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

Commit b485e8f

Browse files
committed
analyzer: fix pushdown of filters with repeated table names
Signed-off-by: Miguel Molina <miguel@erizocosmi.co>
1 parent 6d0f641 commit b485e8f

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

sql/analyzer/filters.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ func (f filters) merge(f2 filters) {
1818
func exprToTableFilters(expr sql.Expression) filters {
1919
filtersByTable := make(filters)
2020
for _, expr := range splitExpression(expr) {
21+
var seenTables = make(map[string]struct{})
2122
var tables []string
2223
_, _ = expr.TransformUp(func(e sql.Expression) (sql.Expression, error) {
2324
f, ok := e.(*expression.GetField)
2425
if ok {
25-
tables = append(tables, f.Table())
26+
if _, ok := seenTables[f.Table()]; !ok {
27+
seenTables[f.Table()] = struct{}{}
28+
tables = append(tables, f.Table())
29+
}
2630
}
2731

2832
return e, nil

sql/analyzer/filters_test.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,21 @@ func TestExprToTableFilters(t *testing.T) {
108108
require := require.New(t)
109109
expr := expression.NewAnd(
110110
expression.NewAnd(
111+
expression.NewAnd(
112+
expression.NewEquals(
113+
expression.NewGetFieldWithTable(0, sql.Int64, "mytable", "f", false),
114+
expression.NewLiteral(3.14, sql.Float64),
115+
),
116+
expression.NewGreaterThan(
117+
expression.NewGetFieldWithTable(0, sql.Int64, "mytable", "f", false),
118+
expression.NewLiteral(3., sql.Float64),
119+
),
120+
),
121+
expression.NewIsNull(
122+
expression.NewGetFieldWithTable(0, sql.Int64, "mytable2", "i2", false),
123+
),
124+
),
125+
expression.NewOr(
111126
expression.NewEquals(
112127
expression.NewGetFieldWithTable(0, sql.Int64, "mytable", "f", false),
113128
expression.NewLiteral(3.14, sql.Float64),
@@ -117,9 +132,6 @@ func TestExprToTableFilters(t *testing.T) {
117132
expression.NewLiteral(3., sql.Float64),
118133
),
119134
),
120-
expression.NewIsNull(
121-
expression.NewGetFieldWithTable(0, sql.Int64, "mytable2", "i2", false),
122-
),
123135
)
124136

125137
expected := filters{
@@ -132,6 +144,16 @@ func TestExprToTableFilters(t *testing.T) {
132144
expression.NewGetFieldWithTable(0, sql.Int64, "mytable", "f", false),
133145
expression.NewLiteral(3., sql.Float64),
134146
),
147+
expression.NewOr(
148+
expression.NewEquals(
149+
expression.NewGetFieldWithTable(0, sql.Int64, "mytable", "f", false),
150+
expression.NewLiteral(3.14, sql.Float64),
151+
),
152+
expression.NewGreaterThan(
153+
expression.NewGetFieldWithTable(0, sql.Int64, "mytable", "f", false),
154+
expression.NewLiteral(3., sql.Float64),
155+
),
156+
),
135157
},
136158
"mytable2": []sql.Expression{
137159
expression.NewIsNull(

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