diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala index 52c1136b1ee30..9989ca79ed270 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala @@ -20,7 +20,7 @@ package org.apache.spark.sql.catalyst.analysis import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.catalyst.rules.Rule -import org.apache.spark.sql.internal.types.AbstractStringType +import org.apache.spark.sql.internal.types.{AbstractArrayType, AbstractStringType} import org.apache.spark.sql.types._ import org.apache.spark.sql.types.UpCastRule.numericPrecedence @@ -197,6 +197,9 @@ object AnsiTypeCoercion extends TypeCoercionBase { case (_: StringType, a @ (_: AtomicType | NumericType | DecimalType | AnyTimestampType)) => Some(a.defaultConcreteType) + case (ArrayType(fromType, _), AbstractArrayType(toType)) => + Some(implicitCast(fromType, toType).map(ArrayType(_, true)).orNull) + // When the target type is `TypeCollection`, there is another branch to find the // "closet convertible data type" below. case (_, target) if !target.isInstanceOf[TypeCollection] => diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala index 5d8bcd4f7b1f9..259e28b62bca7 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala @@ -31,7 +31,7 @@ import org.apache.spark.sql.catalyst.trees.AlwaysProcess import org.apache.spark.sql.catalyst.types.DataTypeUtils import org.apache.spark.sql.errors.QueryCompilationErrors import org.apache.spark.sql.internal.SQLConf -import org.apache.spark.sql.internal.types.{AbstractArrayType, AbstractStringType} +import org.apache.spark.sql.internal.types.{AbstractArrayType, AbstractStringType, StringTypeAnyCollation} import org.apache.spark.sql.types._ import org.apache.spark.sql.types.UpCastRule.numericPrecedence @@ -422,8 +422,9 @@ abstract class TypeCoercionBase { case None => c } - case aj @ ArrayJoin(arr, d, nr) if !ArrayType(StringType).acceptsType(arr.dataType) && - ArrayType.acceptsType(arr.dataType) => + case aj @ ArrayJoin(arr, d, nr) + if !AbstractArrayType(StringTypeAnyCollation).acceptsType(arr.dataType) && + ArrayType.acceptsType(arr.dataType) => val containsNull = arr.dataType.asInstanceOf[ArrayType].containsNull implicitCast(arr, ArrayType(StringType, containsNull)) match { case Some(castedArr) => ArrayJoin(castedArr, d, nr)