summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2013-11-12 15:02:25 +0100
committerSergei Golubchik <sergii@pisem.net>2013-11-12 15:02:25 +0100
commit441192bfb0e620b49cb58eaef96132151531fc54 (patch)
tree8dba9e5585ed2172e520f721ba4e8861bb7b3ef7
parentc98a054fdeab9c2d3a637cf4fce57a2f9756dcc8 (diff)
downloadmariadb-git-441192bfb0e620b49cb58eaef96132151531fc54.tar.gz
MDEV-5113 Wrong result (extra row) and valgrind warnings in Item_maxmin_subselect::any_value on 2nd execution of PS with SELECT subquery
When setting Item_func_not_all::test_sum_item or Item_func_not_all::test_sub_item, reset the other one to NULL - they can never be set both. When a PS is reexecuted, different executions might be optimized differently and a wrong test_su*_item might stay set from the previous execution.
-rw-r--r--mysql-test/r/ps_max_subselect-5113.result16
-rw-r--r--mysql-test/t/ps_max_subselect-5113.test20
-rw-r--r--sql/item_cmpfunc.h4
3 files changed, 38 insertions, 2 deletions
diff --git a/mysql-test/r/ps_max_subselect-5113.result b/mysql-test/r/ps_max_subselect-5113.result
new file mode 100644
index 00000000000..427ef628ead
--- /dev/null
+++ b/mysql-test/r/ps_max_subselect-5113.result
@@ -0,0 +1,16 @@
+CREATE TABLE t1 (b INT NOT NULL);
+INSERT INTO t1 VALUES (0),(8);
+PREPARE stmt FROM '
+ SELECT 1 FROM t1 AS o
+ WHERE o.b >= ALL (
+ SELECT a2.b FROM t1 AS a1 LEFT JOIN t1 AS a2 ON ( a2.b = a1.b )
+ WHERE a1.b <= a2.b
+ )
+';
+EXECUTE stmt;
+1
+1
+EXECUTE stmt;
+1
+1
+DROP TABLE t1;
diff --git a/mysql-test/t/ps_max_subselect-5113.test b/mysql-test/t/ps_max_subselect-5113.test
new file mode 100644
index 00000000000..255e81c1549
--- /dev/null
+++ b/mysql-test/t/ps_max_subselect-5113.test
@@ -0,0 +1,20 @@
+#
+# MDEV-5113 Wrong result (extra row) and valgrind warnings in Item_maxmin_subselect::any_value on 2nd execution of PS with SELECT subquery
+#
+
+CREATE TABLE t1 (b INT NOT NULL);
+INSERT INTO t1 VALUES (0),(8);
+
+PREPARE stmt FROM '
+ SELECT 1 FROM t1 AS o
+ WHERE o.b >= ALL (
+ SELECT a2.b FROM t1 AS a1 LEFT JOIN t1 AS a2 ON ( a2.b = a1.b )
+ WHERE a1.b <= a2.b
+ )
+';
+
+EXECUTE stmt;
+EXECUTE stmt;
+
+DROP TABLE t1;
+
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index cdb4963e857..d00f177fc8e 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -508,8 +508,8 @@ public:
bool fix_fields(THD *thd, Item **ref)
{return Item_func::fix_fields(thd, ref);}
virtual void print(String *str, enum_query_type query_type);
- void set_sum_test(Item_sum_hybrid *item) { test_sum_item= item; };
- void set_sub_test(Item_maxmin_subselect *item) { test_sub_item= item; };
+ void set_sum_test(Item_sum_hybrid *item) { test_sum_item= item; test_sub_item= 0; };
+ void set_sub_test(Item_maxmin_subselect *item) { test_sub_item= item; test_sum_item= 0;};
bool empty_underlying_subquery();
Item *neg_transformer(THD *thd);
};