Skip to content

Commit 99180a8

Browse files
authored
planner: refactor infoschema predicate extractors (pingcap#55502)
ref pingcap#50305
1 parent 0b6e2e6 commit 99180a8

File tree

5 files changed

+379
-488
lines changed

5 files changed

+379
-488
lines changed

pkg/executor/infoschema_reader.go

+64-73
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,6 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex
115115
is := sctx.GetInfoSchema().(infoschema.InfoSchema)
116116
e.is = is
117117

118-
var getAllSchemas = func() []model.CIStr {
119-
dbs := is.AllSchemaNames()
120-
slices.SortFunc(dbs, func(a, b model.CIStr) int {
121-
return strings.Compare(a.L, b.L)
122-
})
123-
return dbs
124-
}
125-
126118
var err error
127119
switch e.table.Name.O {
128120
case infoschema.TableSchemata:
@@ -176,8 +168,7 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex
176168
case infoschema.TableTiDBServersInfo:
177169
err = e.setDataForServersInfo(sctx)
178170
case infoschema.TableTiFlashReplica:
179-
dbs := getAllSchemas()
180-
err = e.dataForTableTiFlashReplica(ctx, sctx, dbs)
171+
err = e.dataForTableTiFlashReplica(ctx, sctx)
181172
case infoschema.TableTiKVStoreStatus:
182173
err = e.dataForTiKVStoreStatus(ctx, sctx)
183174
case infoschema.TableClientErrorsSummaryGlobal,
@@ -415,34 +406,36 @@ func (e *memtableRetriever) setDataForStatistics(ctx context.Context, sctx sessi
415406
return nil
416407
}
417408

418-
func (e *memtableRetriever) setDataForStatisticsInTable(schema model.CIStr, table *model.TableInfo, extractor *plannercore.InfoSchemaStatisticsExtractor) {
409+
func (e *memtableRetriever) setDataForStatisticsInTable(
410+
schema model.CIStr,
411+
table *model.TableInfo,
412+
ex *plannercore.InfoSchemaStatisticsExtractor,
413+
) {
419414
var rows [][]types.Datum
420-
if table.PKIsHandle {
421-
if !extractor.Filter("index_name", "primary") {
422-
for _, col := range table.Columns {
423-
if mysql.HasPriKeyFlag(col.GetFlag()) {
424-
record := types.MakeDatums(
425-
infoschema.CatalogVal, // TABLE_CATALOG
426-
schema.O, // TABLE_SCHEMA
427-
table.Name.O, // TABLE_NAME
428-
"0", // NON_UNIQUE
429-
schema.O, // INDEX_SCHEMA
430-
"PRIMARY", // INDEX_NAME
431-
1, // SEQ_IN_INDEX
432-
col.Name.O, // COLUMN_NAME
433-
"A", // COLLATION
434-
0, // CARDINALITY
435-
nil, // SUB_PART
436-
nil, // PACKED
437-
"", // NULLABLE
438-
"BTREE", // INDEX_TYPE
439-
"", // COMMENT
440-
"", // INDEX_COMMENT
441-
"YES", // IS_VISIBLE
442-
nil, // Expression
443-
)
444-
rows = append(rows, record)
445-
}
415+
if table.PKIsHandle && ex.HasPrimaryKey() {
416+
for _, col := range table.Columns {
417+
if mysql.HasPriKeyFlag(col.GetFlag()) {
418+
record := types.MakeDatums(
419+
infoschema.CatalogVal, // TABLE_CATALOG
420+
schema.O, // TABLE_SCHEMA
421+
table.Name.O, // TABLE_NAME
422+
"0", // NON_UNIQUE
423+
schema.O, // INDEX_SCHEMA
424+
"PRIMARY", // INDEX_NAME
425+
1, // SEQ_IN_INDEX
426+
col.Name.O, // COLUMN_NAME
427+
"A", // COLLATION
428+
0, // CARDINALITY
429+
nil, // SUB_PART
430+
nil, // PACKED
431+
"", // NULLABLE
432+
"BTREE", // INDEX_TYPE
433+
"", // COMMENT
434+
"", // INDEX_COMMENT
435+
"YES", // IS_VISIBLE
436+
nil, // Expression
437+
)
438+
rows = append(rows, record)
446439
}
447440
}
448441
}
@@ -451,7 +444,7 @@ func (e *memtableRetriever) setDataForStatisticsInTable(schema model.CIStr, tabl
451444
nameToCol[c.Name.L] = c
452445
}
453446
for _, index := range table.Indices {
454-
if extractor.Filter("index_name", index.Name.L) {
447+
if !ex.HasIndex(index.Name.L) {
455448
continue
456449
}
457450
nonUnique := "1"
@@ -528,7 +521,7 @@ func (e *memtableRetriever) setDataFromReferConst(ctx context.Context, sctx sess
528521
continue
529522
}
530523
for _, fk := range table.ForeignKeys {
531-
if ok && ex.Filter("constraint_name", fk.Name.L) {
524+
if ok && !ex.HasConstraint(fk.Name.L) {
532525
continue
533526
}
534527
updateRule, deleteRule := "NO ACTION", "NO ACTION"
@@ -753,7 +746,7 @@ func (e *memtableRetriever) setDataFromCheckConstraints(ctx context.Context, sct
753746
if constraint.State != model.StatePublic {
754747
continue
755748
}
756-
if ok && ex.Filter("constraint_name", constraint.Name.L) {
749+
if ok && !ex.HasConstraint(constraint.Name.L) {
757750
continue
758751
}
759752
record := types.MakeDatums(
@@ -797,7 +790,7 @@ func (e *memtableRetriever) setDataFromTiDBCheckConstraints(ctx context.Context,
797790
if constraint.State != model.StatePublic {
798791
continue
799792
}
800-
if ok && ex.Filter("constraint_name", constraint.Name.L) {
793+
if ok && !ex.HasConstraint(constraint.Name.L) {
801794
continue
802795
}
803796
record := types.MakeDatums(
@@ -1152,7 +1145,7 @@ func (e *memtableRetriever) setDataFromPartitions(ctx context.Context, sctx sess
11521145
rows = append(rows, record)
11531146
} else {
11541147
for i, pi := range table.GetPartitionInfo().Definitions {
1155-
if ex.Filter("partition_name", pi.Name.L) {
1148+
if !ex.HasPartition(pi.Name.L) {
11561149
continue
11571150
}
11581151
rowCount = cache.TableRowStatsCache.GetTableRows(pi.ID)
@@ -1676,7 +1669,7 @@ func (e *memtableRetriever) setDataFromKeyColumnUsage(ctx context.Context, sctx
16761669
if checker != nil && !checker.RequestVerification(sctx.GetSessionVars().ActiveRoles, schema.L, table.Name.L, "", mysql.AllPrivMask) {
16771670
continue
16781671
}
1679-
if ex.Filter("constraint_schema", schema.O) {
1672+
if !ex.HasConstraintSchema(schema.L) {
16801673
continue
16811674
}
16821675
rs := keyColumnUsageInTable(schema, table, ex)
@@ -1748,29 +1741,27 @@ func (e *memtableRetriever) setDataForMetricTables() {
17481741
e.rows = rows
17491742
}
17501743

1751-
func keyColumnUsageInTable(schema model.CIStr, table *model.TableInfo, extractor *plannercore.InfoSchemaKeyColumnUsageExtractor) [][]types.Datum {
1744+
func keyColumnUsageInTable(schema model.CIStr, table *model.TableInfo, ex *plannercore.InfoSchemaKeyColumnUsageExtractor) [][]types.Datum {
17521745
var rows [][]types.Datum
1753-
if table.PKIsHandle {
1754-
if extractor == nil || !extractor.Filter("constraint_name", lowerPrimaryKeyName) {
1755-
for _, col := range table.Columns {
1756-
if mysql.HasPriKeyFlag(col.GetFlag()) {
1757-
record := types.MakeDatums(
1758-
infoschema.CatalogVal, // CONSTRAINT_CATALOG
1759-
schema.O, // CONSTRAINT_SCHEMA
1760-
infoschema.PrimaryConstraint, // CONSTRAINT_NAME
1761-
infoschema.CatalogVal, // TABLE_CATALOG
1762-
schema.O, // TABLE_SCHEMA
1763-
table.Name.O, // TABLE_NAME
1764-
col.Name.O, // COLUMN_NAME
1765-
1, // ORDINAL_POSITION
1766-
1, // POSITION_IN_UNIQUE_CONSTRAINT
1767-
nil, // REFERENCED_TABLE_SCHEMA
1768-
nil, // REFERENCED_TABLE_NAME
1769-
nil, // REFERENCED_COLUMN_NAME
1770-
)
1771-
rows = append(rows, record)
1772-
break
1773-
}
1746+
if table.PKIsHandle && ex.HasPrimaryKey() {
1747+
for _, col := range table.Columns {
1748+
if mysql.HasPriKeyFlag(col.GetFlag()) {
1749+
record := types.MakeDatums(
1750+
infoschema.CatalogVal, // CONSTRAINT_CATALOG
1751+
schema.O, // CONSTRAINT_SCHEMA
1752+
infoschema.PrimaryConstraint, // CONSTRAINT_NAME
1753+
infoschema.CatalogVal, // TABLE_CATALOG
1754+
schema.O, // TABLE_SCHEMA
1755+
table.Name.O, // TABLE_NAME
1756+
col.Name.O, // COLUMN_NAME
1757+
1, // ORDINAL_POSITION
1758+
1, // POSITION_IN_UNIQUE_CONSTRAINT
1759+
nil, // REFERENCED_TABLE_SCHEMA
1760+
nil, // REFERENCED_TABLE_NAME
1761+
nil, // REFERENCED_COLUMN_NAME
1762+
)
1763+
rows = append(rows, record)
1764+
break
17741765
}
17751766
}
17761767
}
@@ -1792,7 +1783,7 @@ func keyColumnUsageInTable(schema model.CIStr, table *model.TableInfo, extractor
17921783
continue
17931784
}
17941785

1795-
if extractor != nil && extractor.Filter("constraint_name", filterIdxName) {
1786+
if !ex.HasConstraint(filterIdxName) {
17961787
continue
17971788
}
17981789

@@ -1819,7 +1810,7 @@ func keyColumnUsageInTable(schema model.CIStr, table *model.TableInfo, extractor
18191810
}
18201811
}
18211812
for _, fk := range table.ForeignKeys {
1822-
if extractor != nil && extractor.Filter("constraint_name", fk.Name.L) {
1813+
if !ex.HasConstraint(fk.Name.L) {
18231814
continue
18241815
}
18251816

@@ -2077,15 +2068,15 @@ func (e *memtableRetriever) setDataFromTableConstraints(ctx context.Context, sct
20772068
rows := make([][]types.Datum, 0, len(tables))
20782069
for i, tbl := range tables {
20792070
schema := schemas[i]
2080-
if ex.Filter("constraint_schema", schema.L) {
2071+
if !ex.HasConstraintSchema(schema.L) {
20812072
continue
20822073
}
20832074
if checker != nil && !checker.RequestVerification(sctx.GetSessionVars().ActiveRoles, schema.L, tbl.Name.L, "", mysql.AllPrivMask) {
20842075
continue
20852076
}
20862077

20872078
if tbl.PKIsHandle {
2088-
if !ex.Filter("constraint_name", lowerPrimaryKeyName) {
2079+
if ex.HasPrimaryKey() {
20892080
record := types.MakeDatums(
20902081
infoschema.CatalogVal, // CONSTRAINT_CATALOG
20912082
schema.O, // CONSTRAINT_SCHEMA
@@ -2113,7 +2104,7 @@ func (e *memtableRetriever) setDataFromTableConstraints(ctx context.Context, sct
21132104
// The index has no constriant.
21142105
continue
21152106
}
2116-
if ex.Filter("constraint_name", filterName) {
2107+
if !ex.HasConstraint(filterName) {
21172108
continue
21182109
}
21192110
record := types.MakeDatums(
@@ -2128,7 +2119,7 @@ func (e *memtableRetriever) setDataFromTableConstraints(ctx context.Context, sct
21282119
}
21292120
// TiDB includes foreign key information for compatibility but foreign keys are not yet enforced.
21302121
for _, fk := range tbl.ForeignKeys {
2131-
if ex.Filter("constraint_name", fk.Name.L) {
2122+
if !ex.HasConstraint(fk.Name.L) {
21322123
continue
21332124
}
21342125
record := types.MakeDatums(
@@ -2571,7 +2562,7 @@ func (e *memtableRetriever) setDataFromSequences(ctx context.Context, sctx sessi
25712562
}
25722563

25732564
// dataForTableTiFlashReplica constructs data for table tiflash replica info.
2574-
func (e *memtableRetriever) dataForTableTiFlashReplica(_ context.Context, sctx sessionctx.Context, _ []model.CIStr) error {
2565+
func (e *memtableRetriever) dataForTableTiFlashReplica(_ context.Context, sctx sessionctx.Context) error {
25752566
var (
25762567
checker = privilege.GetPrivilegeManager(sctx)
25772568
rows [][]types.Datum
@@ -3677,7 +3668,7 @@ func (e *memtableRetriever) setDataFromIndexUsage(ctx context.Context, sctx sess
36773668
dom := domain.GetDomain(sctx)
36783669
rows := make([][]types.Datum, 0, 100)
36793670
checker := privilege.GetPrivilegeManager(sctx)
3680-
extractor, ok := e.extractor.(*plannercore.InfoSchemaIndexUsageExtractor)
3671+
extractor, ok := e.extractor.(*plannercore.InfoSchemaTiDBIndexUsageExtractor)
36813672
if !ok {
36823673
return errors.Errorf("wrong extractor type: %T, expected InfoSchemaIndexUsageExtractor", e.extractor)
36833674
}

pkg/planner/core/logical_plan_builder.go

+14-42
Original file line numberDiff line numberDiff line change
@@ -4814,61 +4814,33 @@ func (b *PlanBuilder) buildMemTable(_ context.Context, dbName model.CIStr, table
48144814
case infoschema.TableTiKVRegionPeers:
48154815
p.Extractor = &TikvRegionPeersExtractor{}
48164816
case infoschema.TableColumns:
4817-
ex := &InfoSchemaColumnsExtractor{}
4818-
ex.initExtractableColNames(upTbl)
4819-
p.Extractor = ex
4817+
p.Extractor = NewInfoSchemaColumnsExtractor()
48204818
case infoschema.TableTables:
4821-
ex := &InfoSchemaTablesExtractor{}
4822-
ex.initExtractableColNames(upTbl)
4823-
p.Extractor = ex
4819+
p.Extractor = NewInfoSchemaTablesExtractor()
48244820
case infoschema.TablePartitions:
4825-
ex := &InfoSchemaPartitionsExtractor{}
4826-
ex.initExtractableColNames(upTbl)
4827-
p.Extractor = ex
4821+
p.Extractor = NewInfoSchemaPartitionsExtractor()
48284822
case infoschema.TableStatistics:
4829-
ex := &InfoSchemaStatisticsExtractor{}
4830-
ex.initExtractableColNames(upTbl)
4831-
p.Extractor = ex
4823+
p.Extractor = NewInfoSchemaStatisticsExtractor()
48324824
case infoschema.TableSchemata:
4833-
ex := &InfoSchemaSchemataExtractor{}
4834-
ex.initExtractableColNames(upTbl)
4835-
p.Extractor = ex
4825+
p.Extractor = NewInfoSchemaSchemataExtractor()
48364826
case infoschema.TableSequences:
4837-
ex := &InfoSchemaSequenceExtractor{}
4838-
ex.initExtractableColNames(upTbl)
4839-
p.Extractor = ex
4827+
p.Extractor = NewInfoSchemaSequenceExtractor()
48404828
case infoschema.TableTiDBIndexUsage:
4841-
ex := &InfoSchemaIndexUsageExtractor{}
4842-
ex.initExtractableColNames(upTbl)
4843-
p.Extractor = ex
4829+
p.Extractor = NewInfoSchemaTiDBIndexUsageExtractor()
48444830
case infoschema.TableCheckConstraints:
4845-
ex := &InfoSchemaCheckConstraintsExtractor{}
4846-
ex.initExtractableColNames(upTbl)
4847-
p.Extractor = ex
4831+
p.Extractor = NewInfoSchemaCheckConstraintsExtractor()
48484832
case infoschema.TableTiDBCheckConstraints:
4849-
ex := &InfoSchemaTiDBCheckConstraintsExtractor{}
4850-
ex.initExtractableColNames(upTbl)
4851-
p.Extractor = ex
4833+
p.Extractor = NewInfoSchemaTiDBCheckConstraintsExtractor()
48524834
case infoschema.TableReferConst:
4853-
ex := &InfoSchemaReferConstExtractor{}
4854-
ex.initExtractableColNames(upTbl)
4855-
p.Extractor = ex
4835+
p.Extractor = NewInfoSchemaReferConstExtractor()
48564836
case infoschema.TableTiDBIndexes:
4857-
ex := &InfoSchemaIndexesExtractor{}
4858-
ex.initExtractableColNames(upTbl)
4859-
p.Extractor = ex
4837+
p.Extractor = NewInfoSchemaIndexesExtractor()
48604838
case infoschema.TableViews:
4861-
ex := &InfoSchemaViewsExtractor{}
4862-
ex.initExtractableColNames(upTbl)
4863-
p.Extractor = ex
4839+
p.Extractor = NewInfoSchemaViewsExtractor()
48644840
case infoschema.TableKeyColumn:
4865-
ex := &InfoSchemaKeyColumnUsageExtractor{}
4866-
ex.initExtractableColNames(upTbl)
4867-
p.Extractor = ex
4841+
p.Extractor = NewInfoSchemaKeyColumnUsageExtractor()
48684842
case infoschema.TableConstraints:
4869-
ex := &InfoSchemaTableConstraintsExtractor{}
4870-
ex.initExtractableColNames(upTbl)
4871-
p.Extractor = ex
4843+
p.Extractor = NewInfoSchemaTableConstraintsExtractor()
48724844
case infoschema.TableTiKVRegionStatus:
48734845
p.Extractor = &TiKVRegionStatusExtractor{tablesID: make([]int64, 0)}
48744846
}

0 commit comments

Comments
 (0)