summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2004-06-10 10:59:55 +0300
committerunknown <bell@sanja.is.com.ua>2004-06-10 10:59:55 +0300
commit8e6b48f808882e0586beb09259c329729f475015 (patch)
tree843e4e7d10f5b0100a82cd522e1a21416d20f204
parent350ad5003e90c4129a69937afaf7d87b828a506c (diff)
downloadmariadb-git-8e6b48f808882e0586beb09259c329729f475015.tar.gz
cleunup() of count() and max()/min() added (BUG#2687)
mysql-test/r/func_group.result: test of optimized aggregate function re-execution mysql-test/t/func_group.test: test of optimized aggregate function re-execution sql/item_sum.cc: cleunup() added sql/item_sum.h: cleunup() added
-rw-r--r--mysql-test/r/func_group.result28
-rw-r--r--mysql-test/t/func_group.test22
-rw-r--r--sql/item_sum.cc19
-rw-r--r--sql/item_sum.h2
4 files changed, 71 insertions, 0 deletions
diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result
index bd5646f4068..06259ff4931 100644
--- a/mysql-test/r/func_group.result
+++ b/mysql-test/r/func_group.result
@@ -656,3 +656,31 @@ select stddev(2) from t1;
stddev(2)
NULL
drop table t1;
+create table t1 (a int);
+insert into t1 values (1),(2);
+prepare stmt1 from 'SELECT COUNT(*) FROM t1';
+execute stmt1;
+COUNT(*)
+2
+execute stmt1;
+COUNT(*)
+2
+execute stmt1;
+COUNT(*)
+2
+deallocate prepare stmt1;
+drop table t1;
+create table t1 (a int, primary key(a));
+insert into t1 values (1),(2);
+prepare stmt1 from 'SELECT max(a) FROM t1';
+execute stmt1;
+max(a)
+2
+execute stmt1;
+max(a)
+2
+execute stmt1;
+max(a)
+2
+deallocate prepare stmt1;
+drop table t1;
diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test
index 7966a2262f4..74f4c1bad44 100644
--- a/mysql-test/t/func_group.test
+++ b/mysql-test/t/func_group.test
@@ -396,3 +396,25 @@ create table t1 (a int);
select variance(2) from t1;
select stddev(2) from t1;
drop table t1;
+
+
+#
+# cleunup() of optimized away count(*) and max/min
+#
+create table t1 (a int);
+insert into t1 values (1),(2);
+prepare stmt1 from 'SELECT COUNT(*) FROM t1';
+execute stmt1;
+execute stmt1;
+execute stmt1;
+deallocate prepare stmt1;
+drop table t1;
+
+create table t1 (a int, primary key(a));
+insert into t1 values (1),(2);
+prepare stmt1 from 'SELECT max(a) FROM t1';
+execute stmt1;
+execute stmt1;
+execute stmt1;
+deallocate prepare stmt1;
+drop table t1;
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 0c5b29fc069..098ccf70861 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -361,6 +361,16 @@ longlong Item_sum_count::val_int()
return (longlong) count;
}
+
+void Item_sum_count::cleanup()
+{
+ DBUG_ENTER("Item_sum_count::cleanup");
+ Item_sum_int::cleanup();
+ used_table_cache= ~(table_map) 0;
+ DBUG_VOID_RETURN;
+}
+
+
/*
Avgerage
*/
@@ -575,6 +585,15 @@ Item_sum_hybrid::val_str(String *str)
}
+void Item_sum_hybrid::cleanup()
+{
+ DBUG_ENTER("Item_sum_hybrid::cleanup");
+ Item_sum::cleanup();
+ used_table_cache= ~(table_map) 0;
+ DBUG_VOID_RETURN;
+}
+
+
Item *Item_sum_min::copy_or_same(THD* thd)
{
return new (&thd->mem_root) Item_sum_min(thd, this);
diff --git a/sql/item_sum.h b/sql/item_sum.h
index ef947900fd2..be8bb28e16b 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -172,6 +172,7 @@ class Item_sum_count :public Item_sum_int
void make_const(longlong count_arg) { count=count_arg; used_table_cache=0; }
longlong val_int();
void reset_field();
+ void cleanup();
void update_field();
const char *func_name() const { return "count"; }
Item *copy_or_same(THD* thd);
@@ -428,6 +429,7 @@ class Item_sum_hybrid :public Item_sum
void min_max_update_str_field();
void min_max_update_real_field();
void min_max_update_int_field();
+ void cleanup();
};