Commit fabad719 authored by unknown's avatar unknown

Merge gleb.loc:/home/uchum/work/bk/mysql-5.0-opt

into  gleb.loc:/home/uchum/work/bk/mysql-5.0-opt-27954

parents 44e54a30 35659a28
...@@ -336,3 +336,25 @@ id f1 ...@@ -336,3 +336,25 @@ id f1
0 test1 0 test1
DROP TABLE t1; DROP TABLE t1;
SET SQL_MODE=''; SET SQL_MODE='';
CREATE TABLE t1 (
id INT AUTO_INCREMENT PRIMARY KEY,
c1 CHAR(1) UNIQUE KEY,
cnt INT DEFAULT 1
);
INSERT INTO t1 (c1) VALUES ('A'), ('B'), ('C');
SELECT * FROM t1;
id c1 cnt
1 A 1
2 B 1
3 C 1
INSERT INTO t1 (c1) VALUES ('A'), ('X'), ('Y'), ('Z')
ON DUPLICATE KEY UPDATE cnt=cnt+1;
SELECT * FROM t1;
id c1 cnt
1 A 2
2 B 1
3 C 1
4 X 1
5 Y 1
6 Z 1
DROP TABLE t1;
...@@ -247,3 +247,20 @@ REPLACE INTO t1 VALUES (0,"test1",null); ...@@ -247,3 +247,20 @@ REPLACE INTO t1 VALUES (0,"test1",null);
SELECT id, f1 FROM t1; SELECT id, f1 FROM t1;
DROP TABLE t1; DROP TABLE t1;
SET SQL_MODE=''; SET SQL_MODE='';
#
# Bug#27954: multi-row INSERT ... ON DUPLICATE with duplicated
# row at the first place into table with AUTO_INCREMENT and
# additional UNIQUE key.
#
CREATE TABLE t1 (
id INT AUTO_INCREMENT PRIMARY KEY,
c1 CHAR(1) UNIQUE KEY,
cnt INT DEFAULT 1
);
INSERT INTO t1 (c1) VALUES ('A'), ('B'), ('C');
SELECT * FROM t1;
INSERT INTO t1 (c1) VALUES ('A'), ('X'), ('Y'), ('Z')
ON DUPLICATE KEY UPDATE cnt=cnt+1;
SELECT * FROM t1;
DROP TABLE t1;
...@@ -1685,7 +1685,14 @@ void handler::restore_auto_increment() ...@@ -1685,7 +1685,14 @@ void handler::restore_auto_increment()
{ {
THD *thd= table->in_use; THD *thd= table->in_use;
if (thd->next_insert_id) if (thd->next_insert_id)
{
thd->next_insert_id= thd->prev_insert_id; thd->next_insert_id= thd->prev_insert_id;
if (thd->next_insert_id == 0)
{
/* we didn't generate a value, engine will be called again */
thd->clear_next_insert_id= 0;
}
}
} }
......
...@@ -1431,6 +1431,10 @@ public: ...@@ -1431,6 +1431,10 @@ public:
*/ */
bool insert_id_used; bool insert_id_used;
/*
clear_next_insert_id is set if engine was called at least once
for this statement to generate auto_increment value.
*/
bool clear_next_insert_id; bool clear_next_insert_id;
/* for IS NULL => = last_insert_id() fix in remove_eq_conds() */ /* for IS NULL => = last_insert_id() fix in remove_eq_conds() */
bool substitute_null_with_insert_id; bool substitute_null_with_insert_id;
......
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