This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 67baf10249 support `LargeList` in `array_prepend` and `array_append`
(#8679)
67baf10249 is described below
commit 67baf10249b26b4983d3cc3145817903dad8dcd4
Author: Alex Huang <[email protected]>
AuthorDate: Wed Jan 3 06:37:20 2024 +0800
support `LargeList` in `array_prepend` and `array_append` (#8679)
* support largelist
* fix cast error
* fix cast
* add tests
* fix conflict
* s TODO comment for future tests
add TODO comment for future tests
---------
Co-authored-by: hwj <[email protected]>
---
datafusion/common/src/utils.rs | 23 ++-
datafusion/expr/src/type_coercion/functions.rs | 24 +--
datafusion/physical-expr/src/array_expressions.rs | 144 +++++++++--------
datafusion/sqllogictest/test_files/array.slt | 184 +++++++++++++++++++++-
4 files changed, 284 insertions(+), 91 deletions(-)
diff --git a/datafusion/common/src/utils.rs b/datafusion/common/src/utils.rs
index 49a00b24d1..0a61fce154 100644
--- a/datafusion/common/src/utils.rs
+++ b/datafusion/common/src/utils.rs
@@ -424,10 +424,11 @@ pub fn arrays_into_list_array(
/// assert_eq!(base_type(&data_type), DataType::Int32);
/// ```
pub fn base_type(data_type: &DataType) -> DataType {
- if let DataType::List(field) = data_type {
- base_type(field.data_type())
- } else {
- data_type.to_owned()
+ match data_type {
+ DataType::List(field) | DataType::LargeList(field) => {
+ base_type(field.data_type())
+ }
+ _ => data_type.to_owned(),
}
}
@@ -462,6 +463,20 @@ pub fn coerced_type_with_base_type_only(
field.is_nullable(),
)))
}
+ DataType::LargeList(field) => {
+ let data_type = match field.data_type() {
+ DataType::LargeList(_) => {
+ coerced_type_with_base_type_only(field.data_type(),
base_type)
+ }
+ _ => base_type.to_owned(),
+ };
+
+ DataType::LargeList(Arc::new(Field::new(
+ field.name(),
+ data_type,
+ field.is_nullable(),
+ )))
+ }
_ => base_type.clone(),
}
diff --git a/datafusion/expr/src/type_coercion/functions.rs
b/datafusion/expr/src/type_coercion/functions.rs
index fa47c92762..63908d539b 100644
--- a/datafusion/expr/src/type_coercion/functions.rs
+++ b/datafusion/expr/src/type_coercion/functions.rs
@@ -116,18 +116,18 @@ fn get_valid_types(
&new_base_type,
);
- if let DataType::List(ref field) = array_type {
- let elem_type = field.data_type();
- if is_append {
- Ok(vec![vec![array_type.clone(), elem_type.to_owned()]])
- } else {
- Ok(vec![vec![elem_type.to_owned(), array_type.clone()]])
+ match array_type {
+ DataType::List(ref field) | DataType::LargeList(ref field) => {
+ let elem_type = field.data_type();
+ if is_append {
+ Ok(vec![vec![array_type.clone(), elem_type.to_owned()]])
+ } else {
+ Ok(vec![vec![elem_type.to_owned(), array_type.clone()]])
+ }
}
- } else {
- Ok(vec![vec![]])
+ _ => Ok(vec![vec![]]),
}
}
-
let valid_types = match signature {
TypeSignature::Variadic(valid_types) => valid_types
.iter()
@@ -311,9 +311,9 @@ fn coerced_from<'a>(
Utf8 | LargeUtf8 => Some(type_into.clone()),
Null if can_cast_types(type_from, type_into) =>
Some(type_into.clone()),
- // Only accept list with the same number of dimensions unless the type
is Null.
- // List with different dimensions should be handled in TypeSignature
or other places before this.
- List(_)
+ // Only accept list and largelist with the same number of dimensions
unless the type is Null.
+ // List or LargeList with different dimensions should be handled in
TypeSignature or other places before this.
+ List(_) | LargeList(_)
if datafusion_common::utils::base_type(type_from).eq(&Null)
|| list_ndims(type_from) == list_ndims(type_into) =>
{
diff --git a/datafusion/physical-expr/src/array_expressions.rs
b/datafusion/physical-expr/src/array_expressions.rs
index 92ba7a4d1d..aad021610f 100644
--- a/datafusion/physical-expr/src/array_expressions.rs
+++ b/datafusion/physical-expr/src/array_expressions.rs
@@ -52,22 +52,6 @@ macro_rules! downcast_arg {
}};
}
-/// Downcasts multiple arguments into a single concrete type
-/// $ARGS: &[ArrayRef]
-/// $ARRAY_TYPE: type to downcast to
-///
-/// $returns a Vec<$ARRAY_TYPE>
-macro_rules! downcast_vec {
- ($ARGS:expr, $ARRAY_TYPE:ident) => {{
- $ARGS
- .iter()
- .map(|e| match e.as_any().downcast_ref::<$ARRAY_TYPE>() {
- Some(array) => Ok(array),
- _ => internal_err!("failed to downcast"),
- })
- }};
-}
-
/// Computes a BooleanArray indicating equality or inequality between elements
in a list array and a specified element array.
///
/// # Arguments
@@ -832,17 +816,20 @@ pub fn array_pop_back(args: &[ArrayRef]) ->
Result<ArrayRef> {
///
/// # Examples
///
-/// general_append_and_prepend(
+/// generic_append_and_prepend(
/// [1, 2, 3], 4, append => [1, 2, 3, 4]
/// 5, [6, 7, 8], prepend => [5, 6, 7, 8]
/// )
-fn general_append_and_prepend(
- list_array: &ListArray,
+fn generic_append_and_prepend<O: OffsetSizeTrait>(
+ list_array: &GenericListArray<O>,
element_array: &ArrayRef,
data_type: &DataType,
is_append: bool,
-) -> Result<ArrayRef> {
- let mut offsets = vec![0];
+) -> Result<ArrayRef>
+where
+ i64: TryInto<O>,
+{
+ let mut offsets = vec![O::usize_as(0)];
let values = list_array.values();
let original_data = values.to_data();
let element_data = element_array.to_data();
@@ -858,8 +845,8 @@ fn general_append_and_prepend(
let element_index = 1;
for (row_index, offset_window) in
list_array.offsets().windows(2).enumerate() {
- let start = offset_window[0] as usize;
- let end = offset_window[1] as usize;
+ let start = offset_window[0].to_usize().unwrap();
+ let end = offset_window[1].to_usize().unwrap();
if is_append {
mutable.extend(values_index, start, end);
mutable.extend(element_index, row_index, row_index + 1);
@@ -867,12 +854,12 @@ fn general_append_and_prepend(
mutable.extend(element_index, row_index, row_index + 1);
mutable.extend(values_index, start, end);
}
- offsets.push(offsets[row_index] + (end - start + 1) as i32);
+ offsets.push(offsets[row_index] + O::usize_as(end - start + 1));
}
let data = mutable.freeze();
- Ok(Arc::new(ListArray::try_new(
+ Ok(Arc::new(GenericListArray::<O>::try_new(
Arc::new(Field::new("item", data_type.to_owned(), true)),
OffsetBuffer::new(offsets.into()),
arrow_array::make_array(data),
@@ -938,36 +925,6 @@ pub fn gen_range(args: &[ArrayRef]) -> Result<ArrayRef> {
Ok(arr)
}
-/// Array_append SQL function
-pub fn array_append(args: &[ArrayRef]) -> Result<ArrayRef> {
- if args.len() != 2 {
- return exec_err!("array_append expects two arguments");
- }
-
- let list_array = as_list_array(&args[0])?;
- let element_array = &args[1];
-
- let res = match list_array.value_type() {
- DataType::List(_) => concat_internal(args)?,
- DataType::Null => {
- return make_array(&[
- list_array.values().to_owned(),
- element_array.to_owned(),
- ]);
- }
- data_type => {
- return general_append_and_prepend(
- list_array,
- element_array,
- &data_type,
- true,
- );
- }
- };
-
- Ok(res)
-}
-
/// Array_sort SQL function
pub fn array_sort(args: &[ArrayRef]) -> Result<ArrayRef> {
if args.is_empty() || args.len() > 3 {
@@ -1051,25 +1008,40 @@ fn order_nulls_first(modifier: &str) -> Result<bool> {
}
}
-/// Array_prepend SQL function
-pub fn array_prepend(args: &[ArrayRef]) -> Result<ArrayRef> {
- if args.len() != 2 {
- return exec_err!("array_prepend expects two arguments");
- }
-
- let list_array = as_list_array(&args[1])?;
- let element_array = &args[0];
+fn general_append_and_prepend<O: OffsetSizeTrait>(
+ args: &[ArrayRef],
+ is_append: bool,
+) -> Result<ArrayRef>
+where
+ i64: TryInto<O>,
+{
+ let (list_array, element_array) = if is_append {
+ let list_array = as_generic_list_array::<O>(&args[0])?;
+ let element_array = &args[1];
+ check_datatypes("array_append", &[element_array,
list_array.values()])?;
+ (list_array, element_array)
+ } else {
+ let list_array = as_generic_list_array::<O>(&args[1])?;
+ let element_array = &args[0];
+ check_datatypes("array_prepend", &[list_array.values(),
element_array])?;
+ (list_array, element_array)
+ };
- check_datatypes("array_prepend", &[element_array, list_array.values()])?;
let res = match list_array.value_type() {
- DataType::List(_) => concat_internal(args)?,
- DataType::Null => return make_array(&[element_array.to_owned()]),
+ DataType::List(_) => concat_internal::<i32>(args)?,
+ DataType::LargeList(_) => concat_internal::<i64>(args)?,
+ DataType::Null => {
+ return make_array(&[
+ list_array.values().to_owned(),
+ element_array.to_owned(),
+ ]);
+ }
data_type => {
- return general_append_and_prepend(
+ return generic_append_and_prepend::<O>(
list_array,
element_array,
&data_type,
- false,
+ is_append,
);
}
};
@@ -1077,6 +1049,30 @@ pub fn array_prepend(args: &[ArrayRef]) ->
Result<ArrayRef> {
Ok(res)
}
+/// Array_append SQL function
+pub fn array_append(args: &[ArrayRef]) -> Result<ArrayRef> {
+ if args.len() != 2 {
+ return exec_err!("array_append expects two arguments");
+ }
+
+ match args[0].data_type() {
+ DataType::LargeList(_) => general_append_and_prepend::<i64>(args,
true),
+ _ => general_append_and_prepend::<i32>(args, true),
+ }
+}
+
+/// Array_prepend SQL function
+pub fn array_prepend(args: &[ArrayRef]) -> Result<ArrayRef> {
+ if args.len() != 2 {
+ return exec_err!("array_prepend expects two arguments");
+ }
+
+ match args[1].data_type() {
+ DataType::LargeList(_) => general_append_and_prepend::<i64>(args,
false),
+ _ => general_append_and_prepend::<i32>(args, false),
+ }
+}
+
fn align_array_dimensions(args: Vec<ArrayRef>) -> Result<Vec<ArrayRef>> {
let args_ndim = args
.iter()
@@ -1114,11 +1110,13 @@ fn align_array_dimensions(args: Vec<ArrayRef>) ->
Result<Vec<ArrayRef>> {
}
// Concatenate arrays on the same row.
-fn concat_internal(args: &[ArrayRef]) -> Result<ArrayRef> {
+fn concat_internal<O: OffsetSizeTrait>(args: &[ArrayRef]) -> Result<ArrayRef> {
let args = align_array_dimensions(args.to_vec())?;
- let list_arrays =
- downcast_vec!(args, ListArray).collect::<Result<Vec<&ListArray>>>()?;
+ let list_arrays = args
+ .iter()
+ .map(|arg| as_generic_list_array::<O>(arg))
+ .collect::<Result<Vec<_>>>()?;
// Assume number of rows is the same for all arrays
let row_count = list_arrays[0].len();
@@ -1165,7 +1163,7 @@ fn concat_internal(args: &[ArrayRef]) -> Result<ArrayRef>
{
.map(|a| a.as_ref())
.collect::<Vec<&dyn Array>>();
- let list_arr = ListArray::new(
+ let list_arr = GenericListArray::<O>::new(
Arc::new(Field::new("item", data_type, true)),
OffsetBuffer::from_lengths(array_lengths),
Arc::new(compute::concat(elements.as_slice())?),
@@ -1192,7 +1190,7 @@ pub fn array_concat(args: &[ArrayRef]) ->
Result<ArrayRef> {
}
}
- concat_internal(new_args.as_slice())
+ concat_internal::<i32>(new_args.as_slice())
}
/// Array_empty SQL function
diff --git a/datafusion/sqllogictest/test_files/array.slt
b/datafusion/sqllogictest/test_files/array.slt
index 2f8e3c805f..a3b2c8cdf1 100644
--- a/datafusion/sqllogictest/test_files/array.slt
+++ b/datafusion/sqllogictest/test_files/array.slt
@@ -107,6 +107,19 @@ AS VALUES
(make_array(make_array(4, 5, 6), make_array(10, 11, 12), make_array(4, 9,
8), make_array(7, 8, 9), make_array(10, 11, 12), make_array(1, 8, 7)),
make_array(10, 11, 12), 3, make_array([[11, 12, 13], [14, 15, 16]], [[17, 18,
19], [20, 21, 22]]), make_array(121, 131, 141))
;
+# TODO: add this when #8305 is fixed
+# statement ok
+# CREATE TABLE large_nested_arrays
+# AS
+# SELECT
+# arrow_cast(column1, 'LargeList(LargeList(Int64))') AS column1,
+# arrow_cast(column2, 'LargeList(Int64)') AS column2,
+# column3,
+# arrow_cast(column4, 'LargeList(LargeList(List(Int64)))') AS column4,
+# arrow_cast(column5, 'LargeList(Int64)') AS column5
+# FROM nested_arrays
+# ;
+
statement ok
CREATE TABLE arrays_values
AS VALUES
@@ -120,6 +133,17 @@ AS VALUES
(make_array(61, 62, 63, 64, 65, 66, 67, 68, 69, 70), 66, 7, NULL)
;
+statement ok
+CREATE TABLE large_arrays_values
+AS SELECT
+ arrow_cast(column1, 'LargeList(Int64)') AS column1,
+ column2,
+ column3,
+ column4
+FROM arrays_values
+;
+
+
statement ok
CREATE TABLE arrays_values_v2
AS VALUES
@@ -131,6 +155,17 @@ AS VALUES
(NULL, NULL, NULL, NULL)
;
+# TODO: add this when #8305 is fixed
+# statement ok
+# CREATE TABLE large_arrays_values_v2
+# AS SELECT
+# arrow_cast(column1, 'LargeList(Int64)') AS column1,
+# arrow_cast(column2, 'LargeList(Int64)') AS column2,
+# column3,
+# arrow_cast(column4, 'LargeList(LargeList(Int64))') AS column4
+# FROM arrays_values_v2
+# ;
+
statement ok
CREATE TABLE flatten_table
AS VALUES
@@ -1532,7 +1567,7 @@ query error
select array_append(null, [[4]]);
query ????
-select
+select
array_append(make_array(), 4),
array_append(make_array(), null),
array_append(make_array(1, null, 3), 4),
@@ -1541,6 +1576,17 @@ select
----
[4] [] [1, , 3, 4] [, , 1]
+# TODO: add this when #8305 is fixed
+# query ????
+# select
+# array_append(arrow_cast(make_array(), 'LargeList(Null)'), 4),
+# array_append(make_array(), null),
+# array_append(make_array(1, null, 3), 4),
+# array_append(make_array(null, null), 1)
+# ;
+# ----
+# [4] [] [1, , 3, 4] [, , 1]
+
# test invalid (non-null)
query error
select array_append(1, 2);
@@ -1552,42 +1598,76 @@ query error
select array_append([1], [2]);
query ??
-select
+select
array_append(make_array(make_array(1, null, 3)), make_array(null)),
array_append(make_array(make_array(1, null, 3)), null);
----
[[1, , 3], []] [[1, , 3], ]
+# TODO: add this when #8305 is fixed
+# query ??
+# select
+# array_append(arrow_cast(make_array(make_array(1, null, 3),
'LargeList(LargeList(Int64))')), arrow_cast(make_array(null),
'LargeList(Int64)')),
+# array_append(arrow_cast(make_array(make_array(1, null, 3),
'LargeList(LargeList(Int64))')), null);
+# ----
+# [[1, , 3], []] [[1, , 3], ]
+
# array_append scalar function #3
query ???
select array_append(make_array(1, 2, 3), 4), array_append(make_array(1.0, 2.0,
3.0), 4.0), array_append(make_array('h', 'e', 'l', 'l'), 'o');
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select array_append(arrow_cast(make_array(1, 2, 3), 'LargeList(Int64)'), 4),
array_append(arrow_cast(make_array(1.0, 2.0, 3.0), 'LargeList(Float64)'), 4.0),
array_append(make_array('h', 'e', 'l', 'l'), 'o');
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# array_append scalar function #4 (element is list)
query ???
select array_append(make_array([1], [2], [3]), make_array(4)),
array_append(make_array([1.0], [2.0], [3.0]), make_array(4.0)),
array_append(make_array(['h'], ['e'], ['l'], ['l']), make_array('o'));
----
[[1], [2], [3], [4]] [[1.0], [2.0], [3.0], [4.0]] [[h], [e], [l], [l], [o]]
+# TODO: add this when #8305 is fixed
+# query ???
+# select array_append(arrow_cast(make_array([1], [2], [3]),
'LargeList(LargeList(Int64))'), arrow_cast(make_array(4), 'LargeList(Int64)')),
array_append(arrow_cast(make_array([1.0], [2.0], [3.0]),
'LargeList(LargeList(Float64))'), arrow_cast(make_array(4.0),
'LargeList(Float64)')), array_append(arrow_cast(make_array(['h'], ['e'], ['l'],
['l']), 'LargeList(LargeList(Utf8))'), arrow_cast(make_array('o'),
'LargeList(Utf8)'));
+# ----
+# [[1], [2], [3], [4]] [[1.0], [2.0], [3.0], [4.0]] [[h], [e], [l], [l], [o]]
+
# list_append scalar function #5 (function alias `array_append`)
query ???
select list_append(make_array(1, 2, 3), 4), list_append(make_array(1.0, 2.0,
3.0), 4.0), list_append(make_array('h', 'e', 'l', 'l'), 'o');
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select list_append(arrow_cast(make_array(1, 2, 3), 'LargeList(Int64)'), 4),
list_append(arrow_cast(make_array(1.0, 2.0, 3.0), 'LargeList(Float64)'), 4.0),
list_append(make_array('h', 'e', 'l', 'l'), 'o');
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# array_push_back scalar function #6 (function alias `array_append`)
query ???
select array_push_back(make_array(1, 2, 3), 4),
array_push_back(make_array(1.0, 2.0, 3.0), 4.0),
array_push_back(make_array('h', 'e', 'l', 'l'), 'o');
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select array_push_back(arrow_cast(make_array(1, 2, 3), 'LargeList(Int64)'),
4), array_push_back(arrow_cast(make_array(1.0, 2.0, 3.0),
'LargeList(Float64)'), 4.0), array_push_back(make_array('h', 'e', 'l', 'l'),
'o');
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# list_push_back scalar function #7 (function alias `array_append`)
query ???
select list_push_back(make_array(1, 2, 3), 4), list_push_back(make_array(1.0,
2.0, 3.0), 4.0), list_push_back(make_array('h', 'e', 'l', 'l'), 'o');
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select list_push_back(arrow_cast(make_array(1, 2, 3), 'LargeList(Int64)'), 4),
list_push_back(arrow_cast(make_array(1.0, 2.0, 3.0), 'LargeList(Float64)'),
4.0), list_push_back(make_array('h', 'e', 'l', 'l'), 'o');
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# array_append with columns #1
query ?
select array_append(column1, column2) from arrays_values;
@@ -1601,6 +1681,18 @@ select array_append(column1, column2) from arrays_values;
[51, 52, , 54, 55, 56, 57, 58, 59, 60, 55]
[61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 66]
+query ?
+select array_append(column1, column2) from large_arrays_values;
+----
+[, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
+[11, 12, 13, 14, 15, 16, 17, 18, , 20, 12]
+[21, 22, 23, , 25, 26, 27, 28, 29, 30, 23]
+[31, 32, 33, 34, 35, , 37, 38, 39, 40, 34]
+[44]
+[41, 42, 43, 44, 45, 46, 47, 48, 49, 50, ]
+[51, 52, , 54, 55, 56, 57, 58, 59, 60, 55]
+[61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 66]
+
# array_append with columns #2 (element is list)
query ?
select array_append(column1, column2) from nested_arrays;
@@ -1608,6 +1700,13 @@ select array_append(column1, column2) from nested_arrays;
[[1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5, 6], [7, 8, 9]]
[[4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12], [1, 8, 7], [10,
11, 12]]
+# TODO: add this when #8305 is fixed
+# query ?
+# select array_append(column1, column2) from large_nested_arrays;
+# ----
+# [[1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5, 6], [7, 8, 9]]
+# [[4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12], [1, 8, 7],
[10, 11, 12]]
+
# array_append with columns and scalars #1
query ??
select array_append(column2, 100.1), array_append(column3, '.') from arrays;
@@ -1620,6 +1719,17 @@ select array_append(column2, 100.1),
array_append(column3, '.') from arrays;
[100.1] [,, .]
[16.6, 17.7, 18.8, 100.1] [.]
+query ??
+select array_append(column2, 100.1), array_append(column3, '.') from
large_arrays;
+----
+[1.1, 2.2, 3.3, 100.1] [L, o, r, e, m, .]
+[, 5.5, 6.6, 100.1] [i, p, , u, m, .]
+[7.7, 8.8, 9.9, 100.1] [d, , l, o, r, .]
+[10.1, , 12.2, 100.1] [s, i, t, .]
+[13.3, 14.4, 15.5, 100.1] [a, m, e, t, .]
+[100.1] [,, .]
+[16.6, 17.7, 18.8, 100.1] [.]
+
# array_append with columns and scalars #2
query ??
select array_append(column1, make_array(1, 11, 111)),
array_append(make_array(make_array(1, 2, 3), make_array(11, 12, 13)), column2)
from nested_arrays;
@@ -1627,6 +1737,13 @@ select array_append(column1, make_array(1, 11, 111)),
array_append(make_array(ma
[[1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5, 6], [1, 11,
111]] [[1, 2, 3], [11, 12, 13], [7, 8, 9]]
[[4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12], [1, 8, 7], [1,
11, 111]] [[1, 2, 3], [11, 12, 13], [10, 11, 12]]
+# TODO: add this when #8305 is fixed
+# query ??
+# select array_append(column1, arrow_cast(make_array(1, 11, 111),
'LargeList(Int64)')), array_append(arrow_cast(make_array(make_array(1, 2, 3),
make_array(11, 12, 13)), 'LargeList(LargeList(Int64))'), column2) from
large_nested_arrays;
+# ----
+# [[1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5, 6], [1, 11,
111]] [[1, 2, 3], [11, 12, 13], [7, 8, 9]]
+# [[4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12], [1, 8, 7], [1,
11, 111]] [[1, 2, 3], [11, 12, 13], [10, 11, 12]]
+
## array_prepend (aliases: `list_prepend`, `array_push_front`,
`list_push_front`)
# array_prepend with NULLs
@@ -1688,30 +1805,56 @@ select array_prepend(1, make_array(2, 3, 4)),
array_prepend(1.0, make_array(2.0,
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select array_prepend(1, arrow_cast(make_array(2, 3, 4), 'LargeList(Int64)')),
array_prepend(1.0, arrow_cast(make_array(2.0, 3.0, 4.0),
'LargeList(Float64)')), array_prepend('h', arrow_cast(make_array('e', 'l', 'l',
'o'), 'LargeList(Utf8)'));
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# array_prepend scalar function #4 (element is list)
query ???
select array_prepend(make_array(1), make_array(make_array(2), make_array(3),
make_array(4))), array_prepend(make_array(1.0), make_array([2.0], [3.0],
[4.0])), array_prepend(make_array('h'), make_array(['e'], ['l'], ['l'], ['o']));
----
[[1], [2], [3], [4]] [[1.0], [2.0], [3.0], [4.0]] [[h], [e], [l], [l], [o]]
+# TODO: add this when #8305 is fixed
+# query ???
+# select array_prepend(arrow_cast(make_array(1), 'LargeList(Int64)'),
arrow_cast(make_array(make_array(2), make_array(3), make_array(4)),
'LargeList(LargeList(Int64))')), array_prepend(arrow_cast(make_array(1.0),
'LargeList(Float64)'), arrow_cast(make_array([2.0], [3.0], [4.0]),
'LargeList(LargeList(Float64))')), array_prepend(arrow_cast(make_array('h'),
'LargeList(Utf8)'), arrow_cast(make_array(['e'], ['l'], ['l'], ['o']),
'LargeList(LargeList(Utf8))''));
+# ----
+# [[1], [2], [3], [4]] [[1.0], [2.0], [3.0], [4.0]] [[h], [e], [l], [l], [o]]
+
# list_prepend scalar function #5 (function alias `array_prepend`)
query ???
select list_prepend(1, make_array(2, 3, 4)), list_prepend(1.0, make_array(2.0,
3.0, 4.0)), list_prepend('h', make_array('e', 'l', 'l', 'o'));
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select list_prepend(1, arrow_cast(make_array(2, 3, 4), 'LargeList(Int64)')),
list_prepend(1.0, arrow_cast(make_array(2.0, 3.0, 4.0), 'LargeList(Float64)')),
list_prepend('h', arrow_cast(make_array('e', 'l', 'l', 'o'),
'LargeList(Utf8)'));
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# array_push_front scalar function #6 (function alias `array_prepend`)
query ???
select array_push_front(1, make_array(2, 3, 4)), array_push_front(1.0,
make_array(2.0, 3.0, 4.0)), array_push_front('h', make_array('e', 'l', 'l',
'o'));
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select array_push_front(1, arrow_cast(make_array(2, 3, 4),
'LargeList(Int64)')), array_push_front(1.0, arrow_cast(make_array(2.0, 3.0,
4.0), 'LargeList(Float64)')), array_push_front('h', arrow_cast(make_array('e',
'l', 'l', 'o'), 'LargeList(Utf8)'));
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# list_push_front scalar function #7 (function alias `array_prepend`)
query ???
select list_push_front(1, make_array(2, 3, 4)), list_push_front(1.0,
make_array(2.0, 3.0, 4.0)), list_push_front('h', make_array('e', 'l', 'l',
'o'));
----
[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+query ???
+select list_push_front(1, arrow_cast(make_array(2, 3, 4),
'LargeList(Int64)')), list_push_front(1.0, arrow_cast(make_array(2.0, 3.0,
4.0), 'LargeList(Float64)')), list_push_front('h', arrow_cast(make_array('e',
'l', 'l', 'o'), 'LargeList(Utf8)'));
+----
+[1, 2, 3, 4] [1.0, 2.0, 3.0, 4.0] [h, e, l, l, o]
+
# array_prepend with columns #1
query ?
select array_prepend(column2, column1) from arrays_values;
@@ -1725,6 +1868,18 @@ select array_prepend(column2, column1) from
arrays_values;
[55, 51, 52, , 54, 55, 56, 57, 58, 59, 60]
[66, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]
+query ?
+select array_prepend(column2, column1) from large_arrays_values;
+----
+[1, , 2, 3, 4, 5, 6, 7, 8, 9, 10]
+[12, 11, 12, 13, 14, 15, 16, 17, 18, , 20]
+[23, 21, 22, 23, , 25, 26, 27, 28, 29, 30]
+[34, 31, 32, 33, 34, 35, , 37, 38, 39, 40]
+[44]
+[, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
+[55, 51, 52, , 54, 55, 56, 57, 58, 59, 60]
+[66, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]
+
# array_prepend with columns #2 (element is list)
query ?
select array_prepend(column2, column1) from nested_arrays;
@@ -1732,6 +1887,13 @@ select array_prepend(column2, column1) from
nested_arrays;
[[7, 8, 9], [1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5, 6]]
[[10, 11, 12], [4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12],
[1, 8, 7]]
+# TODO: add this when #8305 is fixed
+# query ?
+# select array_prepend(column2, column1) from large_nested_arrays;
+# ----
+# [[7, 8, 9], [1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5, 6]]
+# [[10, 11, 12], [4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12],
[1, 8, 7]]
+
# array_prepend with columns and scalars #1
query ??
select array_prepend(100.1, column2), array_prepend('.', column3) from arrays;
@@ -1744,6 +1906,17 @@ select array_prepend(100.1, column2), array_prepend('.',
column3) from arrays;
[100.1] [., ,]
[100.1, 16.6, 17.7, 18.8] [.]
+query ??
+select array_prepend(100.1, column2), array_prepend('.', column3) from
large_arrays;
+----
+[100.1, 1.1, 2.2, 3.3] [., L, o, r, e, m]
+[100.1, , 5.5, 6.6] [., i, p, , u, m]
+[100.1, 7.7, 8.8, 9.9] [., d, , l, o, r]
+[100.1, 10.1, , 12.2] [., s, i, t]
+[100.1, 13.3, 14.4, 15.5] [., a, m, e, t]
+[100.1] [., ,]
+[100.1, 16.6, 17.7, 18.8] [.]
+
# array_prepend with columns and scalars #2 (element is list)
query ??
select array_prepend(make_array(1, 11, 111), column1), array_prepend(column2,
make_array(make_array(1, 2, 3), make_array(11, 12, 13))) from nested_arrays;
@@ -1751,6 +1924,13 @@ select array_prepend(make_array(1, 11, 111), column1),
array_prepend(column2, ma
[[1, 11, 111], [1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5,
6]] [[7, 8, 9], [1, 2, 3], [11, 12, 13]]
[[1, 11, 111], [4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12],
[1, 8, 7]] [[10, 11, 12], [1, 2, 3], [11, 12, 13]]
+# TODO: add this when #8305 is fixed
+# query ??
+# select array_prepend(arrow_cast(make_array(1, 11, 111), 'LargeList(Int64)'),
column1), array_prepend(column2, arrow_cast(make_array(make_array(1, 2, 3),
make_array(11, 12, 13)), 'LargeList(LargeList(Int64))')) from
large_nested_arrays;
+# ----
+# [[1, 11, 111], [1, 2, 3], [2, 9, 1], [7, 8, 9], [1, 2, 3], [1, 7, 4], [4, 5,
6]] [[7, 8, 9], [1, 2, 3], [11, 12, 13]]
+# [[1, 11, 111], [4, 5, 6], [10, 11, 12], [4, 9, 8], [7, 8, 9], [10, 11, 12],
[1, 8, 7]] [[10, 11, 12], [1, 2, 3], [11, 12, 13]]
+
## array_repeat (aliases: `list_repeat`)
# array_repeat scalar function #1