diff options
-rw-r--r-- | mysql-test/r/rpl_insert_id.result | 15 | ||||
-rw-r--r-- | mysql-test/t/rpl_insert_id.test | 39 | ||||
-rw-r--r-- | sql/log.cc | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 19 |
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) { |