diff --git a/dbms/src/TiDB/Schema/SchemaBuilder.cpp b/dbms/src/TiDB/Schema/SchemaBuilder.cpp index 807e079e8e2..29fbe400fb7 100644 --- a/dbms/src/TiDB/Schema/SchemaBuilder.cpp +++ b/dbms/src/TiDB/Schema/SchemaBuilder.cpp @@ -242,6 +242,22 @@ void SchemaBuilder::applyDiff(const SchemaDiff & diff) applyPartitionDiff(diff.schema_id, diff.table_id); break; } + case SchemaActionType::ActionAlterTablePartitioning: + case SchemaActionType::ActionRemovePartitioning: + { + if (diff.table_id == diff.old_table_id) + { + /// Only internal additions of new partitions + applyPartitionDiff(diff.schema_id, diff.table_id); + } + else + { + /// The new non-partitioned table will have a new id + applyDropTable(diff.schema_id, diff.old_table_id); + applyCreateTable(diff.schema_id, diff.table_id); + } + break; + } case SchemaActionType::ExchangeTablePartition: { applyExchangeTablePartition(diff); diff --git a/dbms/src/TiDB/Schema/SchemaGetter.h b/dbms/src/TiDB/Schema/SchemaGetter.h index 9f7033058cb..d5fe3d733c4 100644 --- a/dbms/src/TiDB/Schema/SchemaGetter.h +++ b/dbms/src/TiDB/Schema/SchemaGetter.h @@ -92,12 +92,17 @@ enum class SchemaActionType : Int8 ActionReorganizePartition = 64, ActionAlterTTLInfo = 65, ActionAlterTTLRemove = 67, + ActionCreateResourceGroup = 68, + ActionAlterResourceGroup = 69, + ActionDropResourceGroup = 70, + ActionAlterTablePartitioning = 71, + ActionRemovePartitioning = 72, // If we support new type from TiDB. // MaxRecognizedType also needs to be changed. // It should always be equal to the maximum supported type + 1 - MaxRecognizedType = 68, + MaxRecognizedType = 73, }; struct AffectedOption diff --git a/tests/fullstack-test2/ddl/alter_partition_by.test b/tests/fullstack-test2/ddl/alter_partition_by.test new file mode 100644 index 00000000000..3a53104d19c --- /dev/null +++ b/tests/fullstack-test2/ddl/alter_partition_by.test @@ -0,0 +1,194 @@ +# Copyright 2023 PingCAP, Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +## partition_table --> partition_table + +mysql> drop table if exists test.t, test.t2; +mysql> create table test.t (a int primary key, b varchar(255), c int, key (b), key (c,b)) partition by range (a) (partition p0 values less than (1000000), partition p1M values less than (2000000)); +mysql> analyze table test.t; +mysql> alter table test.t set tiflash replica 1; + +mysql> insert into test.t values (1,"1",-1); +mysql> insert into test.t select a+1,a+1,-(a+1) from test.t; +mysql> insert into test.t select a+2,a+2,-(a+2) from test.t; +mysql> insert into test.t select a+500000,a+500000,-(a+500000) from test.t; +mysql> insert into test.t select a+1000000,a+1000000,-(a+1000000) from test.t; + +func> wait_table test t + +# check table info in tiflash +>> select tidb_database,tidb_name from system.tables where tidb_database = 'test' and tidb_name = 't' and is_tombstone = 0 +┌─tidb_database─┬─tidb_name─┐ +│ test │ t │ +└───────────────┴───────────┘ + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t partition (p0); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> show warnings; +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p0); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> show warnings; +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t partition (p1M); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p1M); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> show warnings; + +mysql> alter table test.t partition by range (a) (partition p0 values less than (500000), partition p500k values less than (1000000), partition p1M values less than (2000000)); + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p0); ++----------+ +| count(*) | ++----------+ +| 4 | ++----------+ + +mysql> show warnings; + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p500k); ++----------+ +| count(*) | ++----------+ +| 4 | ++----------+ + +mysql> show warnings; + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t partition (p0); ++----------+ +| count(*) | ++----------+ +| 4 | ++----------+ + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t partition (p500k); ++----------+ +| count(*) | ++----------+ +| 4 | ++----------+ + +mysql> show warnings; + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t partition (p1M); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p1M); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +## non-partitioned table --> partitioned table +mysql> create table test.t2 (a int primary key, b varchar(255), c int, key (b), key (c,b)); +mysql> alter table test.t2 set tiflash replica 1; +mysql> insert into test.t2 select * from test.t; +func> wait_table test t2 + +mysql> drop table test.t; + +>> select tidb_database,tidb_name from system.tables where tidb_database = 'test' and tidb_name = 't2' and is_tombstone = 0 +┌─tidb_database─┬─tidb_name─┐ +│ test │ t2 │ +└───────────────┴───────────┘ + +mysql> alter table test.t2 partition by hash (a) partitions 3; +mysql> analyze table test.t2; + +mysql> explain format='brief' select /*+ READ_FROM_STORAGE(TIFLASH[t2]) */ count(*) from test.t2 partition (p0); +id estRows task access object operator info +StreamAgg 1.00 root funcs:count(Column#16)->Column#4 +└─IndexReader 1.00 root partition:p0 index:StreamAgg +└─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#16 +└─IndexFullScan 16.00 cop[tikv] table:t2, index:b(b) keep order:false + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t2]) */ count(*) from test.t2 partition (p0); ++----------+ +| count(*) | ++----------+ +| 5 | ++----------+ + +mysql> show warnings; + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t2]) */ count(*) from test.t2 partition (p1); ++----------+ +| count(*) | ++----------+ +| 6 | ++----------+ + +mysql> show warnings; + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t2]) */ count(*) from test.t2 partition (p0); ++----------+ +| count(*) | ++----------+ +| 5 | ++----------+ + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t2]) */ count(*) from test.t2 partition (p1); ++----------+ +| count(*) | ++----------+ +| 6 | ++----------+ + +mysql> show warnings; + + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t2]) */ count(*) from test.t2 partition (p2); ++----------+ +| count(*) | ++----------+ +| 5 | ++----------+ + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t2]) */ count(*) from test.t2 partition (p2); ++----------+ +| count(*) | ++----------+ +| 5 | ++----------+ + +mysql> show warnings; + +mysql> drop table test.t2; + diff --git a/tests/fullstack-test2/ddl/remove_partitioning.test b/tests/fullstack-test2/ddl/remove_partitioning.test new file mode 100644 index 00000000000..2f8f9574be8 --- /dev/null +++ b/tests/fullstack-test2/ddl/remove_partitioning.test @@ -0,0 +1,89 @@ +# Copyright 2023 PingCAP, Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +## partition_table --> non-partitioned table + +mysql> drop table if exists test.t; +mysql> create table test.t (a int primary key, b varchar(255), c int, key (b), key (c,b)) partition by range (a) (partition p0 values less than (1000000), partition p1M values less than (2000000)); +mysql> analyze table test.t; +mysql> alter table test.t set tiflash replica 1; + +mysql> insert into test.t values (1,"1",-1); +mysql> insert into test.t select a+1,a+1,-(a+1) from test.t; +mysql> insert into test.t select a+2,a+2,-(a+2) from test.t; +mysql> insert into test.t select a+500000,a+500000,-(a+500000) from test.t; +mysql> insert into test.t select a+1000000,a+1000000,-(a+1000000) from test.t; + +func> wait_table test t + +# check table info in tiflash +>> select tidb_database,tidb_name from system.tables where tidb_database = 'test' and tidb_name = 't' and is_tombstone = 0 +┌─tidb_database─┬─tidb_name─┐ +│ test │ t │ +└───────────────┴───────────┘ + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t partition (p0); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> show warnings; +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p0); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> show warnings; +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t partition (p1M); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p1M); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> show warnings; + +mysql> alter table test.t remove partitioning; + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t; ++----------+ +| count(*) | ++----------+ +| 16 | ++----------+ + +mysql> show warnings; + +mysql> select /*+ READ_FROM_STORAGE(TIKV[t]) */ count(*) from test.t; ++----------+ +| count(*) | ++----------+ +| 16 | ++----------+ + +mysql> show warnings; + +mysql> drop table test.t; diff --git a/tests/run-test.sh b/tests/run-test.sh index 0660061bd5e..1aa73aab33e 100755 --- a/tests/run-test.sh +++ b/tests/run-test.sh @@ -35,9 +35,15 @@ function get_elapse_s() # Another way, the time part may start with 0, which means # it will be regarded as oct format, use "10#" to ensure # calculateing with decimal - if [ "$end_nanos" -lt "$start_nanos" ];then - end_s=$(( 10#$end_s - 1 )) - end_nanos=$(( 10#$end_nanos + 10**9 )) + if [ "$end_nanos" = "N" -a "N" = "$start_nanos" ];then + # MacOS does not support '%N' output_fmt in date... + end_nanos=0 + start_nanos=0 + else + if [ "$end_nanos" -lt "$start_nanos" ];then + end_s=$(( 10#$end_s - 1 )) + end_nanos=$(( 10#$end_nanos + 10**9 )) + fi fi elapse_s=$(( 10#$end_s - 10#$start_s )).`printf "%03d\n" $(( (10#$end_nanos - 10#$start_nanos)/10**6 ))`