Skip to content

Commit 47dc967

Browse files
committed
cleanup
1 parent c78b77b commit 47dc967

File tree

3 files changed

+89
-74
lines changed

3 files changed

+89
-74
lines changed

internal/endtoend/testdata/order_by_binds/sqlite/go/query.sql.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/order_by_binds/sqlite/query.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,11 @@ ORDER BY id % ?;
2222
SELECT * FROM authors
2323
WHERE id > sqlc.arg(min_id)
2424
ORDER BY name ASC;
25+
26+
-- name: ListAuthorsNamedParamsOnly :many
27+
SELECT * FROM authors
28+
ORDER BY
29+
CASE
30+
WHEN @sort = 'name' THEN name
31+
WHEN @sort = 'bio' THEN bio
32+
END ASC;

internal/engine/sqlite/convert.go

Lines changed: 49 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ func (c *cc) convertMultiSelect_stmtContext(n *parser.Select_stmtContext) ast.No
512512
}
513513

514514
limitCount, limitOffset := c.convertLimit_stmtContext(n.Limit_stmt())
515-
sortClause := c.buildSortClause(n.Order_by_stmt())
515+
sortClause := c.convertOrderby_stmtContext(n.Order_by_stmt())
516516

517517
selectStmt.LimitCount = limitCount
518518
selectStmt.LimitOffset = limitOffset
@@ -624,22 +624,57 @@ func (c *cc) convertWildCardField(n *parser.Result_columnContext) *ast.ColumnRef
624624
}
625625
}
626626

627-
func (c *cc) convertOrderby_stmtContext(n parser.IOrder_by_stmtContext) ast.Node {
628-
if orderBy, ok := n.(*parser.Order_by_stmtContext); ok {
629-
list := &ast.List{Items: []ast.Node{}}
630-
for _, o := range orderBy.AllOrdering_term() {
631-
term, ok := o.(*parser.Ordering_termContext)
632-
if !ok {
633-
continue
627+
func (c *cc) convertOrderby_stmtContext(n parser.IOrder_by_stmtContext) *ast.List {
628+
if n == nil {
629+
return nil
630+
}
631+
632+
orderBy, ok := n.(*parser.Order_by_stmtContext)
633+
if !ok {
634+
if debug.Active {
635+
log.Printf("sqlite.convertOrderby_stmtContext: unexpected type %T", n)
636+
}
637+
return nil
638+
}
639+
640+
if len(orderBy.AllOrdering_term()) == 0 {
641+
return nil
642+
}
643+
644+
sortItems := &ast.List{Items: []ast.Node{}}
645+
for _, o := range orderBy.AllOrdering_term() {
646+
term, ok := o.(*parser.Ordering_termContext)
647+
if !ok {
648+
continue
649+
}
650+
651+
sortByDir := ast.SortByDirDefault
652+
if adNode := term.Asc_desc(); adNode != nil {
653+
if adNode.ASC_() != nil {
654+
sortByDir = ast.SortByDirAsc
655+
} else if adNode.DESC_() != nil {
656+
sortByDir = ast.SortByDirDesc
634657
}
635-
list.Items = append(list.Items, &ast.CaseExpr{
636-
Xpr: c.convert(term.Expr()),
637-
Location: term.Expr().GetStart().GetStart(),
638-
})
639658
}
640-
return list
659+
660+
sortByNulls := ast.SortByNullsDefault
661+
if term.NULLS_() != nil {
662+
if term.FIRST_() != nil {
663+
sortByNulls = ast.SortByNullsFirst
664+
} else if term.LAST_() != nil {
665+
sortByNulls = ast.SortByNullsLast
666+
}
667+
}
668+
669+
sortItems.Items = append(sortItems.Items, &ast.SortBy{
670+
Node: c.convert(term.Expr()),
671+
SortbyDir: sortByDir,
672+
SortbyNulls: sortByNulls,
673+
UseOp: &ast.List{},
674+
Location: term.GetStart().GetStart(),
675+
})
641676
}
642-
return todo("convertOrderby_stmtContext", n)
677+
return sortItems
643678
}
644679

645680
func (c *cc) convertLimit_stmtContext(n parser.ILimit_stmtContext) (ast.Node, ast.Node) {
@@ -1316,9 +1351,6 @@ func (c *cc) convert(node node) ast.Node {
13161351
case *parser.Insert_stmtContext:
13171352
return c.convertInsert_stmtContext(n)
13181353

1319-
case *parser.Order_by_stmtContext:
1320-
return c.convertOrderby_stmtContext(n)
1321-
13221354
case *parser.Select_stmtContext:
13231355
return c.convertMultiSelect_stmtContext(n)
13241356

@@ -1342,60 +1374,3 @@ func (c *cc) convert(node node) ast.Node {
13421374
}
13431375
}
13441376

1345-
// buildSortClause converts an IOrder_by_stmtContext into an *ast.List of *ast.SortBy nodes.
1346-
func (c *cc) buildSortClause(orderByNode parser.IOrder_by_stmtContext) *ast.List {
1347-
if orderByNode == nil {
1348-
return nil
1349-
}
1350-
1351-
orderByCtx, ok := orderByNode.(*parser.Order_by_stmtContext)
1352-
if !ok {
1353-
if debug.Active {
1354-
log.Printf("sqlite.buildSortClause: unexpected type %T for IOrder_by_stmtContext", orderByNode)
1355-
}
1356-
return nil
1357-
}
1358-
1359-
if len(orderByCtx.AllOrdering_term()) == 0 {
1360-
return nil
1361-
}
1362-
1363-
sortItems := &ast.List{Items: []ast.Node{}}
1364-
for _, otermIP := range orderByCtx.AllOrdering_term() {
1365-
oterm, ok := otermIP.(*parser.Ordering_termContext)
1366-
if !ok {
1367-
if debug.Active {
1368-
log.Printf("sqlite.buildSortClause: unexpected type %T for IOrdering_termContext", otermIP)
1369-
}
1370-
continue
1371-
}
1372-
1373-
sortByDir := ast.SortByDirDefault
1374-
if adNode := oterm.Asc_desc(); adNode != nil {
1375-
// Asc_descContext has ASC_() and DESC_() methods which return TerminalNode
1376-
if adNode.ASC_() != nil {
1377-
sortByDir = ast.SortByDirAsc
1378-
} else if adNode.DESC_() != nil {
1379-
sortByDir = ast.SortByDirDesc
1380-
}
1381-
}
1382-
1383-
sortByNulls := ast.SortByNullsDefault
1384-
if oterm.NULLS_() != nil { // NULLS_() is a TerminalNode
1385-
if oterm.FIRST_() != nil { // FIRST_() is a TerminalNode
1386-
sortByNulls = ast.SortByNullsFirst
1387-
} else if oterm.LAST_() != nil { // LAST_() is a TerminalNode
1388-
sortByNulls = ast.SortByNullsLast
1389-
}
1390-
}
1391-
1392-
sortItems.Items = append(sortItems.Items, &ast.SortBy{
1393-
Node: c.convert(oterm.Expr()),
1394-
SortbyDir: sortByDir,
1395-
SortbyNulls: sortByNulls,
1396-
UseOp: &ast.List{}, // Typically empty for standard SQLite ORDER BY
1397-
Location: oterm.GetStart().GetStart(),
1398-
})
1399-
}
1400-
return sortItems
1401-
}

0 commit comments

Comments
 (0)