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

Commit a9eddbf

Browse files
authored
Merge pull request #498 from erizocosmico/fix/pushdown-filters
analyzer: fix pushdown of filters with repeated table names
2 parents 6d0f641 + fd90e6d commit a9eddbf

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

sql/analyzer/filters.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,22 @@ 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 tables []string
21+
var seenTables = make(map[string]struct{})
22+
var lastTable 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+
lastTable = f.Table()
29+
}
2630
}
2731

2832
return e, nil
2933
})
3034

31-
if len(tables) == 1 {
32-
filtersByTable[tables[0]] = append(filtersByTable[tables[0]], expr)
35+
if len(seenTables) == 1 {
36+
filtersByTable[lastTable] = append(filtersByTable[lastTable], expr)
3337
}
3438
}
3539

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)