summaryrefslogtreecommitdiff
path: root/sql/sql_prepare.cc
diff options
context:
space:
mode:
authorserg@serg.mylan <>2004-12-24 23:30:40 +0100
committerserg@serg.mylan <>2004-12-24 23:30:40 +0100
commit735d25ed731fc9056394a9a1b191c4f064a3d5a2 (patch)
tree385b86a214c8899f7626b588d1e15f055c3003d1 /sql/sql_prepare.cc
parentd38db21048a54be902fbea38bebd4a916c013a8d (diff)
downloadmariadb-git-735d25ed731fc9056394a9a1b191c4f064a3d5a2.tar.gz
better fix for bug#7242 (crash in prepared INSERT ... UPDATE)
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r--sql/sql_prepare.cc30
1 files changed, 4 insertions, 26 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 6d2ddf03b50..20ebc23e240 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -908,14 +908,15 @@ static int mysql_test_insert(Prepared_statement *stmt,
uint value_count;
ulong counter= 0;
+ table_list->table->insert_values=(byte *)1; // don't allocate insert_values
if ((res= mysql_prepare_insert(thd, table_list, insert_table_list,
table_list->table, fields, values,
update_fields, update_values, duplic)))
goto error;
-
+
value_count= values->elements;
its.rewind();
-
+
while ((values= its++))
{
counter++;
@@ -934,6 +935,7 @@ static int mysql_test_insert(Prepared_statement *stmt,
res= 0;
error:
lex->unit.cleanup();
+ table_list->table->insert_values=0;
DBUG_RETURN(res);
}
@@ -1513,28 +1515,6 @@ static bool init_param_array(Prepared_statement *stmt)
return 0;
}
-
-/* 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.
@@ -1635,7 +1615,6 @@ 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))
@@ -1926,7 +1905,6 @@ 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;
}