예제 #1
0
        public ISqlNode VisitIf(SqlIfNode n)
        {
            Append("IF (");
            Visit(n.Condition);
            AppendLine(")");
            IncreaseIndent();
            Visit(n.Then);
            if (!(n.Then is SqlStatementListNode))
            {
                AppendLine(";");
            }
            AppendLine();
            DecreaseIndent();
            if (n.Else != null)
            {
                AppendLine("ELSE");
                IncreaseIndent();
                Visit(n.Else);
                if (!(n.Else is SqlStatementListNode))
                {
                    AppendLine(";");
                }
                AppendLine();
                DecreaseIndent();
            }

            return(n);
        }
예제 #2
0
        public virtual ISqlNode VisitIf(SqlIfNode n)
        {
            var cond = Visit(n.Condition);
            var then = Visit(n.Then);
            var e    = Visit(n.Else);

            return(n.Update(cond, then, e));
        }
예제 #3
0
        public void If_ParenConditionThenBlock()
        {
            const string s      = @"
IF (5 = 6) 
BEGIN 
    SELECT 'TEST1';
    SELECT 'TEST2';
END";
            var          target = new Parser();
            var          result = target.Parse(Tokenizer.ForPostgreSql(s));

            result.Should().PassValidation().And.RoundTrip();

            var thenStatementList = new SqlStatementListNode
            {
                UseBeginEnd = true
            };

            thenStatementList.Add(new SqlSelectNode
            {
                Columns = new SqlListNode <ISqlNode>
                {
                    Children = new List <ISqlNode>
                    {
                        new SqlStringNode("TEST1")
                    }
                }
            });
            thenStatementList.Add(new SqlSelectNode
            {
                Columns = new SqlListNode <ISqlNode>
                {
                    Children = new List <ISqlNode>
                    {
                        new SqlStringNode("TEST2")
                    }
                }
            });

            var expectedAst = new SqlIfNode
            {
                Condition = new SqlInfixOperationNode
                {
                    Left     = new SqlNumberNode(5),
                    Operator = new SqlOperatorNode("="),
                    Right    = new SqlNumberNode(6)
                },
                Then = thenStatementList
            };

            result.Statements.First().Should().MatchAst(expectedAst);
        }
예제 #4
0
        private SqlIfNode ParseIf(ITokenizer t)
        {
            // "IF" (("(" <Condition> ")") | <Condition>) <Statement> ("ELSE" <Statement>)?
            var ifToken = t.Expect(SqlTokenType.Keyword, "IF");
            var ifNode  = new SqlIfNode
            {
                Location  = ifToken.Location,
                Condition = ParseMaybeParenthesis(t, ParseBooleanExpression),
                Then      = ParseStatement(t)
            };

            if (t.NextIs(SqlTokenType.Keyword, "ELSE", true))
            {
                ifNode.Else = ParseStatement(t);
            }
            return(ifNode);
        }