diff options
3 files changed, 4 insertions, 7 deletions
diff --git a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 index 20165c5f8e..80db7286ff 100644 --- a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 +++ b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 @@ -511,14 +511,11 @@ predicate : NOT? kind=BETWEEN lower=valueExpression AND upper=valueExpression | NOT? kind=IN '(' expression (',' expression)* ')' | NOT? kind=IN '(' query ')' - | NOT? kind=(RLIKE) pattern=valueExpression - | NOT? kind=LIKE pattern=patternExpression + | NOT? kind=RLIKE pattern=valueExpression + | NOT? kind=LIKE pattern=valueExpression (ESCAPE escapeChar=valueExpression)? | IS NOT? kind=NULL ; -patternExpression - : pattern=valueExpression (ESCAPE escapeChar=valueExpression)? - valueExpression : primaryExpression #valueExpressionDefault | operator=(MINUS | PLUS | TILDE) valueExpression #arithmeticUnary diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/regexpExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/regexpExpressions.scala index 4b7652fc7d..5bdc95357f 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/regexpExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/regexpExpressions.scala @@ -82,7 +82,7 @@ trait StringRegexExpression extends ImplicitCastInputTypes { "escape character is treated literally. I.e. '\\%' would match '%', whereas '\\a' matches " + "'\\a'.\n\n" + "Use RLIKE to match with standard regular expressions.") -case class Like(left: Expression, right: Expression) +case class Like(left: Expression, right: Expression, escapeChar: Expression) extends BinaryExpression with StringRegexExpression { override def escape(v: String): String = StringUtils.escapeLikeRegex(v) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala index 9e30634154..5b2eff8f4a 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala @@ -930,7 +930,7 @@ class AstBuilder extends SqlBaseBaseVisitor[AnyRef] with Logging { case SqlBaseParser.IN => invertIfNotDefined(In(e, ctx.expression.asScala.map(expression))) case SqlBaseParser.LIKE => - invertIfNotDefined(Like(e, expression(ctx.pattern))) + invertIfNotDefined(Like(e, expression(ctx.pattern), expression(ctx.escapeChar))) case SqlBaseParser.RLIKE => invertIfNotDefined(RLike(e, expression(ctx.pattern))) case SqlBaseParser.NULL if ctx.NOT != null => |