@@ -979,32 +979,58 @@ func (b *planBuilder) buildShow(show *ast.ShowStmt) (Plan, error) {
979
979
for _ , col := range p .schema .Columns {
980
980
col .UniqueID = b .ctx .GetSessionVars ().AllocPlanColumnID ()
981
981
}
982
- mockTablePlan := LogicalTableDual {}.init (b .ctx )
982
+ mockTablePlan := LogicalTableDual {placeHolder : true }.init (b .ctx )
983
983
mockTablePlan .SetSchema (p .schema )
984
+ var err error
985
+ var np LogicalPlan
986
+ np = mockTablePlan
984
987
if show .Pattern != nil {
985
988
show .Pattern .Expr = & ast.ColumnNameExpr {
986
989
Name : & ast.ColumnName {Name : p .Schema ().Columns [0 ].ColName },
987
990
}
988
- expr , _ , err : = b .rewrite ( show .Pattern , mockTablePlan , nil , false )
991
+ np , err = b .buildSelection ( np , show .Pattern , nil )
989
992
if err != nil {
990
993
return nil , errors .Trace (err )
991
994
}
992
- p .Conditions = append (p .Conditions , expr )
993
995
}
994
996
if show .Where != nil {
995
- conds := splitWhere (show .Where )
996
- for _ , cond := range conds {
997
- expr , _ , err := b .rewrite (cond , mockTablePlan , nil , false )
998
- if err != nil {
999
- return nil , errors .Trace (err )
1000
- }
1001
- p .Conditions = append (p .Conditions , expr )
997
+ np , err = b .buildSelection (np , show .Where , nil )
998
+ if err != nil {
999
+ return nil , err
1000
+ }
1001
+ }
1002
+ if np != mockTablePlan {
1003
+ fieldsLen := len (mockTablePlan .schema .Columns )
1004
+ proj := LogicalProjection {Exprs : make ([]expression.Expression , 0 , fieldsLen )}.init (b .ctx )
1005
+ schema := expression .NewSchema (make ([]* expression.Column , 0 , fieldsLen )... )
1006
+ for _ , col := range mockTablePlan .schema .Columns {
1007
+ proj .Exprs = append (proj .Exprs , col )
1008
+ newCol := col .Clone ().(* expression.Column )
1009
+ newCol .UniqueID = b .ctx .GetSessionVars ().AllocPlanColumnID ()
1010
+ schema .Append (newCol )
1011
+ }
1012
+ proj .SetSchema (schema )
1013
+ proj .SetChildren (np )
1014
+ physical , err := doOptimize (b .optFlag | flagEliminateProjection , proj )
1015
+ if err != nil {
1016
+ return nil , err
1002
1017
}
1003
- p . ResolveIndices ()
1018
+ return substitutePlaceHolderDual ( physical , p ), nil
1004
1019
}
1005
1020
return p , nil
1006
1021
}
1007
1022
1023
+ func substitutePlaceHolderDual (src PhysicalPlan , dst PhysicalPlan ) PhysicalPlan {
1024
+ if dual , ok := src .(* PhysicalTableDual ); ok && dual .placeHolder {
1025
+ return dst
1026
+ }
1027
+ for i , child := range src .Children () {
1028
+ newChild := substitutePlaceHolderDual (child , dst )
1029
+ src .SetChild (i , newChild )
1030
+ }
1031
+ return src
1032
+ }
1033
+
1008
1034
func (b * planBuilder ) buildSimple (node ast.StmtNode ) Plan {
1009
1035
p := & Simple {Statement : node }
1010
1036
0 commit comments