Github user cloud-fan commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19977#discussion_r158327829
  
    --- Diff: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala
 ---
    @@ -658,6 +660,30 @@ object TypeCoercion {
         }
       }
     
    +  /**
    +   * Coerces the types of [[Concat]] children to expected ones.
    +   *
    +   * If `spark.sql.function.concatBinaryAsString` is false and all 
children types are binary,
    +   * the expected types are binary. Otherwise, the expected ones are 
strings.
    +   */
    +  case class ConcatCoercion(conf: SQLConf) extends TypeCoercionRule {
    +    override protected def coerceTypes(
    +        plan: LogicalPlan): LogicalPlan = plan transformExpressionsUp {
    +      // Skip nodes if unresolved or empty children
    +      case c @ Concat(children) if !c.childrenResolved || children.isEmpty 
=> c
    +
    +      case c @ Concat(children) if !children.map(_.dataType).forall(_ == 
BinaryType) =>
    +        val newChildren = children.map { e =>
    +          ImplicitTypeCasts.implicitCast(e, StringType).getOrElse(e)
    +        }
    +        c.copy(children = newChildren)
    +
    +      case c @ Concat(children) if conf.concatBinaryAsString =>
    +        val newChildren = children.map(Cast(_, StringType))
    --- End diff --
    
    also use `ImplicitTypeCasts.implicitCast` here?


---

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

Reply via email to