public virtual ISqlNode VisitCase(SqlCaseNode n) { var input = Visit(n.InputExpression); var whens = VisitTypedNodeList(n.WhenExpressions); var e = Visit(n.ElseExpression); return(n.Update(input, whens, e)); }
public override ISqlNode VisitCase(SqlCaseNode n) { _result.AssertIsScalarExpression(n, nameof(n.InputExpression), n.InputExpression); if (n.ElseExpression != null) { _result.AssertIsScalarExpression(n, nameof(n.ElseExpression), n.ElseExpression); } return(base.VisitCase(n)); }
private ISqlNode ParseCaseExpression(ITokenizer t) { // "CASE" <Expression>? <When>+ <Else>? "END" var caseToken = t.Expect(SqlTokenType.Keyword, "CASE"); var caseNode = new SqlCaseNode { Location = caseToken.Location }; if (!t.Peek().IsKeyword("WHEN")) { caseNode.InputExpression = ParseScalarExpression(t); } while (true) { var lookahead = t.Peek(); if (lookahead.IsKeyword("END")) { t.GetNext(); return(caseNode); } if (lookahead.IsKeyword("ELSE")) { t.GetNext(); caseNode.ElseExpression = ParseScalarExpression(t); t.Expect(SqlTokenType.Keyword, "END"); return(caseNode); } if (lookahead.IsKeyword("WHEN")) { var whenNode = t.GetNext(); var condition = ParseBooleanExpression(t); t.Expect(SqlTokenType.Keyword, "THEN"); var result = ParseScalarExpression(t); caseNode.WhenExpressions.Add(new SqlCaseWhenNode { Location = whenNode.Location, Condition = condition, Result = result }); continue; } throw ParsingException.CouldNotParseRule(nameof(ParseCaseExpression), lookahead); } }
public ISqlNode VisitCase(SqlCaseNode n) { Append("CASE "); Visit(n.InputExpression); IncreaseIndent(); foreach (var when in n.WhenExpressions) { AppendLineAndIndent(); Visit(when); } if (n.ElseExpression != null) { AppendLineAndIndent(); Append("ELSE "); Visit(n.ElseExpression); } DecreaseIndent(); AppendLineAndIndent(); Append("END"); return(n); }