Commit 812d1521 authored by holyfoot@mysql.com's avatar holyfoot@mysql.com

Merge bk@192.168.21.1:mysql-5.1-kt

into mysql.com:/home/hf/work/mysql-5.1.14573
parents 3f694eae e5f04160
...@@ -418,3 +418,9 @@ a val ...@@ -418,3 +418,9 @@ a val
2 1 2 1
3 1 3 1
drop table t1; drop table t1;
CREATE TABLE t1 (t1 INT(10) PRIMARY KEY, t2 INT(10));
INSERT INTO t1 VALUES(0, 0);
INSERT INTO t1 VALUES(1, 1);
ALTER TABLE t1 CHANGE t1 t1 INT(10) auto_increment;
ERROR 23000: ALTER TABLE causes auto_increment resequencing, causing Duplicate entry '1' for key 'PRIMARY'
DROP TABLE t1;
...@@ -275,3 +275,14 @@ update t1 set a=2 where a=1; ...@@ -275,3 +275,14 @@ update t1 set a=2 where a=1;
insert into t1 (val) values (1); insert into t1 (val) values (1);
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# Test key duplications with auto-increment in ALTER TABLE
# bug #14573
#
CREATE TABLE t1 (t1 INT(10) PRIMARY KEY, t2 INT(10));
INSERT INTO t1 VALUES(0, 0);
INSERT INTO t1 VALUES(1, 1);
--error ER_DUP_ENTRY
ALTER TABLE t1 CHANGE t1 t1 INT(10) auto_increment;
DROP TABLE t1;
...@@ -1818,6 +1818,24 @@ ulonglong handler::get_auto_increment() ...@@ -1818,6 +1818,24 @@ ulonglong handler::get_auto_increment()
} }
void handler::print_keydupp_error(uint key_nr, const char *msg)
{
/* Write the duplicated key in the error message */
char key[MAX_KEY_LENGTH];
String str(key,sizeof(key),system_charset_info);
/* Table is opened and defined at this point */
key_unpack(&str,table,(uint) key_nr);
uint max_length=MYSQL_ERRMSG_SIZE-(uint) strlen(msg);
if (str.length() >= max_length)
{
str.length(max_length-4);
str.append(STRING_WITH_LEN("..."));
}
my_printf_error(ER_DUP_ENTRY, msg,
MYF(0), str.c_ptr(), table->key_info[key_nr].name);
}
/* /*
Print error that we got from handler function Print error that we got from handler function
...@@ -1857,18 +1875,7 @@ void handler::print_error(int error, myf errflag) ...@@ -1857,18 +1875,7 @@ void handler::print_error(int error, myf errflag)
uint key_nr=get_dup_key(error); uint key_nr=get_dup_key(error);
if ((int) key_nr >= 0) if ((int) key_nr >= 0)
{ {
/* Write the duplicated key in the error message */ print_keydupp_error(key_nr, ER(ER_DUP_ENTRY));
char key[MAX_KEY_LENGTH];
String str(key,sizeof(key),system_charset_info);
/* Table is opened and defined at this point */
key_unpack(&str,table,(uint) key_nr);
uint max_length=MYSQL_ERRMSG_SIZE-(uint) strlen(ER(ER_DUP_ENTRY));
if (str.length() >= max_length)
{
str.length(max_length-4);
str.append(STRING_WITH_LEN("..."));
}
my_error(ER_DUP_ENTRY, MYF(0), str.c_ptr(), table->key_info[key_nr].name);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
textno=ER_DUP_KEY; textno=ER_DUP_KEY;
......
...@@ -865,6 +865,7 @@ class handler :public Sql_alloc ...@@ -865,6 +865,7 @@ class handler :public Sql_alloc
virtual int ha_initialise(); virtual int ha_initialise();
int ha_open(TABLE *table, const char *name, int mode, int test_if_locked); int ha_open(TABLE *table, const char *name, int mode, int test_if_locked);
bool update_auto_increment(); bool update_auto_increment();
void print_keydupp_error(uint key_nr, const char *msg);
virtual void print_error(int error, myf errflag); virtual void print_error(int error, myf errflag);
virtual bool get_error_message(int error, String *buf); virtual bool get_error_message(int error, String *buf);
uint get_dup_key(int error); uint get_dup_key(int error);
......
...@@ -5842,3 +5842,6 @@ ER_WRONG_PARTITION_NAME ...@@ -5842,3 +5842,6 @@ ER_WRONG_PARTITION_NAME
swe "Felaktigt partitionsnamn" swe "Felaktigt partitionsnamn"
ER_CANT_CHANGE_TX_ISOLATION 25001 ER_CANT_CHANGE_TX_ISOLATION 25001
eng "Transaction isolation level can't be changed while a transaction is in progress" eng "Transaction isolation level can't be changed while a transaction is in progress"
ER_DUP_ENTRY_AUTOINCREMENT_CASE
eng "ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '%-.64s' for key '%-.64s'"
...@@ -6332,6 +6332,20 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -6332,6 +6332,20 @@ copy_data_between_tables(TABLE *from,TABLE *to,
(error != HA_ERR_FOUND_DUPP_KEY && (error != HA_ERR_FOUND_DUPP_KEY &&
error != HA_ERR_FOUND_DUPP_UNIQUE)) error != HA_ERR_FOUND_DUPP_UNIQUE))
{ {
if (error == HA_ERR_FOUND_DUPP_KEY)
{
uint key_nr= to->file->get_dup_key(error);
if ((int) key_nr >= 0)
{
const char *err_msg= ER(ER_DUP_ENTRY);
if (key_nr == 0 &&
(to->key_info[0].key_part[0].field->flags & AUTO_INCREMENT_FLAG))
err_msg= ER(ER_DUP_ENTRY_AUTOINCREMENT_CASE);
to->file->print_keydupp_error(key_nr, err_msg);
break;
}
}
to->file->print_error(error,MYF(0)); to->file->print_error(error,MYF(0));
break; break;
} }
......
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