Loading mysql-test/r/ps.result +14 −0 Original line number Diff line number Diff line Loading @@ -875,3 +875,17 @@ select @@max_prepared_stmt_count, @@prepared_stmt_count; @@max_prepared_stmt_count @@prepared_stmt_count 3 0 set global max_prepared_stmt_count= @old_max_prepared_stmt_count; drop table if exists t1; create temporary table if not exists t1 (a1 int); prepare stmt from "delete t1 from t1 where (cast(a1/3 as unsigned) * 3) = a1"; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; deallocate prepare stmt; mysql-test/t/ps.test +25 −0 Original line number Diff line number Diff line Loading @@ -926,4 +926,29 @@ select @@max_prepared_stmt_count, @@prepared_stmt_count; set global max_prepared_stmt_count= @old_max_prepared_stmt_count; --enable_ps_protocol # # Bug#19399 "Stored Procedures 'Lost Connection' when dropping/creating # tables" # Check that multi-delete tables are also cleaned up before re-execution. # --disable_warnings drop table if exists t1; create temporary table if not exists t1 (a1 int); --enable_warnings # exact delete syntax is essential prepare stmt from "delete t1 from t1 where (cast(a1/3 as unsigned) * 3) = a1"; drop temporary table t1; create temporary table if not exists t1 (a1 int); # the server crashed on the next statement without the fix execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); # the problem was in memory corruption: repeat the test just in case execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; deallocate prepare stmt; # End of 4.1 tests sql/sql_lex.cc +1 −0 Original line number Diff line number Diff line Loading @@ -125,6 +125,7 @@ void lex_start(THD *thd, uchar *buf,uint length) lex->value_list.empty(); lex->update_list.empty(); lex->param_list.empty(); lex->auxilliary_table_list.empty(); lex->unit.next= lex->unit.master= lex->unit.link_next= lex->unit.return_to= 0; lex->unit.prev= lex->unit.link_prev= 0; Loading sql/sql_prepare.cc +13 −7 Original line number Diff line number Diff line Loading @@ -1727,12 +1727,7 @@ static void reset_stmt_for_execute(Prepared_statement *stmt) tables; tables= tables->next) { /* Reset old pointers to TABLEs: they are not valid since the tables were closed in the end of previous prepare or execute call. */ tables->table= 0; tables->table_list= 0; tables->reinit_before_use(thd); } { Loading @@ -1743,6 +1738,17 @@ static void reset_stmt_for_execute(Prepared_statement *stmt) unit->reinit_exec_mechanism(); } } /* Cleanup of the special case of DELETE t1, t2 FROM t1, t2, t3 ... (multi-delete). We do a full clean up, although at the moment all we need to clean in the tables of MULTI-DELETE list is 'table' member. */ for (TABLE_LIST *tables= (TABLE_LIST*) lex->auxilliary_table_list.first; tables; tables= tables->next) { tables->reinit_before_use(thd); } lex->current_select= &lex->select_lex; if (lex->result) lex->result->cleanup(); Loading sql/table.cc +17 −0 Original line number Diff line number Diff line Loading @@ -1544,6 +1544,23 @@ db_type get_table_type(const char *name) DBUG_RETURN(ha_checktype((enum db_type) (uint) *(head+3))); } /* Cleanup this table for re-execution. SYNOPSIS st_table_list::reinit_before_use() */ void st_table_list::reinit_before_use(THD * /* thd */) { /* Reset old pointers to TABLEs: they are not valid since the tables were closed in the end of previous prepare or execute call. */ table= 0; table_list= 0; } /***************************************************************************** ** Instansiate templates Loading Loading
mysql-test/r/ps.result +14 −0 Original line number Diff line number Diff line Loading @@ -875,3 +875,17 @@ select @@max_prepared_stmt_count, @@prepared_stmt_count; @@max_prepared_stmt_count @@prepared_stmt_count 3 0 set global max_prepared_stmt_count= @old_max_prepared_stmt_count; drop table if exists t1; create temporary table if not exists t1 (a1 int); prepare stmt from "delete t1 from t1 where (cast(a1/3 as unsigned) * 3) = a1"; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; deallocate prepare stmt;
mysql-test/t/ps.test +25 −0 Original line number Diff line number Diff line Loading @@ -926,4 +926,29 @@ select @@max_prepared_stmt_count, @@prepared_stmt_count; set global max_prepared_stmt_count= @old_max_prepared_stmt_count; --enable_ps_protocol # # Bug#19399 "Stored Procedures 'Lost Connection' when dropping/creating # tables" # Check that multi-delete tables are also cleaned up before re-execution. # --disable_warnings drop table if exists t1; create temporary table if not exists t1 (a1 int); --enable_warnings # exact delete syntax is essential prepare stmt from "delete t1 from t1 where (cast(a1/3 as unsigned) * 3) = a1"; drop temporary table t1; create temporary table if not exists t1 (a1 int); # the server crashed on the next statement without the fix execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); # the problem was in memory corruption: repeat the test just in case execute stmt; drop temporary table t1; create temporary table if not exists t1 (a1 int); execute stmt; drop temporary table t1; deallocate prepare stmt; # End of 4.1 tests
sql/sql_lex.cc +1 −0 Original line number Diff line number Diff line Loading @@ -125,6 +125,7 @@ void lex_start(THD *thd, uchar *buf,uint length) lex->value_list.empty(); lex->update_list.empty(); lex->param_list.empty(); lex->auxilliary_table_list.empty(); lex->unit.next= lex->unit.master= lex->unit.link_next= lex->unit.return_to= 0; lex->unit.prev= lex->unit.link_prev= 0; Loading
sql/sql_prepare.cc +13 −7 Original line number Diff line number Diff line Loading @@ -1727,12 +1727,7 @@ static void reset_stmt_for_execute(Prepared_statement *stmt) tables; tables= tables->next) { /* Reset old pointers to TABLEs: they are not valid since the tables were closed in the end of previous prepare or execute call. */ tables->table= 0; tables->table_list= 0; tables->reinit_before_use(thd); } { Loading @@ -1743,6 +1738,17 @@ static void reset_stmt_for_execute(Prepared_statement *stmt) unit->reinit_exec_mechanism(); } } /* Cleanup of the special case of DELETE t1, t2 FROM t1, t2, t3 ... (multi-delete). We do a full clean up, although at the moment all we need to clean in the tables of MULTI-DELETE list is 'table' member. */ for (TABLE_LIST *tables= (TABLE_LIST*) lex->auxilliary_table_list.first; tables; tables= tables->next) { tables->reinit_before_use(thd); } lex->current_select= &lex->select_lex; if (lex->result) lex->result->cleanup(); Loading
sql/table.cc +17 −0 Original line number Diff line number Diff line Loading @@ -1544,6 +1544,23 @@ db_type get_table_type(const char *name) DBUG_RETURN(ha_checktype((enum db_type) (uint) *(head+3))); } /* Cleanup this table for re-execution. SYNOPSIS st_table_list::reinit_before_use() */ void st_table_list::reinit_before_use(THD * /* thd */) { /* Reset old pointers to TABLEs: they are not valid since the tables were closed in the end of previous prepare or execute call. */ table= 0; table_list= 0; } /***************************************************************************** ** Instansiate templates Loading