/// <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); }
/// <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); }