From: Date: January 28 2006 12:43am Subject: bk commit into 5.0 tree (patg:1.2010) BUG#14768 List-Archive: http://lists.mysql.com/commits/1765 X-Bug: 14768 Message-Id: <20060127234349.8AD146586A2@govinda.patg.net> Below is the list of changes that have just been committed into a local 5.0 repository of patg. When patg does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet 1.2010 06/01/27 15:43:44 patg@stripped +4 -0 BUG# 14768 Added fixes to make last_insert_id() to work. sql/ha_federated.h 1.23 06/01/27 15:43:40 patg@stripped +1 -0 BUG #14768 New method for setting last_insert_id() sql/ha_federated.cc 1.59 06/01/27 15:43:40 patg@stripped +30 -0 BUG# 14768 * Added code to set last_insert_id() * Added code to free share->scheme mysql-test/t/federated.test 1.20 06/01/27 15:43:40 patg@stripped +30 -0 BUG #14768 Tests for last_insert_id() mysql-test/r/federated.result 1.24 06/01/27 15:43:40 patg@stripped +42 -0 BUG #14768 New test results for last_insert_id() # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: patg # Host: govinda.patg.net # Root: /home/patg/mysql-build/mysql-5.0 --- 1.23/mysql-test/r/federated.result 2005-11-23 16:36:25 -08:00 +++ 1.24/mysql-test/r/federated.result 2006-01-27 15:43:40 -08:00 @@ -1517,6 +1517,48 @@ 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@stripped: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; --- 1.19/mysql-test/t/federated.test 2005-10-31 17:26:36 -08:00 +++ 1.20/mysql-test/t/federated.test 2006-01-27 15:43:40 -08:00 @@ -1224,4 +1224,34 @@ 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@stripped:$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; --- 1.58/sql/ha_federated.cc 2006-01-05 14:47:40 -08:00 +++ 1.59/sql/ha_federated.cc 2006-01-27 15:43:40 -08:00 @@ -1393,6 +1393,12 @@ 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)); @@ -1695,10 +1701,34 @@ { 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) { --- 1.22/sql/ha_federated.h 2005-11-17 06:05:03 -08:00 +++ 1.23/sql/ha_federated.h 2006-01-27 15:43:40 -08:00 @@ -285,6 +285,7 @@ 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);