Loading mysql-test/r/federated.result +42 −0 Original line number Diff line number Diff line Loading @@ -1517,6 +1517,48 @@ bitty drop table federated.t1; drop table federated.t1; DROP TABLE IF EXISTS federated.t1; Warnings: Note 1051 Unknown table 't1' CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`)); DROP TABLE IF EXISTS federated.t1; Warnings: Note 1051 Unknown table 't1' CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:9308/federated/t1'; INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 1 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 2 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 3 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 4 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 5 SELECT * FROM federated.t1; id 1 2 3 4 5 DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; mysql-test/t/federated.test +30 −0 Original line number Diff line number Diff line Loading @@ -1224,4 +1224,34 @@ drop table federated.t1; connection slave; drop table federated.t1; # # BUG# 14768 test auto_increment last_insert_id() # connection slave; DROP TABLE IF EXISTS federated.t1; CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`)); connection master; DROP TABLE IF EXISTS federated.t1; eval CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'; INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); SELECT * FROM federated.t1; source include/federated_cleanup.inc; sql/ha_federated.cc +30 −0 Original line number Diff line number Diff line Loading @@ -1393,6 +1393,12 @@ static int free_share(FEDERATED_SHARE *share) hash_delete(&federated_open_tables, (byte*) share); my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR)); share->scheme= 0; if (share->socket) { my_free((gptr) share->socket, MYF(MY_ALLOW_ZERO_PTR)); share->socket= 0; } thr_lock_delete(&share->lock); VOID(pthread_mutex_destroy(&share->mutex)); my_free((gptr) share, MYF(0)); Loading Loading @@ -1695,10 +1701,34 @@ int ha_federated::write_row(byte *buf) { DBUG_RETURN(stash_remote_error()); } /* If the table we've just written a record to contains an auto_increment field, then store the last_insert_id() value from the foreign server */ if (table->next_number_field) update_auto_increment(); DBUG_RETURN(0); } /* ha_federated::update_auto_increment This method ensures that last_insert_id() works properly. What it simply does is calls last_insert_id() on the foreign database immediately after insert (if the table has an auto_increment field) and sets the insert id via thd->insert_id(ID) (as well as storing thd->prev_insert_id) */ void ha_federated::update_auto_increment(void) { THD *thd= current_thd; DBUG_ENTER("ha_federated::update_auto_increment"); thd->insert_id(mysql->last_used_con->insert_id); DBUG_PRINT("info",("last_insert_id %d", auto_increment_value)); DBUG_VOID_RETURN; } int ha_federated::optimize(THD* thd, HA_CHECK_OPT* check_opt) { Loading sql/ha_federated.h +1 −0 Original line number Diff line number Diff line Loading @@ -285,6 +285,7 @@ class ha_federated: public handler void position(const byte *record); //required void info(uint); //required void update_auto_increment(void); int repair(THD* thd, HA_CHECK_OPT* check_opt); int optimize(THD* thd, HA_CHECK_OPT* check_opt); Loading Loading
mysql-test/r/federated.result +42 −0 Original line number Diff line number Diff line Loading @@ -1517,6 +1517,48 @@ bitty drop table federated.t1; drop table federated.t1; DROP TABLE IF EXISTS federated.t1; Warnings: Note 1051 Unknown table 't1' CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`)); DROP TABLE IF EXISTS federated.t1; Warnings: Note 1051 Unknown table 't1' CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:9308/federated/t1'; INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 1 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 2 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 3 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 4 INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); LAST_INSERT_ID() 5 SELECT * FROM federated.t1; id 1 2 3 4 5 DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated;
mysql-test/t/federated.test +30 −0 Original line number Diff line number Diff line Loading @@ -1224,4 +1224,34 @@ drop table federated.t1; connection slave; drop table federated.t1; # # BUG# 14768 test auto_increment last_insert_id() # connection slave; DROP TABLE IF EXISTS federated.t1; CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`)); connection master; DROP TABLE IF EXISTS federated.t1; eval CREATE TABLE federated.t1 ( `id` int(20) NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'; INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); INSERT INTO federated.t1 VALUES (); SELECT LAST_INSERT_ID(); SELECT * FROM federated.t1; source include/federated_cleanup.inc;
sql/ha_federated.cc +30 −0 Original line number Diff line number Diff line Loading @@ -1393,6 +1393,12 @@ static int free_share(FEDERATED_SHARE *share) hash_delete(&federated_open_tables, (byte*) share); my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR)); share->scheme= 0; if (share->socket) { my_free((gptr) share->socket, MYF(MY_ALLOW_ZERO_PTR)); share->socket= 0; } thr_lock_delete(&share->lock); VOID(pthread_mutex_destroy(&share->mutex)); my_free((gptr) share, MYF(0)); Loading Loading @@ -1695,10 +1701,34 @@ int ha_federated::write_row(byte *buf) { DBUG_RETURN(stash_remote_error()); } /* If the table we've just written a record to contains an auto_increment field, then store the last_insert_id() value from the foreign server */ if (table->next_number_field) update_auto_increment(); DBUG_RETURN(0); } /* ha_federated::update_auto_increment This method ensures that last_insert_id() works properly. What it simply does is calls last_insert_id() on the foreign database immediately after insert (if the table has an auto_increment field) and sets the insert id via thd->insert_id(ID) (as well as storing thd->prev_insert_id) */ void ha_federated::update_auto_increment(void) { THD *thd= current_thd; DBUG_ENTER("ha_federated::update_auto_increment"); thd->insert_id(mysql->last_used_con->insert_id); DBUG_PRINT("info",("last_insert_id %d", auto_increment_value)); DBUG_VOID_RETURN; } int ha_federated::optimize(THD* thd, HA_CHECK_OPT* check_opt) { Loading
sql/ha_federated.h +1 −0 Original line number Diff line number Diff line Loading @@ -285,6 +285,7 @@ class ha_federated: public handler void position(const byte *record); //required void info(uint); //required void update_auto_increment(void); int repair(THD* thd, HA_CHECK_OPT* check_opt); int optimize(THD* thd, HA_CHECK_OPT* check_opt); Loading