diff --git a/dbms/src/Storages/Transaction/TiDB.cpp b/dbms/src/Storages/Transaction/TiDB.cpp index 40f189d9009..b2f32030a5a 100644 --- a/dbms/src/Storages/Transaction/TiDB.cpp +++ b/dbms/src/Storages/Transaction/TiDB.cpp @@ -525,10 +525,40 @@ try auto defs_json = json->getArray("definitions"); definitions.clear(); + std::unordered_set part_id_set; for (size_t i = 0; i < defs_json->size(); i++) { PartitionDefinition definition(defs_json->getObject(i)); definitions.emplace_back(definition); + part_id_set.emplace(definition.id); + } + + auto add_defs_json = json->getArray("adding_definitions"); + if (!add_defs_json.isNull()) + { + for (size_t i = 0; i < add_defs_json->size(); i++) + { + PartitionDefinition definition(add_defs_json->getObject(i)); + if (part_id_set.count(definition.id) == 0) + { + definitions.emplace_back(definition); + part_id_set.emplace(definition.id); + } + } + } + + auto drop_defs_json = json->getArray("dropping_definitions"); + if (!drop_defs_json.isNull()) + { + for (size_t i = 0; i < drop_defs_json->size(); i++) + { + PartitionDefinition definition(drop_defs_json->getObject(i)); + if (part_id_set.count(definition.id) == 0) + { + definitions.emplace_back(definition); + part_id_set.emplace(definition.id); + } + } } num = json->getValue("num"); diff --git a/dbms/src/TiDB/Schema/SchemaBuilder.cpp b/dbms/src/TiDB/Schema/SchemaBuilder.cpp index cab0aa216f8..4a63d159b64 100644 --- a/dbms/src/TiDB/Schema/SchemaBuilder.cpp +++ b/dbms/src/TiDB/Schema/SchemaBuilder.cpp @@ -534,6 +534,7 @@ void SchemaBuilder::applyDiff(const SchemaDiff & diff) case SchemaActionType::AddTablePartition: case SchemaActionType::DropTablePartition: case SchemaActionType::TruncateTablePartition: + case SchemaActionType::ActionReorganizePartition: { applyPartitionDiff(db_info, diff.table_id); break; diff --git a/tests/fullstack-test2/ddl/reorganize_partition.test b/tests/fullstack-test2/ddl/reorganize_partition.test new file mode 100644 index 00000000000..a0327e461f2 --- /dev/null +++ b/tests/fullstack-test2/ddl/reorganize_partition.test @@ -0,0 +1,101 @@ +# 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. + + +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; + +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> 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; +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 (p0); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> select /*+ READ_FROM_STORAGE(TIFLASH[t]) */ count(*) from test.t partition (p0); ++----------+ +| count(*) | ++----------+ +| 8 | ++----------+ + +mysql> show warnings; + +mysql> alter table test.t reorganize partition p0 INTO (partition p0 values less than (500000), partition p500k values less than (1000000)); + +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; +