diff options
author | Wenchen Fan <wenchen@databricks.com> | 2015-11-23 10:13:59 -0800 |
---|---|---|
committer | Michael Armbrust <michael@databricks.com> | 2015-11-23 10:13:59 -0800 |
commit | 1a5baaa6517872b9a4fd6cd41c4b2cf1e390f6d1 (patch) | |
tree | 5d399059cdd9c4b14c02ce551618e9a13f179cf0 /sql/catalyst | |
parent | 94ce65dfcbba1fe3a1fc9d8002c37d9cd1a11336 (diff) | |
download | spark-1a5baaa6517872b9a4fd6cd41c4b2cf1e390f6d1.tar.gz spark-1a5baaa6517872b9a4fd6cd41c4b2cf1e390f6d1.tar.bz2 spark-1a5baaa6517872b9a4fd6cd41c4b2cf1e390f6d1.zip |
[SPARK-11894][SQL] fix isNull for GetInternalRowField
We should use `InternalRow.isNullAt` to check if the field is null before calling `InternalRow.getXXX`
Thanks gatorsmile who discovered this bug.
Author: Wenchen Fan <wenchen@databricks.com>
Closes #9904 from cloud-fan/null.
Diffstat (limited to 'sql/catalyst')
-rw-r--r-- | sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects.scala | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects.scala index 82317d3385..4a1f419f0a 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects.scala @@ -236,11 +236,6 @@ case class NewInstance( } if (propagateNull) { - val objNullCheck = if (ctx.defaultValue(dataType) == "null") { - s"${ev.isNull} = ${ev.value} == null;" - } else { - "" - } val argsNonNull = s"!(${argGen.map(_.isNull).mkString(" || ")})" s""" @@ -531,15 +526,15 @@ case class GetInternalRowField(child: Expression, ordinal: Int, dataType: DataTy throw new UnsupportedOperationException("Only code-generated evaluation is supported") override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = { - val row = child.gen(ctx) - s""" - ${row.code} - final boolean ${ev.isNull} = ${row.isNull}; - ${ctx.javaType(dataType)} ${ev.value} = ${ctx.defaultValue(dataType)}; - if (!${ev.isNull}) { - ${ev.value} = ${ctx.getValue(row.value, dataType, ordinal.toString)}; - } - """ + nullSafeCodeGen(ctx, ev, eval => { + s""" + if ($eval.isNullAt($ordinal)) { + ${ev.isNull} = true; + } else { + ${ev.value} = ${ctx.getValue(eval, dataType, ordinal.toString)}; + } + """ + }) } } |