diff --git a/sqlparser/lib/src/reader/parser/expressions.dart b/sqlparser/lib/src/reader/parser/expressions.dart index 66d1b783..ceda2e1a 100644 --- a/sqlparser/lib/src/reader/parser/expressions.dart +++ b/sqlparser/lib/src/reader/parser/expressions.dart @@ -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'); diff --git a/sqlparser/test/parser/expression_test.dart b/sqlparser/test/parser/expression_test.dart index 01098ac8..cc255686 100644 --- a/sqlparser/test/parser/expression_test.dart +++ b/sqlparser/test/parser/expression_test.dart @@ -65,6 +65,35 @@ final Map _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'),