Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit ac59802

Browse files
authored
Merge pull request #574 from erizocosmico/fix/column-prune-fix-fields
analyzer: fix fields of subqueries too on prune_columns
2 parents 47cd1f8 + ec6bee6 commit ac59802

File tree

2 files changed

+45
-60
lines changed

2 files changed

+45
-60
lines changed

sql/analyzer/prune_columns.go

Lines changed: 44 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,7 @@ func pruneColumns(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {
2929

3030
findUsedColumns(columns, n)
3131

32-
n, err := addSubqueryBarriers(n)
33-
if err != nil {
34-
return nil, err
35-
}
36-
37-
n, err = pruneUnusedColumns(n, columns)
32+
n, err := pruneUnusedColumns(n, columns)
3833
if err != nil {
3934
return nil, err
4035
}
@@ -81,12 +76,7 @@ func pruneSubqueryColumns(
8176

8277
findUsedColumns(columns, n.Child)
8378

84-
node, err := addSubqueryBarriers(n.Child)
85-
if err != nil {
86-
return nil, err
87-
}
88-
89-
node, err = pruneUnusedColumns(node, columns)
79+
node, err := pruneUnusedColumns(n.Child, columns)
9080
if err != nil {
9181
return nil, err
9282
}
@@ -126,30 +116,19 @@ func findUsedColumns(columns usedColumns, n sql.Node) {
126116
})
127117
}
128118

129-
func addSubqueryBarriers(n sql.Node) (sql.Node, error) {
130-
return n.TransformUp(func(n sql.Node) (sql.Node, error) {
131-
sq, ok := n.(*plan.SubqueryAlias)
132-
if !ok {
133-
return n, nil
134-
}
135-
136-
return &subqueryBarrier{sq}, nil
137-
})
138-
}
139-
140119
func pruneSubqueries(
141120
ctx *sql.Context,
142121
a *Analyzer,
143122
n sql.Node,
144123
parentColumns usedColumns,
145124
) (sql.Node, error) {
146125
return n.TransformUp(func(n sql.Node) (sql.Node, error) {
147-
barrier, ok := n.(*subqueryBarrier)
126+
subq, ok := n.(*plan.SubqueryAlias)
148127
if !ok {
149128
return n, nil
150129
}
151130

152-
return pruneSubqueryColumns(ctx, a, barrier.SubqueryAlias, parentColumns)
131+
return pruneSubqueryColumns(ctx, a, subq, parentColumns)
153132
})
154133
}
155134

@@ -173,39 +152,53 @@ type tableColumnPair struct {
173152

174153
func fixRemainingFieldsIndexes(n sql.Node) (sql.Node, error) {
175154
return n.TransformUp(func(n sql.Node) (sql.Node, error) {
176-
exp, ok := n.(sql.Expressioner)
177-
if !ok {
178-
return n, nil
179-
}
180-
181-
var schema sql.Schema
182-
for _, c := range n.Children() {
183-
schema = append(schema, c.Schema()...)
184-
}
155+
switch n := n.(type) {
156+
case *plan.SubqueryAlias:
157+
child, err := fixRemainingFieldsIndexes(n.Child)
158+
if err != nil {
159+
return nil, err
160+
}
185161

186-
if len(schema) == 0 {
187-
return n, nil
188-
}
162+
return plan.NewSubqueryAlias(n.Name(), child), nil
163+
default:
164+
exp, ok := n.(sql.Expressioner)
165+
if !ok {
166+
return n, nil
167+
}
189168

190-
indexes := make(map[tableColumnPair]int)
191-
for i, col := range schema {
192-
indexes[tableColumnPair{col.Source, col.Name}] = i
193-
}
169+
var schema sql.Schema
170+
for _, c := range n.Children() {
171+
schema = append(schema, c.Schema()...)
172+
}
194173

195-
return exp.TransformExpressions(func(e sql.Expression) (sql.Expression, error) {
196-
gf, ok := e.(*expression.GetField)
197-
if !ok {
198-
return e, nil
174+
if len(schema) == 0 {
175+
return n, nil
199176
}
200177

201-
idx, ok := indexes[tableColumnPair{gf.Table(), gf.Name()}]
202-
if !ok {
203-
return nil, fmt.Errorf("unable to find column %q of table %q", gf.Name(), gf.Table())
178+
indexes := make(map[tableColumnPair]int)
179+
for i, col := range schema {
180+
indexes[tableColumnPair{col.Source, col.Name}] = i
204181
}
205182

206-
ngf := *gf
207-
return ngf.WithIndex(idx), nil
208-
})
183+
return exp.TransformExpressions(func(e sql.Expression) (sql.Expression, error) {
184+
gf, ok := e.(*expression.GetField)
185+
if !ok {
186+
return e, nil
187+
}
188+
189+
idx, ok := indexes[tableColumnPair{gf.Table(), gf.Name()}]
190+
if !ok {
191+
return nil, fmt.Errorf("unable to find column %q of table %q", gf.Name(), gf.Table())
192+
}
193+
194+
if idx == gf.Index() {
195+
return gf, nil
196+
}
197+
198+
ngf := *gf
199+
return ngf.WithIndex(idx), nil
200+
})
201+
}
209202
})
210203
}
211204

@@ -290,11 +283,3 @@ func shouldPruneExpr(e sql.Expression, cols usedColumns) bool {
290283

291284
return true
292285
}
293-
294-
type subqueryBarrier struct {
295-
*plan.SubqueryAlias
296-
}
297-
298-
func (b *subqueryBarrier) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) {
299-
return f(b)
300-
}

sql/analyzer/prune_columns_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ func TestPruneColumns(t *testing.T) {
263263
),
264264
expression.NewEquals(
265265
gf(0, "t1", "foo"),
266-
gf(3, "t2", "foo"),
266+
gf(1, "t2", "foo"),
267267
),
268268
),
269269
),

0 commit comments

Comments
 (0)