diff options
author | Sergei Golubchik <sergii@pisem.net> | 2013-11-12 15:02:25 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2013-11-12 15:02:25 +0100 |
commit | 441192bfb0e620b49cb58eaef96132151531fc54 (patch) | |
tree | 8dba9e5585ed2172e520f721ba4e8861bb7b3ef7 | |
parent | c98a054fdeab9c2d3a637cf4fce57a2f9756dcc8 (diff) | |
download | mariadb-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.result | 16 | ||||
-rw-r--r-- | mysql-test/t/ps_max_subselect-5113.test | 20 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 4 |
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); }; |