Skip to content

Commit 4e15e80

Browse files
authored
sql/parse: generate sort and limit before project. (#44)
* Sort was being generated after Project, so it was not possible to ORDER BY by a field not included in SELECT. * Limit was being executed after the Project too.
1 parent 01ace9e commit 4e15e80

File tree

3 files changed

+58
-40
lines changed

3 files changed

+58
-40
lines changed

engine_test.go

+21-4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ func TestEngine_Query(t *testing.T) {
3737
sql.NewMemoryRow(int64(1)),
3838
},
3939
)
40+
41+
testQuery(t, e,
42+
"SELECT i FROM mytable WHERE s = 'a' ORDER BY i DESC;",
43+
[]sql.Row{
44+
sql.NewMemoryRow(int64(1)),
45+
},
46+
)
47+
48+
testQuery(t, e,
49+
"SELECT i FROM mytable WHERE s = 'a' ORDER BY i DESC LIMIT 1;",
50+
[]sql.Row{
51+
sql.NewMemoryRow(int64(1)),
52+
},
53+
)
4054
}
4155

4256
func testQuery(t *testing.T, e *gitql.Engine, q string, r []sql.Row) {
@@ -66,10 +80,13 @@ func testQuery(t *testing.T, e *gitql.Engine, q string, r []sql.Row) {
6680
func newEngine(t *testing.T) *gitql.Engine {
6781
assert := require.New(t)
6882

69-
table := mem.NewTable("mytable", sql.Schema{{"i", sql.BigInteger}})
70-
assert.Nil(table.Insert(int64(1)))
71-
assert.Nil(table.Insert(int64(2)))
72-
assert.Nil(table.Insert(int64(3)))
83+
table := mem.NewTable("mytable", sql.Schema{
84+
{"i", sql.BigInteger},
85+
{"s", sql.String},
86+
})
87+
assert.Nil(table.Insert(int64(1), "a"))
88+
assert.Nil(table.Insert(int64(2), "b"))
89+
assert.Nil(table.Insert(int64(3), "c"))
7390

7491
db := mem.NewDatabase("mydb")
7592
db.AddTable("mytable", table)

sql/parse/parse.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@ func (p *parser) buildPlan() (sql.Node, error) {
282282
node = plan.NewFilter(p.filterClauses[0], node)
283283
}
284284

285-
node = plan.NewProject(p.projection, node)
286285
if len(p.sortFields) > 0 {
287286
node = plan.NewSort(p.sortFields, node)
288287
}
@@ -291,6 +290,8 @@ func (p *parser) buildPlan() (sql.Node, error) {
291290
node = plan.NewLimit(int64(*p.limit), node)
292291
}
293292

293+
node = plan.NewProject(p.projection, node)
294+
294295
return node, nil
295296
}
296297

sql/parse/parse_test.go

+35-35
Original file line numberDiff line numberDiff line change
@@ -45,31 +45,31 @@ var fixtures = map[string]sql.Node{
4545
plan.NewUnresolvedRelation("foo"),
4646
),
4747
),
48-
`SELECT foo, bar FROM foo LIMIT 10;`: plan.NewLimit(int64(10),
49-
plan.NewProject(
50-
[]sql.Expression{
51-
expression.NewUnresolvedColumn("foo"),
52-
expression.NewUnresolvedColumn("bar"),
53-
},
48+
`SELECT foo, bar FROM foo LIMIT 10;`: plan.NewProject(
49+
[]sql.Expression{
50+
expression.NewUnresolvedColumn("foo"),
51+
expression.NewUnresolvedColumn("bar"),
52+
},
53+
plan.NewLimit(int64(10),
5454
plan.NewUnresolvedRelation("foo"),
5555
),
5656
),
57-
`SELECT foo, bar FROM foo ORDER BY baz DESC;`: plan.NewSort(
58-
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
59-
plan.NewProject(
60-
[]sql.Expression{
61-
expression.NewUnresolvedColumn("foo"),
62-
expression.NewUnresolvedColumn("bar"),
63-
},
57+
`SELECT foo, bar FROM foo ORDER BY baz DESC;`: plan.NewProject(
58+
[]sql.Expression{
59+
expression.NewUnresolvedColumn("foo"),
60+
expression.NewUnresolvedColumn("bar"),
61+
},
62+
plan.NewSort(
63+
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
6464
plan.NewUnresolvedRelation("foo"),
6565
),
6666
),
67-
`SELECT foo, bar FROM foo WHERE foo = bar LIMIT 10;`: plan.NewLimit(int64(10),
68-
plan.NewProject(
69-
[]sql.Expression{
70-
expression.NewUnresolvedColumn("foo"),
71-
expression.NewUnresolvedColumn("bar"),
72-
},
67+
`SELECT foo, bar FROM foo WHERE foo = bar LIMIT 10;`: plan.NewProject(
68+
[]sql.Expression{
69+
expression.NewUnresolvedColumn("foo"),
70+
expression.NewUnresolvedColumn("bar"),
71+
},
72+
plan.NewLimit(int64(10),
7373
plan.NewFilter(
7474
expression.NewEquals(
7575
expression.NewUnresolvedColumn("foo"),
@@ -79,26 +79,26 @@ var fixtures = map[string]sql.Node{
7979
),
8080
),
8181
),
82-
`SELECT foo, bar FROM foo ORDER BY baz DESC LIMIT 1;`: plan.NewLimit(int64(1),
83-
plan.NewSort(
84-
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
85-
plan.NewProject(
86-
[]sql.Expression{
87-
expression.NewUnresolvedColumn("foo"),
88-
expression.NewUnresolvedColumn("bar"),
89-
},
82+
`SELECT foo, bar FROM foo ORDER BY baz DESC LIMIT 1;`: plan.NewProject(
83+
[]sql.Expression{
84+
expression.NewUnresolvedColumn("foo"),
85+
expression.NewUnresolvedColumn("bar"),
86+
},
87+
plan.NewLimit(int64(1),
88+
plan.NewSort(
89+
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
9090
plan.NewUnresolvedRelation("foo"),
9191
),
9292
),
9393
),
94-
`SELECT foo, bar FROM foo WHERE qux = 1 ORDER BY baz DESC LIMIT 1;`: plan.NewLimit(int64(1),
95-
plan.NewSort(
96-
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
97-
plan.NewProject(
98-
[]sql.Expression{
99-
expression.NewUnresolvedColumn("foo"),
100-
expression.NewUnresolvedColumn("bar"),
101-
},
94+
`SELECT foo, bar FROM foo WHERE qux = 1 ORDER BY baz DESC LIMIT 1;`: plan.NewProject(
95+
[]sql.Expression{
96+
expression.NewUnresolvedColumn("foo"),
97+
expression.NewUnresolvedColumn("bar"),
98+
},
99+
plan.NewLimit(int64(1),
100+
plan.NewSort(
101+
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
102102
plan.NewFilter(
103103
expression.NewEquals(
104104
expression.NewUnresolvedColumn("qux"),

0 commit comments

Comments
 (0)