public override SqlExpression VisitCompoundExpression(PlSqlParser.CompoundExpressionContext context) { var left = Visit(context.exp); bool isNot = context.NOT() != null; if (context.LIKE() != null) { var right = Visit(context.likeExp); var op = isNot ? SqlExpressionType.NotLike : SqlExpressionType.Like; return(SqlExpression.Binary(left, op, right)); } if (context.BETWEEN() != null) { var min = Visit(context.min); var max = Visit(context.max); var lowerBound = SqlExpression.GreaterOrEqualThan(left, min); var upperBound = SqlExpression.SmallerOrEqualThan(left, max); return(SqlExpression.And(lowerBound, upperBound)); } if (context.IN() != null) { var arg = Visit(context.inElements()); SqlExpression right; SqlExpressionType op; if (isNot) { right = SqlExpression.All(arg); op = SqlExpressionType.NotEqual; } else { right = SqlExpression.Any(arg); op = SqlExpressionType.Equal; } return(SqlExpression.Binary(left, op, right)); } return(left); }
public override SqlExpression VisitCompoundExpression(PlSqlParser.CompoundExpressionContext context) { var left = Visit(context.exp); bool isNot = context.NOT() != null; if (context.LIKE() != null) { var right = Visit(context.likeExp); var op = isNot ? SqlExpressionType.NotLike : SqlExpressionType.Like; // TODO: ESCAPE return(SqlExpression.StringMatch(op, left, right, null)); } if (context.BETWEEN() != null) { var min = Visit(context.min); var max = Visit(context.max); var lowerBound = SqlExpression.GreaterThanOrEqual(left, min); var upperBound = SqlExpression.LessThanOrEqual(left, max); return(SqlExpression.And(lowerBound, upperBound)); } if (context.IN() != null) { var arg = Visit(context.inElements()); if (isNot) { return(SqlExpression.All(SqlExpression.Binary(SqlExpressionType.NotEqual, left, arg))); } return(SqlExpression.Any(SqlExpression.Binary(SqlExpressionType.Equal, left, arg))); } return(left); }