Skip to content

Commit

Permalink
Added support for new DDL actions for remove and add table partitioni…
Browse files Browse the repository at this point in the history
…ng (#7822)

close #7823
  • Loading branch information
mjonss authored Sep 11, 2023
1 parent 630d107 commit 1539364
Show file tree
Hide file tree
Showing 5 changed files with 314 additions and 4 deletions.
16 changes: 16 additions & 0 deletions dbms/src/TiDB/Schema/SchemaBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,22 @@ void SchemaBuilder<Getter, NameMapper>::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);
Expand Down
7 changes: 6 additions & 1 deletion dbms/src/TiDB/Schema/SchemaGetter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
194 changes: 194 additions & 0 deletions tests/fullstack-test2/ddl/alter_partition_by.test
Original file line number Diff line number Diff line change
@@ -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;

89 changes: 89 additions & 0 deletions tests/fullstack-test2/ddl/remove_partitioning.test
Original file line number Diff line number Diff line change
@@ -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;
12 changes: 9 additions & 3 deletions tests/run-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 ))`
Expand Down

0 comments on commit 1539364

Please sign in to comment.