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 d3df7e03962e0..671bbbc2e37bf 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 @@ -1393,6 +1393,10 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging } str.charAt(0) }.getOrElse('\\') + if ('%' == escapeChar || '_' == escapeChar) { + throw new ParseException("Invalid escape string." + + "Escape string can not be '%', '_'.", ctx) + } invertIfNotDefined(Like(e, expression(ctx.pattern), escapeChar)) case SqlBaseParser.RLIKE => invertIfNotDefined(RLike(e, expression(ctx.pattern))) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala index 4dccada3d5546..94b293f14a37f 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala @@ -196,6 +196,10 @@ class ExpressionParserSuite extends AnalysisTest { assertEqual("a not like 'pattern%' escape '\"'", !('a.like("pattern%", '\"'))) intercept("a not like 'pattern%' escape '\"/'", message) intercept("a not like 'pattern%' escape ''", message) + + val message2 = "Escape string can not be '%', '_'." + intercept("a like 'pattern%' escape '_'", message2) + intercept("a like 'pattern%' escape '%'", message2) } test("like expressions with ESCAPED_STRING_LITERALS = true") {