Skip to content

Commit

Permalink
Merge #29597
Browse files Browse the repository at this point in the history
29597: opt: remember subquery ASTs for explain r=RaduBerinde a=RaduBerinde

#### sql: rename "sql" to "original sql" in subquery EXPLAIN

With the optimizer, this field will show the original subquery which
might have been modified by transforms.

Release note: None

#### opt: remember subquery ASTs for explain

Store the original `*tree.Subquery` in `Any`, `Exists`, `Subquery` and
use it to populate the subquery during execbuild. This causes the
original subquery to show up in `EXPLAIN`.

Fixes #29350.

Release note: None


Co-authored-by: Radu Berinde <[email protected]>
  • Loading branch information
craig[bot] and RaduBerinde committed Sep 6, 2018
2 parents a9ce5b7 + 3eab8d4 commit 6ff2995
Show file tree
Hide file tree
Showing 17 changed files with 308 additions and 216 deletions.
4 changes: 3 additions & 1 deletion pkg/sql/explain_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,9 @@ func (e *explainer) populateEntries(ctx context.Context, plan planNode, subquery
for i := range subqueryPlans {
_, _ = e.enterNode(ctx, "subquery", plan)
e.attr("subquery", "id", fmt.Sprintf("@S%d", i+1))
e.attr("subquery", "sql", subqueryPlans[i].subquery.String())
// This field contains the original subquery (which could have been modified
// by optimizer transformations).
e.attr("subquery", "original sql", subqueryPlans[i].subquery.String())
e.attr("subquery", "exec mode", distsqlrun.SubqueryExecModeNames[subqueryPlans[i].execMode])
if subqueryPlans[i].plan != nil {
_ = walkPlan(ctx, subqueryPlans[i].plan, observer)
Expand Down
30 changes: 15 additions & 15 deletions pkg/sql/logictest/testdata/planner_test/needed_columns
Original file line number Diff line number Diff line change
Expand Up @@ -121,21 +121,21 @@ nosort · · (x) x=CONST
query TTTTT
EXPLAIN (VERBOSE) SELECT 1 = (SELECT 2 AS x FROM (SELECT 3 AS s)) AS y
----
root · · (y) y=CONST
├── render · · (y) y=CONST
│ │ render 0 @S1 = 1 · ·
│ └── emptyrow · · () ·
└── subquery · · (y) y=CONST
│ id @S1 · ·
sql (SELECT 2 AS x FROM (SELECT 3 AS s)) · ·
│ exec mode one row · ·
└── limit · · (x) x=CONST
│ count 2 · ·
└── render · · (x) x=CONST
│ render 0 2 · ·
└── render · · (s[omitted]) ·
│ render 0 NULL · ·
└── emptyrow · · () ·
root · · (y) y=CONST
├── render · · (y) y=CONST
│ │ render 0 @S1 = 1 · ·
│ └── emptyrow · · () ·
└── subquery · · (y) y=CONST
│ id @S1 · ·
original sql (SELECT 2 AS x FROM (SELECT 3 AS s)) · ·
│ exec mode one row · ·
└── limit · · (x) x=CONST
│ count 2 · ·
└── render · · (x) x=CONST
│ render 0 2 · ·
└── render · · (s[omitted]) ·
│ render 0 NULL · ·
└── emptyrow · · () ·

# Propagation through table scans.
statement ok
Expand Down
186 changes: 93 additions & 93 deletions pkg/sql/logictest/testdata/planner_test/subquery

Large diffs are not rendered by default.

20 changes: 14 additions & 6 deletions pkg/sql/opt/exec/execbuilder/scalar_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -360,15 +360,16 @@ func (b *Builder) buildAny(ctx *buildScalarCtx, ev memo.ExprView) (tree.TypedExp
types.Types[val] = ev.Metadata().ColumnType(opt.ColumnID(key))
})

subqueryExpr := b.addSubquery(exec.SubqueryAnyRows, types, plan.root)
def := ev.Private().(*memo.SubqueryDef)
subqueryExpr := b.addSubquery(exec.SubqueryAnyRows, types, plan.root, def.OriginalExpr)

// Build the scalar value that is compared against each row.
scalar, err := b.buildScalar(ctx, ev.Child(1))
if err != nil {
return nil, err
}

cmp := opt.ComparisonOpReverseMap[ev.Private().(opt.Operator)]
cmp := opt.ComparisonOpReverseMap[def.Cmp]
return tree.NewTypedComparisonExprWithSubOp(tree.Any, cmp, scalar, subqueryExpr), nil
}

Expand All @@ -388,7 +389,8 @@ func (b *Builder) buildExistsSubquery(
return nil, err
}

return b.addSubquery(exec.SubqueryExists, types.Bool, root), nil
def := ev.Private().(*memo.SubqueryDef)
return b.addSubquery(exec.SubqueryExists, types.Bool, root, def.OriginalExpr), nil
}

