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 <[email protected]>
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)