Commit 0bdae38e authored by ramil@mysql.com's avatar ramil@mysql.com

Fix for bug #6880: LAST_INSERT_ID() within a statement

parent cb4c6a0d
...@@ -378,4 +378,26 @@ t1 CREATE TABLE `t1` ( ...@@ -378,4 +378,26 @@ t1 CREATE TABLE `t1` (
KEY `t1_name` (`t1_name`) KEY `t1_name` (`t1_name`)
) ENGINE=MyISAM AUTO_INCREMENT=1003 DEFAULT CHARSET=latin1 ) ENGINE=MyISAM AUTO_INCREMENT=1003 DEFAULT CHARSET=latin1
DROP TABLE `t1`; DROP TABLE `t1`;
create table t1(a int not null auto_increment primary key);
create table t2(a int not null auto_increment primary key, t1a int);
insert into t1 values(NULL);
insert into t2 values (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID());
insert into t1 values (NULL);
insert into t2 values (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID()),
(NULL, LAST_INSERT_ID());
insert into t1 values (NULL);
insert into t2 values (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID()),
(NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID());
select * from t2;
a t1a
1 1
2 1
3 2
4 2
5 2
6 3
7 3
8 3
9 3
drop table t1, t2;
End of 4.1 tests End of 4.1 tests
...@@ -99,3 +99,20 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File ...@@ -99,3 +99,20 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 276 slave-relay-bin.000003 214 master-bin.000002 Yes Yes 0 0 276 214 None 0 No # # 127.0.0.1 root MASTER_PORT 1 master-bin.000002 276 slave-relay-bin.000003 214 master-bin.000002 Yes Yes 0 0 276 214 None 0 No #
show binlog events in 'slave-bin.000005' from 4; show binlog events in 'slave-bin.000005' from 4;
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
create table t1(a int auto_increment primary key, b int);
insert into t1 values (NULL, 1);
reset master;
set insert_id=5;
insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id());
show binlog events;
Log_name Pos Event_type Server_id Orig_log_pos Info
slave-bin.000001 4 Start 2 4 Server ver: VERSION, Binlog ver: 3
slave-bin.000001 79 Intvar 2 79 LAST_INSERT_ID=1
slave-bin.000001 107 Intvar 2 107 INSERT_ID=5
slave-bin.000001 135 Query 2 135 use `test`; insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id())
select * from t1;
a b
1 1
5 1
6 1
drop table t1;
...@@ -238,4 +238,21 @@ SHOW CREATE TABLE `t1`; ...@@ -238,4 +238,21 @@ SHOW CREATE TABLE `t1`;
DROP TABLE `t1`; DROP TABLE `t1`;
#
# Bug #6880: LAST_INSERT_ID() within a statement
#
create table t1(a int not null auto_increment primary key);
create table t2(a int not null auto_increment primary key, t1a int);
insert into t1 values(NULL);
insert into t2 values (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID());
insert into t1 values (NULL);
insert into t2 values (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID()),
(NULL, LAST_INSERT_ID());
insert into t1 values (NULL);
insert into t2 values (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID()),
(NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID());
select * from t2;
drop table t1, t2;
--echo End of 4.1 tests --echo End of 4.1 tests
...@@ -108,4 +108,18 @@ show slave status; ...@@ -108,4 +108,18 @@ show slave status;
--error 1220 --error 1220
show binlog events in 'slave-bin.000005' from 4; show binlog events in 'slave-bin.000005' from 4;
#
# Bug #6880: LAST_INSERT_ID() within a statement
#
create table t1(a int auto_increment primary key, b int);
insert into t1 values (NULL, 1);
reset master;
set insert_id=5;
insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id());
--replace_result $VERSION VERSION
show binlog events;
select * from t1;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -2233,15 +2233,16 @@ longlong Item_func_release_lock::val_int() ...@@ -2233,15 +2233,16 @@ longlong Item_func_release_lock::val_int()
longlong Item_func_last_insert_id::val_int() longlong Item_func_last_insert_id::val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
THD* thd= current_thd;
if (arg_count) if (arg_count)
{ {
longlong value=args[0]->val_int(); longlong value=args[0]->val_int();
current_thd->insert_id(value); thd->insert_id(value);
null_value=args[0]->null_value; null_value=args[0]->null_value;
} }
else else
current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
return current_thd->insert_id(); return thd->last_insert_id_used ? thd->current_insert_id : thd->insert_id();
} }
/* This function is just used to test speed of different functions */ /* This function is just used to test speed of different functions */
......
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