Github user wzhfy commented on a diff in the pull request:

    https://github.com/apache/spark/pull/12646#discussion_r120000329
  
    --- Diff: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
 ---
    @@ -503,58 +503,63 @@ case class FindInSet(left: Expression, right: 
Expression) extends BinaryExpressi
       override def prettyName: String = "find_in_set"
     }
     
    +trait String2TrimExpression extends ImplicitCastInputTypes {
    +  self: Expression =>
    +
    +  override def dataType: DataType = StringType
    +  override def inputTypes: Seq[AbstractDataType] = 
Seq.fill(children.size)(StringType)
    +
    +  override def nullable: Boolean = children.exists(_.nullable)
    +  override def foldable: Boolean = children.forall(_.foldable)
    +
    +  override def sql: String = {
    +    if (children.size == 1) {
    +      val childrenSQL = children.map(_.sql).mkString(", ")
    +      s"$prettyName($childrenSQL)"
    +    } else {
    +      val trimSQL = children(0).map(_.sql).mkString(", ")
    +      val tarSQL = children(1).map(_.sql).mkString(", ")
    +      s"$prettyName($trimSQL, $tarSQL)"
    +    }
    +  }
    +}
    +
     /**
      * A function that takes a character string, removes the leading and/or 
trailing characters matching with the characters
    - * in the trim string, returns the new string. If LEADING/TRAILING/BOTH 
and trimStr keywords are not specified, it
    - * defaults to remove space character from both ends.
    + * in the trim string, returns the new string. If BOTH and trimStr 
keywords are not specified, it defaults to remove
    + * space character from both ends.
      * trimStr: A character string to be trimmed from the source string, if it 
has multiple characters, the function
      * searches for each character in the source string, removes the 
characters from the source string until it
      * encounters the first non-match character.
    - * LEADING: removes any characters from the left end of the source string 
that matches characters in the trim string.
    - * TRAILING: removes any characters from the right end of the source 
string that matches characters in the trim string.
      * BOTH: removes any characters from both ends of the source string that 
matches characters in the trim string.
       */
     @ExpressionDescription(
       usage = """
         _FUNC_(str) - Removes the leading and trailing space characters from 
`str`.
         _FUNC_(BOTH trimStr FROM str) - Remove the leading and trailing 
trimString from `str`
    -    _FUNC_(LEADING trimStr FROM str) - Remove the leading trimString from 
`str`
    -    _FUNC_(TRAILING trimStr FROM str) - Remove the trailing trimString 
from `str`
       """,
       extended = """
         Arguments:
           str - a string expression
           trimString - the trim string
           BOTH, FROM - these are keyword to specify for trim string from both 
ends of the string
    -      LEADING, FROM - these are keyword to specify for trim string from 
left end of the string
    -      TRAILING, FROM - these are keyword to specify for trim string from 
right end of the string
         Examples:
           > SELECT _FUNC_('    SparkSQL   ');
            SparkSQL
           > SELECT _FUNC_(BOTH 'SL' FROM 'SSparkSQLS');
            parkSQ
    -      > SELECT _FUNC_(LEADING 'paS' FROM 'SSparkSQLS');
    -       rkSQLS
    -      > SELECT _FUNC_(TRAILING 'SLQ' FROM 'SSparkSQLS');
    -       SSparkS
       """)
     case class StringTrim(children: Seq[Expression])
    -  extends Expression with ImplicitCastInputTypes {
    +  extends Expression with String2TrimExpression {
     
       require(children.size <= 2 && children.nonEmpty,
         s"$prettyName requires at least one argument and no more than two.")
     
    -  override def dataType: DataType = StringType
    -  override def inputTypes: Seq[AbstractDataType] = 
Seq.fill(children.size)(StringType)
    -
    -  override def nullable: Boolean = children.exists(_.nullable)
    -  override def foldable: Boolean = children.forall(_.foldable)
    -
       override def prettyName: String = "trim"
     
       // trim function can take one or two arguments.
    -  // For one argument(children size is 1), it is the trim space function.
    -  // For two arguments(children size is 2), it is the trim function with 
one of these options: BOTH/LEADING/TRAILING.
    +  // Specify one child, it is for the trim space function.
    +  // Specify the two children, it is for the trim function with BOTH 
option.
    --- End diff --
    
    Can you please give more clear description here: what do the first argument 
and the second argument mean? Maybe my previous comment is misleading, sorry 
about that.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

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

Reply via email to