Skip to content

Commit 1dd78de

Browse files
authored
executor,infoschema: add I_S table: TIDB_CHECK_CONSTRAINTS (#48313)
close #47565
1 parent 3f1c698 commit 1dd78de

File tree

6 files changed

+134
-1
lines changed

6 files changed

+134
-1
lines changed

pkg/executor/builder.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -2123,7 +2123,8 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) exec.Ex
21232123
strings.ToLower(infoschema.ClusterTableMemoryUsageOpsHistory),
21242124
strings.ToLower(infoschema.TableResourceGroups),
21252125
strings.ToLower(infoschema.TableRunawayWatches),
2126-
strings.ToLower(infoschema.TableCheckConstraints):
2126+
strings.ToLower(infoschema.TableCheckConstraints),
2127+
strings.ToLower(infoschema.TableTiDBCheckConstraints):
21272128
return &MemTableReaderExec{
21282129
BaseExecutor: exec.NewBaseExecutor(b.ctx, v.Schema(), v.ID()),
21292130
table: v.Table,

pkg/executor/infoschema_reader.go

+36
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex
195195
err = e.setDataFromRunawayWatches(sctx)
196196
case infoschema.TableCheckConstraints:
197197
err = e.setDataFromCheckConstraints(sctx, dbs)
198+
case infoschema.TableTiDBCheckConstraints:
199+
err = e.setDataFromTiDBCheckConstraints(sctx, dbs)
198200
}
199201
if err != nil {
200202
return nil, err
@@ -628,6 +630,8 @@ func (e *memtableRetriever) setDataFromTables(sctx sessionctx.Context, schemas [
628630
return nil
629631
}
630632

633+
// Data for inforation_schema.CHECK_CONSTRAINTS
634+
// This is standards (ISO/IEC 9075-11) compliant and is compatible with the implementation in MySQL as well.
631635
func (e *memtableRetriever) setDataFromCheckConstraints(sctx sessionctx.Context, schemas []*model.DBInfo) error {
632636
var rows [][]types.Datum
633637
checker := privilege.GetPrivilegeManager(sctx)
@@ -656,6 +660,38 @@ func (e *memtableRetriever) setDataFromCheckConstraints(sctx sessionctx.Context,
656660
return nil
657661
}
658662

663+
// Data for inforation_schema.TIDB_CHECK_CONSTRAINTS
664+
// This has non-standard TiDB specific extensions.
665+
func (e *memtableRetriever) setDataFromTiDBCheckConstraints(sctx sessionctx.Context, schemas []*model.DBInfo) error {
666+
var rows [][]types.Datum
667+
checker := privilege.GetPrivilegeManager(sctx)
668+
for _, schema := range schemas {
669+
for _, table := range schema.Tables {
670+
if len(table.Constraints) > 0 {
671+
if checker != nil && !checker.RequestVerification(sctx.GetSessionVars().ActiveRoles, schema.Name.L, table.Name.L, "", mysql.SelectPriv) {
672+
continue
673+
}
674+
for _, constraint := range table.Constraints {
675+
if constraint.State != model.StatePublic {
676+
continue
677+
}
678+
record := types.MakeDatums(
679+
infoschema.CatalogVal, // CONSTRAINT_CATALOG
680+
schema.Name.O, // CONSTRAINT_SCHEMA
681+
constraint.Name.O, // CONSTRAINT_NAME
682+
fmt.Sprintf("(%s)", constraint.ExprString), // CHECK_CLAUSE
683+
table.Name.O, // TABLE_NAME
684+
table.ID, // TABLE_ID
685+
)
686+
rows = append(rows, record)
687+
}
688+
}
689+
}
690+
}
691+
e.rows = rows
692+
return nil
693+
}
694+
659695
func (e *hugeMemTableRetriever) setDataForColumns(ctx context.Context, sctx sessionctx.Context, extractor *plannercore.ColumnsTableExtractor) error {
660696
checker := privilege.GetPrivilegeManager(sctx)
661697
e.rows = e.rows[:0]

pkg/executor/infoschema_reader_internal_test.go

+52
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,55 @@ func TestSetDataFromCheckConstraints(t *testing.T) {
7171
require.Equal(t, types.NewStringDatum("t2_c1"), mt.rows[0][2])
7272
require.Equal(t, types.NewStringDatum("(id<10)"), mt.rows[0][3])
7373
}
74+
75+
func TestSetDataFromTiDBCheckConstraints(t *testing.T) {
76+
mt := memtableRetriever{}
77+
sctx := defaultCtx()
78+
dbs := []*model.DBInfo{
79+
{
80+
ID: 1,
81+
Name: model.NewCIStr("test"),
82+
Tables: []*model.TableInfo{
83+
{
84+
ID: 1,
85+
Name: model.NewCIStr("t1"),
86+
},
87+
{
88+
ID: 2,
89+
Name: model.NewCIStr("t2"),
90+
Constraints: []*model.ConstraintInfo{
91+
{
92+
Name: model.NewCIStr("t2_c1"),
93+
Table: model.NewCIStr("t2"),
94+
ExprString: "id<10",
95+
State: model.StatePublic,
96+
},
97+
},
98+
},
99+
{
100+
ID: 3,
101+
Name: model.NewCIStr("t3"),
102+
Constraints: []*model.ConstraintInfo{
103+
{
104+
Name: model.NewCIStr("t3_c1"),
105+
Table: model.NewCIStr("t3"),
106+
ExprString: "id<10",
107+
State: model.StateDeleteOnly,
108+
},
109+
},
110+
},
111+
},
112+
},
113+
}
114+
err := mt.setDataFromTiDBCheckConstraints(sctx, dbs)
115+
require.NoError(t, err)
116+
117+
require.Equal(t, 1, len(mt.rows)) // 1 row
118+
require.Equal(t, 6, len(mt.rows[0])) // 6 columns
119+
require.Equal(t, types.NewStringDatum("def"), mt.rows[0][0])
120+
require.Equal(t, types.NewStringDatum("test"), mt.rows[0][1])
121+
require.Equal(t, types.NewStringDatum("t2_c1"), mt.rows[0][2])
122+
require.Equal(t, types.NewStringDatum("(id<10)"), mt.rows[0][3])
123+
require.Equal(t, types.NewStringDatum("t2"), mt.rows[0][4])
124+
require.Equal(t, types.NewIntDatum(2), mt.rows[0][5])
125+
}

pkg/infoschema/tables.go

+15
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ const (
209209
TableRunawayWatches = "RUNAWAY_WATCHES"
210210
// TableCheckConstraints is the list of CHECK constraints.
211211
TableCheckConstraints = "CHECK_CONSTRAINTS"
212+
// TableTiDBCheckConstraints is the list of CHECK constraints, with non-standard TiDB extensions.
213+
TableTiDBCheckConstraints = "TIDB_CHECK_CONSTRAINTS"
212214
)
213215

214216
const (
@@ -318,6 +320,7 @@ var tableIDMap = map[string]int64{
318320
TableResourceGroups: autoid.InformationSchemaDBID + 88,
319321
TableRunawayWatches: autoid.InformationSchemaDBID + 89,
320322
TableCheckConstraints: autoid.InformationSchemaDBID + 90,
323+
TableTiDBCheckConstraints: autoid.InformationSchemaDBID + 91,
321324
}
322325

323326
// columnInfo represents the basic column information of all kinds of INFORMATION_SCHEMA tables
@@ -1630,13 +1633,24 @@ var tableRunawayWatchListCols = []columnInfo{
16301633
{name: "ACTION", tp: mysql.TypeVarchar, size: 12, flag: mysql.NotNullFlag},
16311634
}
16321635

1636+
// information_schema.CHECK_CONSTRAINTS
16331637
var tableCheckConstraintsCols = []columnInfo{
16341638
{name: "CONSTRAINT_CATALOG", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag},
16351639
{name: "CONSTRAINT_SCHEMA", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag},
16361640
{name: "CONSTRAINT_NAME", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag},
16371641
{name: "CHECK_CLAUSE", tp: mysql.TypeLongBlob, size: types.UnspecifiedLength, flag: mysql.NotNullFlag},
16381642
}
16391643

1644+
// information_schema.TIDB_CHECK_CONSTRAINTS
1645+
var tableTiDBCheckConstraintsCols = []columnInfo{
1646+
{name: "CONSTRAINT_CATALOG", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag},
1647+
{name: "CONSTRAINT_SCHEMA", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag},
1648+
{name: "CONSTRAINT_NAME", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag},
1649+
{name: "CHECK_CLAUSE", tp: mysql.TypeLongBlob, size: types.UnspecifiedLength, flag: mysql.NotNullFlag},
1650+
{name: "TABLE_NAME", tp: mysql.TypeVarchar, size: 64},
1651+
{name: "TABLE_ID", tp: mysql.TypeLonglong, size: 21},
1652+
}
1653+
16401654
// GetShardingInfo returns a nil or description string for the sharding information of given TableInfo.
16411655
// The returned description string may be:
16421656
// - "NOT_SHARDED": for tables that SHARD_ROW_ID_BITS is not specified.
@@ -2175,6 +2189,7 @@ var tableNameToColumns = map[string][]columnInfo{
21752189
TableResourceGroups: tableResourceGroupsCols,
21762190
TableRunawayWatches: tableRunawayWatchListCols,
21772191
TableCheckConstraints: tableCheckConstraintsCols,
2192+
TableTiDBCheckConstraints: tableTiDBCheckConstraintsCols,
21782193
}
21792194

21802195
func createInfoSchemaTable(_ autoid.Allocators, meta *model.TableInfo) (table.Table, error) {

tests/integrationtest/r/infoschema/tables.result

+17
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,20 @@ DROP TABLE t2;
271271
SELECT * FROM information_schema.CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't2_chk_1';
272272
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME CHECK_CLAUSE
273273
SET GLOBAL tidb_enable_check_constraint = default;
274+
drop table if exists t1, t2;
275+
SET GLOBAL tidb_enable_check_constraint = ON;
276+
CREATE TABLE t1 (id INT PRIMARY KEY, CHECK (id<10));
277+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't1_chk_1';
278+
CONSTRAINT_SCHEMA CONSTRAINT_NAME CHECK_CLAUSE TABLE_NAME
279+
infoschema__tables t1_chk_1 (`id` < 10) t1
280+
ALTER TABLE t1 DROP CONSTRAINT t1_chk_1;
281+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't1_chk_1';
282+
CONSTRAINT_SCHEMA CONSTRAINT_NAME CHECK_CLAUSE TABLE_NAME
283+
CREATE TABLE t2 (id INT PRIMARY KEY, CHECK (id<20));
284+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't2_chk_1';
285+
CONSTRAINT_SCHEMA CONSTRAINT_NAME CHECK_CLAUSE TABLE_NAME
286+
infoschema__tables t2_chk_1 (`id` < 20) t2
287+
DROP TABLE t2;
288+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't2_chk_1';
289+
CONSTRAINT_SCHEMA CONSTRAINT_NAME CHECK_CLAUSE TABLE_NAME
290+
SET GLOBAL tidb_enable_check_constraint = default;

tests/integrationtest/t/infoschema/tables.test

+12
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,15 @@ DROP TABLE t2;
203203
SELECT * FROM information_schema.CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't2_chk_1';
204204
SET GLOBAL tidb_enable_check_constraint = default;
205205

206+
# TestTiDBCheckConstraints
207+
drop table if exists t1, t2;
208+
SET GLOBAL tidb_enable_check_constraint = ON;
209+
CREATE TABLE t1 (id INT PRIMARY KEY, CHECK (id<10));
210+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't1_chk_1';
211+
ALTER TABLE t1 DROP CONSTRAINT t1_chk_1;
212+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't1_chk_1';
213+
CREATE TABLE t2 (id INT PRIMARY KEY, CHECK (id<20));
214+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't2_chk_1';
215+
DROP TABLE t2;
216+
SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE, TABLE_NAME FROM information_schema.TIDB_CHECK_CONSTRAINTS where CONSTRAINT_NAME = 't2_chk_1';
217+
SET GLOBAL tidb_enable_check_constraint = default;

0 commit comments

Comments
 (0)