summaryrefslogtreecommitdiff
path: root/sql/sql_prepare.cc
diff options
context:
space:
mode:
authorunknown <acurtis@pcgem.rdg.cyberkinetica.com>2004-12-14 08:12:04 +0000
committerunknown <acurtis@pcgem.rdg.cyberkinetica.com>2004-12-14 08:12:04 +0000
commit17d1552bbb555f5fe52c39bd4ffee99ad6d823c6 (patch)
tree8eee47212d5f5031d2a5103fc85e2361b0c1faad /sql/sql_prepare.cc
parente19a3042efa64cc0ca5142ceeacd40729740eb39 (diff)
downloadmariadb-git-17d1552bbb555f5fe52c39bd4ffee99ad6d823c6.tar.gz
Bug#7242
The "insert_update" causes a server crash when using prepared statements Must clear table->insert_values after completing every prepared statement
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r--sql/sql_prepare.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index f4a96d751cd..6d2ddf03b50 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -1514,6 +1514,27 @@ static bool init_param_array(Prepared_statement *stmt)
}
+/* Init statement before execution */
+
+static void cleanup_stmt_for_execute(Prepared_statement *stmt)
+{
+ THD *thd= stmt->thd;
+ LEX *lex= stmt->lex;
+ SELECT_LEX *sl= lex->all_selects_list;
+
+ for (; sl; sl= sl->next_select_in_list())
+ {
+ for (TABLE_LIST *tables= (TABLE_LIST*) sl->table_list.first;
+ tables;
+ tables= tables->next)
+ {
+ if (tables->table)
+ tables->table->insert_values= 0;
+ }
+ }
+}
+
+
/*
Given a query string with parameter markers, create a Prepared Statement
from it and send PS info back to the client.
@@ -1614,6 +1635,7 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
if (!error)
error= send_prepare_results(stmt, test(name));
+ cleanup_stmt_for_execute(stmt);
/* restore to WAIT_PRIOR: QUERY_PRIOR is set inside alloc_query */
if (!(specialflag & SPECIAL_NO_PRIOR))
@@ -1904,6 +1926,7 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
reset_stmt_params(stmt);
close_thread_tables(thd); // to close derived tables
thd->set_statement(&thd->stmt_backup);
+ cleanup_stmt_for_execute(stmt);
DBUG_VOID_RETURN;
}