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);
        }