Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions internal/endtoend/testdata/order_by_binds/sqlite/go/db.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions internal/endtoend/testdata/order_by_binds/sqlite/go/models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

173 changes: 173 additions & 0 deletions internal/endtoend/testdata/order_by_binds/sqlite/go/query.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 32 additions & 0 deletions internal/endtoend/testdata/order_by_binds/sqlite/query.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
-- name: ListAuthorsColumnSort :many
SELECT * FROM authors
WHERE id > sqlc.arg(min_id)
ORDER BY CASE WHEN sqlc.arg(sort_column) = 'name' THEN name END;

-- name: ListAuthorsColumnSortDirection :many
SELECT * FROM authors
WHERE id > ?
ORDER BY
CASE
WHEN @order_by = 'asc' THEN name
END ASC,
CASE
WHEN @order_by = 'desc' OR @order_by IS NULL THEN name
END DESC;

-- name: ListAuthorsColumnSortFnWtihArg :many
SELECT * FROM authors
ORDER BY id % ?;

-- name: ListAuthorsNameSort :many
SELECT * FROM authors
WHERE id > sqlc.arg(min_id)
ORDER BY name ASC;

-- name: ListAuthorsNamedParamsOnly :many
SELECT * FROM authors
ORDER BY
CASE
WHEN @sort = 'name' THEN name
WHEN @sort = 'bio' THEN bio
END ASC;
5 changes: 5 additions & 0 deletions internal/endtoend/testdata/order_by_binds/sqlite/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CREATE TABLE authors (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
bio TEXT
);
12 changes: 12 additions & 0 deletions internal/endtoend/testdata/order_by_binds/sqlite/sqlc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"version": "1",
"packages": [
{
"path": "go",
"engine": "sqlite",
"name": "order_by_binds",
"schema": "schema.sql",
"queries": "query.sql"
}
]
}
73 changes: 55 additions & 18 deletions internal/engine/sqlite/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,11 @@ func (c *cc) convertMultiSelect_stmtContext(n *parser.Select_stmtContext) ast.No
}

limitCount, limitOffset := c.convertLimit_stmtContext(n.Limit_stmt())
sortClause := c.convertOrderby_stmtContext(n.Order_by_stmt())

selectStmt.LimitCount = limitCount
selectStmt.LimitOffset = limitOffset
selectStmt.SortClause = sortClause
// Only set WithClause if there are CTEs
if len(ctes.Items) > 0 {
selectStmt.WithClause = &ast.WithClause{Ctes: &ctes}
Expand Down Expand Up @@ -621,22 +624,59 @@ func (c *cc) convertWildCardField(n *parser.Result_columnContext) *ast.ColumnRef
}
}

func (c *cc) convertOrderby_stmtContext(n parser.IOrder_by_stmtContext) ast.Node {
if orderBy, ok := n.(*parser.Order_by_stmtContext); ok {
list := &ast.List{Items: []ast.Node{}}
for _, o := range orderBy.AllOrdering_term() {
term, ok := o.(*parser.Ordering_termContext)
if !ok {
continue
func (c *cc) convertOrderby_stmtContext(n parser.IOrder_by_stmtContext) *ast.List {
if n == nil {
return nil
}

orderBy, ok := n.(*parser.Order_by_stmtContext)
if !ok {
if debug.Active {
log.Printf("sqlite.convertOrderby_stmtContext: unexpected type %T", n)
}
return nil
}

if len(orderBy.AllOrdering_term()) == 0 {
return nil
}

sortItems := &ast.List{Items: []ast.Node{}}
for _, o := range orderBy.AllOrdering_term() {
term, ok := o.(*parser.Ordering_termContext)
if !ok {
continue
}

// Sort direction: ASC, DESC, or default
sortByDir := ast.SortByDirDefault
if adNode := term.Asc_desc(); adNode != nil {
if adNode.ASC_() != nil {
sortByDir = ast.SortByDirAsc
} else if adNode.DESC_() != nil {
sortByDir = ast.SortByDirDesc
}
list.Items = append(list.Items, &ast.CaseExpr{
Xpr: c.convert(term.Expr()),
Location: term.Expr().GetStart().GetStart(),
})
}
return list

// Nulls ordering: NULLS FIRST, NULLS LAST, or default
sortByNulls := ast.SortByNullsDefault
if term.NULLS_() != nil {
if term.FIRST_() != nil {
sortByNulls = ast.SortByNullsFirst
} else if term.LAST_() != nil {
sortByNulls = ast.SortByNullsLast
}
}

sortItems.Items = append(sortItems.Items, &ast.SortBy{
Node: c.convert(term.Expr()),
SortbyDir: sortByDir,
SortbyNulls: sortByNulls,
UseOp: &ast.List{},
Location: term.GetStart().GetStart(),
})
}
return todo("convertOrderby_stmtContext", n)
return sortItems
}

func (c *cc) convertLimit_stmtContext(n parser.ILimit_stmtContext) (ast.Node, ast.Node) {
Expand Down Expand Up @@ -826,7 +866,7 @@ func (c *cc) convertUnaryExpr(n *parser.Expr_unaryContext) ast.Node {
if opCtx.MINUS() != nil {
// Negative number: -expr
return &ast.A_Expr{
Name: &ast.List{Items: []ast.Node{&ast.String{Str: "-"}}},
Name: &ast.List{Items: []ast.Node{&ast.String{Str: "-"}}},
Rexpr: expr,
}
}
Expand All @@ -837,7 +877,7 @@ func (c *cc) convertUnaryExpr(n *parser.Expr_unaryContext) ast.Node {
if opCtx.TILDE() != nil {
// Bitwise NOT: ~expr
return &ast.A_Expr{
Name: &ast.List{Items: []ast.Node{&ast.String{Str: "~"}}},
Name: &ast.List{Items: []ast.Node{&ast.String{Str: "~"}}},
Rexpr: expr,
}
}
Expand Down Expand Up @@ -1313,9 +1353,6 @@ func (c *cc) convert(node node) ast.Node {
case *parser.Insert_stmtContext:
return c.convertInsert_stmtContext(n)

case *parser.Order_by_stmtContext:
return c.convertOrderby_stmtContext(n)

case *parser.Select_stmtContext:
return c.convertMultiSelect_stmtContext(n)

Expand Down
Loading
Loading