Skip to content

Commit

Permalink
executor: add placement policy name / direct placement to is.tables/p…
Browse files Browse the repository at this point in the history
…artitions (#28798)
  • Loading branch information
mjonss authored Oct 18, 2021
1 parent dbe8c6c commit 84ec663
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 3 deletions.
14 changes: 14 additions & 0 deletions ddl/placement_policy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ func (s *testDBSuite6) TestCreateTableWithPlacementPolicy(c *C) {
"PRIMARY_REGION=\"cn-east-1\" " +
"REGIONS=\"cn-east-1, cn-east-2\" " +
"FOLLOWERS=2 ")
defer tk.MustExec("DROP TABLE IF EXISTS t")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't'").Check(testkit.Rows(`def test t <nil> PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1, cn-east-2" FOLLOWERS=2`))

tbl := testGetTableByName(c, tk.Se, "test", "t")
c.Assert(tbl, NotNil)
Expand Down Expand Up @@ -360,6 +362,7 @@ func (s *testDBSuite6) TestCreateTableWithPlacementPolicy(c *C) {
"CONSTRAINTS=\"[+region=bj]\" ")
tk.MustExec("create table t(a int)" +
"PLACEMENT POLICY=\"x\"")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't'").Check(testkit.Rows(`def test t x <nil>`))
tk.MustExec("create table t_range_p(id int) placement policy x partition by range(id) (" +
"PARTITION p0 VALUES LESS THAN (100)," +
"PARTITION p1 VALUES LESS THAN (1000) placement policy y," +
Expand Down Expand Up @@ -436,6 +439,7 @@ func (s *testDBSuite6) TestCreateTableWithPlacementPolicy(c *C) {
tk.MustExec("create table t(a int)" +
"FOLLOWERS=2 " +
"CONSTRAINTS=\"[+disk=ssd]\" ")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't'").Check(testkit.Rows(`def test t <nil> CONSTRAINTS="[+disk=ssd]" FOLLOWERS=2`))

tbl = testGetTableByName(c, tk.Se, "test", "t")
c.Assert(tbl, NotNil)
Expand Down Expand Up @@ -489,6 +493,7 @@ func (s *testDBSuite6) TestDropPlacementPolicyInUse(c *C) {
defer tk.MustExec("drop placement policy if exists p2")
tk.MustExec("create table test.t12 (id int) placement policy 'p2'")
defer tk.MustExec("drop table if exists test.t12")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't12'").Check(testkit.Rows(`def test t12 p2 <nil>`))

// p3 is used by test2.t22
tk.MustExec("create placement policy p3 " +
Expand Down Expand Up @@ -574,6 +579,8 @@ func (s *testDBSuite6) TestPolicyCacheAndPolicyDependency(c *C) {

tk.MustExec("drop table if exists t")
tk.MustExec("create table t (a int) placement policy \"x\"")
defer tk.MustExec("drop table if exists t")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't'").Check(testkit.Rows(`def test t BASE TABLE x <nil>`))
tbl := testGetTableByName(c, tk.Se, "test", "t")

// Test policy dependency cache.
Expand All @@ -584,6 +591,8 @@ func (s *testDBSuite6) TestPolicyCacheAndPolicyDependency(c *C) {

tk.MustExec("drop table if exists t2")
tk.MustExec("create table t2 (a int) placement policy \"x\"")
defer tk.MustExec("drop table if exists t2")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't'").Check(testkit.Rows(`def test t BASE TABLE x <nil>`))
tbl2 := testGetTableByName(c, tk.Se, "test", "t2")

dependencies = testGetPolicyDependency(s.store, "x")
Expand Down Expand Up @@ -647,6 +656,7 @@ func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) {
"PARTITION p1 VALUES LESS THAN (11)," +
"PARTITION p2 VALUES LESS THAN (16)," +
"PARTITION p3 VALUES LESS THAN (21));")
defer tk.MustExec("drop table if exists t1")
tk.MustQuery("SELECT " +
"CATALOG_NAME,POLICY_NAME,SCHEMA_NAME,TABLE_NAME,PARTITION_NAME," +
"PRIMARY_REGION,REGIONS,CONSTRAINTS,LEADER_CONSTRAINTS,FOLLOWER_CONSTRAINTS,LEARNER_CONSTRAINTS," +
Expand All @@ -658,6 +668,8 @@ func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) {
"REGIONS=\"cn-east-1, cn-east-2\" " +
"FOLLOWERS=2 ")

tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows(`def test t1 p0 PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1, cn-east-2" FOLLOWERS=2`))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p1'").Check(testkit.Rows(`def test t1 p1 <nil> <nil>`))
tbl := testGetTableByName(c, tk.Se, "test", "t1")
c.Assert(tbl, NotNil)
ptDef := testGetPartitionDefinitionsByName(c, tk.Se, "test", "t1", "p0")
Expand Down Expand Up @@ -699,6 +711,7 @@ func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) {
"FOLLOWERS=2 ")
tk.MustExec("alter table t1 partition p0 " +
"PLACEMENT POLICY=\"x\"")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows(`def test t1 p0 x `))

