aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCheng Lian <lian.cs.zju@gmail.com>2014-09-09 18:39:33 -0700
committerMichael Armbrust <michael@databricks.com>2014-09-09 18:39:33 -0700
commitc110614b33a690a3db6ccb1a920fb6a3795aa5a0 (patch)
tree918ab984014e5129ad94e8a7962ba57d14bad321
parent07ee4a28c3a502121770f301316cb2256e8f0ce2 (diff)
downloadspark-c110614b33a690a3db6ccb1a920fb6a3795aa5a0.tar.gz
spark-c110614b33a690a3db6ccb1a920fb6a3795aa5a0.tar.bz2
spark-c110614b33a690a3db6ccb1a920fb6a3795aa5a0.zip
[SPARK-3448][SQL] Check for null in SpecificMutableRow.update
`SpecificMutableRow.update` doesn't check for null, and breaks existing `MutableRow` contract. The tricky part here is that for performance considerations, the `update` method of all subclasses of `MutableValue` doesn't check for null and sets the null bit to false. Author: Cheng Lian <lian.cs.zju@gmail.com> Closes #2325 from liancheng/check-for-null and squashes the following commits: 9366c44 [Cheng Lian] Check for null in SpecificMutableRow.update
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/SpecificRow.scala4
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/RowSuite.scala8
2 files changed, 10 insertions, 2 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/SpecificRow.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/SpecificRow.scala
index 75ea0e8459..088f11ee4a 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/SpecificRow.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/SpecificRow.scala
@@ -227,7 +227,9 @@ final class SpecificMutableRow(val values: Array[MutableValue]) extends MutableR
new SpecificMutableRow(newValues)
}
- override def update(ordinal: Int, value: Any): Unit = values(ordinal).update(value)
+ override def update(ordinal: Int, value: Any): Unit = {
+ if (value == null) setNullAt(ordinal) else values(ordinal).update(value)
+ }
override def iterator: Iterator[Any] = values.map(_.boxed).iterator
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/RowSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/RowSuite.scala
index 651cb735ab..811319e0a6 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/RowSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/RowSuite.scala
@@ -19,7 +19,7 @@ package org.apache.spark.sql
import org.scalatest.FunSuite
-import org.apache.spark.sql.catalyst.expressions.GenericMutableRow
+import org.apache.spark.sql.catalyst.expressions.{GenericMutableRow, SpecificMutableRow}
class RowSuite extends FunSuite {
@@ -43,4 +43,10 @@ class RowSuite extends FunSuite {
assert(expected.getBoolean(2) === actual2.getBoolean(2))
assert(expected(3) === actual2(3))
}
+
+ test("SpecificMutableRow.update with null") {
+ val row = new SpecificMutableRow(Seq(IntegerType))
+ row(0) = null
+ assert(row.isNullAt(0))
+ }
}