Skip to content

Commit

Permalink
Merge pull request #8423 from planetscale/vrepl-any-uk-source-target
Browse files Browse the repository at this point in the history
VReplication: support different keys on source and target tables (different covered columns)
  • Loading branch information
shlomi-noach authored Jul 13, 2021
2 parents 0ecc59e + 7a5a564 commit 30250f5
Show file tree
Hide file tree
Showing 23 changed files with 774 additions and 297 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -180,9 +180,89 @@ var (
alterStatement: "drop primary key, add primary key(updates, id)",
},
{
name: "fail; no shared UK",
name: "different PRIMARY KEY",
prepareStatement: "",
alterStatement: "drop primary key, add primary key(id_negative)",
},
{
name: "extended PRIMARY KEY",
prepareStatement: "",
alterStatement: "drop primary key, add primary key(id, id_negative)",
},
{
name: "extended PRIMARY KEY, different order",
prepareStatement: "",
alterStatement: "drop primary key, add primary key(id_negative, id)",
},
{
name: "reduced PRIMARY KEY",
prepareStatement: "drop primary key, add primary key(id, id_negative)",
alterStatement: "drop primary key, add primary key(id)",
},
{
name: "reduced PRIMARY KEY 2",
prepareStatement: "drop primary key, add primary key(id, id_negative)",
alterStatement: "drop primary key, add primary key(id_negative)",
},
{
name: "different PRIMARY KEY, text",
prepareStatement: "",
alterStatement: "drop primary key, add primary key(rand_text(40))",
},
{
name: "different PRIMARY KEY, rand",
prepareStatement: "",
alterStatement: "drop primary key, add primary key(rand_num, rand_text(40))",
},
{
name: "different PRIMARY KEY, from negative to int",
prepareStatement: "drop primary key, add primary key(id_negative)",
alterStatement: "drop primary key, add primary key(id)",
},
{
name: "different PRIMARY KEY, from text to int",
prepareStatement: "drop primary key, add primary key(rand_text(40))",
alterStatement: "drop primary key, add primary key(id)",
},
{
name: "different PRIMARY KEY, from text to rand",
prepareStatement: "drop primary key, add primary key(rand_text(40))",
alterStatement: "drop primary key, add primary key(rand_num, rand_text(40))",
},
{
name: "partially shared PRIMARY KEY 1",
prepareStatement: "drop primary key, add primary key(id, id_negative)",
alterStatement: "drop primary key, add primary key(id, rand_text(40))",
},
{
name: "partially shared PRIMARY KEY 2",
prepareStatement: "drop primary key, add primary key(id, id_negative)",
alterStatement: "drop primary key, add primary key(id_negative, rand_text(40))",
},
{
name: "partially shared PRIMARY KEY 3",
prepareStatement: "drop primary key, add primary key(id, id_negative)",
alterStatement: "drop primary key, add primary key(rand_text(40), id)",
},
{
name: "partially shared PRIMARY KEY 4",
prepareStatement: "drop primary key, add primary key(id_negative, id)",
alterStatement: "drop primary key, add primary key(rand_text(40), id)",
},
{
name: "different PRIMARY KEY vs UNIQUE KEY",
prepareStatement: "",
alterStatement: "drop primary key, add unique key(id_negative)",
},
{
name: "no shared UK, multiple options",
prepareStatement: "add unique key negative_uidx(id_negative)",
alterStatement: "drop primary key, drop key negative_uidx, add primary key(rand_text(40)), add unique key negtext_uidx(id_negative, rand_text(40))",
},
{
name: "fail; no uk on target",
prepareStatement: "",
alterStatement: "drop primary key",
expectFailure: true,
},
{
Expand All @@ -197,7 +277,7 @@ var (
`

insertRowStatement = `
INSERT IGNORE INTO stress_test (id, id_negative, rand_text, rand_num, op_order) VALUES (%d, %d, concat(left(md5(rand()), 8), '_', %d), floor(rand()*1000000), %d)
INSERT IGNORE INTO stress_test (id, id_negative, rand_text, rand_num, op_order) VALUES (%d, %d, concat(left(md5(%d), 8), '_', %d), floor(rand()*1000000), %d)
`
updateRowStatement = `
UPDATE stress_test SET op_order=%d, updates=updates+1 WHERE id=%d
Expand Down Expand Up @@ -480,7 +560,7 @@ func getCreateTableStatement(t *testing.T, tablet *cluster.Vttablet, tableName s

func generateInsert(t *testing.T, conn *mysql.Conn) error {
id := rand.Int31n(int32(maxTableRows))
query := fmt.Sprintf(insertRowStatement, id, -id, id, nextOpOrder())
query := fmt.Sprintf(insertRowStatement, id, -id, id, id, nextOpOrder())
qr, err := conn.ExecuteFetch(query, 1000, true)
if err == nil && qr != nil {
assert.Less(t, qr.RowsAffected, uint64(2))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
modify id int unsigned not null, drop primary key, add primary key (uu)
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
drop table if exists onlineddl_test;
create table onlineddl_test (
id int auto_increment,
uu varchar(64) not null,
ts timestamp,
primary key(id)
) auto_increment=1;

insert into onlineddl_test values (null, uuid(), now());

drop event if exists onlineddl_test;
delimiter ;;
create event onlineddl_test
on schedule every 1 second
starts current_timestamp
ends current_timestamp + interval 60 second
on completion not preserve
enable
do
begin
insert into onlineddl_test values (null, uuid(), now());
insert into onlineddl_test values (null, uuid(), now());
insert into onlineddl_test values (null, uuid(), now());
end ;;
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ create table onlineddl_test (
unique key its_uidx(i, id)
) ;

insert into onlineddl_test values (null, 3, now(6));

drop event if exists onlineddl_test;
delimiter ;;
create event onlineddl_test
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
drop table if exists onlineddl_test;
create table onlineddl_test (
id int auto_increment,
i int not null,
ts timestamp,
primary key(id)
) auto_increment=1;

insert into onlineddl_test values (null, 3, now());

drop event if exists onlineddl_test;
delimiter ;;
create event onlineddl_test
on schedule every 1 second
starts current_timestamp
ends current_timestamp + interval 60 second
on completion not preserve
enable
do
begin
insert into onlineddl_test values (null, 11, now());
insert into onlineddl_test values (null, 13, now());
insert into onlineddl_test values (null, 17, now());
end ;;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
drop primary key, add column id int unsigned auto_increment primary key
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
drop table if exists onlineddl_test;
create table onlineddl_test (
uu varchar(64) not null,
ts timestamp,
primary key(uu)
);

insert into onlineddl_test values (uuid(), now());

drop event if exists onlineddl_test;
delimiter ;;
create event onlineddl_test
on schedule every 1 second
starts current_timestamp
ends current_timestamp + interval 60 second
on completion not preserve
enable
do
begin
insert into onlineddl_test values (uuid(), now());
insert into onlineddl_test values (uuid(), now());

set @uu := uuid();
insert into onlineddl_test values (@uu, now());
update onlineddl_test set ts=now() + interval 1 hour where uu=@uu;
end ;;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Found no possible

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,7 @@ begin
insert into onlineddl_test (id, jsonobj) values (null, '{"_id":19}');
insert into onlineddl_test (id, jsonobj) values (null, '{"_id":23}');
insert into onlineddl_test (id, jsonobj) values (null, '{"_id":27}');

set @last_insert_id := last_insert_id();
update onlineddl_test set jsonobj=JSON_OBJECT('_id', 27, 'name', 'carrot') where id=@last_insert_id and idb=27;
end ;;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
drop primary key, add primary key (id, i)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
drop primary key, add primary key (id)
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
drop table if exists onlineddl_test;
create table onlineddl_test (
id int auto_increment,
i int not null,
ts timestamp,
primary key(id, i)
) auto_increment=1;

insert into onlineddl_test values (null, 3, now());

drop event if exists onlineddl_test;
delimiter ;;
create event onlineddl_test
on schedule every 1 second
starts current_timestamp
ends current_timestamp + interval 60 second
on completion not preserve
enable
do
begin
insert into onlineddl_test values (null, 11, now());
insert into onlineddl_test values (null, 13, now());
insert into onlineddl_test values (null, 17, now());
end ;;
Loading

0 comments on commit 30250f5

Please sign in to comment.