|
| 1 | +--source include/have_ndb.inc |
| 2 | +--source include/have_binlog_format_mixed_or_row.inc |
| 3 | +--source suite/ndb_rpl/ndb_master-slave.inc |
| 4 | + |
| 5 | + |
| 6 | +--echo # |
| 7 | +--echo # Bug#33974581 Update of table with hidden key stops applier |
| 8 | +--echo # |
| 9 | +--echo # When Applier process changes to a hidden key table it need to read |
| 10 | +--echo # from NDB instead of just defining another update or write. Before the |
| 11 | +--echo # read can take place, any already defined operations need to be sent to |
| 12 | +--echo # NDB. This is done both in order to "read your own writes" as well as |
| 13 | +--echo # handle constraint violation and missing row errors in the same way as |
| 14 | +--echo # if the table with hidden key was not changed. |
| 15 | +--echo # |
| 16 | + |
| 17 | +--echo # |
| 18 | +--echo # 1) This test shows "read your own write" for table with hidden pk. |
| 19 | +--echo # Since the table has hidden pk the UPDATE will need to read rows |
| 20 | +--echo # from NDB, find the ones that match the condition and then update those. |
| 21 | +--echo # In order to make it possible for NDB to return the first INSERT it |
| 22 | +--echo # need to be prepared/flushed before starting to read. |
| 23 | +--echo # |
| 24 | +--source include/rpl_connection_master.inc |
| 25 | +CREATE TABLE t1 (a INT, b INT) engine = NDB; |
| 26 | +INSERT INTO t1 VALUES (1, 1); |
| 27 | +UPDATE t1 SET a=NULL where b=1; |
| 28 | +--source include/sync_slave_sql_with_master.inc |
| 29 | + |
| 30 | +--source include/rpl_connection_master.inc |
| 31 | +DROP TABLE t1; |
| 32 | +--source include/sync_slave_sql_with_master.inc |
| 33 | + |
| 34 | +--echo # |
| 35 | +--echo # 2) This tests show that applying changes to table with hidden pk |
| 36 | +--echo # ignore error(s) from previously defined changes (in the same epoch |
| 37 | +--echo # transaction) as they should. |
| 38 | +--echo # |
| 39 | +--source include/rpl_connection_master.inc |
| 40 | +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) engine = NDB; |
| 41 | +CREATE TABLE t2_hidden_pk (a INT, b INT) engine = NDB; |
| 42 | +CREATE TABLE t3_hidden_pk_unique (a INT, b INT, unique(b)) engine = NDB; |
| 43 | +CREATE TABLE t4_hidden_pk_index (a INT, b INT, index(b)) engine = NDB; |
| 44 | +INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4), (5,5); |
| 45 | +INSERT INTO t2_hidden_pk VALUES (1,1), (2,2), (3,3), (4,4), (5,5); |
| 46 | +INSERT INTO t3_hidden_pk_unique VALUES (1,1), (2,2), (3,3), (4,4), (5,5); |
| 47 | +INSERT INTO t4_hidden_pk_index VALUES (1,1), (2,2), (3,3), (4,4), (5,5); |
| 48 | +--source include/sync_slave_sql_with_master.inc |
| 49 | + |
| 50 | +--source include/rpl_connection_slave.inc |
| 51 | +--echo ## Delete rows on replica to make it possible to change something |
| 52 | +--echo ## on the source that would then fail when applied on the replica. |
| 53 | +DELETE FROM t1 WHERE a = 5; |
| 54 | +DELETE FROM t2_hidden_pk WHERE a = 5; |
| 55 | +DELETE FROM t3_hidden_pk_unique WHERE a = 5; |
| 56 | +DELETE FROM t4_hidden_pk_index WHERE a = 5; |
| 57 | + |
| 58 | +--echo ## Case 1, pk table (the "normal" case) |
| 59 | +--echo ## - update row that does not exist on replica |
| 60 | +--echo ## - update pk table -> direct update |
| 61 | +--source include/rpl_connection_master.inc |
| 62 | +BEGIN; |
| 63 | +UPDATE t1 SET b = 0 WHERE a = 5; |
| 64 | +UPDATE t1 SET b = 10 WHERE a = 1; |
| 65 | +COMMIT; |
| 66 | +--source include/sync_slave_sql_with_master.inc |
| 67 | + |
| 68 | +--echo ## Case 2, hidden pk table |
| 69 | +--echo ## - update row that does not exist on replica |
| 70 | +--echo ## - update hidden pk table -> uses scan |
| 71 | +--source include/rpl_connection_master.inc |
| 72 | +BEGIN; |
| 73 | +UPDATE t1 SET b = 0 WHERE a = 5; |
| 74 | +UPDATE t2_hidden_pk SET b = 10 WHERE a = 1; |
| 75 | +COMMIT; |
| 76 | +--source include/sync_slave_sql_with_master.inc |
| 77 | + |
| 78 | +--echo ## Case 3, hidden pk table with unique index |
| 79 | +--echo ## - update row that does not exist on replica |
| 80 | +--echo ## - update hidden pk table with unique index -> uses index scan |
| 81 | +--source include/rpl_connection_master.inc |
| 82 | +BEGIN; |
| 83 | +UPDATE t1 SET b = 0 WHERE a = 5; |
| 84 | +UPDATE t3_hidden_pk_unique SET a = 30 WHERE b < 3; |
| 85 | +COMMIT; |
| 86 | +--source include/sync_slave_sql_with_master.inc |
| 87 | + |
| 88 | +--echo ## Case 4, hidden pk table with index |
| 89 | +--echo ## - update row that does not exist on replica |
| 90 | +--echo ## - update hidden pk table with index -> uses index scan |
| 91 | +--source include/rpl_connection_master.inc |
| 92 | +BEGIN; |
| 93 | +UPDATE t1 SET b = 0 WHERE a = 5; |
| 94 | +UPDATE t4_hidden_pk_index SET a = 40 WHERE b < 4; |
| 95 | +COMMIT; |
| 96 | +--source include/sync_slave_sql_with_master.inc |
| 97 | + |
| 98 | +--echo # Cleanup |
| 99 | +--source include/rpl_connection_master.inc |
| 100 | +DROP TABLE t1, t2_hidden_pk, t3_hidden_pk_unique, t4_hidden_pk_index; |
| 101 | +--source include/sync_slave_sql_with_master.inc |
| 102 | + |
| 103 | +--source include/rpl_end.inc |
0 commit comments