Commit 43ed7433 authored by unknown's avatar unknown

Merge moonlight.intranet:/home/tomash/src/mysql_ab/mysql-5.0-real-bug21726

into  moonlight.intranet:/home/tomash/src/mysql_ab/mysql-5.1-real-bug21726


mysql-test/t/rpl_insert_id.test:
  Use local.
sql/item_func.cc:
  Use local.
sql/item_func.h:
  Use local.
sql/log_event.cc:
  SCCS merged
sql/set_var.cc:
  Use local.
sql/sql_class.h:
  Use local.
sql/sql_insert.cc:
  Use local.
sql/sql_load.cc:
  Use local.
sql/sql_parse.cc:
  Use local.
sql/sql_select.cc:
  Use local.
sql/sql_update.cc:
  Use local.
mysql-test/r/rpl_insert_id.result:
  Use local.
sql/sql_class.cc:
  Manual merge.  Add comment for THD::cleanup_after_query().
tests/mysql_client_test.c:
  Manual merge.  Add test case for bug#21726: Incorrect result with
  multiple invocations of LAST_INSERT_ID.
parents 6a698c3b be929087
......@@ -263,6 +263,135 @@ n b
2 100
3 350
drop table t1;
DROP PROCEDURE IF EXISTS p1;
DROP TABLE IF EXISTS t1, t2;
SELECT LAST_INSERT_ID(0);
LAST_INSERT_ID(0)
0
CREATE TABLE t1 (
id INT NOT NULL DEFAULT 0,
last_id INT,
PRIMARY KEY (id)
);
CREATE TABLE t2 (
id INT NOT NULL AUTO_INCREMENT,
last_id INT,
PRIMARY KEY (id)
);
CREATE PROCEDURE p1()
BEGIN
INSERT INTO t2 (last_id) VALUES (LAST_INSERT_ID());
INSERT INTO t1 (last_id) VALUES (LAST_INSERT_ID());
END|
CALL p1();
SELECT * FROM t1;
id last_id
0 1
SELECT * FROM t2;
id last_id
1 0
SELECT * FROM t1;
id last_id
0 1
SELECT * FROM t2;
id last_id
1 0
DROP PROCEDURE p1;
DROP TABLE t1, t2;
DROP PROCEDURE IF EXISTS p1;
DROP FUNCTION IF EXISTS f1;
DROP FUNCTION IF EXISTS f2;
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1 (
i INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
j INT DEFAULT 0
);
CREATE TABLE t2 (i INT);
CREATE PROCEDURE p1()
BEGIN
INSERT INTO t1 (i) VALUES (NULL);
INSERT INTO t2 (i) VALUES (LAST_INSERT_ID());
INSERT INTO t1 (i) VALUES (NULL), (NULL);
INSERT INTO t2 (i) VALUES (LAST_INSERT_ID());
END |
CREATE FUNCTION f1() RETURNS INT MODIFIES SQL DATA
BEGIN
INSERT INTO t1 (i) VALUES (NULL);
INSERT INTO t2 (i) VALUES (LAST_INSERT_ID());
INSERT INTO t1 (i) VALUES (NULL), (NULL);
INSERT INTO t2 (i) VALUES (LAST_INSERT_ID());
RETURN 0;
END |
CREATE FUNCTION f2() RETURNS INT NOT DETERMINISTIC
RETURN LAST_INSERT_ID() |
INSERT INTO t1 VALUES (NULL, -1);
CALL p1();
SELECT f1();
f1()
0
INSERT INTO t1 VALUES (NULL, f2()), (NULL, LAST_INSERT_ID()),
(NULL, LAST_INSERT_ID()), (NULL, f2()), (NULL, f2());
INSERT INTO t1 VALUES (NULL, f2());
INSERT INTO t1 VALUES (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID(5)),
(NULL, @@LAST_INSERT_ID);
INSERT INTO t1 VALUES (NULL, 0), (NULL, LAST_INSERT_ID());
UPDATE t1 SET j= -1 WHERE i IS NULL;
SELECT * FROM t1;
i j
1 -1
2 0
3 0
4 0
5 0
6 0
7 0
8 3
9 3
10 3
11 3
12 3
13 8
14 13
15 5
16 13
17 -1
18 14
SELECT * FROM t2;
i
2
3
5
6
SELECT * FROM t1;
i j
1 -1
2 0
3 0
4 0
5 0
6 0
7 0
8 3
9 3
10 3
11 3
12 3
13 8
14 13
15 5
16 13
17 -1
18 14
SELECT * FROM t2;
i
2
3
5
6
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP FUNCTION f2;
DROP TABLE t1, t2;
#
# End of 5.0 tests
#
......
......@@ -630,8 +630,21 @@ bool THD::store_globals()
}
/* Cleanup after a query */
/*
Cleanup after query.
SYNOPSIS
THD::cleanup_after_query()
DESCRIPTION
This function is used to reset thread data to it's default state.
NOTE
This function is not suitable for setting thread data to some
non-default values, as there is only one replication thread, so
different master threads may overwrite data of each other on
slave.
*/
void THD::cleanup_after_query()
{
if (!in_sub_stmt) /* stored functions and triggers are a special case */
......
......@@ -15438,6 +15438,43 @@ static void test_bug21206()
DBUG_VOID_RETURN;
}
/*
Bug#21726: Incorrect result with multiple invocations of
LAST_INSERT_ID
Test that client gets updated value of insert_id on UPDATE that uses
LAST_INSERT_ID(expr).
*/
static void test_bug21726()
{
const char *create_table[]=
{
"DROP TABLE IF EXISTS t1",
"CREATE TABLE t1 (i INT)",
"INSERT INTO t1 VALUES (1)",
};
const char *update_query= "UPDATE t1 SET i= LAST_INSERT_ID(i + 1)";
int rc;
my_ulonglong insert_id;
DBUG_ENTER("test_bug21726");
myheader("test_bug21726");
fill_tables(create_table, sizeof(create_table) / sizeof(*create_table));
rc= mysql_query(mysql, update_query);
myquery(rc);
insert_id= mysql_insert_id(mysql);
DIE_UNLESS(insert_id == 2);
rc= mysql_query(mysql, update_query);
myquery(rc);
insert_id= mysql_insert_id(mysql);
DIE_UNLESS(insert_id == 3);
DBUG_VOID_RETURN;
}
/*
Read and parse arguments and MySQL options from my.cnf
......@@ -15713,8 +15750,9 @@ static struct my_tests_st my_tests[]= {
{ "test_bug17667", test_bug17667 },
{ "test_bug15752", test_bug15752 },
{ "test_mysql_insert_id", test_mysql_insert_id },
{ "test_bug19671", test_bug19671},
{ "test_bug21206", test_bug21206},
{ "test_bug19671", test_bug19671 },
{ "test_bug21206", test_bug21206 },
{ "test_bug21726", test_bug21726 },
{ 0, 0 }
};
......
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