From 441192bfb0e620b49cb58eaef96132151531fc54 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 12 Nov 2013 15:02:25 +0100 Subject: 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. --- mysql-test/r/ps_max_subselect-5113.result | 16 ++++++++++++++++ mysql-test/t/ps_max_subselect-5113.test | 20 ++++++++++++++++++++ sql/item_cmpfunc.h | 4 ++-- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 mysql-test/r/ps_max_subselect-5113.result create mode 100644 mysql-test/t/ps_max_subselect-5113.test 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); }; -- cgit v1.2.1