aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2016-10-20 14:30:31 -0700
committerJakob Odersky <jakob@odersky.com>2016-10-20 14:30:31 -0700
commit7c76197330e2d44807ddb858254f8a63635e4095 (patch)
tree8e63faa871edc8392bf9531eaa459d3c97ee9120
parent2ab001c2547859f24c5fcb12cddf58212c1dafd3 (diff)
downloadspark-escape.tar.gz
spark-escape.tar.bz2
spark-escape.zip
more wipescape
-rw-r--r--sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g47
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/regexpExpressions.scala2
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala2
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 =>