Github user viirya commented on a diff in the pull request:
https://github.com/apache/spark/pull/19910#discussion_r155238576
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypeCreator.scala
---
@@ -356,25 +356,24 @@ case class CreateNamedStruct(children:
Seq[Expression]) extends CreateNamedStruc
override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val rowClass = classOf[GenericInternalRow].getName
val values = ctx.freshName("values")
- ctx.addMutableState("Object[]", values, s"$values = null;")
+ ctx.addMutableState("Object[]", values, s"$values = new
Object[${valExprs.size}];")
val valuesCode = ctx.splitExpressionsWithCurrentInputs(
valExprs.zipWithIndex.map { case (e, i) =>
val eval = e.genCode(ctx)
s"""
- ${eval.code}
- if (${eval.isNull}) {
- $values[$i] = null;
- } else {
- $values[$i] = ${eval.value};
- }"""
+ |${eval.code}
+ |if (${eval.isNull}) {
+ | $values[$i] = null;
+ |} else {
+ | $values[$i] = ${eval.value};
+ |}
+ """.stripMargin
})
ev.copy(code =
s"""
- |$values = new Object[${valExprs.size}];
|$valuesCode
|final InternalRow ${ev.value} = new $rowClass($values);
- |$values = null;
--- End diff --
We create the object array every time is because `GenericInternalRow`
doesn't copy the given array. If the parent operator keeps the produced rows,
this change may cause wrong result.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]