From: Sergey Glukhov Date: April 14 2011 9:32am Subject: bzr commit into mysql-trunk branch (sergey.glukhov:3312) List-Archive: http://lists.mysql.com/commits/135413 Message-Id: <201104140931.p3E9VtAI012520@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///home/gluh/MySQL/mysql-trunk/ based on revid:magne.mahre@stripped 3312 Sergey Glukhov 2011-04-14 [merge] 5.5 -> trunk merge @ mysql-test/r/func_analyse.result 5.5 -> trunk merge @ mysql-test/t/func_analyse.test 5.5 -> trunk merge @ sql/sql_select.cc 5.5 -> trunk merge modified: mysql-test/r/func_analyse.result mysql-test/t/func_analyse.test sql/sql_select.cc === modified file 'mysql-test/r/func_analyse.result' --- a/mysql-test/r/func_analyse.result 2011-03-14 18:11:41 +0000 +++ b/mysql-test/r/func_analyse.result 2011-04-14 09:32:17 +0000 @@ -135,6 +135,19 @@ 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 # # Bug #47338 assertion in handler::ha_external_lock === modified file 'mysql-test/t/func_analyse.test' --- a/mysql-test/t/func_analyse.test 2011-03-14 18:11:41 +0000 +++ b/mysql-test/t/func_analyse.test 2011-04-14 09:32:17 +0000 @@ -1,6 +1,7 @@ # # Test of procedure analyse # +-- source include/have_innodb.inc --disable_warnings drop table if exists t1,t2; @@ -144,6 +145,17 @@ 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 --echo # === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2011-04-07 14:24:47 +0000 +++ b/sql/sql_select.cc 2011-04-14 09:32:17 +0000 @@ -2936,7 +2936,11 @@ JOIN::exec() curr_join->best_positions[curr_join->const_tables].sj_strategy != SJ_OPT_LOOSE_SCAN) disable_sorted_access(&curr_join->join_tab[curr_join->const_tables]); - 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; @@ -18625,10 +18629,14 @@ end_send(JOIN *join, JOIN_TAB *join_tab } 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 */ No bundle (reason: revision is a merge (you can force generation of a bundle with env var BZR_FORCE_BUNDLE=1)).