ptDef = testGetPartitionDefinitionsByName(c, tk.Se, "test", "t1", "p0")
c.Assert(ptDef, NotNil)
Expand All @@ -710,6 +723,7 @@ func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) {
"PRIMARY_REGION=\"cn-east-1\" " +
"REGIONS=\"cn-east-1, cn-east-2\" " +
"FOLLOWERS=2 ")
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows("def test t1 p0 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1, cn-east-2\" FOLLOWERS=2"))

ptDef = testGetPartitionDefinitionsByName(c, tk.Se, "test", "t1", "p0")
c.Assert(ptDef, NotNil)
Expand Down
15 changes: 12 additions & 3 deletions ddl/placement_sql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -752,6 +752,8 @@ func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) {
" `b` varchar(255) DEFAULT NULL,\n" +
" PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"nl\" REGIONS=\"se,nz,nl\" FOLLOWERS=3 */"))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='SchemaDirectPlacementTest' AND TABLE_NAME = 'UseSchemaDefault'").Check(testkit.Rows(`def SchemaDirectPlacementTest UseSchemaDefault <nil> PRIMARY_REGION="nl" REGIONS="se,nz,nl" FOLLOWERS=3`))

tk.MustExec(`CREATE TABLE SchemaDirectPlacementTest.UseDirectPlacement (a int unsigned primary key, b varchar(255)) PRIMARY_REGION="se" REGIONS="se"`)

tk.MustQuery(`SHOW CREATE TABLE SchemaDirectPlacementTest.UseDirectPlacement`).Check(testkit.Rows(
Expand All @@ -760,6 +762,7 @@ func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) {
" `b` varchar(255) DEFAULT NULL,\n" +
" PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"se\" REGIONS=\"se\" */"))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='SchemaDirectPlacementTest' AND TABLE_NAME = 'UseDirectPlacement'").Check(testkit.Rows("def SchemaDirectPlacementTest UseDirectPlacement <nil> PRIMARY_REGION=\"se\" REGIONS=\"se\""))

tk.MustExec(`CREATE TABLE SchemaPolicyPlacementTest.UseSchemaDefault (a int unsigned primary key, b varchar(255))`)
tk.MustQuery(`SHOW CREATE TABLE SchemaPolicyPlacementTest.UseSchemaDefault`).Check(testkit.Rows(
Expand All @@ -768,6 +771,7 @@ func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) {
" `b` varchar(255) DEFAULT NULL,\n" +
" PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`PolicySchemaTest` */"))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='SchemaPolicyPlacementTest' AND TABLE_NAME = 'UseSchemaDefault'").Check(testkit.Rows(`def SchemaPolicyPlacementTest UseSchemaDefault PolicySchemaTest <nil>`))

