Commit 0c1dd98e authored by unknown's avatar unknown

Fix for bug #34889: mysql_client_test::test_mysql_insert_id test fails

                    sporadically

Under some circumstances, the mysql_insert_id() value after SELECT ...
INSERT could return a wrong value. This could happen when the last
SELECT ... INSERT did not involve an AUTO_INCREMENT column, but the
value of mysql_insert_id() was changed by some previous statements.

Fixed by checking the value of thd->insert_id_used in
select_insert::send_eof() and returning 0 for mysql_insert_id() if it
is not set.


sql/sql_insert.cc:
  Do not return thd->last_insert_id unconditionally in
  select_insert::send_eof(). First check if thd->insert_id_used is
  non-zero, and return 0 otherwise.
tests/mysql_client_test.c:
  Added a test case for bug #34889.
parent 4f3eab58
...@@ -3006,7 +3006,8 @@ bool select_insert::send_eof() ...@@ -3006,7 +3006,8 @@ bool select_insert::send_eof()
((thd->client_capabilities & CLIENT_FOUND_ROWS) ? ((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
info.touched : info.updated); info.touched : info.updated);
id= autoinc_value_of_first_inserted_row > 0 ? id= autoinc_value_of_first_inserted_row > 0 ?
autoinc_value_of_first_inserted_row : thd->last_insert_id; autoinc_value_of_first_inserted_row : thd->insert_id_used ?
thd->last_insert_id : 0;
::send_ok(thd, (ulong) thd->row_count_func, id, buff); ::send_ok(thd, (ulong) thd->row_count_func, id, buff);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
...@@ -15241,6 +15241,22 @@ static void test_mysql_insert_id() ...@@ -15241,6 +15241,22 @@ static void test_mysql_insert_id()
myquery(rc); myquery(rc);
res= mysql_insert_id(mysql); res= mysql_insert_id(mysql);
DIE_UNLESS(res == 0); DIE_UNLESS(res == 0);
/*
Test for bug #34889: mysql_client_test::test_mysql_insert_id test fails
sporadically
*/
rc= mysql_query(mysql, "create table t2 (f1 int not null primary key auto_increment, f2 varchar(255))");
myquery(rc);
rc= mysql_query(mysql, "insert into t2 values (null,'b')");
myquery(rc);
rc= mysql_query(mysql, "insert into t1 select 5,'c'");
myquery(rc);
res= mysql_insert_id(mysql);
DIE_UNLESS(res == 0);
rc= mysql_query(mysql, "drop table t2");
myquery(rc);
rc= mysql_query(mysql, "insert into t1 select null,'d'"); rc= mysql_query(mysql, "insert into t1 select null,'d'");
myquery(rc); myquery(rc);
res= mysql_insert_id(mysql); res= mysql_insert_id(mysql);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment