From 2fafd20054ed9e91df819be9cb5f63feeaf6dbcd Mon Sep 17 00:00:00 2001 From: Hangjie Mo Date: Fri, 17 Jan 2025 17:55:22 +0800 Subject: [PATCH] *: add test cases for non-unique global index (#59012) ref pingcap/tidb#58650 --- br/tests/br_table_partition/prepare.sh | 3 +++ br/tests/br_table_partition/run.sh | 10 ++++++-- .../tests/partition_table/data/pt_case_0.sql | 2 +- .../tests/partition_table/data/pt_case_1.sql | 2 +- .../tests/partition_table/data/pt_case_2.sql | 2 +- .../result/pt_case_0-schema.sql | 3 ++- .../result/pt_case_1-schema.sql | 3 ++- .../result/pt_case_2-schema.sql | 3 ++- .../data/partitioned.a-schema.sql | 2 +- .../data/partitioned.defaultlist-schema.sql | 2 +- .../data/partitioned.list-schema.sql | 2 +- .../data/partitioned.range-schema.sql | 2 +- .../tests/lightning_partitioned-table/run.sh | 24 +++++++++++++++---- .../importintotest/import_into_test.go | 14 +++++++++++ 14 files changed, 58 insertions(+), 16 deletions(-) diff --git a/br/tests/br_table_partition/prepare.sh b/br/tests/br_table_partition/prepare.sh index 6f553d5f11..431d1f0d68 100755 --- a/br/tests/br_table_partition/prepare.sh +++ b/br/tests/br_table_partition/prepare.sh @@ -80,10 +80,13 @@ done wait run_sql "ALTER TABLE $DB.${TABLE}_Hash ADD UNIQUE INDEX idx(c1) GLOBAL" & +run_sql "ALTER TABLE $DB.${TABLE}_Hash ADD INDEX idx1(c1) GLOBAL" & run_sql "ALTER TABLE $DB.${TABLE}_List ADD UNIQUE INDEX idx(c1) GLOBAL" & +run_sql "ALTER TABLE $DB.${TABLE}_List ADD INDEX idx1(c1) GLOBAL" & for i in $(seq $TABLE_COUNT); do run_sql "ALTER TABLE $DB.$TABLE${i} ADD UNIQUE INDEX idx(c1) GLOBAL" & + run_sql "ALTER TABLE $DB.$TABLE${i} ADD INDEX idx1(c1) GLOBAL" & done wait diff --git a/br/tests/br_table_partition/run.sh b/br/tests/br_table_partition/run.sh index ecc58857cc..bad32e9986 100755 --- a/br/tests/br_table_partition/run.sh +++ b/br/tests/br_table_partition/run.sh @@ -26,6 +26,8 @@ DB=$DB TABLE=$TABLE TABLE_COUNT=$TABLE_COUNT prepare.sh declare -A row_count_ori declare -A row_count_new +declare -A row_count_new_global_index +declare -A row_count_new_non_unique_global_index for i in $(seq $TABLE_COUNT) _Hash _List; do row_count_ori[$i]=$(run_sql "SELECT COUNT(*) FROM $DB.$TABLE${i};" | awk '/COUNT/{print $2}') @@ -44,15 +46,19 @@ run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR for i in $(seq $TABLE_COUNT) _Hash _List; do run_sql "SHOW CREATE TABLE $DB.$TABLE${i};" | grep 'PARTITION' row_count_new[$i]=$(run_sql "SELECT COUNT(*) FROM $DB.$TABLE${i};" | awk '/COUNT/{print $2}') + row_count_new_global_index[$i]=$(run_sql "SELECT COUNT(*) FROM $DB.$TABLE${i} use index(idx);" | awk '/COUNT/{print $2}') + row_count_new_non_unique_global_index[$i]=$(run_sql "SELECT COUNT(*) FROM $DB.$TABLE${i} use index(idx1);" | awk '/COUNT/{print $2}') done fail=false for i in $(seq $TABLE_COUNT) _Hash _List; do - if [ "${row_count_ori[$i]}" != "${row_count_new[$i]}" ];then + if [ "${row_count_ori[$i]}" != "${row_count_new[$i]}" ] || \ + [ "${row_count_ori[$i]}" != "${row_count_new_global_index[$i]}" ] || \ + [ "${row_count_ori[$i]}" != "${row_count_new_non_unique_global_index[$i]}" ]; then fail=true echo "TEST: [$TEST_NAME] fail on table $DB.$TABLE${i}" fi - echo "table $DB.$TABLE${i} [original] row count: ${row_count_ori[$i]}, [after br] row count: ${row_count_new[$i]}" + echo "table $DB.$TABLE${i} [original] row count: ${row_count_ori[$i]}, [after br] row count: ${row_count_new[$i]}, global index row count: ${row_count_new_global_index[$i]}, non-unique global index row count: ${row_count_new_non_unique_global_index[$i]}" done if $fail; then diff --git a/dumpling/tests/partition_table/data/pt_case_0.sql b/dumpling/tests/partition_table/data/pt_case_0.sql index caa6890a93..c1d6d74475 100644 --- a/dumpling/tests/partition_table/data/pt_case_0.sql +++ b/dumpling/tests/partition_table/data/pt_case_0.sql @@ -1,4 +1,4 @@ -create table `pt_case_0` (a int, b int, unique index idx(a) global) partition by hash(b) partitions 5; +create table `pt_case_0` (a int, b int, unique index idx(a) global, index idx1(a) global) partition by hash(b) partitions 5; insert into `pt_case_0` values (0, 10), (1, 9), diff --git a/dumpling/tests/partition_table/data/pt_case_1.sql b/dumpling/tests/partition_table/data/pt_case_1.sql index dacd1b37d1..c3b10d02f8 100644 --- a/dumpling/tests/partition_table/data/pt_case_1.sql +++ b/dumpling/tests/partition_table/data/pt_case_1.sql @@ -1,4 +1,4 @@ -create table `pt_case_1` (a int, b int, unique index idx(a) global) partition by list(b) +create table `pt_case_1` (a int, b int, unique index idx(a) global, index idx1(a) global) partition by list(b) (partition p0 values in (0, 1, 2, 3), partition p1 values in (4, 5, 6), partition p2 values in (7, 8, 9, 10)); diff --git a/dumpling/tests/partition_table/data/pt_case_2.sql b/dumpling/tests/partition_table/data/pt_case_2.sql index f875588984..367ed843d9 100644 --- a/dumpling/tests/partition_table/data/pt_case_2.sql +++ b/dumpling/tests/partition_table/data/pt_case_2.sql @@ -1,4 +1,4 @@ -create table `pt_case_2` (a int, b int, unique index idx(a) global) partition by range(b) +create table `pt_case_2` (a int, b int, unique index idx(a) global, index idx1(a) global) partition by range(b) (partition p0 values less than (4), partition p1 values less than (7), partition p2 values less than (11)); diff --git a/dumpling/tests/partition_table/result/pt_case_0-schema.sql b/dumpling/tests/partition_table/result/pt_case_0-schema.sql index ac2691edc5..770fbe46db 100644 --- a/dumpling/tests/partition_table/result/pt_case_0-schema.sql +++ b/dumpling/tests/partition_table/result/pt_case_0-schema.sql @@ -3,6 +3,7 @@ CREATE TABLE `pt_case_0` ( `a` int DEFAULT NULL, `b` int DEFAULT NULL, - UNIQUE KEY `idx` (`a`) /*T![global_index] GLOBAL */ + UNIQUE KEY `idx` (`a`) /*T![global_index] GLOBAL */, + KEY `idx1` (`a`) /*T![global_index] GLOBAL */ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY HASH (`b`) PARTITIONS 5; diff --git a/dumpling/tests/partition_table/result/pt_case_1-schema.sql b/dumpling/tests/partition_table/result/pt_case_1-schema.sql index b3e5510c5e..36ce7fff7a 100644 --- a/dumpling/tests/partition_table/result/pt_case_1-schema.sql +++ b/dumpling/tests/partition_table/result/pt_case_1-schema.sql @@ -3,7 +3,8 @@ CREATE TABLE `pt_case_1` ( `a` int DEFAULT NULL, `b` int DEFAULT NULL, - UNIQUE KEY `idx` (`a`) /*T![global_index] GLOBAL */ + UNIQUE KEY `idx` (`a`) /*T![global_index] GLOBAL */, + KEY `idx1` (`a`) /*T![global_index] GLOBAL */ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY LIST (`b`) (PARTITION `p0` VALUES IN (0,1,2,3), diff --git a/dumpling/tests/partition_table/result/pt_case_2-schema.sql b/dumpling/tests/partition_table/result/pt_case_2-schema.sql index a4c4583630..8090c1dc14 100644 --- a/dumpling/tests/partition_table/result/pt_case_2-schema.sql +++ b/dumpling/tests/partition_table/result/pt_case_2-schema.sql @@ -3,7 +3,8 @@ CREATE TABLE `pt_case_2` ( `a` int DEFAULT NULL, `b` int DEFAULT NULL, - UNIQUE KEY `idx` (`a`) /*T![global_index] GLOBAL */ + UNIQUE KEY `idx` (`a`) /*T![global_index] GLOBAL */, + KEY `idx1` (`a`) /*T![global_index] GLOBAL */ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY RANGE (`b`) (PARTITION `p0` VALUES LESS THAN (4), diff --git a/lightning/tests/lightning_partitioned-table/data/partitioned.a-schema.sql b/lightning/tests/lightning_partitioned-table/data/partitioned.a-schema.sql index 274e117b91..e6227e9271 100644 --- a/lightning/tests/lightning_partitioned-table/data/partitioned.a-schema.sql +++ b/lightning/tests/lightning_partitioned-table/data/partitioned.a-schema.sql @@ -1 +1 @@ -create table a (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(c) global) partition by hash(a) partitions 5; +create table a (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(`c`) global, index key_a(`a`) global) partition by hash(a) partitions 5; diff --git a/lightning/tests/lightning_partitioned-table/data/partitioned.defaultlist-schema.sql b/lightning/tests/lightning_partitioned-table/data/partitioned.defaultlist-schema.sql index f8e01f41d7..83e4049246 100644 --- a/lightning/tests/lightning_partitioned-table/data/partitioned.defaultlist-schema.sql +++ b/lightning/tests/lightning_partitioned-table/data/partitioned.defaultlist-schema.sql @@ -1 +1 @@ -create table `defaultlist` (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(`c`) global) partition by list(a) (partition p1 values in (1,4,8),partition p2 values in (32,default), partition p3 values in (262144,65536)); +create table `defaultlist` (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(`c`) global, index key_a(`a`) global) partition by list(a) (partition p1 values in (1,4,8),partition p2 values in (32,default), partition p3 values in (262144,65536)); diff --git a/lightning/tests/lightning_partitioned-table/data/partitioned.list-schema.sql b/lightning/tests/lightning_partitioned-table/data/partitioned.list-schema.sql index dfd046ae25..2a6fbec1ba 100644 --- a/lightning/tests/lightning_partitioned-table/data/partitioned.list-schema.sql +++ b/lightning/tests/lightning_partitioned-table/data/partitioned.list-schema.sql @@ -1 +1 @@ -create table `list` (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(`c`) global) partition by list(a) (partition p1 values in (1,4,8),partition p2 values in (32,8388608,268435456), partition p3 values in (262144,0,65536)); +create table `list` (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(`c`) global, index key_a(`a`) global) partition by list(a) (partition p1 values in (1,4,8),partition p2 values in (32,8388608,268435456), partition p3 values in (262144,0,65536)); diff --git a/lightning/tests/lightning_partitioned-table/data/partitioned.range-schema.sql b/lightning/tests/lightning_partitioned-table/data/partitioned.range-schema.sql index 0bbc1c03df..f1a3b2eebb 100644 --- a/lightning/tests/lightning_partitioned-table/data/partitioned.range-schema.sql +++ b/lightning/tests/lightning_partitioned-table/data/partitioned.range-schema.sql @@ -1 +1 @@ -create table `range` (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(`c`) global) partition by range(a) (partition pNeg values less than (0), partition pMax values less than (maxvalue)); +create table `range` (a int, b varchar(16), c int, KEY key_b (`b`), unique index key_c(`c`) global, index key_a(`a`) global) partition by range(a) (partition pNeg values less than (0), partition pMax values less than (maxvalue)); diff --git a/lightning/tests/lightning_partitioned-table/run.sh b/lightning/tests/lightning_partitioned-table/run.sh index 82bcb888d3..438682b201 100755 --- a/lightning/tests/lightning_partitioned-table/run.sh +++ b/lightning/tests/lightning_partitioned-table/run.sh @@ -27,7 +27,7 @@ for BACKEND in tidb local; do run_lightning --backend $BACKEND - run_sql 'SELECT count(1), sum(a) FROM partitioned.a;' + run_sql 'SELECT count(1), sum(a) FROM partitioned.a use index ();' check_contains 'count(1): 8' check_contains 'sum(a): 277151781' @@ -35,10 +35,14 @@ for BACKEND in tidb local; do check_contains 'count(1): 8' check_contains 'sum(c): 277151781' + run_sql 'SELECT count(1), sum(a) FROM partitioned.a use index (key_a);' + check_contains 'count(1): 8' + check_contains 'sum(a): 277151781' + run_sql "SHOW TABLE STATUS FROM partitioned WHERE name = 'a';" check_contains 'Create_options: partitioned' - run_sql 'SELECT count(1), sum(a) FROM partitioned.range;' + run_sql 'SELECT count(1), sum(a) FROM partitioned.range use index ();' check_contains 'count(1): 8' check_contains 'sum(a): 277151781' @@ -46,10 +50,14 @@ for BACKEND in tidb local; do check_contains 'count(1): 8' check_contains 'sum(c): 277151781' + run_sql 'SELECT count(1), sum(a) FROM partitioned.range use index (key_a);' + check_contains 'count(1): 8' + check_contains 'sum(a): 277151781' + run_sql "SHOW TABLE STATUS FROM partitioned WHERE name = 'range';" check_contains 'Create_options: partitioned' - run_sql 'SELECT count(1), sum(a) FROM partitioned.list;' + run_sql 'SELECT count(1), sum(a) FROM partitioned.list use index ();' check_contains 'count(1): 8' check_contains 'sum(a): 277151781' @@ -57,10 +65,14 @@ for BACKEND in tidb local; do check_contains 'count(1): 8' check_contains 'sum(c): 277151781' + run_sql 'SELECT count(1), sum(a) FROM partitioned.list use index (key_a);' + check_contains 'count(1): 8' + check_contains 'sum(a): 277151781' + run_sql "SHOW TABLE STATUS FROM partitioned WHERE name = 'list';" check_contains 'Create_options: partitioned' - run_sql 'SELECT count(1), sum(a) FROM partitioned.defaultlist;' + run_sql 'SELECT count(1), sum(a) FROM partitioned.defaultlist use index ();' check_contains 'count(1): 8' check_contains 'sum(a): 277151781' @@ -68,6 +80,10 @@ for BACKEND in tidb local; do check_contains 'count(1): 8' check_contains 'sum(c): 277151781' + run_sql 'SELECT count(1), sum(a) FROM partitioned.defaultlist use index (key_a);' + check_contains 'count(1): 8' + check_contains 'sum(a): 277151781' + run_sql "SHOW TABLE STATUS FROM partitioned WHERE name = 'defaultlist';" check_contains 'Create_options: partitioned' done diff --git a/tests/realtikvtest/importintotest/import_into_test.go b/tests/realtikvtest/importintotest/import_into_test.go index 32e3920c4f..81a94e5f76 100644 --- a/tests/realtikvtest/importintotest/import_into_test.go +++ b/tests/realtikvtest/importintotest/import_into_test.go @@ -239,6 +239,20 @@ func (s *mockGCSSuite) TestBasicImportInto() { querySQL: "select * from t order by b", lastInsertID: 6, }, + // partition table + { + createTableSQL: "create table t (a bigint, b varchar(100), c int) partition by hash(a) partitions 5;", + flags: "(c, b, a)", + res: []string{"11 test1 1", "22 test2 2", "33 test3 3", "44 test4 4", "55 test5 5", "66 test6 6"}, + querySQL: "select * from t order by c", + }, + // partition table + global index + { + createTableSQL: "create table t (a bigint, b varchar(100), c int, index idx(c) global) partition by hash(a) partitions 5;", + flags: "(c, b, a)", + res: []string{"11 test1 1", "22 test2 2", "33 test3 3", "44 test4 4", "55 test5 5", "66 test6 6"}, + querySQL: "select * from t use index(idx) order by c", + }, } loadDataSQL := fmt.Sprintf(`import into t %%s FROM 'gs://test-multi-load/db.tbl.*.csv?endpoint=%s'