maropu commented on a change in pull request #25001: [SPARK-28083][SQL] Support 
LIKE ... ESCAPE syntax
URL: https://github.com/apache/spark/pull/25001#discussion_r305171884
 
 

 ##########
 File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/regexpExpressions.scala
 ##########
 @@ -83,33 +83,38 @@ abstract class StringRegexExpression extends 
BinaryExpression
           % matches zero or more characters in the input (similar to .* in 
posix regular
           expressions)
 
-          The escape character is '\'. If an escape character precedes a 
special symbol or another
-          escape character, the following character is matched literally. It 
is invalid to escape
-          any other character.
-
           Since Spark 2.0, string literals are unescaped in our SQL parser. 
For example, in order
           to match "\abc", the pattern should be "\\abc".
 
           When SQL config 'spark.sql.parser.escapedStringLiterals' is enabled, 
it fallbacks
           to Spark 1.6 behavior regarding string literal parsing. For example, 
if the config is
           enabled, the pattern to match "\abc" should be "\abc".
+      * escape - a optional string. The default escape character is the '\' . 
If an escape character
+          precedes a special symbol or another escape character, the following 
character is matched
+          literally. It is invalid to escape any other character.
   """,
   examples = """
     Examples:
       > SELECT '%SystemDrive%\Users\John' _FUNC_ '\%SystemDrive\%\\Users%'
       true
+      > SELECT '%SystemDrive%/Users/John' _FUNC_ '/%SystemDrive/%//Users%' 
ESCAPE '/'
+      true
   """,
   note = """
     Use RLIKE to match with standard regular expressions.
   """,
   since = "1.0.0")
-case class Like(left: Expression, right: Expression) extends 
StringRegexExpression {
+case class Like(left: Expression, right: Expression, escapeCharOpt: 
Option[String] = None)
+  extends StringRegexExpression {
+
+  private lazy val escapeStr = escapeCharOpt.getOrElse("\\")
 
-  override def escape(v: String): String = StringUtils.escapeLikeRegex(v)
+  override def escape(v: String): String = StringUtils.escapeLikeRegex(v, 
escapeStr)
 
   override def matches(regex: Pattern, str: String): Boolean = 
regex.matcher(str).matches()
 
-  override def toString: String = s"$left LIKE $right"
+  override def toString: String = s"$left LIKE $right" +
+    escapeCharOpt.map(str => s" ESCAPE $str").getOrElse("")
 
 Review comment:
   `str` has the same handling with line 150-156 for special chars?

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to