Github user HyukjinKwon commented on a diff in the pull request:
https://github.com/apache/spark/pull/21598#discussion_r196751561
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala
---
@@ -75,28 +75,44 @@ trait BinaryArrayExpressionWithImplicitCast extends
BinaryExpression
> SELECT _FUNC_(array('b', 'd', 'c', 'a'));
4
""")
-case class Size(child: Expression) extends UnaryExpression with
ExpectsInputTypes {
+case class Size(
+ child: Expression,
+ legacySizeOfNull: Boolean)
+ extends UnaryExpression with ExpectsInputTypes {
+
+ def this(child: Expression) =
+ this(
+ child,
+ legacySizeOfNull = SQLConf.get.getConf(SQLConf.LEGACY_SIZE_OF_NULL))
+
override def dataType: DataType = IntegerType
override def inputTypes: Seq[AbstractDataType] =
Seq(TypeCollection(ArrayType, MapType))
- override def nullable: Boolean = false
+ override def nullable: Boolean = if (legacySizeOfNull) false else
super.nullable
override def eval(input: InternalRow): Any = {
val value = child.eval(input)
if (value == null) {
- -1
+ if (legacySizeOfNull) -1 else null
} else child.dataType match {
case _: ArrayType => value.asInstanceOf[ArrayData].numElements()
case _: MapType => value.asInstanceOf[MapData].numElements()
}
}
override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
- val childGen = child.genCode(ctx)
- ev.copy(code = code"""
+ if (legacySizeOfNull) {
+ val childGen = child.genCode(ctx)
+ ev.copy(code = code"""
boolean ${ev.isNull} = false;
${childGen.code}
${CodeGenerator.javaType(dataType)} ${ev.value} = ${childGen.isNull}
? -1 :
(${childGen.value}).numElements();""", isNull = FalseLiteral)
+ } else {
+ child.dataType match {
+ case _: ArrayType => defineCodeGen(ctx, ev, c =>
s"($c).numElements()")
+ case _: MapType => defineCodeGen(ctx, ev, c =>
s"($c).numElements()")
--- End diff --
Can we fold both cases?
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]