Skip to content

Commit 6187d99

Browse files
committed
Handle null field properly
1 parent 7eb27e2 commit 6187d99

File tree

2 files changed

+32
-28
lines changed

2 files changed

+32
-28
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/InternalRow.scala

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,31 +78,33 @@ abstract class InternalRow extends SpecializedGetters with Serializable {
7878
var newRet: InternalRow = ret
7979
if (field.ne(newField)) {
8080
if (newRet == null) newRet = this.copy()
81-
if (newField != null) {
82-
newRet.update(idx, newField)
83-
} else {
84-
newRet.setNullAt(idx)
85-
}
81+
newRet.update(idx, newField)
8682
}
8783
newRet
8884
}
8985

9086
var ret: InternalRow = null
9187
dataType.map(_.dataType).zipWithIndex.foreach {
9288
case (ty: StructType, idx) =>
93-
val field = getStruct(idx, ty.size)
94-
val newField = field.copyUnsafeData(ty)
95-
ret = updateRetIfNecessary(ret, field, newField, idx)
89+
if (!isNullAt(idx)) {
90+
val field = getStruct(idx, ty.size)
91+
val newField = field.copyUnsafeData(ty)
92+
ret = updateRetIfNecessary(ret, field, newField, idx)
93+
}
9694

9795
case (ty: ArrayType, idx) =>
98-
val field = getArray(idx)
99-
val newField = field.copyUnsafeData(ty)
100-
ret = updateRetIfNecessary(ret, field, newField, idx)
96+
if (!isNullAt(idx)) {
97+
val field = getArray(idx)
98+
val newField = field.copyUnsafeData(ty)
99+
ret = updateRetIfNecessary(ret, field, newField, idx)
100+
}
101101

102102
case (ty: MapType, idx) =>
103-
val field = getMap(idx)
104-
val newField = field.copyUnsafeData(ty)
105-
ret = updateRetIfNecessary(ret, field, newField, idx)
103+
if (!isNullAt(idx)) {
104+
val field = getMap(idx)
105+
val newField = field.copyUnsafeData(ty)
106+
ret = updateRetIfNecessary(ret, field, newField, idx)
107+
}
106108

107109
case _ =>
108110
}

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/ArrayData.scala

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ abstract class ArrayData extends SpecializedGetters with Serializable {
8383
var newRet: ArrayData = ret
8484
if (field.ne(newField)) {
8585
if (newRet == null) newRet = this.copy()
86-
if (newField != null) {
87-
newRet.update(idx, newField)
88-
} else {
89-
newRet.setNullAt(idx)
90-
}
86+
newRet.update(idx, newField)
9187
}
9288
newRet
9389
}
@@ -98,9 +94,11 @@ abstract class ArrayData extends SpecializedGetters with Serializable {
9894
val len = numElements()
9995
var i = 0
10096
while (i < len) {
101-
val field = getStruct(i, ty.size)
102-
val newField = field.copyUnsafeData(ty)
103-
ret = updateRetIfNecessary(ret, field, newField, i)
97+
if (!isNullAt(i)) {
98+
val field = getStruct(i, ty.size)
99+
val newField = field.copyUnsafeData(ty)
100+
ret = updateRetIfNecessary(ret, field, newField, i)
101+
}
104102
i += 1
105103
}
106104
if (ret != null) ret else this
@@ -109,9 +107,11 @@ abstract class ArrayData extends SpecializedGetters with Serializable {
109107
val len = numElements()
110108
var i = 0
111109
while (i < len) {
112-
val field = getArray(i)
113-
val newField = field.copyUnsafeData(ty)
114-
ret = updateRetIfNecessary(ret, field, newField, i)
110+
if (!isNullAt(i)) {
111+
val field = getArray(i)
112+
val newField = field.copyUnsafeData(ty)
113+
ret = updateRetIfNecessary(ret, field, newField, i)
114+
}
115115
i += 1
116116
}
117117
if (ret != null) ret else this
@@ -120,9 +120,11 @@ abstract class ArrayData extends SpecializedGetters with Serializable {
120120
val len = numElements()
121121
var i = 0
122122
while (i < len) {
123-
val field = getMap(i)
124-
val newField = field.copyUnsafeData(ty)
125-
ret = updateRetIfNecessary(ret, field, newField, i)
123+
if (!isNullAt(i)) {
124+
val field = getMap(i)
125+
val newField = field.copyUnsafeData(ty)
126+
ret = updateRetIfNecessary(ret, field, newField, i)
127+
}
126128
i += 1
127129
}
128130
if (ret != null) ret else this

0 commit comments

Comments
 (0)