summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-01-28 06:48:26 +0200
committerunknown <monty@mashka.mysql.fi>2003-01-28 06:48:26 +0200
commit72455300841e1b00c312c3a03ace3bcbd57a4d2f (patch)
tree9e418865f0fad863fd9f50122562955a2ff1b8e3
parentc46c1258274f4993e5c5cc30cd0d4137d611db5f (diff)
downloadmariadb-git-72455300841e1b00c312c3a03ace3bcbd57a4d2f.tar.gz
Fix when using auto_increment and last_insert_id() in the same insert statement.
sql/sql_base.cc: S
-rw-r--r--mysql-test/r/rpl_insert_id.result15
-rw-r--r--mysql-test/t/rpl_insert_id.test39
-rw-r--r--sql/log.cc2
-rw-r--r--sql/sql_base.cc19
4 files changed, 61 insertions, 14 deletions
diff --git a/mysql-test/r/rpl_insert_id.result b/mysql-test/r/rpl_insert_id.result
new file mode 100644
index 00000000000..0298cca5da5
--- /dev/null
+++ b/mysql-test/r/rpl_insert_id.result
@@ -0,0 +1,15 @@
+a
+1
+2
+3
+4
+b c
+1 4
+a
+10
+11
+12
+13
+b c
+5 0
+6 11
diff --git a/mysql-test/t/rpl_insert_id.test b/mysql-test/t/rpl_insert_id.test
new file mode 100644
index 00000000000..3f3636d3082
--- /dev/null
+++ b/mysql-test/t/rpl_insert_id.test
@@ -0,0 +1,39 @@
+#see if queries that use both
+#auto_increment and LAST_INSERT_ID()
+#are replicated well
+source include/master-slave.inc;
+connection master;
+drop table if exists t1;
+create table t1(a int auto_increment, key(a));
+create table t2(b int auto_increment, c int, key(b));
+insert into t1 values (1),(2),(3);
+insert into t1 values (null);
+insert into t2 values (null,last_insert_id());
+save_master_pos;
+connection slave;
+sync_with_master;
+select * from t1;
+select * from t2;
+connection master;
+#check if multi-line inserts,
+#which set last_insert_id to the first id inserted,
+#are replicated the same way
+drop table t1;
+drop table t2;
+create table t1(a int auto_increment, key(a));
+create table t2(b int auto_increment, c int, key(b));
+insert into t1 values (10);
+insert into t1 values (null),(null),(null);
+insert into t2 values (5,0);
+insert into t2 values (null,last_insert_id());
+save_master_pos;
+connection slave;
+sync_with_master;
+select * from t1;
+select * from t2;
+connection master;
+drop table t1;
+drop table t2;
+save_master_pos;
+connection slave;
+sync_with_master;
diff --git a/sql/log.cc b/sql/log.cc
index ab3277fe58b..5e5d5b9368e 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -697,7 +697,7 @@ bool MYSQL_LOG::write(Query_log_event* event_info)
if (thd->last_insert_id_used)
{
- Intvar_log_event e((uchar)LAST_INSERT_ID_EVENT, thd->last_insert_id);
+ Intvar_log_event e((uchar)LAST_INSERT_ID_EVENT, thd->current_insert_id);
if(thd->server_id)
e.server_id = thd->server_id;
if (e.write(file))
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index fb120442385..bab4c151ef3 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -522,26 +522,19 @@ void close_temporary_tables(THD *thd)
{
TABLE *table,*next;
char *query, *end;
- const uint init_query_buf_size = 11; // "drop table "
uint query_buf_size;
bool found_user_tables = 0;
-
LINT_INIT(end);
- query_buf_size = init_query_buf_size;
-
- for (table=thd->temporary_tables ; table ; table=table->next)
- {
- query_buf_size += table->key_length;
- }
- if (query_buf_size == init_query_buf_size)
+ if (!thd->temporary_tables)
return; // no tables to close
+ query_buf_size= 11; // "drop table "
+ for (table=thd->temporary_tables ; table ; table=table->next)
+ query_buf_size+= table->key_length +1;
+
if ((query = alloc_root(&thd->mem_root, query_buf_size)))
- {
- memcpy(query, "drop table ", init_query_buf_size);
- end = query + init_query_buf_size;
- }
+ end= strmov(query, "drop table ");
for (table=thd->temporary_tables ; table ; table=next)
{