Support nested CASE expressions (#609)

This commit is contained in:
Simon Binder 2020-06-02 12:05:02 +02:00
parent 9f651b3ce9
commit 896d62d76c
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
2 changed files with 31 additions and 2 deletions

View File

@ -31,13 +31,13 @@ mixin ExpressionParser on ParserBase {
final whenExpr = _or();
_consume(TokenType.then, 'Expected THEN');
final then = _or();
final then = expression();
whens.add(WhenComponent(when: whenExpr, then: then)
..setSpan(whenToken, _previous));
}
if (_matchOne(TokenType.$else)) {
$else = _or();
$else = expression();
}
_consume(TokenType.end, 'Expected END to finish the case operator');

View File

@ -65,6 +65,35 @@ final Map<String, Expression> _testCases = {
],
elseExpr: Reference(columnName: 'e'),
),
'CASE WHEN a THEN '
'CASE WHEN b THEN c ELSE d END '
'ELSE '
'CASE WHEN e THEN f ELSE g END '
'END': CaseExpression(
whens: [
WhenComponent(
when: Reference(columnName: 'a'),
then: CaseExpression(
whens: [
WhenComponent(
when: Reference(columnName: 'b'),
then: Reference(columnName: 'c'),
),
],
elseExpr: Reference(columnName: 'd'),
),
),
],
elseExpr: CaseExpression(
whens: [
WhenComponent(
when: Reference(columnName: 'e'),
then: Reference(columnName: 'f'),
),
],
elseExpr: Reference(columnName: 'g'),
),
),
"x NOT LIKE '%A%\$' ESCAPE '\$'": StringComparisonExpression(
not: true,
left: Reference(columnName: 'x'),