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); }
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); }
public override ISqlNode VisitStatementList(SqlStatementListNode n) { var symbols = PushSymbolTable(); n = base.VisitStatementList(n) as SqlStatementListNode; n.Symbols = symbols; PopSymbolTable(); return(n); }
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"); }
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); }
// 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); }
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)); }