Loading include/my_base.h +9 −1 Original line number Diff line number Diff line Loading @@ -160,7 +160,15 @@ enum ha_extra_function { Off by default. */ HA_EXTRA_WRITE_CAN_REPLACE, HA_EXTRA_WRITE_CANNOT_REPLACE HA_EXTRA_WRITE_CANNOT_REPLACE, /* Inform handler that delete_row()/update_row() cannot batch deletes/updates and should perform them immediately. This may be needed when table has AFTER DELETE/UPDATE triggers which access to subject table. These flags are reset by the handler::extra(HA_EXTRA_RESET) call. */ HA_EXTRA_DELETE_CANNOT_BATCH, HA_EXTRA_UPDATE_CANNOT_BATCH }; /* The following is parameter to ha_panic() */ Loading mysql-test/r/ndb_trigger.result +171 −0 Original line number Diff line number Diff line Loading @@ -116,4 +116,175 @@ op a b d 1 1.050000000000000000000000000000 d 2 2.050000000000000000000000000000 drop tables t1, t2, t3; CREATE TABLE t1 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t1 VALUES (1, 0); CREATE TRIGGER t1_update AFTER UPDATE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id = NEW.id; END // CREATE TABLE t2 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t2 VALUES (2, 0); CREATE TABLE t3 (id INT NOT NULL PRIMARY KEY) ENGINE=ndbcluster; INSERT INTO t3 VALUES (1); CREATE TABLE t4 LIKE t1; CREATE TRIGGER t4_update AFTER UPDATE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id = NEW.id; END // CREATE TABLE t5 LIKE t2; UPDATE t1 SET xy = 3 WHERE id = 1; SELECT xy FROM t1 where id = 1; xy 3 SELECT xy FROM t2 where id = 1; xy 3 UPDATE t1 SET xy = 4 WHERE id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; xy 4 SELECT xy FROM t2 where id = 1; xy 4 INSERT INTO t4 SELECT * FROM t1; INSERT INTO t5 SELECT * FROM t2; UPDATE t1,t4 SET t1.xy = 3, t4.xy = 3 WHERE t1.id = 1 AND t4.id = 1; SELECT xy FROM t1 where id = 1; xy 3 SELECT xy FROM t2 where id = 1; xy 3 SELECT xy FROM t4 where id = 1; xy 3 SELECT xy FROM t5 where id = 1; xy 3 UPDATE t1,t4 SET t1.xy = 4, t4.xy = 4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 1) AND t4.id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; xy 4 SELECT xy FROM t2 where id = 1; xy 4 SELECT xy FROM t4 where id = 1; xy 4 SELECT xy FROM t5 where id = 1; xy 4 INSERT INTO t1 VALUES (1,0) ON DUPLICATE KEY UPDATE xy = 5; SELECT xy FROM t1 where id = 1; xy 5 SELECT xy FROM t2 where id = 1; xy 5 DROP TRIGGER t1_update; DROP TRIGGER t4_update; CREATE TRIGGER t1_delete AFTER DELETE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id > 4; END // CREATE TRIGGER t4_delete AFTER DELETE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id > 4; END // INSERT INTO t1 VALUES (5, 0),(6,0); INSERT INTO t2 VALUES (5, 1),(6,1); INSERT INTO t3 VALUES (5); SELECT * FROM t1 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 1 DELETE FROM t1 WHERE id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; id xy 1 5 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 0 INSERT INTO t1 VALUES (5,0); UPDATE t2 SET xy = 1 WHERE id = 6; TRUNCATE t4; INSERT INTO t4 SELECT * FROM t1; TRUNCATE t5; INSERT INTO t5 SELECT * FROM t2; SELECT * FROM t1 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 1 SELECT * FROM t4 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t5 order by id; id xy 1 5 2 0 5 1 6 1 DELETE FROM t1,t4 USING t1,t3,t4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 5) AND t4.id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; id xy 1 5 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 0 SELECT * FROM t4 order by id; id xy 1 5 6 0 SELECT * FROM t5 order by id; id xy 1 5 2 0 5 1 6 0 INSERT INTO t1 VALUES (5, 0); REPLACE INTO t2 VALUES (6,1); SELECT * FROM t1 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 1 REPLACE INTO t1 VALUES (5, 1); SELECT * FROM t1 order by id; id xy 1 5 5 1 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 0 DROP TRIGGER t1_delete; DROP TRIGGER t4_delete; DROP TABLE t1, t2, t3, t4, t5; End of 5.0 tests mysql-test/t/ndb_trigger.test +108 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,112 @@ select * from t2 order by op, a, b; drop tables t1, t2, t3; # Test for bug#26242 # Verify that AFTER UPDATE/DELETE triggers are executed # after the change has actually taken place CREATE TABLE t1 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t1 VALUES (1, 0); DELIMITER //; CREATE TRIGGER t1_update AFTER UPDATE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id = NEW.id; END // DELIMITER ;// CREATE TABLE t2 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t2 VALUES (2, 0); CREATE TABLE t3 (id INT NOT NULL PRIMARY KEY) ENGINE=ndbcluster; INSERT INTO t3 VALUES (1); CREATE TABLE t4 LIKE t1; DELIMITER //; CREATE TRIGGER t4_update AFTER UPDATE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id = NEW.id; END // DELIMITER ;// CREATE TABLE t5 LIKE t2; UPDATE t1 SET xy = 3 WHERE id = 1; SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; UPDATE t1 SET xy = 4 WHERE id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; INSERT INTO t4 SELECT * FROM t1; INSERT INTO t5 SELECT * FROM t2; UPDATE t1,t4 SET t1.xy = 3, t4.xy = 3 WHERE t1.id = 1 AND t4.id = 1; SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; SELECT xy FROM t4 where id = 1; SELECT xy FROM t5 where id = 1; UPDATE t1,t4 SET t1.xy = 4, t4.xy = 4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 1) AND t4.id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; SELECT xy FROM t4 where id = 1; SELECT xy FROM t5 where id = 1; INSERT INTO t1 VALUES (1,0) ON DUPLICATE KEY UPDATE xy = 5; SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; DROP TRIGGER t1_update; DROP TRIGGER t4_update; DELIMITER //; CREATE TRIGGER t1_delete AFTER DELETE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id > 4; END // DELIMITER ;// DELIMITER //; CREATE TRIGGER t4_delete AFTER DELETE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id > 4; END // DELIMITER ;// INSERT INTO t1 VALUES (5, 0),(6,0); INSERT INTO t2 VALUES (5, 1),(6,1); INSERT INTO t3 VALUES (5); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; DELETE FROM t1 WHERE id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; INSERT INTO t1 VALUES (5,0); UPDATE t2 SET xy = 1 WHERE id = 6; TRUNCATE t4; INSERT INTO t4 SELECT * FROM t1; TRUNCATE t5; INSERT INTO t5 SELECT * FROM t2; SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; SELECT * FROM t4 order by id; SELECT * FROM t5 order by id; DELETE FROM t1,t4 USING t1,t3,t4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 5) AND t4.id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; SELECT * FROM t4 order by id; SELECT * FROM t5 order by id; INSERT INTO t1 VALUES (5, 0); REPLACE INTO t2 VALUES (6,1); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; REPLACE INTO t1 VALUES (5, 1); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; DROP TRIGGER t1_delete; DROP TRIGGER t4_delete; DROP TABLE t1, t2, t3, t4, t5; --echo End of 5.0 tests sql/ha_ndbcluster.cc +23 −4 Original line number Diff line number Diff line Loading @@ -2523,8 +2523,13 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data) ERR_RETURN(op->getNdbError()); } // Execute update operation if (!cursor && execute_no_commit(this,trans,false) != 0) { /* Execute update operation if we are not doing a scan for update and there exist UPDATE AFTER triggers */ if ((!cursor || m_update_cannot_batch) && execute_no_commit(this,trans,false) != 0) { no_uncommitted_rows_execute_failure(); DBUG_RETURN(ndb_err(trans)); } Loading Loading @@ -2565,7 +2570,7 @@ int ha_ndbcluster::delete_row(const byte *record) no_uncommitted_rows_update(-1); if (!m_primary_key_update) if (!(m_primary_key_update || m_delete_cannot_batch)) // If deleting from cursor, NoCommit will be handled in next_result DBUG_RETURN(0); } Loading Loading @@ -3406,6 +3411,16 @@ int ha_ndbcluster::extra(enum ha_extra_function operation) DBUG_PRINT("info", ("Turning OFF use of write instead of insert")); m_use_write= FALSE; break; case HA_EXTRA_DELETE_CANNOT_BATCH: DBUG_PRINT("info", ("HA_EXTRA_DELETE_CANNOT_BATCH")); m_delete_cannot_batch= TRUE; break; case HA_EXTRA_UPDATE_CANNOT_BATCH: DBUG_PRINT("info", ("HA_EXTRA_UPDATE_CANNOT_BATCH")); m_update_cannot_batch= TRUE; break; default: break; } DBUG_RETURN(0); Loading @@ -3422,6 +3437,8 @@ int ha_ndbcluster::reset() m_retrieve_primary_key= FALSE; m_ignore_dup_key= FALSE; m_use_write= FALSE; m_delete_cannot_batch= FALSE; m_update_cannot_batch= FALSE; DBUG_RETURN(0); } Loading Loading @@ -4788,6 +4805,8 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): m_bulk_insert_rows((ha_rows) 1024), m_rows_changed((ha_rows) 0), m_bulk_insert_not_flushed(FALSE), m_delete_cannot_batch(FALSE), m_update_cannot_batch(FALSE), m_ops_pending(0), m_skip_auto_increment(TRUE), m_blobs_pending(0), Loading Loading @@ -7127,7 +7146,7 @@ void ndb_serialize_cond(const Item *item, void *arg) Check that the field is part of the table of the handler instance and that we expect a field with of this result type. */ if (context->table == field->table) if (context->table->s == field->table->s) { const NDBTAB *tab= (const NDBTAB *) context->ndb_table; DBUG_PRINT("info", ("FIELD_ITEM")); Loading sql/ha_ndbcluster.h +2 −0 Original line number Diff line number Diff line Loading @@ -774,6 +774,8 @@ bool uses_blob_value(bool all_fields); ha_rows m_bulk_insert_rows; ha_rows m_rows_changed; bool m_bulk_insert_not_flushed; bool m_delete_cannot_batch; bool m_update_cannot_batch; ha_rows m_ops_pending; bool m_skip_auto_increment; bool m_blobs_pending; Loading Loading
include/my_base.h +9 −1 Original line number Diff line number Diff line Loading @@ -160,7 +160,15 @@ enum ha_extra_function { Off by default. */ HA_EXTRA_WRITE_CAN_REPLACE, HA_EXTRA_WRITE_CANNOT_REPLACE HA_EXTRA_WRITE_CANNOT_REPLACE, /* Inform handler that delete_row()/update_row() cannot batch deletes/updates and should perform them immediately. This may be needed when table has AFTER DELETE/UPDATE triggers which access to subject table. These flags are reset by the handler::extra(HA_EXTRA_RESET) call. */ HA_EXTRA_DELETE_CANNOT_BATCH, HA_EXTRA_UPDATE_CANNOT_BATCH }; /* The following is parameter to ha_panic() */ Loading
mysql-test/r/ndb_trigger.result +171 −0 Original line number Diff line number Diff line Loading @@ -116,4 +116,175 @@ op a b d 1 1.050000000000000000000000000000 d 2 2.050000000000000000000000000000 drop tables t1, t2, t3; CREATE TABLE t1 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t1 VALUES (1, 0); CREATE TRIGGER t1_update AFTER UPDATE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id = NEW.id; END // CREATE TABLE t2 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t2 VALUES (2, 0); CREATE TABLE t3 (id INT NOT NULL PRIMARY KEY) ENGINE=ndbcluster; INSERT INTO t3 VALUES (1); CREATE TABLE t4 LIKE t1; CREATE TRIGGER t4_update AFTER UPDATE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id = NEW.id; END // CREATE TABLE t5 LIKE t2; UPDATE t1 SET xy = 3 WHERE id = 1; SELECT xy FROM t1 where id = 1; xy 3 SELECT xy FROM t2 where id = 1; xy 3 UPDATE t1 SET xy = 4 WHERE id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; xy 4 SELECT xy FROM t2 where id = 1; xy 4 INSERT INTO t4 SELECT * FROM t1; INSERT INTO t5 SELECT * FROM t2; UPDATE t1,t4 SET t1.xy = 3, t4.xy = 3 WHERE t1.id = 1 AND t4.id = 1; SELECT xy FROM t1 where id = 1; xy 3 SELECT xy FROM t2 where id = 1; xy 3 SELECT xy FROM t4 where id = 1; xy 3 SELECT xy FROM t5 where id = 1; xy 3 UPDATE t1,t4 SET t1.xy = 4, t4.xy = 4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 1) AND t4.id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; xy 4 SELECT xy FROM t2 where id = 1; xy 4 SELECT xy FROM t4 where id = 1; xy 4 SELECT xy FROM t5 where id = 1; xy 4 INSERT INTO t1 VALUES (1,0) ON DUPLICATE KEY UPDATE xy = 5; SELECT xy FROM t1 where id = 1; xy 5 SELECT xy FROM t2 where id = 1; xy 5 DROP TRIGGER t1_update; DROP TRIGGER t4_update; CREATE TRIGGER t1_delete AFTER DELETE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id > 4; END // CREATE TRIGGER t4_delete AFTER DELETE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id > 4; END // INSERT INTO t1 VALUES (5, 0),(6,0); INSERT INTO t2 VALUES (5, 1),(6,1); INSERT INTO t3 VALUES (5); SELECT * FROM t1 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 1 DELETE FROM t1 WHERE id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; id xy 1 5 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 0 INSERT INTO t1 VALUES (5,0); UPDATE t2 SET xy = 1 WHERE id = 6; TRUNCATE t4; INSERT INTO t4 SELECT * FROM t1; TRUNCATE t5; INSERT INTO t5 SELECT * FROM t2; SELECT * FROM t1 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 1 SELECT * FROM t4 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t5 order by id; id xy 1 5 2 0 5 1 6 1 DELETE FROM t1,t4 USING t1,t3,t4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 5) AND t4.id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; id xy 1 5 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 0 SELECT * FROM t4 order by id; id xy 1 5 6 0 SELECT * FROM t5 order by id; id xy 1 5 2 0 5 1 6 0 INSERT INTO t1 VALUES (5, 0); REPLACE INTO t2 VALUES (6,1); SELECT * FROM t1 order by id; id xy 1 5 5 0 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 1 REPLACE INTO t1 VALUES (5, 1); SELECT * FROM t1 order by id; id xy 1 5 5 1 6 0 SELECT * FROM t2 order by id; id xy 1 5 2 0 5 1 6 0 DROP TRIGGER t1_delete; DROP TRIGGER t4_delete; DROP TABLE t1, t2, t3, t4, t5; End of 5.0 tests
mysql-test/t/ndb_trigger.test +108 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,112 @@ select * from t2 order by op, a, b; drop tables t1, t2, t3; # Test for bug#26242 # Verify that AFTER UPDATE/DELETE triggers are executed # after the change has actually taken place CREATE TABLE t1 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t1 VALUES (1, 0); DELIMITER //; CREATE TRIGGER t1_update AFTER UPDATE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id = NEW.id; END // DELIMITER ;// CREATE TABLE t2 ( id INT NOT NULL PRIMARY KEY, xy INT ) ENGINE=ndbcluster; INSERT INTO t2 VALUES (2, 0); CREATE TABLE t3 (id INT NOT NULL PRIMARY KEY) ENGINE=ndbcluster; INSERT INTO t3 VALUES (1); CREATE TABLE t4 LIKE t1; DELIMITER //; CREATE TRIGGER t4_update AFTER UPDATE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id = NEW.id; END // DELIMITER ;// CREATE TABLE t5 LIKE t2; UPDATE t1 SET xy = 3 WHERE id = 1; SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; UPDATE t1 SET xy = 4 WHERE id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; INSERT INTO t4 SELECT * FROM t1; INSERT INTO t5 SELECT * FROM t2; UPDATE t1,t4 SET t1.xy = 3, t4.xy = 3 WHERE t1.id = 1 AND t4.id = 1; SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; SELECT xy FROM t4 where id = 1; SELECT xy FROM t5 where id = 1; UPDATE t1,t4 SET t1.xy = 4, t4.xy = 4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 1) AND t4.id IN (SELECT id FROM t3 WHERE id = 1); SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; SELECT xy FROM t4 where id = 1; SELECT xy FROM t5 where id = 1; INSERT INTO t1 VALUES (1,0) ON DUPLICATE KEY UPDATE xy = 5; SELECT xy FROM t1 where id = 1; SELECT xy FROM t2 where id = 1; DROP TRIGGER t1_update; DROP TRIGGER t4_update; DELIMITER //; CREATE TRIGGER t1_delete AFTER DELETE ON t1 FOR EACH ROW BEGIN REPLACE INTO t2 SELECT * FROM t1 WHERE t1.id > 4; END // DELIMITER ;// DELIMITER //; CREATE TRIGGER t4_delete AFTER DELETE ON t4 FOR EACH ROW BEGIN REPLACE INTO t5 SELECT * FROM t4 WHERE t4.id > 4; END // DELIMITER ;// INSERT INTO t1 VALUES (5, 0),(6,0); INSERT INTO t2 VALUES (5, 1),(6,1); INSERT INTO t3 VALUES (5); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; DELETE FROM t1 WHERE id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; INSERT INTO t1 VALUES (5,0); UPDATE t2 SET xy = 1 WHERE id = 6; TRUNCATE t4; INSERT INTO t4 SELECT * FROM t1; TRUNCATE t5; INSERT INTO t5 SELECT * FROM t2; SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; SELECT * FROM t4 order by id; SELECT * FROM t5 order by id; DELETE FROM t1,t4 USING t1,t3,t4 WHERE t1.id IN (SELECT id FROM t3 WHERE id = 5) AND t4.id IN (SELECT id FROM t3 WHERE id = 5); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; SELECT * FROM t4 order by id; SELECT * FROM t5 order by id; INSERT INTO t1 VALUES (5, 0); REPLACE INTO t2 VALUES (6,1); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; REPLACE INTO t1 VALUES (5, 1); SELECT * FROM t1 order by id; SELECT * FROM t2 order by id; DROP TRIGGER t1_delete; DROP TRIGGER t4_delete; DROP TABLE t1, t2, t3, t4, t5; --echo End of 5.0 tests
sql/ha_ndbcluster.cc +23 −4 Original line number Diff line number Diff line Loading @@ -2523,8 +2523,13 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data) ERR_RETURN(op->getNdbError()); } // Execute update operation if (!cursor && execute_no_commit(this,trans,false) != 0) { /* Execute update operation if we are not doing a scan for update and there exist UPDATE AFTER triggers */ if ((!cursor || m_update_cannot_batch) && execute_no_commit(this,trans,false) != 0) { no_uncommitted_rows_execute_failure(); DBUG_RETURN(ndb_err(trans)); } Loading Loading @@ -2565,7 +2570,7 @@ int ha_ndbcluster::delete_row(const byte *record) no_uncommitted_rows_update(-1); if (!m_primary_key_update) if (!(m_primary_key_update || m_delete_cannot_batch)) // If deleting from cursor, NoCommit will be handled in next_result DBUG_RETURN(0); } Loading Loading @@ -3406,6 +3411,16 @@ int ha_ndbcluster::extra(enum ha_extra_function operation) DBUG_PRINT("info", ("Turning OFF use of write instead of insert")); m_use_write= FALSE; break; case HA_EXTRA_DELETE_CANNOT_BATCH: DBUG_PRINT("info", ("HA_EXTRA_DELETE_CANNOT_BATCH")); m_delete_cannot_batch= TRUE; break; case HA_EXTRA_UPDATE_CANNOT_BATCH: DBUG_PRINT("info", ("HA_EXTRA_UPDATE_CANNOT_BATCH")); m_update_cannot_batch= TRUE; break; default: break; } DBUG_RETURN(0); Loading @@ -3422,6 +3437,8 @@ int ha_ndbcluster::reset() m_retrieve_primary_key= FALSE; m_ignore_dup_key= FALSE; m_use_write= FALSE; m_delete_cannot_batch= FALSE; m_update_cannot_batch= FALSE; DBUG_RETURN(0); } Loading Loading @@ -4788,6 +4805,8 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): m_bulk_insert_rows((ha_rows) 1024), m_rows_changed((ha_rows) 0), m_bulk_insert_not_flushed(FALSE), m_delete_cannot_batch(FALSE), m_update_cannot_batch(FALSE), m_ops_pending(0), m_skip_auto_increment(TRUE), m_blobs_pending(0), Loading Loading @@ -7127,7 +7146,7 @@ void ndb_serialize_cond(const Item *item, void *arg) Check that the field is part of the table of the handler instance and that we expect a field with of this result type. */ if (context->table == field->table) if (context->table->s == field->table->s) { const NDBTAB *tab= (const NDBTAB *) context->ndb_table; DBUG_PRINT("info", ("FIELD_ITEM")); Loading
sql/ha_ndbcluster.h +2 −0 Original line number Diff line number Diff line Loading @@ -774,6 +774,8 @@ bool uses_blob_value(bool all_fields); ha_rows m_bulk_insert_rows; ha_rows m_rows_changed; bool m_bulk_insert_not_flushed; bool m_delete_cannot_batch; bool m_update_cannot_batch; ha_rows m_ops_pending; bool m_skip_auto_increment; bool m_blobs_pending; Loading