Skip to content

Commit 6ff2995

Browse files
craig[bot]RaduBerinde
craig[bot]
andcommitted
Merge #29597
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]>
2 parents a9ce5b7 + 3eab8d4 commit 6ff2995

File tree

17 files changed

+308
-216
lines changed

17 files changed

+308
-216
lines changed

pkg/sql/explain_plan.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,9 @@ func (e *explainer) populateEntries(ctx context.Context, plan planNode, subquery
293293
for i := range subqueryPlans {
294294
_, _ = e.enterNode(ctx, "subquery", plan)
295295
e.attr("subquery", "id", fmt.Sprintf("@S%d", i+1))
296-
e.attr("subquery", "sql", subqueryPlans[i].subquery.String())
296+
// This field contains the original subquery (which could have been modified
297+
// by optimizer transformations).
298+
e.attr("subquery", "original sql", subqueryPlans[i].subquery.String())
297299
e.attr("subquery", "exec mode", distsqlrun.SubqueryExecModeNames[subqueryPlans[i].execMode])
298300
if subqueryPlans[i].plan != nil {
299301
_ = walkPlan(ctx, subqueryPlans[i].plan, observer)

pkg/sql/logictest/testdata/planner_test/needed_columns

+15-15
Original file line numberDiff line numberDiff line change
@@ -121,21 +121,21 @@ nosort · · (x) x=CONST
121121
query TTTTT
122122
EXPLAIN (VERBOSE) SELECT 1 = (SELECT 2 AS x FROM (SELECT 3 AS s)) AS y
123123
----
124-
root · · (y) y=CONST
125-
├── render · · (y) y=CONST
126-
│ │ render 0 @S1 = 1 · ·
127-
│ └── emptyrow · · () ·
128-
└── subquery · · (y) y=CONST
129-
│ id @S1 · ·
130-
sql (SELECT 2 AS x FROM (SELECT 3 AS s)) · ·
131-
│ exec mode one row · ·
132-
└── limit · · (x) x=CONST
133-
│ count 2 · ·
134-
└── render · · (x) x=CONST
135-
│ render 0 2 · ·
136-
└── render · · (s[omitted]) ·
137-
│ render 0 NULL · ·
138-
└── emptyrow · · () ·
124+
root · · (y) y=CONST
125+
├── render · · (y) y=CONST
126+
│ │ render 0 @S1 = 1 · ·
127+
│ └── emptyrow · · () ·
128+
└── subquery · · (y) y=CONST
129+
│ id @S1 · ·
130+
original sql (SELECT 2 AS x FROM (SELECT 3 AS s)) · ·
131+
│ exec mode one row · ·
132+
└── limit · · (x) x=CONST
133+
│ count 2 · ·
134+
└── render · · (x) x=CONST
135+
│ render 0 2 · ·
136+
└── render · · (s[omitted]) ·
137+
│ render 0 NULL · ·
138+
└── emptyrow · · () ·
139139

140140
# Propagation through table scans.
141141
statement ok

pkg/sql/logictest/testdata/planner_test/subquery

+93-93
Large diffs are not rendered by default.

pkg/sql/opt/exec/execbuilder/scalar_builder.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -360,15 +360,16 @@ func (b *Builder) buildAny(ctx *buildScalarCtx, ev memo.ExprView) (tree.TypedExp
360360
types.Types[val] = ev.Metadata().ColumnType(opt.ColumnID(key))
361361
})
362362

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

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

371-
cmp := opt.ComparisonOpReverseMap[ev.Private().(opt.Operator)]
372+
cmp := opt.ComparisonOpReverseMap[def.Cmp]
372373
return tree.NewTypedComparisonExprWithSubOp(tree.Any, cmp, scalar, subqueryExpr), nil
373374
}
374375

@@ -388,7 +389,8 @@ func (b *Builder) buildExistsSubquery(
388389
return nil, err
389390
}
390391

391-
return b.addSubquery(exec.SubqueryExists, types.Bool, root), nil
392+
def := ev.Private().(*memo.SubqueryDef)
393+
return b.addSubquery(exec.SubqueryExists, types.Bool, root, def.OriginalExpr), nil
392394
}
393395

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

420-
return b.addSubquery(exec.SubqueryOneRow, ev.Logical().Scalar.Type, root), nil
422+
def := ev.Private().(*memo.SubqueryDef)
423+
return b.addSubquery(exec.SubqueryOneRow, ev.Logical().Scalar.Type, root, def.OriginalExpr), nil
421424
}
422425

423426
// addSubquery adds an entry to b.subqueries and creates a tree.Subquery
424427
// expression node associated with it.
425-
func (b *Builder) addSubquery(mode exec.SubqueryMode, typ types.T, root exec.Node) *tree.Subquery {
426-
exprNode := &tree.Subquery{Exists: mode == exec.SubqueryExists}
428+
func (b *Builder) addSubquery(
429+
mode exec.SubqueryMode, typ types.T, root exec.Node, originalExpr *tree.Subquery,
430+
) *tree.Subquery {
431+
exprNode := &tree.Subquery{
432+
Select: originalExpr.Select,
433+
Exists: mode == exec.SubqueryExists,
434+
}
427435
exprNode.SetType(typ)
428436
b.subqueries = append(b.subqueries, exec.Subquery{
429437
ExprNode: exprNode,

pkg/sql/opt/exec/execbuilder/testdata/srfs

+19-19
Original file line numberDiff line numberDiff line change
@@ -163,25 +163,25 @@ render · ·
163163
query TTTTT
164164
EXPLAIN (VERBOSE) SELECT generate_series((SELECT unnest(ARRAY[x, y]) FROM xy), z) FROM xz
165165
----
166-
root · · (generate_series) ·
167-
├── render · · (generate_series) ·
168-
│ │ render 0 generate_series · ·
169-
│ └── project set · · (z, generate_series) ·
170-
│ │ render 0 generate_series(@S1, @1) · ·
171-
│ └── scan · · (z) ·
172-
│ table xz@primary · ·
173-
│ spans ALL · ·
174-
└── subquery · · (generate_series) ·
175-
│ id @S1 · ·
176-
│ sql <unknown> · ·
177-
│ exec mode one row · ·
178-
└── render · · (unnest) ·
179-
│ render 0 unnest · ·
180-
└── project set · · (x, y, unnest) ·
181-
│ render 0 unnest(ARRAY[@1, @2]) · ·
182-
└── scan · · (x, y) ·
183-
· table xy@primary · ·
184-
· spans ALL · ·
166+
root · · (generate_series) ·
167+
├── render · · (generate_series) ·
168+
│ │ render 0 generate_series · ·
169+
│ └── project set · · (z, generate_series) ·
170+
│ │ render 0 generate_series(@S1, @1) · ·
171+
│ └── scan · · (z) ·
172+
│ table xz@primary · ·
173+
│ spans ALL · ·
174+
└── subquery · · (generate_series) ·
175+
│ id @S1 · ·
176+
original sql (SELECT unnest(ARRAY[x, y]) FROM xy) · ·
177+
│ exec mode one row · ·
178+
└── render · · (unnest) ·
179+
│ render 0 unnest · ·
180+
└── project set · · (x, y, unnest) ·
181+
│ render 0 unnest(ARRAY[@1, @2]) · ·
182+
└── scan · · (x, y) ·
183+
· table xy@primary · ·
184+
· spans ALL · ·
185185

186186
# Regression test for #24676.
187187
statement ok

0 commit comments

Comments
 (0)