Skip to content

Commit fef9d8d

Browse files
committed
chore(embedded/sql): Add support for simple CASE statements
Signed-off-by: Stefano Scafiti <[email protected]>
1 parent 51c0742 commit fef9d8d

File tree

6 files changed

+521
-362
lines changed

6 files changed

+521
-362
lines changed

embedded/sql/engine_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2973,13 +2973,13 @@ func TestQuery(t *testing.T) {
29732973
`SELECT
29742974
department,
29752975
job_title,
2976-
CASE
2977-
WHEN department = 'sales' THEN
2976+
CASE department
2977+
WHEN 'sales' THEN
29782978
CASE
29792979
WHEN job_title = 'manager' THEN '20% Bonus'
29802980
ELSE '10% Bonus'
29812981
END
2982-
WHEN department = 'engineering' THEN
2982+
WHEN 'engineering' THEN
29832983
CASE
29842984
WHEN job_title = 'senior engineer' THEN '15% Bonus'
29852985
ELSE '5% Bonus'

embedded/sql/parser_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,57 @@ func TestParseExp(t *testing.T) {
16741674
}},
16751675
expectedError: nil,
16761676
},
1677+
{
1678+
input: "SELECT CASE 1 + 1 WHEN 2 THEN 1 ELSE 0 END FROM my_table",
1679+
expectedOutput: []SQLStmt{
1680+
&SelectStmt{
1681+
ds: &tableRef{table: "my_table"},
1682+
targets: []TargetEntry{
1683+
{
1684+
Exp: &CaseWhenExp{
1685+
exp: &NumExp{
1686+
op: ADDOP,
1687+
left: &Integer{1},
1688+
right: &Integer{1},
1689+
},
1690+
whenThen: []whenThenClause{
1691+
{
1692+
when: &Integer{2},
1693+
then: &Integer{1},
1694+
},
1695+
},
1696+
elseExp: &Integer{0},
1697+
},
1698+
},
1699+
},
1700+
},
1701+
},
1702+
},
1703+
{
1704+
input: "SELECT CASE WHEN is_deleted OR is_expired THEN 1 END AS is_deleted_or_expired FROM my_table",
1705+
expectedOutput: []SQLStmt{
1706+
&SelectStmt{
1707+
ds: &tableRef{table: "my_table"},
1708+
targets: []TargetEntry{
1709+
{
1710+
Exp: &CaseWhenExp{
1711+
whenThen: []whenThenClause{
1712+
{
1713+
when: &BinBoolExp{
1714+
op: OR,
1715+
left: &ColSelector{col: "is_deleted"},
1716+
right: &ColSelector{col: "is_expired"},
1717+
},
1718+
then: &Integer{1},
1719+
},
1720+
},
1721+
},
1722+
As: "is_deleted_or_expired",
1723+
},
1724+
},
1725+
},
1726+
},
1727+
},
16771728
{
16781729
input: "SELECT CASE WHEN is_deleted OR is_expired THEN 1 END AS is_deleted_or_expired FROM my_table",
16791730
expectedOutput: []SQLStmt{

embedded/sql/sql_grammar.y

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func setResult(l yyLexer, stmts []SQLStmt) {
136136
%type <join> join
137137
%type <joinType> opt_join_type
138138
%type <checks> opt_checks
139-
%type <exp> exp opt_where opt_having boundexp opt_else when_then_else
139+
%type <exp> exp opt_exp opt_where opt_having boundexp opt_else
140140
%type <binExp> binExp
141141
%type <cols> opt_groupby
142142
%type <exp> opt_limit opt_offset case_when_exp
@@ -1057,6 +1057,17 @@ opt_checks:
10571057
$$ = append([]CheckConstraint{{name: $2, exp: $4}}, $6...)
10581058
}
10591059

1060+
opt_exp:
1061+
{
1062+
$$ = nil
1063+
}
1064+
|
1065+
exp
1066+
{
1067+
$$ = $1
1068+
}
1069+
;
1070+
10601071
exp:
10611072
boundexp
10621073
{
@@ -1104,18 +1115,12 @@ exp:
11041115
}
11051116

11061117
case_when_exp:
1107-
CASE when_then_else END
1108-
{
1109-
$$ = $2
1110-
}
1111-
;
1112-
1113-
when_then_else:
1114-
when_then_clauses opt_else
1118+
CASE opt_exp when_then_clauses opt_else END
11151119
{
11161120
$$ = &CaseWhenExp{
1117-
whenThen: $1,
1118-
elseExp: $2,
1121+
exp: $2,
1122+
whenThen: $3,
1123+
elseExp: $4,
11191124
}
11201125
}
11211126
;

0 commit comments

Comments
 (0)