Commit 2268afed authored by unknown's avatar unknown

BUG#21381 - Engine not notified about multi-table UPDATE IGNORE

Though this is not storage engine specific problem, I was able to
repeat this problem with BDB and NDB engines only. That was the
reason to add a test case into ndb_update.test. As a result
different bad things could happen.

BDB has removed duplicate rows which is not expected.
NDB returns an error.

For multi table update notify storage engine about UPDATE IGNORE
as it is done in single table UPDATE.


mysql-test/r/ndb_update.result:
  A test case for bug#21381.
mysql-test/t/ndb_update.test:
  A test case for bug#21381.
sql/sql_update.cc:
  For multi table update notify storage engine about UPDATE IGNORE
  as it is done in single table UPDATE.
parent 186573b3
...@@ -31,3 +31,11 @@ pk1 b c ...@@ -31,3 +31,11 @@ pk1 b c
12 2 2 12 2 2
14 1 1 14 1 1
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a INT NOT NULL, UNIQUE(a)) ENGINE=ndbcluster;
INSERT INTO t1 VALUES(1),(2);
UPDATE IGNORE t1, t1 AS t1a SET t1.a=3;
SELECT a FROM t1 ORDER BY a;
a
1
3
DROP TABLE t1;
...@@ -33,4 +33,13 @@ select * from t1 order by pk1; ...@@ -33,4 +33,13 @@ select * from t1 order by pk1;
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
--enable_warnings --enable_warnings
#
# BUG#21381 - Engine not notified about multi-table UPDATE IGNORE
#
CREATE TABLE t1(a INT NOT NULL, UNIQUE(a)) ENGINE=ndbcluster;
INSERT INTO t1 VALUES(1),(2);
UPDATE IGNORE t1, t1 AS t1a SET t1.a=3;
SELECT a FROM t1 ORDER BY a;
DROP TABLE t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -901,6 +901,8 @@ multi_update::initialize_tables(JOIN *join) ...@@ -901,6 +901,8 @@ multi_update::initialize_tables(JOIN *join)
List<Item> temp_fields= *fields_for_table[cnt]; List<Item> temp_fields= *fields_for_table[cnt];
ORDER group; ORDER group;
if (ignore)
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
if (table == main_table) // First table in join if (table == main_table) // First table in join
{ {
if (safe_update_on_fly(join->join_tab, &temp_fields)) if (safe_update_on_fly(join->join_tab, &temp_fields))
...@@ -1007,7 +1009,11 @@ multi_update::~multi_update() ...@@ -1007,7 +1009,11 @@ multi_update::~multi_update()
{ {
TABLE_LIST *table; TABLE_LIST *table;
for (table= update_tables ; table; table= table->next) for (table= update_tables ; table; table= table->next)
{
table->table->no_keyread= table->table->no_cache= 0; table->table->no_keyread= table->table->no_cache= 0;
if (ignore)
table->table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
}
if (tmp_tables) if (tmp_tables)
{ {
......
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