Skip to content

Commit

Permalink
partition: Show partition reformat (#29945)
Browse files Browse the repository at this point in the history
  • Loading branch information
mjonss committed Nov 24, 2021
1 parent e65f548 commit 9cd0b49
Show file tree
Hide file tree
Showing 7 changed files with 340 additions and 222 deletions.
2 changes: 1 addition & 1 deletion ddl/db_partition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ func (s *testIntegrationSuite3) TestCreateTableWithPartition(c *C) {
partition p0 values less than (to_seconds('2004-01-01')),
partition p1 values less than (to_seconds('2005-01-01')));`)
tk.MustQuery("show create table t26").Check(
testkit.Rows("t26 CREATE TABLE `t26` (\n `a` date DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\nPARTITION BY RANGE ( TO_SECONDS(`a`) ) (\n PARTITION `p0` VALUES LESS THAN (63240134400),\n PARTITION `p1` VALUES LESS THAN (63271756800)\n)"))
testkit.Rows("t26 CREATE TABLE `t26` (\n `a` date DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\nPARTITION BY RANGE (TO_SECONDS(`a`))\n(PARTITION `p0` VALUES LESS THAN (63240134400),\n PARTITION `p1` VALUES LESS THAN (63271756800))"))
tk.MustExec(`create table t27 (a bigint unsigned not null)
partition by range(a) (
partition p0 values less than (10),
Expand Down
3 changes: 3 additions & 0 deletions ddl/partition.go
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,9 @@ func buildHashPartitionDefinitions(_ sessionctx.Context, defs []*ast.PartitionDe
def := defs[i]
definitions[i].Name = def.Name
definitions[i].Comment, _ = def.Comment()
if err := setPartitionPlacementFromOptions(&definitions[i], def.Options); err != nil {
return nil, err
}
}
}
return definitions, nil
Expand Down
212 changes: 94 additions & 118 deletions ddl/placement_policy_test.go

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions executor/seqtest/seq_executor_serial_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ func TestShow(t *testing.T) {
tk.MustQuery("show create table t").Check(testutil.RowsWithSep("|",
"t CREATE TABLE `t` (\n"+
" `a` int(11) DEFAULT NULL\n"+
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"+"\nPARTITION BY RANGE ( `a` ) (\n PARTITION `p0` VALUES LESS THAN (10),\n PARTITION `p1` VALUES LESS THAN (20),\n PARTITION `p2` VALUES LESS THAN (MAXVALUE)\n)",
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"+"\nPARTITION BY RANGE (`a`)\n(PARTITION `p0` VALUES LESS THAN (10),\n PARTITION `p1` VALUES LESS THAN (20),\n PARTITION `p2` VALUES LESS THAN (MAXVALUE))",
))

tk.MustExec(`drop table if exists t`)
Expand Down Expand Up @@ -529,8 +529,8 @@ func TestShow(t *testing.T) {
tk.MustQuery("show create table t").Check(testutil.RowsWithSep("|",
"t CREATE TABLE `t` (\n"+
" `a` int(11) DEFAULT NULL\n"+
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"+"\nPARTITION BY HASH( `a` )\nPARTITIONS 4",
))
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+
"PARTITION BY HASH (`a`) PARTITIONS 4"))

// Test show create table compression type.
tk.MustExec(`drop table if exists t1`)
Expand Down
108 changes: 51 additions & 57 deletions executor/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -1235,58 +1235,54 @@ func appendPartitionInfo(partitionInfo *model.PartitionInfo, buf *bytes.Buffer,
if partitionInfo == nil {
return
}
// Since MySQL 5.1/5.5 is very old and TiDB aims for 5.7/8.0 compatibility, we will not
// include the /*!50100 or /*!50500 comments for TiDB.
// This also solves the issue with comments within comments that would happen for
// PLACEMENT POLICY options.
if partitionInfo.Type == model.PartitionTypeHash {
fmt.Fprintf(buf, "\nPARTITION BY HASH( %s )", partitionInfo.Expr)
fmt.Fprintf(buf, "\nPARTITIONS %d", partitionInfo.Num)
return
defaultPartitionDefinitions := true
for i, def := range partitionInfo.Definitions {
if def.Name.O != fmt.Sprintf("p%d", i) {
defaultPartitionDefinitions = false
break
}
if len(def.Comment) > 0 || def.DirectPlacementOpts != nil || def.PlacementPolicyRef != nil {
defaultPartitionDefinitions = false
break
}
}

if defaultPartitionDefinitions {
fmt.Fprintf(buf, "\nPARTITION BY HASH (%s) PARTITIONS %d", partitionInfo.Expr, partitionInfo.Num)
return
}
}
// this if statement takes care of range columns case
if partitionInfo.Columns != nil && partitionInfo.Type == model.PartitionTypeRange {
buf.WriteString("\nPARTITION BY RANGE COLUMNS(")
// this if statement takes care of lists/range columns case
if partitionInfo.Columns != nil {
// partitionInfo.Type == model.PartitionTypeRange || partitionInfo.Type == model.PartitionTypeList
// Notice that MySQL uses two spaces between LIST and COLUMNS...
fmt.Fprintf(buf, "\nPARTITION BY %s COLUMNS(", partitionInfo.Type.String())
for i, col := range partitionInfo.Columns {
buf.WriteString(col.L)
buf.WriteString(stringutil.Escape(col.O, sqlMode))
if i < len(partitionInfo.Columns)-1 {
buf.WriteString(",")
}
}
buf.WriteString(") (\n")
} else if partitionInfo.Type == model.PartitionTypeList {
if len(partitionInfo.Columns) == 0 {
fmt.Fprintf(buf, "\nPARTITION BY %s (%s) (\n", partitionInfo.Type.String(), partitionInfo.Expr)
} else {
colsName := ""
for _, col := range partitionInfo.Columns {
if len(colsName) > 0 {
colsName += ","
}
colsName += col.L
}
fmt.Fprintf(buf, "\nPARTITION BY LIST COLUMNS(%s) (\n", colsName)
}
buf.WriteString(")\n(")
} else {
fmt.Fprintf(buf, "\nPARTITION BY %s ( %s ) (\n", partitionInfo.Type.String(), partitionInfo.Expr)
fmt.Fprintf(buf, "\nPARTITION BY %s (%s)\n(", partitionInfo.Type.String(), partitionInfo.Expr)
}
if partitionInfo.Type == model.PartitionTypeRange {
for i, def := range partitionInfo.Definitions {
lessThans := strings.Join(def.LessThan, ",")
fmt.Fprintf(buf, " PARTITION `%s` VALUES LESS THAN (%s)", def.Name, lessThans)
if def.DirectPlacementOpts != nil {
// add direct placement info here
appendDirectPlacementInfo(def.DirectPlacementOpts, buf)
}
if def.PlacementPolicyRef != nil {
// add placement ref info here
fmt.Fprintf(buf, " /*T![placement] PLACEMENT POLICY=%s */", stringutil.Escape(def.PlacementPolicyRef.Name.O, sqlMode))
}
if i < len(partitionInfo.Definitions)-1 {
buf.WriteString(",\n")
} else {
buf.WriteString("\n")
}

for i, def := range partitionInfo.Definitions {
if i > 0 {
fmt.Fprintf(buf, ",\n ")
}
buf.WriteString(")")
} else if partitionInfo.Type == model.PartitionTypeList {
for i, def := range partitionInfo.Definitions {
fmt.Fprintf(buf, "PARTITION %s", stringutil.Escape(def.Name.O, sqlMode))
// PartitionTypeHash does not have any VALUES definition
if partitionInfo.Type == model.PartitionTypeRange {
lessThans := strings.Join(def.LessThan, ",")
fmt.Fprintf(buf, " VALUES LESS THAN (%s)", lessThans)
} else if partitionInfo.Type == model.PartitionTypeList {
values := bytes.NewBuffer(nil)
for j, inValues := range def.InValues {
if j > 0 {
Expand All @@ -1300,23 +1296,21 @@ func appendPartitionInfo(partitionInfo *model.PartitionInfo, buf *bytes.Buffer,
values.WriteString(strings.Join(inValues, ","))
}
}
fmt.Fprintf(buf, " PARTITION `%s` VALUES IN (%s)", def.Name, values.String())
if def.DirectPlacementOpts != nil {
// add direct placement info here
appendDirectPlacementInfo(def.DirectPlacementOpts, buf)
}
if def.PlacementPolicyRef != nil {
// add placement ref info here
fmt.Fprintf(buf, " /*T![placement] PLACEMENT POLICY=%s */", stringutil.Escape(def.PlacementPolicyRef.Name.O, sqlMode))
}
if i < len(partitionInfo.Definitions)-1 {
buf.WriteString(",\n")
} else {
buf.WriteString("\n")
}
fmt.Fprintf(buf, " VALUES IN (%s)", values.String())
}
if len(def.Comment) > 0 {
buf.WriteString(fmt.Sprintf(" COMMENT '%s'", format.OutputFormat(def.Comment)))
}
if def.DirectPlacementOpts != nil {
// add direct placement info here
appendDirectPlacementInfo(def.DirectPlacementOpts, buf)
}
if def.PlacementPolicyRef != nil {
// add placement ref info here
fmt.Fprintf(buf, " /*T![placement] PLACEMENT POLICY=%s */", stringutil.Escape(def.PlacementPolicyRef.Name.O, sqlMode))
}
buf.WriteString(")")
}
buf.WriteString(")")
}

// ConstructResultOfShowCreateDatabase constructs the result for show create database.
Expand Down
Loading

0 comments on commit 9cd0b49

Please sign in to comment.