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

Commit ec6bee6

Browse files
committed
analyzer: fix fields of subqueries too on prune_columns
Signed-off-by: Miguel Molina <miguel@erizocosmi.co>
1 parent 47cd1f8 commit ec6bee6

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy