From 80f8cedf30b5e05e4e327eb64b0b7ee63c195c81 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 8 Apr 2025 13:46:12 +0530 Subject: [PATCH 1/2] [release-19.0] DML test fix for duplicate column value (#18132) --- .../endtoend/vtgate/queries/dml/dml_test.go | 16 ++++++------ .../endtoend/vtgate/queries/dml/main_test.go | 2 +- .../vtgate/queries/dml/sharded_schema.sql | 10 ++++++++ .../endtoend/vtgate/queries/dml/vschema.json | 25 ++++++++++++++++++- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/dml/dml_test.go b/go/test/endtoend/vtgate/queries/dml/dml_test.go index 9d060e99881..b6ce468b63d 100644 --- a/go/test/endtoend/vtgate/queries/dml/dml_test.go +++ b/go/test/endtoend/vtgate/queries/dml/dml_test.go @@ -88,24 +88,24 @@ func TestDeleteWithLimit(t *testing.T) { defer closer() // initial rows - mcmp.Exec("insert into s_tbl(id, num) values (1,10), (2,10), (3,10), (4,20), (5,5), (6,15), (7,17), (8,80)") + mcmp.Exec("insert into s_tbl(id, col) values (1,10), (2,10), (3,10), (4,20), (5,5), (6,15), (7,17), (8,80)") mcmp.Exec("insert into order_tbl(region_id, oid, cust_no) values (1,1,4), (1,2,2), (2,3,5), (2,4,55)") // check rows - mcmp.AssertMatches(`select id, num from s_tbl order by id`, + mcmp.AssertMatches(`select id, col from s_tbl order by id`, `[[INT64(1) INT64(10)] [INT64(2) INT64(10)] [INT64(3) INT64(10)] [INT64(4) INT64(20)] [INT64(5) INT64(5)] [INT64(6) INT64(15)] [INT64(7) INT64(17)] [INT64(8) INT64(80)]]`) mcmp.AssertMatches(`select region_id, oid, cust_no from order_tbl order by oid`, `[[INT64(1) INT64(1) INT64(4)] [INT64(1) INT64(2) INT64(2)] [INT64(2) INT64(3) INT64(5)] [INT64(2) INT64(4) INT64(55)]]`) // delete with limit - qr := mcmp.Exec(`delete from s_tbl order by num, id limit 3`) + qr := mcmp.Exec(`delete from s_tbl order by col, id limit 3`) require.EqualValues(t, 3, qr.RowsAffected) qr = mcmp.Exec(`delete from order_tbl where region_id = 1 limit 1`) require.EqualValues(t, 1, qr.RowsAffected) // check rows - mcmp.AssertMatches(`select id, num from s_tbl order by id`, + mcmp.AssertMatches(`select id, col from s_tbl order by id`, `[[INT64(3) INT64(10)] [INT64(4) INT64(20)] [INT64(6) INT64(15)] [INT64(7) INT64(17)] [INT64(8) INT64(80)]]`) // 2 rows matches but limit is 1, so any one of the row can remain in table. mcmp.AssertMatchesAnyNoCompare(`select region_id, oid, cust_no from order_tbl order by oid`, @@ -113,15 +113,15 @@ func TestDeleteWithLimit(t *testing.T) { `[[INT64(1) INT64(1) INT64(4)] [INT64(2) INT64(3) INT64(5)] [INT64(2) INT64(4) INT64(55)]]`) // delete with limit - qr = mcmp.Exec(`delete from s_tbl where num < 20 limit 2`) + qr = mcmp.Exec(`delete from s_tbl where col < 20 limit 2`) require.EqualValues(t, 2, qr.RowsAffected) qr = mcmp.Exec(`delete from order_tbl limit 5`) require.EqualValues(t, 3, qr.RowsAffected) // check rows - // 3 rows matches `num < 20` but limit is 2 so any one of them can remain in the table. - mcmp.AssertMatchesAnyNoCompare(`select id, num from s_tbl order by id`, + // 3 rows matches `col < 20` but limit is 2 so any one of them can remain in the table. + mcmp.AssertMatchesAnyNoCompare(`select id, col from s_tbl order by id`, `[[INT64(4) INT64(20)] [INT64(7) INT64(17)] [INT64(8) INT64(80)]]`, `[[INT64(3) INT64(10)] [INT64(4) INT64(20)] [INT64(8) INT64(80)]]`, `[[INT64(4) INT64(20)] [INT64(6) INT64(15)] [INT64(8) INT64(80)]]`) @@ -133,7 +133,7 @@ func TestDeleteWithLimit(t *testing.T) { mcmp.Exec(`delete from order_tbl limit 5`) // try with limit again on empty table. - qr = mcmp.Exec(`delete from s_tbl where num < 20 limit 2`) + qr = mcmp.Exec(`delete from s_tbl where col < 20 limit 2`) require.EqualValues(t, 0, qr.RowsAffected) qr = mcmp.Exec(`delete from order_tbl limit 5`) diff --git a/go/test/endtoend/vtgate/queries/dml/main_test.go b/go/test/endtoend/vtgate/queries/dml/main_test.go index 0c4d58aa614..0c9405c4cee 100644 --- a/go/test/endtoend/vtgate/queries/dml/main_test.go +++ b/go/test/endtoend/vtgate/queries/dml/main_test.go @@ -132,7 +132,7 @@ func start(t *testing.T) (utils.MySQLCompare, func()) { _, _ = utils.ExecAllowError(t, mcmp.VtConn, "set workload = oltp") tables := []string{ - "s_tbl", "num_vdx_tbl", "user_tbl", "order_tbl", "oevent_tbl", "oextra_tbl", + "s_tbl", "num_vdx_tbl", "col_vdx_tbl", "user_tbl", "order_tbl", "oevent_tbl", "oextra_tbl", "auto_tbl", "oid_vdx_tbl", "unq_idx", "nonunq_idx", "u_tbl", "mixed_tbl", "lkp_map_idx", "j_tbl", "j_utbl", } for _, table := range tables { diff --git a/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql b/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql index cc24737a0fa..703e11e705b 100644 --- a/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql +++ b/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql @@ -2,6 +2,8 @@ create table s_tbl ( id bigint, num bigint, + col bigint, + unique key (num), primary key (id) ) Engine = InnoDB; @@ -12,6 +14,14 @@ create table num_vdx_tbl primary key (num) ) Engine = InnoDB; +create table col_vdx_tbl +( + col bigint, + id bigint, + keyspace_id varbinary(20), + primary key (col, id) +) Engine = InnoDB; + create table user_tbl ( id bigint, diff --git a/go/test/endtoend/vtgate/queries/dml/vschema.json b/go/test/endtoend/vtgate/queries/dml/vschema.json index 72a949a49e4..9ba4ce9ebfb 100644 --- a/go/test/endtoend/vtgate/queries/dml/vschema.json +++ b/go/test/endtoend/vtgate/queries/dml/vschema.json @@ -9,7 +9,18 @@ "params": { "table": "num_vdx_tbl", "from": "num", - "to": "keyspace_id" + "to": "keyspace_id", + "ignore_nulls": "true" + }, + "owner": "s_tbl" + }, + "col_vdx": { + "type": "consistent_lookup", + "params": { + "table": "col_vdx_tbl", + "from": "col,id", + "to": "keyspace_id", + "ignore_nulls": "true" }, "owner": "s_tbl" }, @@ -63,6 +74,10 @@ { "column": "num", "name": "num_vdx" + }, + { + "columns": ["col", "id"], + "name": "col_vdx" } ] }, @@ -74,6 +89,14 @@ } ] }, + "col_vdx_tbl": { + "column_vindexes": [ + { + "column": "col", + "name": "hash" + } + ] + }, "user_tbl": { "auto_increment": { "column": "id", From dfde72e7f12327e38df4d16e6cd8dbe546d3c6b7 Mon Sep 17 00:00:00 2001 From: Tanjin Xu Date: Mon, 26 Jan 2026 11:37:12 -0800 Subject: [PATCH 2/2] fix: enable Percona tools repository before ps80 setup Percona repository structure now requires the tools repository to be enabled before setting up ps80. This fixes the CI error: "Selected product uses 'ps-80 tools' repositories. But the 'tools' repository is disabled" Co-Authored-By: Claude --- .github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml | 4 +++- .github/workflows/cluster_endtoend_xb_backup.yml | 4 +++- .github/workflows/cluster_endtoend_xb_recovery.yml | 4 +++- test/templates/cluster_endtoend_test.tpl | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml index 5aa14f6ea18..b362b5aeada 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml @@ -101,7 +101,9 @@ jobs: sudo apt-get install -y lsb-release gnupg2 curl wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb sudo DEBIAN_FRONTEND="noninteractive" dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb - sudo percona-release setup ps80 + # Enable tools repository first, then ps-80 + sudo percona-release enable-only tools release + sudo percona-release enable ps-80 release sudo apt-get update # Install everything else we need, and configure diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index 5637c976edc..339c930032e 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -101,7 +101,9 @@ jobs: sudo apt-get install -y lsb-release gnupg2 curl wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb sudo DEBIAN_FRONTEND="noninteractive" dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb - sudo percona-release setup ps80 + # Enable tools repository first, then ps-80 + sudo percona-release enable-only tools release + sudo percona-release enable ps-80 release sudo apt-get update # Install everything else we need, and configure diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index 9273c66cc1b..8f8759f3d1d 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -101,7 +101,9 @@ jobs: sudo apt-get install -y lsb-release gnupg2 curl wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb sudo DEBIAN_FRONTEND="noninteractive" dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb - sudo percona-release setup ps80 + # Enable tools repository first, then ps-80 + sudo percona-release enable-only tools release + sudo percona-release enable ps-80 release sudo apt-get update # Install everything else we need, and configure diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 9ed8d0ee4cd..7797ea3822b 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -103,7 +103,9 @@ jobs: sudo apt-get install -y lsb-release gnupg2 curl wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb sudo DEBIAN_FRONTEND="noninteractive" dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb - sudo percona-release setup ps80 + # Enable tools repository first, then ps-80 + sudo percona-release enable-only tools release + sudo percona-release enable ps-80 release sudo apt-get update # Install everything else we need, and configure