diff --git a/cmd/explaintest/r/show.result b/cmd/explaintest/r/show.result new file mode 100644 index 0000000000000..6dfbf77c4af44 --- /dev/null +++ b/cmd/explaintest/r/show.result @@ -0,0 +1,4 @@ +show tables like '%xx'; +Tables_in_test (%xx) +show databases like '%xx'; +Database (%xx) diff --git a/cmd/explaintest/t/show.test b/cmd/explaintest/t/show.test new file mode 100644 index 0000000000000..b90131d18f861 --- /dev/null +++ b/cmd/explaintest/t/show.test @@ -0,0 +1,3 @@ +# test show output field name +show tables like '%xx'; +show databases like '%xx'; diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index b150788d36a56..1059e8eadf1a5 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -2933,17 +2933,17 @@ func (b *PlanBuilder) buildShow(ctx context.Context, show *ast.ShowStmt) (Plan, }.Init(b.ctx) isView := false isSequence := false + // It depends on ShowPredicateExtractor now + buildPattern := true switch show.Tp { case ast.ShowDatabases, ast.ShowVariables, ast.ShowTables, ast.ShowColumns, ast.ShowTableStatus, ast.ShowCollation: if (show.Tp == ast.ShowTables || show.Tp == ast.ShowTableStatus) && p.DBName == "" { return nil, ErrNoDB } - extractor := newShowBaseExtractor(*show) - if extractor.Extract() { + if extractor := newShowBaseExtractor(*show); extractor.Extract() { p.Extractor = extractor - // Avoid building Selection. - show.Pattern = nil + buildPattern = false } case ast.ShowCreateTable, ast.ShowCreateSequence, ast.ShowPlacementForTable, ast.ShowPlacementForPartition: var err error @@ -3019,7 +3019,8 @@ func (b *PlanBuilder) buildShow(ctx context.Context, show *ast.ShowStmt) (Plan, var err error var np LogicalPlan np = p - if show.Pattern != nil { + // If we have ShowPredicateExtractor, we do not buildSelection with Pattern + if show.Pattern != nil && buildPattern { show.Pattern.Expr = &ast.ColumnNameExpr{ Name: &ast.ColumnName{Name: p.OutputNames()[0].ColName}, } @@ -4645,12 +4646,20 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp case ast.ShowConfig: names = []string{"Type", "Instance", "Name", "Value"} case ast.ShowDatabases: - names = []string{"Database"} + fieldDB := "Database" + if patternName := extractPatternLikeName(s.Pattern); patternName != "" { + fieldDB = fmt.Sprintf("%s (%s)", fieldDB, patternName) + } + names = []string{fieldDB} case ast.ShowOpenTables: names = []string{"Database", "Table", "In_use", "Name_locked"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLong, mysql.TypeLong} case ast.ShowTables: - names = []string{fmt.Sprintf("Tables_in_%s", s.DBName)} + fieldTable := fmt.Sprintf("Tables_in_%s", s.DBName) + if patternName := extractPatternLikeName(s.Pattern); patternName != "" { + fieldTable = fmt.Sprintf("%s (%s)", fieldTable, patternName) + } + names = []string{fieldTable} if s.Full { names = append(names, "Table_type") } @@ -4870,3 +4879,14 @@ func (b *PlanBuilder) buildCompactTable(node *ast.CompactTableStmt) (Plan, error } return p, nil } + +func extractPatternLikeName(patternLike *ast.PatternLikeExpr) string { + if patternLike == nil { + return "" + } + switch v := patternLike.Pattern.(type) { + case *driver.ValueExpr: + return v.GetString() + } + return "" +}