diff --git a/datafusion/spark/src/function/array/slice.rs b/datafusion/spark/src/function/array/slice.rs index bcd10a1bf7d79..5c65f899a01b0 100644 --- a/datafusion/spark/src/function/array/slice.rs +++ b/datafusion/spark/src/function/array/slice.rs @@ -172,6 +172,15 @@ fn calculate_start_end(args: &[ArrayRef]) -> Result<(ArrayRef, ArrayRef)> { start }; + // Spark returns an empty array when the adjusted start lands before + // position 1 (e.g. slice([1], -2, 2)). array_slice would otherwise + // treat 0 the same as 1 and return the first element. + if adjusted_start_value < 1 { + adjusted_start.append_value(1); + end.append_value(0); + continue; + } + adjusted_start.append_value(adjusted_start_value); end.append_value(adjusted_start_value + (length - 1)); } diff --git a/datafusion/sqllogictest/test_files/spark/array/slice.slt b/datafusion/sqllogictest/test_files/spark/array/slice.slt index 6dfc1c0c6d0bf..7be2342841547 100644 --- a/datafusion/sqllogictest/test_files/spark/array/slice.slt +++ b/datafusion/sqllogictest/test_files/spark/array/slice.slt @@ -137,3 +137,18 @@ query ? SELECT slice(slice(make_array(NULL), 1, 2), 1, 2) ---- [NULL] + +query ? +SELECT slice(make_array(1), -2, 2) +---- +[] + +query ? +SELECT slice(make_array(1, 2, 3, 4), -5, 2) +---- +[] + +query ? +SELECT slice(make_array(1), 3, 4) +---- +[] \ No newline at end of file