Exemplo n.º 1
0
        private SqlStatementListNode ParseBeginEndStatementList(ITokenizer t)
        {
            t.Expect(SqlTokenType.Keyword, "BEGIN");
            var statements = new SqlStatementListNode {
                UseBeginEnd = true
            };

            while (true)
            {
                var lookahead = t.Peek();
                if (lookahead.IsType(SqlTokenType.EndOfInput))
                {
                    throw ParsingException.CouldNotParseRule(nameof(ParseBeginEndStatementList), lookahead);
                }
                if (lookahead.Is(SqlTokenType.Keyword, "END"))
                {
                    t.GetNext();
                    break;
                }

                var statement = ParseStatement(t);
                if (statement == null)
                {
                    throw ParsingException.CouldNotParseRule(nameof(ParseBeginEndStatementList), t.Peek());
                }

                statements.Statements.Add(statement);
            }

            return(statements);
        }
Exemplo n.º 2
0
        public ISqlNode VisitStatementList(SqlStatementListNode n)
        {
            if (n.UseBeginEnd)
            {
                WriteIndent();
                AppendLine("BEGIN");
                IncreaseIndent();
            }

            foreach (var statement in n.Statements)
            {
                WriteIndent();
                Visit(statement);
                if (!(statement is SqlStatementListNode || statement is SqlIfNode))
                {
                    AppendLine(";");
                }
            }

            if (n.UseBeginEnd)
            {
                DecreaseIndent();
                WriteIndent();
                AppendLine("END");
            }

            return(n);
        }
Exemplo n.º 3
0
        public override ISqlNode VisitStatementList(SqlStatementListNode n)
        {
            var symbols = PushSymbolTable();

            n         = base.VisitStatementList(n) as SqlStatementListNode;
            n.Symbols = symbols;
            PopSymbolTable();
            return(n);
        }
Exemplo n.º 4
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);
        }
        public void BuildSymbolTable_SetWithoutDeclare()
        {
            var ast = new SqlStatementListNode
            {
                new SqlSetNode
                {
                    Variable = new SqlVariableNode("@var"),
                    Right    = new SqlNumberNode(5)
                }
            };
            Action act = () => ast.BuildSymbolTables();

            act.Should().Throw <SymbolNotDefinedException>().And.Symbol.Should().Be("@var");
        }
Exemplo n.º 6
0
        public void BuildSymbolTable_DeclareSet()
        {
            var ast = new SqlStatementListNode
            {
                new SqlDeclareNode
                {
                    Variable = new SqlVariableNode("@var"),
                    DataType = new SqlKeywordNode("INT")
                },
                new SqlSetNode
                {
                    Variable = new SqlVariableNode("@var"),
                    Right    = new SqlNumberNode(5)
                }
            };

            ast.BuildSymbolTables();
            ast.Symbols.GetInfoOrThrow("@var", null).OriginKind.Should().Be(SymbolOriginKind.UserDeclared);
        }
Exemplo n.º 7
0
        // TODO: "GO" which starts a new logical block and also sets scope limits for variables

        private SqlStatementListNode ParseStatementList(ITokenizer t)
        {
            var statements = new SqlStatementListNode();

            while (true)
            {
                while (t.NextIs(SqlTokenType.Symbol, ";", true))
                {
                    ;
                }
                if (t.Peek().IsType(SqlTokenType.EndOfInput))
                {
                    break;
                }
                var statement = ParseStatement(t);
                if (statement == null)
                {
                    throw ParsingException.CouldNotParseRule(nameof(ParseStatement), t.Peek());
                }
                statements.Statements.Add(statement);
            }

            return(statements);
        }
Exemplo n.º 8
0
        public virtual ISqlNode VisitStatementList(SqlStatementListNode n)
        {
            var stmts = VisitTypedNodeList(n.Statements);

            return(n.Update(stmts, n.UseBeginEnd));
        }
 public override ISqlNode VisitStatementList(SqlStatementListNode n)
 {
     return(base.VisitStatementList(n));
 }