func (b *Builder) buildSubquery(ctx *buildScalarCtx, ev memo.ExprView) (tree.TypedExpr, error) {
Expand Down Expand Up @@ -417,13 +419,19 @@ func (b *Builder) buildSubquery(ctx *buildScalarCtx, ev memo.ExprView) (tree.Typ
return nil, err
}

return b.addSubquery(exec.SubqueryOneRow, ev.Logical().Scalar.Type, root), nil
def := ev.Private().(*memo.SubqueryDef)
return b.addSubquery(exec.SubqueryOneRow, ev.Logical().Scalar.Type, root, def.OriginalExpr), nil
}

// addSubquery adds an entry to b.subqueries and creates a tree.Subquery
// expression node associated with it.
func (b *Builder) addSubquery(mode exec.SubqueryMode, typ types.T, root exec.Node) *tree.Subquery {
exprNode := &tree.Subquery{Exists: mode == exec.SubqueryExists}
func (b *Builder) addSubquery(
mode exec.SubqueryMode, typ types.T, root exec.Node, originalExpr *tree.Subquery,
) *tree.Subquery {
exprNode := &tree.Subquery{
Select: originalExpr.Select,
Exists: mode == exec.SubqueryExists,
}
exprNode.SetType(typ)
b.subqueries = append(b.subqueries, exec.Subquery{
ExprNode: exprNode,
Expand Down
38 changes: 19 additions & 19 deletions pkg/sql/opt/exec/execbuilder/testdata/srfs
Original file line number Diff line number Diff line change
Expand Up @@ -163,25 +163,25 @@ render · ·
query TTTTT
EXPLAIN (VERBOSE) SELECT generate_series((SELECT unnest(ARRAY[x, y]) FROM xy), z) FROM xz
----
root · · (generate_series) ·
├── render · · (generate_series) ·
│ │ render 0 generate_series · ·
│ └── project set · · (z, generate_series) ·
│ │ render 0 generate_series(@S1, @1) · ·
│ └── scan · · (z) ·
│ table xz@primary · ·
│ spans ALL · ·
└── subquery · · (generate_series) ·
│ id @S1 · ·
│ sql <unknown> · ·
│ exec mode one row · ·
└── render · · (unnest) ·
│ render 0 unnest · ·
└── project set · · (x, y, unnest) ·
│ render 0 unnest(ARRAY[@1, @2]) · ·
└── scan · · (x, y) ·
· table xy@primary · ·
· spans ALL · ·
root · · (generate_series) ·
├── render · · (generate_series) ·
│ │ render 0 generate_series · ·
│ └── project set · · (z, generate_series) ·
│ │ render 0 generate_series(@S1, @1) · ·
│ └── scan · · (z) ·
│ table xz@primary · ·
│ spans ALL · ·
└── subquery · · (generate_series) ·
│ id @S1 · ·
original sql (SELECT unnest(ARRAY[x, y]) FROM xy) · ·
│ exec mode one row · ·
└── render · · (unnest) ·
│ render 0 unnest · ·
└── project set · · (x, y, unnest) ·
│ render 0 unnest(ARRAY[@1, @2]) · ·
└── scan · · (x, y) ·
· table xy@primary · ·
· spans ALL · ·

# Regression test for #24676.
statement ok
Expand Down
Loading

0 comments on commit 6ff2995

Please sign in to comment.