Skip to content

Commit 7461c2d

Browse files
authored
fix(engine/sqlite): support CASE expr (#2926)
Fixes #2925 Fixes #2736
1 parent e4fd079 commit 7461c2d

File tree

7 files changed

+135
-0
lines changed

7 files changed

+135
-0
lines changed

internal/endtoend/testdata/case_named_params/sqlite/go/db.go

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

internal/endtoend/testdata/case_named_params/sqlite/go/models.go

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

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

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-- name: ListAuthors :one
2+
SELECT *
3+
FROM authors
4+
WHERE email = CASE WHEN sqlc.arg(email) = '' then NULL else sqlc.arg(email) END
5+
OR username = CASE WHEN sqlc.arg(username) = '' then NULL else sqlc.arg(username) END
6+
LIMIT 1;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE authors (
2+
id INTEGER PRIMARY KEY,
3+
username TEXT NULL,
4+
email TEXT NULL,
5+
name TEXT NOT NULL,
6+
bio TEXT
7+
);
8+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "sqlite",
7+
"name": "querytest",
8+
"schema": "schema.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

internal/engine/sqlite/convert.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,28 @@ func (c *cc) convertCollateExpr(n *parser.Expr_collateContext) ast.Node {
10961096
}
10971097
}
10981098

1099+
func (c *cc) convertCase(n *parser.Expr_caseContext) ast.Node {
1100+
e := &ast.CaseExpr{
1101+
Args: &ast.List{},
1102+
}
1103+
es := n.AllExpr()
1104+
if n.ELSE_() != nil {
1105+
e.Defresult = c.convert(es[len(es)-1])
1106+
es = es[:len(es)-1]
1107+
}
1108+
if len(es)%2 == 1 {
1109+
e.Arg = c.convert(es[0])
1110+
es = es[1:]
1111+
}
1112+
for i := 0; i < len(es); i += 2 {
1113+
e.Args.Items = append(e.Args.Items, &ast.CaseWhen{
1114+
Expr: c.convert(es[i+0]),
1115+
Result: c.convert(es[i+1]),
1116+
})
1117+
}
1118+
return e
1119+
}
1120+
10991121
func (c *cc) convert(node node) ast.Node {
11001122
switch n := node.(type) {
11011123

@@ -1184,6 +1206,9 @@ func (c *cc) convert(node node) ast.Node {
11841206
case *parser.Expr_castContext:
11851207
return c.convertCastExpr(n)
11861208

1209+
case *parser.Expr_caseContext:
1210+
return c.convertCase(n)
1211+
11871212
default:
11881213
return todo("convert(case=default)", n)
11891214
}

0 commit comments

Comments
 (0)