tk.MustExec(`CREATE TABLE SchemaPolicyPlacementTest.UsePolicy (a int unsigned primary key, b varchar(255)) PLACEMENT POLICY = "PolicyTableTest"`)
tk.MustQuery(`SHOW CREATE TABLE SchemaPolicyPlacementTest.UsePolicy`).Check(testkit.Rows(
Expand All @@ -776,6 +780,7 @@ func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) {
" `b` varchar(255) DEFAULT NULL,\n" +
" PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`PolicyTableTest` */"))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='SchemaPolicyPlacementTest' AND TABLE_NAME = 'UsePolicy'").Check(testkit.Rows(`def SchemaPolicyPlacementTest UsePolicy PolicyTableTest <nil>`))

is := s.dom.InfoSchema()

Expand Down Expand Up @@ -803,7 +808,10 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) {
tk.MustExec("drop placement policy if exists alter_x")
tk.MustExec("drop placement policy if exists alter_y")
tk.MustExec("create placement policy alter_x PRIMARY_REGION=\"cn-east-1\", REGIONS=\"cn-east-1\";")
defer tk.MustExec("drop placement policy if exists alter_x")
tk.MustExec("create placement policy alter_y PRIMARY_REGION=\"cn-east-2\", REGIONS=\"cn-east-2\";")
defer tk.MustExec("drop placement policy if exists alter_y")
defer tk.MustExec(`DROP DATABASE IF EXISTS TestAlterDB;`) // Must drop tables before policy

// Policy Test
// Test for Non-Exist policy
Expand All @@ -823,6 +831,7 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) {
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin "+
"/*T![placement] PLACEMENT POLICY=`alter_x` */",
))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='TestAlterDB' AND TABLE_NAME = 't'").Check(testkit.Rows(`def TestAlterDB t alter_x <nil>`))
// Test for Alter Default Placement Policy, And will not update the old table options.
tk.MustExec("ALTER DATABASE TestAlterDB DEFAULT PLACEMENT POLICY=`alter_y`;")
tk.MustExec("create table t2(a int);")
Expand All @@ -838,6 +847,7 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) {
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin "+
"/*T![placement] PLACEMENT POLICY=`alter_y` */",
))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='TestAlterDB' AND TABLE_NAME = 't2'").Check(testkit.Rows(`def TestAlterDB t2 alter_y <nil>`))

// Reset Test
tk.MustExec("drop database if exists TestAlterDB;")
Expand All @@ -859,6 +869,7 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) {
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin "+
"/*T![placement] PRIMARY_REGION=\"se\" REGIONS=\"se\" FOLLOWERS=2 */",
))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='TestAlterDB' AND TABLE_NAME = 't3'").Check(testkit.Rows("def TestAlterDB t3 <nil> PRIMARY_REGION=\"se\" REGIONS=\"se\" FOLLOWERS=2"))
// Test for override default option
tk.MustExec("create table t4(a int) PLACEMENT POLICY=\"alter_x\";")
tk.MustQuery(`show create table t4`).Check(testutil.RowsWithSep("|",
Expand All @@ -867,6 +878,7 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) {
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin "+
"/*T![placement] PLACEMENT POLICY=`alter_x` */",
))
tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='TestAlterDB' AND TABLE_NAME = 't4'").Check(testkit.Rows(`def TestAlterDB t4 alter_x <nil>`))

// Hybrid Test
// Test for alter both policy and direct options.
Expand All @@ -893,7 +905,4 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) {
"/*T![placement] PRIMARY_REGION=\"se\" REGIONS=\"se\" FOLLOWERS=2 */",
))

