TestForeignKeyChecks tests that foreign key constraints replicate correctly when foreign key checks are enabled and disabled.
(t *testing.T)
| 430 | // TestForeignKeyChecks tests that foreign key constraints replicate correctly when foreign key checks are |
| 431 | // enabled and disabled. |
| 432 | func TestForeignKeyChecks(t *testing.T) { |
| 433 | t.SkipNow() |
| 434 | |
| 435 | defer teardown(t) |
| 436 | startSqlServersWithSystemVars(t, duckReplicaSystemVars) |
| 437 | startReplicationAndCreateTestDb(t, mySqlPort) |
| 438 | |
| 439 | // Test that we can execute statement-based replication that requires foreign_key_checks |
| 440 | // being turned off (referenced table doesn't exist yet). |
| 441 | primaryDatabase.MustExec("SET foreign_key_checks = 0;") |
| 442 | primaryDatabase.MustExec("CREATE TABLE t1 (pk int primary key, color varchar(100), FOREIGN KEY (color) REFERENCES colors(name));") |
| 443 | primaryDatabase.MustExec("CREATE TABLE colors (name varchar(100) primary key);") |
| 444 | primaryDatabase.MustExec("SET foreign_key_checks = 1;") |
| 445 | |
| 446 | // Insert a record with foreign key checks enabled |
| 447 | primaryDatabase.MustExec("START TRANSACTION;") |
| 448 | primaryDatabase.MustExec("INSERT INTO colors VALUES ('green'), ('red'), ('blue');") |
| 449 | primaryDatabase.MustExec("INSERT INTO t1 VALUES (1, 'red'), (2, 'green');") |
| 450 | primaryDatabase.MustExec("COMMIT;") |
| 451 | |
| 452 | // Test the Insert path with foreign key checks turned off |
| 453 | primaryDatabase.MustExec("START TRANSACTION;") |
| 454 | primaryDatabase.MustExec("SET foreign_key_checks = 0;") |
| 455 | primaryDatabase.MustExec("INSERT INTO t1 VALUES (3, 'not-a-color');") |
| 456 | primaryDatabase.MustExec("COMMIT;") |
| 457 | |
| 458 | // Test the Update and Delete paths with foreign key checks turned off |
| 459 | primaryDatabase.MustExec("START TRANSACTION;") |
| 460 | primaryDatabase.MustExec("DELETE FROM colors WHERE name='red';") |
| 461 | primaryDatabase.MustExec("UPDATE t1 SET color='still-not-a-color' WHERE pk=2;") |
| 462 | primaryDatabase.MustExec("COMMIT;") |
| 463 | |
| 464 | // Verify the changes on the replica |
| 465 | waitForReplicaToCatchUp(t) |
| 466 | rows, err := replicaDatabase.Queryx("select * from db01.t1 order by pk;") |
| 467 | require.NoError(t, err) |
| 468 | row := convertMapScanResultToStrings(readNextRow(t, rows)) |
| 469 | require.Equal(t, "1", row["pk"]) |
| 470 | require.Equal(t, "red", row["color"]) |
| 471 | row = convertMapScanResultToStrings(readNextRow(t, rows)) |
| 472 | require.Equal(t, "2", row["pk"]) |
| 473 | require.Equal(t, "still-not-a-color", row["color"]) |
| 474 | row = convertMapScanResultToStrings(readNextRow(t, rows)) |
| 475 | require.Equal(t, "3", row["pk"]) |
| 476 | require.Equal(t, "not-a-color", row["color"]) |
| 477 | require.False(t, rows.Next()) |
| 478 | require.NoError(t, rows.Close()) |
| 479 | |
| 480 | rows, err = replicaDatabase.Queryx("select * from db01.colors order by name;") |
| 481 | require.NoError(t, err) |
| 482 | row = convertMapScanResultToStrings(readNextRow(t, rows)) |
| 483 | require.Equal(t, "blue", row["name"]) |
| 484 | row = convertMapScanResultToStrings(readNextRow(t, rows)) |
| 485 | require.Equal(t, "green", row["name"]) |
| 486 | require.False(t, rows.Next()) |
| 487 | require.NoError(t, rows.Close()) |
| 488 | } |
| 489 |
nothing calls this directly
no test coverage detected