public override SqlStatement VisitLoopStatement(PlSqlParser.LoopStatementContext context)
        {
            LoopStatement loop;

            if (context.WHILE() != null)
            {
                var condition = Expression.Build(context.condition());
                loop = new WhileLoopStatement(condition);
            }
            else if (context.FOR() != null)
            {
                var param = context.cursorLoopParam();
                if (param.lowerBound() != null &&
                    param.upperBound() != null)
                {
                    var lower     = Expression.Build(param.lowerBound());
                    var upper     = Expression.Build(param.upperBound());
                    var indexName = Name.Simple(param.id());

                    var reverse = param.REVERSE() != null;
                    loop = new ForLoopStatement(indexName, lower, upper)
                    {
                        Reverse = reverse
                    };
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            else
            {
                loop = new LoopStatement();
            }

            if (context.labelDeclaration() != null)
            {
                var labelName = Name.Simple(context.labelDeclaration().id());
                loop.Label = labelName;
            }

            var seqOfStatements = context.seqOfStatements();

            if (seqOfStatements != null)
            {
                var statements = seqOfStatements.statement().Select(Visit);
                foreach (var statement in statements)
                {
                    loop.Statements.Add(statement);
                }
            }

            return(loop);
        }
Exemple #2
0
            void IStatementVisitor.Visit(WhileLoopStatement statement)
            {
                Label previousLoopAfterLabel = currentLoopAfterLabel;

                currentLoopAfterLabel = generator.DefineLabel();
                Label labelBegin = generator.DefineAndMarkLabel();

                statement.Condition.AcceptInternal(this);
                generator.IfFalseGoto(currentLoopAfterLabel);
                statement.Body.AcceptInternal(this);
                generator.Goto(labelBegin);
                generator.MarkLabel(currentLoopAfterLabel);
                currentLoopAfterLabel = previousLoopAfterLabel;
            }
Exemple #3
0
        public void WhileLoop()
        {
            var whileLoop =
                new WhileLoopStatement(SqlExpression.SmallerOrEqualThan(SqlExpression.VariableReference("a"),
                                                                        SqlExpression.Constant(20)));

            whileLoop.Statements.Add(new ExitStatement());

            SerializeAndAssert(whileLoop, (serialized, deserialized) => {
                Assert.IsNotNull(deserialized);
                Assert.IsNotNull(deserialized.ConditionExpression);
                Assert.IsNotNull(deserialized.Statements);
                Assert.IsNotEmpty(deserialized.Statements);
            });
        }
Exemple #4
0
        private static void EmitWhileLoopStatement(WhileLoopStatement whileLoop, ILGenerator methodIL)
        {
            Label toLoopCond = methodIL.DefineLabel();
            Label toLoopBody = methodIL.DefineLabel();
            Label toBodyEnd  = methodIL.DefineLabel();
            Label toLoopEnd  = methodIL.DefineLabel();

            BreakLabel    = toLoopEnd;
            ContinueLabel = toBodyEnd;

            methodIL.MarkLabel(toLoopCond);
            EmitCondition(whileLoop.Condition, methodIL);

            methodIL.Emit(OpCodes.Brtrue, toLoopBody);
            methodIL.Emit(OpCodes.Br, toLoopEnd);

            methodIL.MarkLabel(toLoopBody);
            EmitEmbeddedStatement((EmbeddedStatement)whileLoop.Body, methodIL);
            methodIL.MarkLabel(toBodyEnd);
            methodIL.Emit(OpCodes.Br, toLoopCond);

            methodIL.MarkLabel(toLoopEnd);
        }
        public void WhileLoop()
        {
            var loop = new WhileLoopStatement(SqlExpression.SmallerThan(SqlExpression.VariableReference("a"), SqlExpression.Constant(33)));

            loop.Statements.Add(new DeclareVariableStatement("b", PrimitiveTypes.Integer()));
            loop.Statements.Add(new AssignVariableStatement(SqlExpression.VariableReference("b"),
                                                            SqlExpression.Add(SqlExpression.VariableReference("a"), SqlExpression.Constant(40))));
            loop.Statements.Add(new AssignVariableStatement(SqlExpression.VariableReference("a"),
                                                            SqlExpression.Add(SqlExpression.VariableReference("a"), SqlExpression.Constant(1))));

            var block = new PlSqlBlockStatement();

            block.Declarations.Add(new DeclareVariableStatement("a", PrimitiveTypes.Integer()));

            var result = AdminQuery.ExecuteStatement(block);

            Assert.IsNotNull(result);
            Assert.AreEqual(StatementResultType.Result, result.Type);

            var value = result.Result.GetValue(0, 0);

            Assert.IsNotNull(value);
            Assert.IsFalse(Field.IsNullField(value));
        }