Generates an array of integers from start to stop with a given step. This function takes 1 to 3 ArrayRefs as arguments, representing start, stop, and step values. It returns a `Result ` representing the resulting ListArray after the operation. # Arguments `args` - An array of 1 to 3 ArrayRefs representing start, stop, and step (step value can not be zero) values. # Examples gen_range
(&self, args: &[ArrayRef])
| 296 | /// gen_range(1, 4) => [1, 2, 3] |
| 297 | /// gen_range(1, 7, 2) => [1, 3, 5] |
| 298 | fn gen_range_inner(&self, args: &[ArrayRef]) -> Result<ArrayRef> { |
| 299 | let (start_array, stop_array, step_array) = match args { |
| 300 | [stop_array] => (None, as_int64_array(stop_array)?, None), |
| 301 | [start_array, stop_array] => ( |
| 302 | Some(as_int64_array(start_array)?), |
| 303 | as_int64_array(stop_array)?, |
| 304 | None, |
| 305 | ), |
| 306 | [start_array, stop_array, step_array] => ( |
| 307 | Some(as_int64_array(start_array)?), |
| 308 | as_int64_array(stop_array)?, |
| 309 | Some(as_int64_array(step_array)?), |
| 310 | ), |
| 311 | _ => return internal_err!("{} expects 1 to 3 arguments", self.name()), |
| 312 | }; |
| 313 | |
| 314 | let mut values = vec![]; |
| 315 | let mut offsets = vec![0]; |
| 316 | let mut valid = NullBufferBuilder::new(stop_array.len()); |
| 317 | for (idx, stop) in stop_array.iter().enumerate() { |
| 318 | match retrieve_range_args(start_array, stop, step_array, idx) { |
| 319 | Some((_, _, 0)) => { |
| 320 | return exec_err!( |
| 321 | "step can't be 0 for function {}(start [, stop, step])", |
| 322 | self.name() |
| 323 | ); |
| 324 | } |
| 325 | Some((start, stop, step)) => { |
| 326 | generate_range_values( |
| 327 | start, |
| 328 | stop, |
| 329 | step, |
| 330 | self.include_upper_bound, |
| 331 | &mut values, |
| 332 | )?; |
| 333 | offsets.push(values.len() as i32); |
| 334 | valid.append_non_null(); |
| 335 | } |
| 336 | // If any of the arguments is NULL, append a NULL value to the result. |
| 337 | None => { |
| 338 | offsets.push(values.len() as i32); |
| 339 | valid.append_null(); |
| 340 | } |
| 341 | }; |
| 342 | } |
| 343 | let arr = Arc::new(ListArray::try_new( |
| 344 | Arc::new(Field::new_list_field(DataType::Int64, true)), |
| 345 | OffsetBuffer::new(offsets.into()), |
| 346 | Arc::new(Int64Array::from(values)), |
| 347 | valid.finish(), |
| 348 | )?); |
| 349 | Ok(arr) |
| 350 | } |
| 351 | |
| 352 | fn gen_range_date(&self, args: &[ArrayRef]) -> Result<ArrayRef> { |
| 353 | let [start, stop, step] = take_function_args(self.name(), args)?; |
no test coverage detected