diff options
author | serg@serg.mylan <> | 2004-12-24 23:30:40 +0100 |
---|---|---|
committer | serg@serg.mylan <> | 2004-12-24 23:30:40 +0100 |
commit | 735d25ed731fc9056394a9a1b191c4f064a3d5a2 (patch) | |
tree | 385b86a214c8899f7626b588d1e15f055c3003d1 /sql/sql_prepare.cc | |
parent | d38db21048a54be902fbea38bebd4a916c013a8d (diff) | |
download | mariadb-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.cc | 30 |
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; } |