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

Commit e1f4e4a

Browse files
author
kuba--
committed
Implement group by index
Signed-off-by: kuba-- <kuba@sourced.tech>
1 parent 94eaa89 commit e1f4e4a

File tree

5 files changed

+123
-2
lines changed

5 files changed

+123
-2
lines changed

engine_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,18 @@ var queries = []struct {
159159
{int32(1), "third row"},
160160
},
161161
},
162+
{
163+
`SELECT COUNT(*) as cnt, fi FROM (
164+
SELECT tbl.s AS fi
165+
FROM mytable tbl
166+
) t
167+
GROUP BY 2`,
168+
[]sql.Row{
169+
{int32(1), "first row"},
170+
{int32(1), "second row"},
171+
{int32(1), "third row"},
172+
},
173+
},
162174
{
163175
`SELECT COUNT(*) as cnt, s as fi FROM mytable GROUP BY fi`,
164176
[]sql.Row{
@@ -167,6 +179,14 @@ var queries = []struct {
167179
{int32(1), "third row"},
168180
},
169181
},
182+
{
183+
`SELECT COUNT(*) as cnt, s as fi FROM mytable GROUP BY 2`,
184+
[]sql.Row{
185+
{int32(1), "first row"},
186+
{int32(1), "second row"},
187+
{int32(1), "third row"},
188+
},
189+
},
170190
{
171191
"SELECT CAST(-3 AS UNSIGNED) FROM mytable",
172192
[]sql.Row{
@@ -296,6 +316,14 @@ var queries = []struct {
296316
{int32(1), int64(1)},
297317
},
298318
},
319+
{
320+
`SELECT COUNT(*) c, i as foo FROM mytable GROUP BY 2 ORDER BY 2 DESC`,
321+
[]sql.Row{
322+
{int32(1), int64(3)},
323+
{int32(1), int64(2)},
324+
{int32(1), int64(1)},
325+
},
326+
},
299327
{
300328
`SELECT COUNT(*) c, i as foo FROM mytable GROUP BY i ORDER BY foo, i DESC`,
301329
[]sql.Row{
@@ -304,6 +332,30 @@ var queries = []struct {
304332
{int32(1), int64(1)},
305333
},
306334
},
335+
{
336+
`SELECT COUNT(*) c, i as foo FROM mytable GROUP BY 2 ORDER BY foo, i DESC`,
337+
[]sql.Row{
338+
{int32(1), int64(3)},
339+
{int32(1), int64(2)},
340+
{int32(1), int64(1)},
341+
},
342+
},
343+
{
344+
`SELECT COUNT(*) c, i as i FROM mytable GROUP BY 2`,
345+
[]sql.Row{
346+
{int32(1), int64(3)},
347+
{int32(1), int64(2)},
348+
{int32(1), int64(1)},
349+
},
350+
},
351+
{
352+
`SELECT i as i FROM mytable GROUP BY 1`,
353+
[]sql.Row{
354+
{int64(3)},
355+
{int64(2)},
356+
{int64(1)},
357+
},
358+
},
307359
{
308360
`SELECT CONCAT("a", "b", "c")`,
309361
[]sql.Row{
@@ -370,6 +422,12 @@ var queries = []struct {
370422
{"third row"},
371423
},
372424
},
425+
{
426+
`SELECT SUBSTRING(s, -3, 3) as s FROM mytable WHERE s LIKE '%d row' GROUP BY 1`,
427+
[]sql.Row{
428+
{"row"},
429+
},
430+
},
373431
{
374432
`SELECT s FROM mytable WHERE s NOT LIKE '%d row'`,
375433
[]sql.Row{
@@ -560,6 +618,32 @@ var queries = []struct {
560618
{"i2"},
561619
},
562620
},
621+
{
622+
`
623+
SELECT COLUMN_NAME FROM information_schema.COLUMNS
624+
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME LIKE '%table'
625+
GROUP BY 1
626+
`,
627+
[]sql.Row{
628+
{"s"},
629+
{"i"},
630+
{"s2"},
631+
{"i2"},
632+
},
633+
},
634+
{
635+
`
636+
SELECT COLUMN_NAME as COLUMN_NAME FROM information_schema.COLUMNS
637+
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME LIKE '%table'
638+
GROUP BY 1
639+
`,
640+
[]sql.Row{
641+
{"s"},
642+
{"i"},
643+
{"s2"},
644+
{"i2"},
645+
},
646+
},
563647
{
564648
`SHOW CREATE DATABASE mydb`,
565649
[]sql.Row{{
@@ -1491,6 +1575,17 @@ func TestOrderByGroupBy(t *testing.T) {
14911575
}
14921576

14931577
require.Equal(expected, rows)
1578+
1579+
_, iter, err = e.Query(
1580+
newCtx(),
1581+
"SELECT team, COUNT(*) FROM members GROUP BY 1 ORDER BY 2",
1582+
)
1583+
require.NoError(err)
1584+
1585+
rows, err = sql.RowIterToRows(iter)
1586+
require.NoError(err)
1587+
1588+
require.Equal(expected, rows)
14941589
}
14951590

14961591
func TestTracing(t *testing.T) {

sql/analyzer/resolve_columns.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,8 @@ func resolveColumns(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error)
303303
var col *sql.Column
304304
var found bool
305305
for _, c := range columns {
306-
if strings.ToLower(c.Source) == table {
306+
_, ok := n.(*plan.GroupBy)
307+
if ok || (strings.ToLower(c.Source) == table) {
307308
col = c
308309
found = true
309310
break

sql/analyzer/validation_rules.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func validateOrderBy(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error
7777
}
7878

7979
func validateGroupBy(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {
80-
span, ctx := ctx.Span("validate_order_by")
80+
span, ctx := ctx.Span("validate_group_by")
8181
defer span.Finish()
8282

8383
switch n := n.(type) {

sql/parse/parse.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,20 @@ func selectToProjectOrGroupBy(se sqlparser.SelectExprs, g sqlparser.GroupBy, chi
615615
return nil, err
616616
}
617617

618+
agglen := int64(len(selectExprs))
619+
for i, ge := range groupingExprs {
620+
// if GROUP BY index
621+
if l, ok := ge.(*expression.Literal); ok && sql.IsNumber(l.Type()) {
622+
if idx, ok := l.Value().(int64); ok && idx > 0 && idx <= agglen {
623+
aggexpr := selectExprs[idx-1]
624+
if alias, ok := aggexpr.(*expression.Alias); ok {
625+
aggexpr = expression.NewUnresolvedColumn(alias.Name())
626+
}
627+
groupingExprs[i] = aggexpr
628+
}
629+
}
630+
}
631+
618632
return plan.NewGroupBy(selectExprs, groupingExprs, child), nil
619633
}
620634

sql/parse/parse_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,17 @@ var fixtures = map[string]sql.Node{
193193
},
194194
plan.NewUnresolvedTable("t1", ""),
195195
),
196+
`SELECT foo, bar FROM t1 GROUP BY 1, 2;`: plan.NewGroupBy(
197+
[]sql.Expression{
198+
expression.NewUnresolvedColumn("foo"),
199+
expression.NewUnresolvedColumn("bar"),
200+
},
201+
[]sql.Expression{
202+
expression.NewUnresolvedColumn("foo"),
203+
expression.NewUnresolvedColumn("bar"),
204+
},
205+
plan.NewUnresolvedTable("t1", ""),
206+
),
196207
`SELECT COUNT(*) FROM t1;`: plan.NewGroupBy(
197208
[]sql.Expression{
198209
expression.NewUnresolvedFunction("count", true,

0 commit comments

Comments
 (0)