From: Roy Lyseng Date: June 28 2011 7:24am Subject: bzr commit into mysql-trunk branch (roy.lyseng:3395) List-Archive: http://lists.mysql.com/commits/139943 Message-Id: <20110628072405.190EF1F6@tyr67.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6396128493810343999==" --===============6396128493810343999== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/rl136806/mysql/repo/mysql-work0/ based on revid:roy.lyseng@stripped 3395 Roy Lyseng 2011-06-28 iBug#12603141: JOIN::flatten_subqueries asrt/simplify_joins sig11/... When preparing a prepared statement, we need to save a copy of WHERE and HAVING condition trees in the prep_where and prep_having fields of SELECT_LEX. However, the semantic analysis needs to wrap some Item_field objects using Item_ref objects, which are scoped for the lifetime of the preparation. This is usually not a problem, but when the Item_field is the root object of the condition, the Item_ref object is attempted saved in prep_where or prep_having. The destructor for the Item_ref is called at the end of the preparation, so that when execution of the statement is performed, the destroyed Item_ref object will be referenced. One possible solution to this problem is to detect that the root object is an Item_ref object when saving prep_where and prep_having, and unwrap this object before saving it. The procedure must be applied recursively because sometimes an Item_field is wrapped in multiple Item_ref objects. mysql-test/t/ps.test Added test case for bug#12603141. sql/sql_lex.cc In st_select_lex::fix_prepare_information(), unwrap Item_ref objects when saving the prep_where and prep_having fields. sql/sql_select.cc In JOIN::optimize(), unwrap Item_ref objects when saving the prep_where field. modified: mysql-test/r/ps.result mysql-test/t/ps.test sql/sql_lex.cc sql/sql_select.cc === modified file 'mysql-test/r/ps.result' --- a/mysql-test/r/ps.result 2011-03-22 12:06:52 +0000 +++ b/mysql-test/r/ps.result 2011-06-28 07:04:32 +0000 @@ -3721,3 +3721,29 @@ FROM (SELECT 1 UNION SELECT 2) t; 2 # # End of 5.5 tests. +# +# Bug#12603141: JOIN::flatten_subqueries asrt/simplify_joins sig11/... +# +CREATE TABLE t1( +a INTEGER PRIMARY KEY +) engine=Innodb; +INSERT INTO t1 VALUES (0),(1),(2); +CREATE TABLE t2( +a INTEGER PRIMARY KEY +) engine=Innodb; +INSERT INTO t2 VALUES (1); +PREPARE stmt FROM ' +SELECT (SELECT 1 FROM t2 WHERE ot.a) AS d +FROM t1 AS ot +GROUP BY d'; +EXECUTE stmt; +d +NULL +1 +EXECUTE stmt; +d +NULL +1 +DROP TABLE t1, t2; +# +# End of 5.6 tests. === modified file 'mysql-test/t/ps.test' --- a/mysql-test/t/ps.test 2011-03-22 12:06:52 +0000 +++ b/mysql-test/t/ps.test 2011-06-28 07:04:32 +0000 @@ -3327,4 +3327,28 @@ FROM (SELECT 1 UNION SELECT 2) t; --echo # --echo # End of 5.5 tests. +--echo # +--echo # Bug#12603141: JOIN::flatten_subqueries asrt/simplify_joins sig11/... +--echo # + +CREATE TABLE t1( + a INTEGER PRIMARY KEY +) engine=Innodb; +INSERT INTO t1 VALUES (0),(1),(2); +CREATE TABLE t2( + a INTEGER PRIMARY KEY +) engine=Innodb; +INSERT INTO t2 VALUES (1); +PREPARE stmt FROM ' +SELECT (SELECT 1 FROM t2 WHERE ot.a) AS d +FROM t1 AS ot +GROUP BY d'; +EXECUTE stmt; +EXECUTE stmt; +DROP TABLE t1, t2; + + +--echo # +--echo # End of 5.6 tests. + ########################################################################### === modified file 'sql/sql_lex.cc' --- a/sql/sql_lex.cc 2011-04-01 14:04:52 +0000 +++ b/sql/sql_lex.cc 2011-06-28 07:04:32 +0000 @@ -3072,13 +3072,19 @@ void st_select_lex::fix_prepare_informat first_execution= 0; if (*conds) { - prep_where= *conds; - *conds= where= prep_where->copy_andor_structure(thd); + Item *item= *conds; + while (item->type() == Item::REF_ITEM) + item= *(((Item_ref *)item)->ref); + prep_where= item; + *conds= where= (*conds)->copy_andor_structure(thd); } if (*having_conds) { - prep_having= *having_conds; - *having_conds= having= prep_having->copy_andor_structure(thd); + Item *item= *having_conds; + while (item->type() == Item::REF_ITEM) + item= *(((Item_ref *)item)->ref); + prep_having= item; + *having_conds= having= (*having_conds)->copy_andor_structure(thd); } fix_prepare_info_in_table_list(thd, table_list.first); } === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2011-06-27 07:17:26 +0000 +++ b/sql/sql_select.cc 2011-06-28 07:04:32 +0000 @@ -1904,8 +1904,21 @@ JOIN::optimize() conds= simplify_joins(this, join_list, conds, TRUE, FALSE); build_bitmap_for_nested_joins(join_list, 0); - sel->prep_where= conds ? conds->copy_andor_structure(thd) : 0; - + /* + This should really have been performed when preparing the select_lex. + Doing it now means that we must take care not to include wrapper + objects added to the root of the condition tree during + execution-time resolving. + */ + if (conds == NULL) + sel->prep_where= NULL; + else + { + Item *item= conds; + while (item->type() == Item::REF_ITEM) + item= *(((Item_ref *)item)->ref); + sel->prep_where= item->copy_andor_structure(thd); + } if (arena) thd->restore_active_arena(arena, &backup); } --===============6396128493810343999== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/roy.lyseng@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: roy.lyseng@stripped # target_branch: file:///home/rl136806/mysql/repo/mysql-work0/ # testament_sha1: cf19f9278aa65e87bce18e2b7d86b9d67387e048 # timestamp: 2011-06-28 09:24:04 +0200 # base_revision_id: roy.lyseng@stripped\ # cpsza5wmcazn013c # # Begin bundle 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 --===============6396128493810343999==--