Skip to content

Commit

Permalink
Added support for ALTER TABLE t REORGANIZE PARTITION p INTO (..) (#6428)
Browse files Browse the repository at this point in the history
close #6444
  • Loading branch information
mjonss authored Feb 20, 2023
1 parent 7eae316 commit a8c4d47
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 0 deletions.
30 changes: 30 additions & 0 deletions dbms/src/Storages/Transaction/TiDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,10 +525,40 @@ try

auto defs_json = json->getArray("definitions");
definitions.clear();
std::unordered_set<TableID> 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<UInt64>("num");
Expand Down
1 change: 1 addition & 0 deletions dbms/src/TiDB/Schema/SchemaBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@ void SchemaBuilder<Getter, NameMapper>::applyDiff(const SchemaDiff & diff)
case SchemaActionType::AddTablePartition:
case SchemaActionType::DropTablePartition:
case SchemaActionType::TruncateTablePartition:
case SchemaActionType::ActionReorganizePartition:
{
applyPartitionDiff(db_info, diff.table_id);
break;
Expand Down
101 changes: 101 additions & 0 deletions tests/fullstack-test2/ddl/reorganize_partition.test
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit a8c4d47

Please sign in to comment.