Exemplo n.º 1
0
        /// <summary>
        /// relational_expression :
        ///       relational_expression op = relational_operator relational_expression
        ///     | compound_expression
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override object VisitRelational_expression([NotNull] PlSqlParser.Relational_expressionContext context)
        {
            OCodeObject result = null;

            var compound_expression = context.compound_expression();

            if (compound_expression != null)
            {
                result = (OCodeObject)VisitCompound_expression(compound_expression);
            }

            else
            {
                Stop();

                var relational_expression = context.relational_expression();
                var left      = (OCodeExpression)VisitRelational_expression(relational_expression[0]);
                var right     = (OCodeExpression)VisitRelational_expression(relational_expression[1]);
                var _operator = (OperatorEnum)VisitRelational_operator(context.relational_operator());

                result = new OBinaryExpression()
                {
                    Left     = left,
                    Operator = _operator,
                    Right    = right
                };
            }

            Debug.Assert(result != null);
            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// string_function :
        ///       SUBSTR LEFT_PAREN expression COMMA expression(COMMA expression)? RIGHT_PAREN
        ///     | TO_CHAR LEFT_PAREN(table_element | standard_function | expression) (COMMA string1=string)? (COMMA string2=string)? RIGHT_PAREN
        ///     | DECODE LEFT_PAREN expressions RIGHT_PAREN
        ///     | CHR LEFT_PAREN concatenation USING NCHAR_CS RIGHT_PAREN
        ///     | NVL LEFT_PAREN expression COMMA expression RIGHT_PAREN
        ///     | TRIM LEFT_PAREN((LEADING | TRAILING | BOTH)?  string1=string? FROM)? concatenation RIGHT_PAREN
        ///     | TO_DATE LEFT_PAREN expression(COMMA string1 = string)? RIGHT_PAREN
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override object VisitString_function([NotNull] PlSqlParser.String_functionContext context)
        {
            OCallMethodReference result = null;

            if (context.SUBSTR().Exist())
            {
                Stop();
                result = new OCallMethodReference(new MethodName("SUBSTR")
                                                  , context.expression().Select(c => new OMethodArgument()
                {
                    Value = (OCodeObject)VisitExpression(c)
                }).ToArray()
                                                  );
            }
            else if (context.TO_CHAR().Exist())
            {
                Stop();
                OCodeObject value         = null;
                var         table_element = context.table_element();
                if (table_element != null)
                {
                    value = (OCodeObject)VisitTable_element(table_element);
                }

                else
                {
                    var standard_function = context.standard_function();
                    if (standard_function != null)
                    {
                        value = (OCodeObject)VisitStandard_function(standard_function);
                    }

                    else
                    {
                        var expression = context.expression();
                        value = (OCodeObject)VisitExpression(expression[0]);
                    }
                }

                List <OMethodArgument> args = new List <OMethodArgument>()
                {
                    new OMethodArgument()
                    {
                        Value = value
                    }
                };
                if (context.@string1 != null)
                {
                    args.Add(new OMethodArgument()
                    {
                        Value = [email protected]()
                    });
                }
                if (context.@string2 != null)
                {
                    args.Add(new OMethodArgument()
                    {
                        Value = [email protected]()
                    });
                }

                result = new OCallMethodReference(new MethodName("TO_CHAR")

                                                  );
            }
            else if (context.DECODE().Exist())
            {
                Stop();
                var e = context.expressions();
                result = new OCallMethodReference(new MethodName("DECODE")
                                                  , e.expression().Select(c => new OMethodArgument()
                {
                    Value = (OCodeObject)VisitExpression(c)
                }).First()
                                                  );
            }
            else if (context.CHR().Exist())
            {
                Stop();

                var concatenation = context.concatenation();
                var value         = (OCodeObject)VisitConcatenation(concatenation);
                if (context.NCHAR_CS().Exist())
                {
                    Stop();
                }

                result = new OCallMethodReference(new MethodName("CHR")
                                                  , new OMethodArgument()
                {
                    Value = value
                }
                                                  );
            }
            else if (context.TRIM().Exist())
            {
                Stop();
                List <OMethodArgument> args = new List <OMethodArgument>();
                if (context.LEADING().Exist())
                {
                    args.Add(new OMethodArgument()
                    {
                        Value = new OKeyWordConstant()
                        {
                            Value = "LEADING"
                        }
                    });
                }

                else if (context.TRAILING().Exist())
                {
                    args.Add(new OMethodArgument()
                    {
                        Value = new OKeyWordConstant()
                        {
                            Value = "TRAILING"
                        }
                    });
                }

                if (context.BOTH().Exist())
                {
                    args.Add(new OMethodArgument()
                    {
                        Value = new OKeyWordConstant()
                        {
                            Value = "BOTH"
                        }
                    });
                }

                if (context.string1 != null)
                {
                    args.Add(new OMethodArgument()
                    {
                        Value = context.string1.ToConstant()
                    });
                }

                var concatenation = context.concatenation();
                var value         = (OCodeObject)VisitConcatenation(concatenation);
                //args.Add(new OMethodArgument() { Value = value });

                result = new OCallMethodReference(new MethodName("TRIM"), args.ToArray());
            }
            else
            {
                Stop();
            }

            return(result);
        }