diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 694cf903d35..454ff0b615f 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -4046,4 +4046,28 @@ boo 2 drop procedure bug14643_1| drop procedure bug14643_2| +drop procedure if exists bug14304| +drop table if exists t3, t4| +create table t3(a int primary key auto_increment)| +create table t4(a int primary key auto_increment)| +create procedure bug14304() +begin +insert into t3 set a=null; +insert into t4 set a=null; +insert into t4 set a=null; +insert into t4 set a=null; +insert into t4 set a=null; +insert into t4 set a=null; +insert into t4 select null as a; +insert into t3 set a=null; +insert into t3 set a=null; +select * from t3; +end| +call bug14304()| +a +1 +2 +3 +drop procedure bug14304| +drop table t3, t4| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 5bbe9258461..676cc3cda1e 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -4823,6 +4823,37 @@ call bug14643_2()| drop procedure bug14643_1| drop procedure bug14643_2| +# +# BUG#14304: auto_increment field incorrect set in SP +# +--disable_warnings +drop procedure if exists bug14304| +drop table if exists t3, t4| +--enable_warnings + +create table t3(a int primary key auto_increment)| +create table t4(a int primary key auto_increment)| + +create procedure bug14304() +begin + insert into t3 set a=null; + insert into t4 set a=null; + insert into t4 set a=null; + insert into t4 set a=null; + insert into t4 set a=null; + insert into t4 set a=null; + insert into t4 select null as a; + + insert into t3 set a=null; + insert into t3 set a=null; + + select * from t3; +end| + +call bug14304()| + +drop procedure bug14304| +drop table t3, t4| # # BUG#NNNN: New bug synopsis diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 9b7ce44c14a..81e10e59a9b 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1069,7 +1069,7 @@ int sp_head::execute(THD *thd) } /* we should cleanup free_list and memroot, used by instruction */ - thd->free_items(); + thd->cleanup_after_query(); free_root(&execute_mem_root, MYF(0)); /* diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 70dfaca53d3..00669ee5c73 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1948,6 +1948,7 @@ void THD::reset_sub_statement_state(Sub_statement_state *backup, backup->last_insert_id= last_insert_id; backup->next_insert_id= next_insert_id; backup->insert_id_used= insert_id_used; + backup->clear_next_insert_id= clear_next_insert_id; backup->limit_found_rows= limit_found_rows; backup->examined_row_count= examined_row_count; backup->sent_row_count= sent_row_count; @@ -1999,6 +2000,7 @@ void THD::restore_sub_statement_state(Sub_statement_state *backup) last_insert_id= backup->last_insert_id; next_insert_id= backup->next_insert_id; insert_id_used= backup->insert_id_used; + clear_next_insert_id= backup->clear_next_insert_id; limit_found_rows= backup->limit_found_rows; sent_row_count= backup->sent_row_count; client_capabilities= backup->client_capabilities; diff --git a/sql/sql_class.h b/sql/sql_class.h index 33be70ee674..0a5a615fe64 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1090,7 +1090,7 @@ public: ha_rows cuted_fields, sent_row_count, examined_row_count; ulong client_capabilities; uint in_sub_stmt; - bool enable_slow_log, insert_id_used; + bool enable_slow_log, insert_id_used, clear_next_insert_id; my_bool no_send_ok; SAVEPOINT *savepoints; };