From dae9a0840d8212b1d7a48b781c8bb44d637d670b Mon Sep 17 00:00:00 2001 From: rich7420 Date: Wed, 9 Sep 2026 12:33:45 +0800 Subject: [PATCH 1/3] test: restore ANSI array index error coverage --- .../expressions/array/get_array_item_ansi.sql | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql b/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql index 19d0cb2a634..f12970bfa23 100644 --- a/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql +++ b/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql @@ -25,34 +25,36 @@ -- ============================================================================ statement -CREATE TABLE ansi_array_oob(arr array) USING parquet +CREATE TABLE ansi_array_oob(arr array, positive_idx int, negative_idx int) USING parquet statement -INSERT INTO ansi_array_oob VALUES (array(1, 2, 3)) +INSERT INTO ansi_array_oob VALUES (array(1, 2, 3), 5, -1) + +-- Valid boundary indices must run natively as well as match Spark. +query +SELECT arr[0], arr[2] FROM ansi_array_oob -- ============================================================================ -- Array index out of bounds (positive index) --- Spark throws: [INVALID_ARRAY_INDEX] The index X is out of bounds --- Comet throws: Index out of bounds for array --- See https://github.com/apache/datafusion-comet/issues/3375 +-- Spark and Comet throw INVALID_ARRAY_INDEX in ANSI mode. -- ============================================================================ -- index beyond array length should throw (0-based indexing) -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_ARRAY_INDEX) SELECT arr[10] FROM ansi_array_oob --- literal array with out of bounds access -query ignore(https://github.com/apache/datafusion-comet/issues/3375) -SELECT array(1, 2, 3)[5] +-- Use a column index so SimplifyExtractValueOps cannot replace the lookup with NULL. +query expect_error(INVALID_ARRAY_INDEX) +SELECT array(1, 2, 3)[positive_idx] FROM ansi_array_oob -- ============================================================================ -- Array index out of bounds (negative index) -- ============================================================================ -- negative index should throw -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_ARRAY_INDEX) SELECT arr[-1] FROM ansi_array_oob --- literal with negative index -query ignore(https://github.com/apache/datafusion-comet/issues/3375) -SELECT array(1, 2, 3)[-1] +-- literal array with a negative column index +query expect_error(INVALID_ARRAY_INDEX) +SELECT array(1, 2, 3)[negative_idx] FROM ansi_array_oob From f25e0145be9b6de421b9a5e86c45d07ebd79bd07 Mon Sep 17 00:00:00 2001 From: rich7420 Date: Wed, 9 Sep 2026 13:08:01 +0800 Subject: [PATCH 2/3] test: restore ANSI element_at error coverage --- .../expressions/array/element_at_ansi.sql | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql b/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql index 30ab1bba587..288cc951179 100644 --- a/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql +++ b/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql @@ -31,34 +31,35 @@ CREATE TABLE ansi_element_at_oob(arr array) USING parquet statement INSERT INTO ansi_element_at_oob VALUES (array(1, 2, 3)) +-- Valid positive and negative boundary indices must run natively and match Spark. +query +SELECT element_at(arr, 1), element_at(arr, 3), element_at(arr, -1), element_at(arr, -3) +FROM ansi_element_at_oob + -- ============================================================================ -- element_at index out of bounds (positive index) --- Spark throws: [INVALID_ARRAY_INDEX_IN_ELEMENT_AT] ... --- Comet throws: Index out of bounds for array --- See https://github.com/apache/datafusion-comet/issues/3375 +-- Spark and Comet throw INVALID_ARRAY_INDEX_IN_ELEMENT_AT in ANSI mode. -- ============================================================================ -- index beyond array length should throw (1-based indexing) -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) SELECT element_at(arr, 10) FROM ansi_element_at_oob -- literal array with out of bounds access -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) SELECT element_at(array(1, 2, 3), 5) -- ============================================================================ -- element_at with index 0 (invalid) --- Spark throws: [INVALID_INDEX_OF_ZERO] The index 0 is invalid --- Comet throws: different error message --- See https://github.com/apache/datafusion-comet/issues/3375 +-- Spark and Comet throw INVALID_INDEX_OF_ZERO. -- ============================================================================ -- index 0 is not valid for element_at (1-based indexing) -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_INDEX_OF_ZERO) SELECT element_at(arr, 0) FROM ansi_element_at_oob -- literal with index 0 -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_INDEX_OF_ZERO) SELECT element_at(array(1, 2, 3), 0) -- ============================================================================ @@ -66,11 +67,11 @@ SELECT element_at(array(1, 2, 3), 0) -- ============================================================================ -- negative index beyond array size should throw -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) SELECT element_at(arr, -10) FROM ansi_element_at_oob -- literal with negative out of bounds -query ignore(https://github.com/apache/datafusion-comet/issues/3375) +query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) SELECT element_at(array(1, 2, 3), -5) -- ============================================================================ From a4b81b7786f9d006d3617e3d256fad82fada0d33 Mon Sep 17 00:00:00 2001 From: rich7420 Date: Fri, 11 Sep 2026 00:29:18 +0800 Subject: [PATCH 3/3] test: strengthen ANSI array access regression coverage --- .../expressions/array/element_at_ansi.sql | 28 +++++++++++++------ .../expressions/array/get_array_item_ansi.sql | 11 +++++--- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql b/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql index 288cc951179..89293ccefd9 100644 --- a/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql +++ b/spark/src/test/resources/sql-tests/expressions/array/element_at_ansi.sql @@ -36,18 +36,25 @@ query SELECT element_at(arr, 1), element_at(arr, 3), element_at(arr, -1), element_at(arr, -3) FROM ansi_element_at_oob +-- A NULL index returns NULL even in ANSI mode. +query +SELECT element_at(arr, CAST(NULL AS INT)) FROM ansi_element_at_oob + -- ============================================================================ -- element_at index out of bounds (positive index) -- Spark and Comet throw INVALID_ARRAY_INDEX_IN_ELEMENT_AT in ANSI mode. -- ============================================================================ -- index beyond array length should throw (1-based indexing) -query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) +query expect_error([INVALID_ARRAY_INDEX_IN_ELEMENT_AT]) +SELECT element_at(arr, 4) FROM ansi_element_at_oob + +query expect_error([INVALID_ARRAY_INDEX_IN_ELEMENT_AT]) SELECT element_at(arr, 10) FROM ansi_element_at_oob -- literal array with out of bounds access -query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) -SELECT element_at(array(1, 2, 3), 5) +query expect_error([INVALID_ARRAY_INDEX_IN_ELEMENT_AT]) +SELECT element_at(array(1, 2, 3), 5) FROM ansi_element_at_oob -- ============================================================================ -- element_at with index 0 (invalid) @@ -55,24 +62,27 @@ SELECT element_at(array(1, 2, 3), 5) -- ============================================================================ -- index 0 is not valid for element_at (1-based indexing) -query expect_error(INVALID_INDEX_OF_ZERO) +query expect_error([INVALID_INDEX_OF_ZERO]) SELECT element_at(arr, 0) FROM ansi_element_at_oob -- literal with index 0 -query expect_error(INVALID_INDEX_OF_ZERO) -SELECT element_at(array(1, 2, 3), 0) +query expect_error([INVALID_INDEX_OF_ZERO]) +SELECT element_at(array(1, 2, 3), 0) FROM ansi_element_at_oob -- ============================================================================ -- element_at index out of bounds (negative index beyond array) -- ============================================================================ -- negative index beyond array size should throw -query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) +query expect_error([INVALID_ARRAY_INDEX_IN_ELEMENT_AT]) +SELECT element_at(arr, -4) FROM ansi_element_at_oob + +query expect_error([INVALID_ARRAY_INDEX_IN_ELEMENT_AT]) SELECT element_at(arr, -10) FROM ansi_element_at_oob -- literal with negative out of bounds -query expect_error(INVALID_ARRAY_INDEX_IN_ELEMENT_AT) -SELECT element_at(array(1, 2, 3), -5) +query expect_error([INVALID_ARRAY_INDEX_IN_ELEMENT_AT]) +SELECT element_at(array(1, 2, 3), -5) FROM ansi_element_at_oob -- ============================================================================ -- ANSI short-circuit over a NULL array diff --git a/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql b/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql index f12970bfa23..c21d27426f6 100644 --- a/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql +++ b/spark/src/test/resources/sql-tests/expressions/array/get_array_item_ansi.sql @@ -40,11 +40,14 @@ SELECT arr[0], arr[2] FROM ansi_array_oob -- ============================================================================ -- index beyond array length should throw (0-based indexing) -query expect_error(INVALID_ARRAY_INDEX) +query expect_error([INVALID_ARRAY_INDEX]) +SELECT arr[3] FROM ansi_array_oob + +query expect_error([INVALID_ARRAY_INDEX]) SELECT arr[10] FROM ansi_array_oob -- Use a column index so SimplifyExtractValueOps cannot replace the lookup with NULL. -query expect_error(INVALID_ARRAY_INDEX) +query expect_error([INVALID_ARRAY_INDEX]) SELECT array(1, 2, 3)[positive_idx] FROM ansi_array_oob -- ============================================================================ @@ -52,9 +55,9 @@ SELECT array(1, 2, 3)[positive_idx] FROM ansi_array_oob -- ============================================================================ -- negative index should throw -query expect_error(INVALID_ARRAY_INDEX) +query expect_error([INVALID_ARRAY_INDEX]) SELECT arr[-1] FROM ansi_array_oob -- literal array with a negative column index -query expect_error(INVALID_ARRAY_INDEX) +query expect_error([INVALID_ARRAY_INDEX]) SELECT array(1, 2, 3)[negative_idx] FROM ansi_array_oob