Skip to content

Commit

Permalink
sql/parse: generate sort and limit before project. (#44)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
smola authored Nov 4, 2016
1 parent 01ace9e commit 4e15e80
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 40 deletions.
25 changes: 21 additions & 4 deletions engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,20 @@ func TestEngine_Query(t *testing.T) {
sql.NewMemoryRow(int64(1)),
},
)

testQuery(t, e,
"SELECT i FROM mytable WHERE s = 'a' ORDER BY i DESC;",
[]sql.Row{
sql.NewMemoryRow(int64(1)),
},
)

testQuery(t, e,
"SELECT i FROM mytable WHERE s = 'a' ORDER BY i DESC LIMIT 1;",
[]sql.Row{
sql.NewMemoryRow(int64(1)),
},
)
}

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

table := mem.NewTable("mytable", sql.Schema{{"i", sql.BigInteger}})
assert.Nil(table.Insert(int64(1)))
assert.Nil(table.Insert(int64(2)))
assert.Nil(table.Insert(int64(3)))
table := mem.NewTable("mytable", sql.Schema{
{"i", sql.BigInteger},
{"s", sql.String},
})
assert.Nil(table.Insert(int64(1), "a"))
assert.Nil(table.Insert(int64(2), "b"))
assert.Nil(table.Insert(int64(3), "c"))

db := mem.NewDatabase("mydb")
db.AddTable("mytable", table)
Expand Down
3 changes: 2 additions & 1 deletion sql/parse/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,6 @@ func (p *parser) buildPlan() (sql.Node, error) {
node = plan.NewFilter(p.filterClauses[0], node)
}

node = plan.NewProject(p.projection, node)
if len(p.sortFields) > 0 {
node = plan.NewSort(p.sortFields, node)
}
Expand All @@ -291,6 +290,8 @@ func (p *parser) buildPlan() (sql.Node, error) {
node = plan.NewLimit(int64(*p.limit), node)
}

node = plan.NewProject(p.projection, node)

return node, nil
}

Expand Down
70 changes: 35 additions & 35 deletions sql/parse/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,31 +45,31 @@ var fixtures = map[string]sql.Node{
plan.NewUnresolvedRelation("foo"),
),
),
`SELECT foo, bar FROM foo LIMIT 10;`: plan.NewLimit(int64(10),
plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
`SELECT foo, bar FROM foo LIMIT 10;`: plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
plan.NewLimit(int64(10),
plan.NewUnresolvedRelation("foo"),
),
),
`SELECT foo, bar FROM foo ORDER BY baz DESC;`: plan.NewSort(
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
`SELECT foo, bar FROM foo ORDER BY baz DESC;`: plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
plan.NewSort(
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
plan.NewUnresolvedRelation("foo"),
),
),
`SELECT foo, bar FROM foo WHERE foo = bar LIMIT 10;`: plan.NewLimit(int64(10),
plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
`SELECT foo, bar FROM foo WHERE foo = bar LIMIT 10;`: plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
plan.NewLimit(int64(10),
plan.NewFilter(
expression.NewEquals(
expression.NewUnresolvedColumn("foo"),
Expand All @@ -79,26 +79,26 @@ var fixtures = map[string]sql.Node{
),
),
),
`SELECT foo, bar FROM foo ORDER BY baz DESC LIMIT 1;`: plan.NewLimit(int64(1),
plan.NewSort(
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
`SELECT foo, bar FROM foo ORDER BY baz DESC LIMIT 1;`: plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
plan.NewLimit(int64(1),
plan.NewSort(
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
plan.NewUnresolvedRelation("foo"),
),
),
),
`SELECT foo, bar FROM foo WHERE qux = 1 ORDER BY baz DESC LIMIT 1;`: plan.NewLimit(int64(1),
plan.NewSort(
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
`SELECT foo, bar FROM foo WHERE qux = 1 ORDER BY baz DESC LIMIT 1;`: plan.NewProject(
[]sql.Expression{
expression.NewUnresolvedColumn("foo"),
expression.NewUnresolvedColumn("bar"),
},
plan.NewLimit(int64(1),
plan.NewSort(
[]plan.SortField{{expression.NewUnresolvedColumn("baz"), plan.Descending}},
plan.NewFilter(
expression.NewEquals(
expression.NewUnresolvedColumn("qux"),
Expand Down

0 comments on commit 4e15e80

Please sign in to comment.