diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 | 7 | ||||
-rw-r--r-- | sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala | 4 |
2 files changed, 10 insertions, 1 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 6a94def65f..20165c5f8e 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,10 +511,14 @@ predicate : NOT? kind=BETWEEN lower=valueExpression AND upper=valueExpression | NOT? kind=IN '(' expression (',' expression)* ')' | NOT? kind=IN '(' query ')' - | NOT? kind=(RLIKE | LIKE) pattern=valueExpression + | NOT? kind=(RLIKE) pattern=valueExpression + | NOT? kind=LIKE pattern=patternExpression | IS NOT? kind=NULL ; +patternExpression + : pattern=valueExpression (ESCAPE escapeChar=valueExpression)? + valueExpression : primaryExpression #valueExpressionDefault | operator=(MINUS | PLUS | TILDE) valueExpression #arithmeticUnary @@ -845,6 +849,7 @@ TERMINATED: 'TERMINATED'; COLLECTION: 'COLLECTION'; ITEMS: 'ITEMS'; KEYS: 'KEYS'; +ESCAPE: 'ESCAPE'; ESCAPED: 'ESCAPED'; LINES: 'LINES'; SEPARATED: 'SEPARATED'; 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 bf3f30279a..9e30634154 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 @@ -914,6 +914,10 @@ class AstBuilder extends SqlBaseBaseVisitor[AnyRef] with Logging { case not => Not(e) } + def escapeChar(e: Expression): Expression = ctx.ESCAPE match { + case _ => e + } + // Create the predicate. ctx.kind.getType match { case SqlBaseParser.BETWEEN => |