Commit cea30533 authored by unknown's avatar unknown

BUG# 14768

Added fixes to make last_insert_id() to work.


mysql-test/r/federated.result:
  BUG #14768
  
  New test results for last_insert_id()
mysql-test/t/federated.test:
  BUG #14768
  
  Tests for last_insert_id()
sql/ha_federated.cc:
  BUG# 14768
  
  * Added code to set last_insert_id()
  * Added code to free share->scheme
sql/ha_federated.h:
  BUG #14768
  
  New method for setting last_insert_id()
parent bee074d1
...@@ -1517,6 +1517,48 @@ bitty ...@@ -1517,6 +1517,48 @@ bitty
drop table federated.t1; drop table federated.t1;
drop table federated.t1; drop table federated.t1;
DROP TABLE IF EXISTS 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 DATABASE IF EXISTS federated;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
DROP DATABASE IF EXISTS federated; DROP DATABASE IF EXISTS federated;
...@@ -1224,4 +1224,34 @@ drop table federated.t1; ...@@ -1224,4 +1224,34 @@ drop table federated.t1;
connection slave; connection slave;
drop table federated.t1; 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; source include/federated_cleanup.inc;
...@@ -1393,6 +1393,12 @@ static int free_share(FEDERATED_SHARE *share) ...@@ -1393,6 +1393,12 @@ static int free_share(FEDERATED_SHARE *share)
hash_delete(&federated_open_tables, (byte*) share); hash_delete(&federated_open_tables, (byte*) share);
my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR));
share->scheme= 0; share->scheme= 0;
if (share->socket)
{
my_free((gptr) share->socket, MYF(MY_ALLOW_ZERO_PTR));
share->socket= 0;
}
thr_lock_delete(&share->lock); thr_lock_delete(&share->lock);
VOID(pthread_mutex_destroy(&share->mutex)); VOID(pthread_mutex_destroy(&share->mutex));
my_free((gptr) share, MYF(0)); my_free((gptr) share, MYF(0));
...@@ -1695,10 +1701,34 @@ int ha_federated::write_row(byte *buf) ...@@ -1695,10 +1701,34 @@ int ha_federated::write_row(byte *buf)
{ {
DBUG_RETURN(stash_remote_error()); 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); 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) int ha_federated::optimize(THD* thd, HA_CHECK_OPT* check_opt)
{ {
......
...@@ -285,6 +285,7 @@ class ha_federated: public handler ...@@ -285,6 +285,7 @@ class ha_federated: public handler
void position(const byte *record); //required void position(const byte *record); //required
void info(uint); //required void info(uint); //required
void update_auto_increment(void);
int repair(THD* thd, HA_CHECK_OPT* check_opt); int repair(THD* thd, HA_CHECK_OPT* check_opt);
int optimize(THD* thd, HA_CHECK_OPT* check_opt); int optimize(THD* thd, HA_CHECK_OPT* check_opt);
......
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