Skip to content

Commit 93e7979

Browse files
committed
address array overflow
1 parent 72ef664 commit 93e7979

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4174,22 +4174,36 @@ case class ArrayExcept(left: Expression, right: Expression) extends ArraySetLike
41744174
|$javaTypeName $value = $array1.$getter;
41754175
|$hsJavaTypeName $hsValue = $genHsValue;
41764176
|if (!$hs.contains($hsValue)) {
4177+
| if (++$size > ${ByteArrayMethods.MAX_ROUNDED_ARRAY_LENGTH}) {
4178+
| break;
4179+
| }
41774180
| $hs.add$postFix($hsValue);
4178-
| $builder.$$plus$$eq($value);
4179-
| $size++;
4181+
| $builder.$$plus$$eq($value);
41804182
|}
41814183
""".stripMargin
41824184

4183-
val nonNullArrayDataBuild = if (postFix != "") {
4185+
val nonNullArrayDataBuild = {
4186+
val build = if (postFix != "") {
4187+
val defaultSize = elementType.defaultSize
4188+
s"""
4189+
|if (!UnsafeArrayData.shouldUseGenericArrayData($defaultSize, $size)) {
4190+
| ${ev.value} = UnsafeArrayData.fromPrimitiveArray($builder.result());
4191+
|} else {
4192+
| ${ev.value} = new $genericArrayData($builder.result());
4193+
|}
4194+
""".stripMargin
4195+
} else {
4196+
s"${ev.value} = new $genericArrayData($builder.result());"
4197+
}
41844198
s"""
4185-
|if (!UnsafeArrayData.shouldUseGenericArrayData(${elementType.defaultSize}, $size)) {
4186-
| ${ev.value} = UnsafeArrayData.fromPrimitiveArray($builder.result());
4187-
|} else {
4188-
| ${ev.value} = new $genericArrayData($builder.result());
4199+
|if ($size > ${ByteArrayMethods.MAX_ROUNDED_ARRAY_LENGTH}) {
4200+
| throw new RuntimeException("Unsuccessful try create array with " + $size +
4201+
| " bytes of data due to exceeding the limit " +
4202+
| "${ByteArrayMethods.MAX_ROUNDED_ARRAY_LENGTH} elements for GenericArrayData." +
4203+
| " $prettyName failed.");
41894204
|}
4205+
|$build
41904206
""".stripMargin
4191-
} else {
4192-
s"${ev.value} = new $genericArrayData($builder.result());"
41934207
}
41944208

41954209
def buildResultArrayData(nonNullArrayDataBuild: String) =

0 commit comments

Comments
 (0)