tk.MustExec(`DROP DATABASE IF EXISTS TestAlterDB;`)
tk.MustExec("drop placement policy if exists alter_x")
tk.MustExec("drop placement policy if exists alter_y")
}
22 changes: 22 additions & 0 deletions executor/infoschema_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,13 @@ func (e *memtableRetriever) setDataFromTables(ctx context.Context, sctx sessionc
pkType = "CLUSTERED"
}
shardingInfo := infoschema.GetShardingInfo(schema, table)
var policyName, directPlacement interface{}
if table.PlacementPolicyRef != nil {
policyName = table.PlacementPolicyRef.Name.O
}
if table.DirectPlacementOpts != nil {
directPlacement = table.DirectPlacementOpts.String()
}
record := types.MakeDatums(
infoschema.CatalogVal, // TABLE_CATALOG
schema.Name.O, // TABLE_SCHEMA
Expand All @@ -598,6 +605,8 @@ func (e *memtableRetriever) setDataFromTables(ctx context.Context, sctx sessionc
table.ID, // TIDB_TABLE_ID
shardingInfo, // TIDB_ROW_ID_SHARDING_INFO
pkType, // TIDB_PK_TYPE
policyName, // TIDB_PLACEMENT_POLICY_NAME
directPlacement, // TIDB_DIRECT_PLACEMENT
)
rows = append(rows, record)
} else {
Expand Down Expand Up @@ -626,6 +635,8 @@ func (e *memtableRetriever) setDataFromTables(ctx context.Context, sctx sessionc
table.ID, // TIDB_TABLE_ID
nil, // TIDB_ROW_ID_SHARDING_INFO
pkType, // TIDB_PK_TYPE
nil, // TIDB_PLACEMENT_POLICY_NAME
nil, // TIDB_DIRECT_PLACEMENT
)
rows = append(rows, record)
}
Expand Down Expand Up @@ -805,6 +816,8 @@ func (e *memtableRetriever) setDataFromPartitions(ctx context.Context, sctx sess
nil, // NODEGROUP
nil, // TABLESPACE_NAME
nil, // TIDB_PARTITION_ID
nil, // TIDB_PLACEMENT_POLICY_NAME
nil, // TIDB_DIRECT_PLACEMENT
)
rows = append(rows, record)
} else {
Expand Down Expand Up @@ -861,6 +874,13 @@ func (e *memtableRetriever) setDataFromPartitions(ctx context.Context, sctx sess
partitionExpr = buf.String()
}

var policyName, directPlacement interface{}
if pi.PlacementPolicyRef != nil {
policyName = pi.PlacementPolicyRef.Name.O
}
if pi.DirectPlacementOpts != nil {
directPlacement = pi.DirectPlacementOpts.String()
}
record := types.MakeDatums(
infoschema.CatalogVal, // TABLE_CATALOG
schema.Name.O, // TABLE_SCHEMA
Expand Down Expand Up @@ -888,6 +908,8 @@ func (e *memtableRetriever) setDataFromPartitions(ctx context.Context, sctx sess
nil, // NODEGROUP
nil, // TABLESPACE_NAME
pi.ID, // TIDB_PARTITION_ID
policyName, // TIDB_PLACEMENT_POLICY_NAME
directPlacement, // TIDB_DIRECT_PLACEMENT
)
rows = append(rows, record)
}
Expand Down
4 changes: 4 additions & 0 deletions infoschema/tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ var tablesCols = []columnInfo{
{name: "TIDB_TABLE_ID", tp: mysql.TypeLonglong, size: 21},
{name: "TIDB_ROW_ID_SHARDING_INFO", tp: mysql.TypeVarchar, size: 255},
{name: "TIDB_PK_TYPE", tp: mysql.TypeVarchar, size: 64},
{name: "TIDB_PLACEMENT_POLICY_NAME", tp: mysql.TypeVarchar, size: 64},
{name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: types.UnspecifiedLength},
}

// See: http://dev.mysql.com/doc/refman/5.7/en/columns-table.html
Expand Down Expand Up @@ -558,6 +560,8 @@ var partitionsCols = []columnInfo{
{name: "NODEGROUP", tp: mysql.TypeVarchar, size: 12},
{name: "TABLESPACE_NAME", tp: mysql.TypeVarchar, size: 64},
{name: "TIDB_PARTITION_ID", tp: mysql.TypeLonglong, size: 21},
{name: "TIDB_PLACEMENT_POLICY_NAME", tp: mysql.TypeVarchar, size: 64},
{name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: types.UnspecifiedLength},
}

var tableConstraintsCols = []columnInfo{
Expand Down

0 comments on commit 84ec663

Please sign in to comment.