From: Sergey Glukhov Date: April 14 2011 8:11am Subject: bzr commit into mysql-5.1 branch (sergey.glukhov:3658) Bug#11756242 List-Archive: http://lists.mysql.com/commits/135391 X-Bug: 11756242 Message-Id: <201104140811.p3E8BCGj010825@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3079826109227629405==" --===============3079826109227629405== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/gluh/MySQL/mysql-5.1/ based on revid:serge.kozlov@stripped 3658 Sergey Glukhov 2011-04-14 Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL There are two problems with ANALYSE(): 1. Memory leak it happens because do_select() can overwrite JOIN::procedure field(with zero value in our case) and JOIN destructor don't free the memory allocated for JOIN::procedure. The fix is to save original JOIN::procedure before do_select() call and restore it after do_select execution. 2. Wrong result If ANALYSE() procedure is used for the statement with LIMIT clause it could retrun empty result set. It happens because of missing analyse::end_of_records() call. First end_send() function call returns NESTED_LOOP_QUERY_LIMIT and second call of end_send() with end_of_records flag enabled does not happen. The fix is to return NESTED_LOOP_OK from end_send() if procedure is active. @ mysql-test/r/analyse.result test case @ mysql-test/t/analyse.test test case @ sql/sql_select.cc --save original JOIN::procedure before do_select() call and restore it after do_select execution. --return NESTED_LOOP_OK from end_send() if procedure is active modified: mysql-test/r/analyse.result mysql-test/t/analyse.test sql/sql_select.cc === modified file 'mysql-test/r/analyse.result' --- a/mysql-test/r/analyse.result 2011-03-14 18:03:22 +0000 +++ b/mysql-test/r/analyse.result 2011-04-14 08:11:57 +0000 @@ -135,4 +135,17 @@ SELECT * FROM t1 PROCEDURE ANALYSE(); Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype test.t1.a e e- 1 2 0 0 1.3333 NULL ENUM('e','e-') NOT NULL DROP TABLE t1; +# +# Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL +# +CREATE TABLE t1(f1 INT) ENGINE=MYISAM; +CREATE TABLE t2(f2 INT) ENGINE=INNODB; +INSERT INTO t2 VALUES (1); +SELECT DISTINCTROW f1 FROM t1 NATURAL RIGHT OUTER JOIN t2 PROCEDURE ANALYSE(); +Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype +test.t1.f1 NULL NULL 0 0 0 1 0.0 0.0 CHAR(0) +SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE(); +Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype +test.t2.f2 1 1 1 1 0 0 1.0000 0.0000 ENUM('1') NOT NULL +DROP TABLE t1, t2; End of 5.1 tests === modified file 'mysql-test/t/analyse.test' --- a/mysql-test/t/analyse.test 2011-03-14 18:03:22 +0000 +++ b/mysql-test/t/analyse.test 2011-04-14 08:11:57 +0000 @@ -1,6 +1,7 @@ # # Test of procedure analyse # +-- source include/have_innodb.inc --disable_warnings drop table if exists t1,t2; @@ -144,4 +145,15 @@ INSERT INTO t1 VALUES ('e'),('e'),('e-') SELECT * FROM t1 PROCEDURE ANALYSE(); DROP TABLE t1; +--echo # +--echo # Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL +--echo # + +CREATE TABLE t1(f1 INT) ENGINE=MYISAM; +CREATE TABLE t2(f2 INT) ENGINE=INNODB; +INSERT INTO t2 VALUES (1); +SELECT DISTINCTROW f1 FROM t1 NATURAL RIGHT OUTER JOIN t2 PROCEDURE ANALYSE(); +SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE(); +DROP TABLE t1, t2; + --echo End of 5.1 tests === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2011-02-22 21:03:32 +0000 +++ b/sql/sql_select.cc 2011-04-14 08:11:57 +0000 @@ -1929,7 +1929,11 @@ JOIN::exec() if (!curr_join->sort_and_group && curr_join->const_tables != curr_join->tables) curr_join->join_tab[curr_join->const_tables].sorted= 0; - if ((tmp_error= do_select(curr_join, (List *) 0, curr_tmp_table, 0))) + + Procedure *save_proc= curr_join->procedure; + tmp_error= do_select(curr_join, (List *) 0, curr_tmp_table, 0); + curr_join->procedure= save_proc; + if (tmp_error) { error= tmp_error; DBUG_VOID_RETURN; @@ -12354,10 +12358,14 @@ end_send(JOIN *join, JOIN_TAB *join_tab int error; if (join->having && join->having->val_int() == 0) DBUG_RETURN(NESTED_LOOP_OK); // Didn't match having - error=0; if (join->procedure) - error=join->procedure->send_row(join->procedure_fields_list); - else if (join->do_send_rows) + { + if (join->procedure->send_row(join->procedure_fields_list)) + DBUG_RETURN(NESTED_LOOP_ERROR); + DBUG_RETURN(NESTED_LOOP_OK); + } + error=0; + if (join->do_send_rows) error=join->result->send_data(*join->fields); if (error) DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ --===============3079826109227629405== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/sergey.glukhov@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: sergey.glukhov@stripped\ # hv5h2rljma7um9yc # target_branch: file:///home/gluh/MySQL/mysql-5.1/ # testament_sha1: e11416f427f551fc58b1dba12cb9005fec306fe1 # timestamp: 2011-04-14 12:12:01 +0400 # source_branch: bzr+ssh://sgluhov@stripped/bzrroot\ # /server/mysql-5.1/ # base_revision_id: serge.kozlov@stripped\ # ghrxsnitso1ogg50 # # Begin bundle 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 F3JFOFCQKtslNA== --===============3079826109227629405==--