Skip to content

Commit 41d6422

Browse files
Address review comment
1 parent a4753b8 commit 41d6422

2 files changed

Lines changed: 37 additions & 13 deletions

File tree

datafusion/spark/src/function/array/sequence.rs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,26 @@ impl ScalarUDFImpl for SparkSequence {
146146

147147
match args[0].data_type() {
148148
DataType::Int64 => {
149-
validate_int64_sequence_step(args)?;
150-
let optional_new_args = add_step_argument_if_not_exists(args)?;
151-
let new_args = match optional_new_args {
152-
Some(new_args) => &new_args.to_owned(),
153-
None => args,
154-
};
155-
make_scalar_function(|args| {
156-
Range::generate_series().gen_range_inner(args)
157-
})(new_args)
149+
let result = validate_int64_sequence_step(args)?;
150+
match result {
151+
Some(_r) => Ok(ColumnarValue::Scalar(ScalarValue::List(
152+
ScalarValue::new_list(
153+
&[ScalarValue::Int64(result)],
154+
&DataType::Int64,
155+
true,
156+
),
157+
))),
158+
None => {
159+
let optional_new_args = add_step_argument_if_not_exists(args)?;
160+
let new_args = match optional_new_args {
161+
Some(new_args) => &new_args.to_owned(),
162+
None => args,
163+
};
164+
make_scalar_function(|args| {
165+
Range::generate_series().gen_range_inner(args)
166+
})(new_args)
167+
}
168+
}
158169
}
159170
DataType::Date32 | DataType::Date64 => {
160171
let optional_new_args = add_interval_argument_if_not_exists(args);
@@ -187,9 +198,9 @@ impl ScalarUDFImpl for SparkSequence {
187198
}
188199

189200
/// Validates explicit `step` for 3-argument integer `sequence` (Spark semantics).
190-
fn validate_int64_sequence_step(args: &[ColumnarValue]) -> Result<()> {
201+
fn validate_int64_sequence_step(args: &[ColumnarValue]) -> Result<Option<i64>> {
191202
if args.len() != 3 {
192-
return Ok(());
203+
return Ok(None);
193204
}
194205
let arrays = ColumnarValue::values_to_arrays(args)?;
195206
let start = as_int64_array(&arrays[0])?;
@@ -202,7 +213,10 @@ fn validate_int64_sequence_step(args: &[ColumnarValue]) -> Result<()> {
202213
let s = start.value(i);
203214
let e = stop.value(i);
204215
let st = step.value(i);
205-
if st == 0 {
216+
if st == 0 && s == e {
217+
return Ok(Some(s))
218+
}
219+
if st == 0 && s != e {
206220
return exec_err!("Step cannot be 0 for sequence");
207221
}
208222
if s < e && st <= 0 {
@@ -212,7 +226,7 @@ fn validate_int64_sequence_step(args: &[ColumnarValue]) -> Result<()> {
212226
return exec_err!("When start > stop, step must be negative");
213227
}
214228
}
215-
Ok(())
229+
Ok(None)
216230
}
217231

218232
/// When only start and stop are given, Spark picks step `1` if start ≤ stop and `-1` if start > stop.

datafusion/sqllogictest/test_files/spark/array/sequence.slt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@ SELECT sequence(-2, -2);
7979
----
8080
[-2]
8181

82+
query ?
83+
SELECT sequence(5, 5, 0);
84+
----
85+
[5]
86+
87+
query ?
88+
SELECT sequence(-5, -5, 0);
89+
----
90+
[-5]
91+
8292
query ?
8393
SELECT sequence(TIMESTAMP '2023-01-03T00:00:00', TIMESTAMP '2023-01-01T00:00:00', INTERVAL '-1' DAY)
8494
----

0 commit comments

Comments
 (0)