@@ -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.
0 commit comments