From: Sergey Glukhov Date: April 8 2011 8:45am Subject: bzr commit into mysql-5.1 branch (sergey.glukhov:3645) Bug#11756242 List-Archive: http://lists.mysql.com/commits/135034 X-Bug: 11756242 Message-Id: <201104080845.p388j4uP021449@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8629372455251310354==" --===============8629372455251310354== 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:sergey.glukhov@stripped 3645 Sergey Glukhov 2011-04-08 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-08 08:45:29 +0000 @@ -135,4 +135,14 @@ 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) +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-08 08:45:29 +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,14 @@ 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(); +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-08 08:45:29 +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 */ --===============8629372455251310354== 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\ # ighkkh6m1p94mk0g # target_branch: file:///home/gluh/MySQL/mysql-5.1/ # testament_sha1: 4585293507717218280924a477f2867d814f35fc # timestamp: 2011-04-08 12:45:36 +0400 # source_branch: bzr+ssh://sgluhov@stripped/bzrroot\ # /server/mysql-5.1/ # base_revision_id: sergey.glukhov@stripped\ # vzlybvxxh4xjeqb6 # # Begin bundle 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 --===============8629372455251310354==--