Commit 48272222 authored by unknown's avatar unknown

LAST_INSERT_ID() should not be set if we couldn't generate an auto_increment id.


mysql-test/r/auto_increment.result:
  Update after auto_increment fix
mysql-test/t/auto_increment.test:
  Another fix for LAST_INSERT_ID()
sql/handler.cc:
  Another fix for LAST_INSERT_ID()
sql/sql_class.h:
  Another fix for LAST_INSERT_ID()
parent d0dc9e7d
...@@ -111,11 +111,16 @@ insert into t1 set i = null; ...@@ -111,11 +111,16 @@ insert into t1 set i = null;
select last_insert_id(); select last_insert_id();
last_insert_id() last_insert_id()
255 255
insert into t1 set i = 254;
ERROR 23000: Duplicate entry '254' for key 1
select last_insert_id();
last_insert_id()
255
insert into t1 set i = null; insert into t1 set i = null;
ERROR 23000: Duplicate entry '255' for key 1 ERROR 23000: Duplicate entry '255' for key 1
select last_insert_id(); select last_insert_id();
last_insert_id() last_insert_id()
255 0
drop table t1; drop table t1;
create table t1 (i tinyint unsigned not null auto_increment, key (i)); create table t1 (i tinyint unsigned not null auto_increment, key (i));
insert into t1 set i = 254; insert into t1 set i = 254;
......
...@@ -80,6 +80,9 @@ insert into t1 set i = 254; ...@@ -80,6 +80,9 @@ insert into t1 set i = 254;
insert into t1 set i = null; insert into t1 set i = null;
select last_insert_id(); select last_insert_id();
--error 1062 --error 1062
insert into t1 set i = 254;
select last_insert_id();
--error 1062
insert into t1 set i = null; insert into t1 set i = null;
select last_insert_id(); select last_insert_id();
drop table t1; drop table t1;
...@@ -100,5 +103,6 @@ select last_insert_id(); ...@@ -100,5 +103,6 @@ select last_insert_id();
--error 1062 --error 1062
insert into t1 values (NULL, 10); insert into t1 values (NULL, 10);
select last_insert_id(); select last_insert_id();
drop table t1; drop table t1;
...@@ -709,6 +709,8 @@ void handler::update_auto_increment() ...@@ -709,6 +709,8 @@ void handler::update_auto_increment()
nr=get_auto_increment(); nr=get_auto_increment();
if (!table->next_number_field->store(nr)) if (!table->next_number_field->store(nr))
thd->insert_id((ulonglong) nr); thd->insert_id((ulonglong) nr);
else
thd->insert_id(table->next_number_field->val_int());
auto_increment_column_changed=1; auto_increment_column_changed=1;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -503,8 +503,23 @@ class THD :public ilink ...@@ -503,8 +503,23 @@ class THD :public ilink
#ifdef SIGNAL_WITH_VIO_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
Vio* active_vio; Vio* active_vio;
#endif #endif
ulonglong next_insert_id,last_insert_id,current_insert_id, /*
limit_found_rows; next_insert_id is set on SET INSERT_ID= #. This is used as the next
generated auto_increment value in handler.cc
*/
ulonglong next_insert_id;
/*
The insert_id used for the last statement or set by SET LAST_INSERT_ID=#
or SELECT LAST_INSERT_ID(#). Used for binary log and returned by
LAST_INSERT_ID()
*/
ulonglong last_insert_id;
/*
Set to the first value that LAST_INSERT_ID() returned for the last
statement. When this is set, last_insert_id_used is set to true.
*/
ulonglong current_insert_id;
ulonglong limit_found_rows;
ha_rows select_limit, offset_limit, cuted_fields, ha_rows select_limit, offset_limit, cuted_fields,
sent_row_count, examined_row_count; sent_row_count, examined_row_count;
table_map used_tables; table_map used_tables;
......
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