From 4f0cc4335f9bb797640248a725fd393769ff69ef Mon Sep 17 00:00:00 2001 From: Dejan Simic <10134699+simicd@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:17:34 +0100 Subject: [PATCH 1/2] Port select queries - part I --- datafusion/core/tests/sql/select.rs | 457 ------------------ datafusion/sqllogictest/test_files/select.slt | 264 +++++++++- 2 files changed, 257 insertions(+), 464 deletions(-) diff --git a/datafusion/core/tests/sql/select.rs b/datafusion/core/tests/sql/select.rs index cbdea9d729487..c74dc88abeec6 100644 --- a/datafusion/core/tests/sql/select.rs +++ b/datafusion/core/tests/sql/select.rs @@ -19,463 +19,6 @@ use super::*; use datafusion_common::ScalarValue; use tempfile::TempDir; -#[tokio::test] -async fn query_get_indexed_field() -> Result<()> { - let ctx = SessionContext::new(); - let schema = Arc::new(Schema::new(vec![Field::new_list( - "some_list", - Field::new("item", DataType::Int64, true), - false, - )])); - let builder = PrimitiveBuilder::::with_capacity(3); - let mut lb = ListBuilder::new(builder); - for int_vec in [[0, 1, 2], [4, 5, 6], [7, 8, 9]] { - let builder = lb.values(); - for int in int_vec { - builder.append_value(int); - } - lb.append(true); - } - - let data = RecordBatch::try_new(schema.clone(), vec![Arc::new(lb.finish())])?; - - ctx.register_batch("ints", data)?; - - // Original column is micros, convert to millis and check timestamp - let sql = "SELECT some_list[1] as i0 FROM ints LIMIT 3"; - let actual = execute_to_batches(&ctx, sql).await; - #[rustfmt::skip] - let expected = ["+----+", - "| i0 |", - "+----+", - "| 0 |", - "| 4 |", - "| 7 |", - "+----+"]; - assert_batches_eq!(expected, &actual); - Ok(()) -} - -#[tokio::test] -async fn query_nested_get_indexed_field() -> Result<()> { - let ctx = SessionContext::new(); - let nested_dt = DataType::List(Arc::new(Field::new("item", DataType::Int64, true))); - // Nested schema of { "some_list": [[i64]] } - let schema = Arc::new(Schema::new(vec![Field::new( - "some_list", - DataType::List(Arc::new(Field::new("item", nested_dt.clone(), true))), - false, - )])); - - let builder = PrimitiveBuilder::::with_capacity(3); - let nested_lb = ListBuilder::new(builder); - let mut lb = ListBuilder::new(nested_lb); - for int_vec_vec in [ - [[0, 1], [2, 3], [3, 4]], - [[5, 6], [7, 8], [9, 10]], - [[11, 12], [13, 14], [15, 16]], - ] { - let nested_builder = lb.values(); - for int_vec in int_vec_vec { - let builder = nested_builder.values(); - for int in int_vec { - builder.append_value(int); - } - nested_builder.append(true); - } - lb.append(true); - } - - let data = RecordBatch::try_new(schema.clone(), vec![Arc::new(lb.finish())])?; - - ctx.register_batch("ints", data)?; - - // Original column is micros, convert to millis and check timestamp - let sql = "SELECT some_list[1] as i0 FROM ints LIMIT 3"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+----------+", - "| i0 |", - "+----------+", - "| [0, 1] |", - "| [5, 6] |", - "| [11, 12] |", - "+----------+", - ]; - assert_batches_eq!(expected, &actual); - let sql = "SELECT some_list[1][1] as i0 FROM ints LIMIT 3"; - let actual = execute_to_batches(&ctx, sql).await; - #[rustfmt::skip] - let expected = ["+----+", - "| i0 |", - "+----+", - "| 0 |", - "| 5 |", - "| 11 |", - "+----+"]; - assert_batches_eq!(expected, &actual); - Ok(()) -} - -#[tokio::test] -async fn query_nested_get_indexed_field_on_struct() -> Result<()> { - let ctx = SessionContext::new(); - let nested_dt = DataType::List(Arc::new(Field::new("item", DataType::Int64, true))); - // Nested schema of { "some_struct": { "bar": [i64] } } - let struct_fields = vec![Field::new("bar", nested_dt.clone(), true)]; - let schema = Arc::new(Schema::new(vec![Field::new( - "some_struct", - DataType::Struct(struct_fields.clone().into()), - false, - )])); - - let builder = PrimitiveBuilder::::with_capacity(3); - let nested_lb = ListBuilder::new(builder); - let mut sb = StructBuilder::new(struct_fields, vec![Box::new(nested_lb)]); - for int_vec in [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]] { - let lb = sb.field_builder::>(0).unwrap(); - for int in int_vec { - lb.values().append_value(int); - } - lb.append(true); - sb.append(true); - } - let s = sb.finish(); - let data = RecordBatch::try_new(schema.clone(), vec![Arc::new(s)])?; - - ctx.register_batch("structs", data)?; - - // Original column is micros, convert to millis and check timestamp - let sql = "SELECT some_struct['bar'] as l0 FROM structs LIMIT 3"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+----------------+", - "| l0 |", - "+----------------+", - "| [0, 1, 2, 3] |", - "| [4, 5, 6, 7] |", - "| [8, 9, 10, 11] |", - "+----------------+", - ]; - assert_batches_eq!(expected, &actual); - - // Access to field of struct by CompoundIdentifier - let sql = "SELECT some_struct.bar as l0 FROM structs LIMIT 3"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+----------------+", - "| l0 |", - "+----------------+", - "| [0, 1, 2, 3] |", - "| [4, 5, 6, 7] |", - "| [8, 9, 10, 11] |", - "+----------------+", - ]; - assert_batches_eq!(expected, &actual); - - let sql = "SELECT some_struct['bar'][1] as i0 FROM structs LIMIT 3"; - let actual = execute_to_batches(&ctx, sql).await; - #[rustfmt::skip] - let expected = ["+----+", - "| i0 |", - "+----+", - "| 0 |", - "| 4 |", - "| 8 |", - "+----+"]; - assert_batches_eq!(expected, &actual); - Ok(()) -} - -#[tokio::test] -async fn query_on_string_dictionary() -> Result<()> { - // Test to ensure DataFusion can operate on dictionary types - // Use StringDictionary (32 bit indexes = keys) - let d1: DictionaryArray = - vec![Some("one"), None, Some("three")].into_iter().collect(); - - let d2: DictionaryArray = vec![Some("blarg"), None, Some("three")] - .into_iter() - .collect(); - - let d3: StringArray = vec![Some("XYZ"), None, Some("three")].into_iter().collect(); - - let batch = RecordBatch::try_from_iter(vec![ - ("d1", Arc::new(d1) as ArrayRef), - ("d2", Arc::new(d2) as ArrayRef), - ("d3", Arc::new(d3) as ArrayRef), - ]) - .unwrap(); - - let ctx = SessionContext::new(); - ctx.register_batch("test", batch)?; - - // Basic SELECT - let sql = "SELECT d1 FROM test"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+", - "| d1 |", - "+-------+", - "| one |", - "| |", - "| three |", - "+-------+", - ]; - assert_batches_eq!(expected, &actual); - - // basic filtering - let sql = "SELECT d1 FROM test WHERE d1 IS NOT NULL"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+", - "| d1 |", - "+-------+", - "| one |", - "| three |", - "+-------+", - ]; - assert_batches_eq!(expected, &actual); - - // comparison with constant - let sql = "SELECT d1 FROM test WHERE d1 = 'three'"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+", - "| d1 |", - "+-------+", - "| three |", - "+-------+", - ]; - assert_batches_eq!(expected, &actual); - - // comparison with another dictionary column - let sql = "SELECT d1 FROM test WHERE d1 = d2"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+", - "| d1 |", - "+-------+", - "| three |", - "+-------+", - ]; - assert_batches_eq!(expected, &actual); - - // order comparison with another dictionary column - let sql = "SELECT d1 FROM test WHERE d1 <= d2"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+", - "| d1 |", - "+-------+", - "| three |", - "+-------+", - ]; - assert_batches_eq!(expected, &actual); - - // comparison with a non dictionary column - let sql = "SELECT d1 FROM test WHERE d1 = d3"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+", - "| d1 |", - "+-------+", - "| three |", - "+-------+", - ]; - assert_batches_eq!(expected, &actual); - - // filtering with constant - let sql = "SELECT d1 FROM test WHERE d1 = 'three'"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+", - "| d1 |", - "+-------+", - "| three |", - "+-------+", - ]; - assert_batches_eq!(expected, &actual); - - // Expression evaluation - let sql = "SELECT concat(d1, '-foo') FROM test"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+------------------------------+", - "| concat(test.d1,Utf8(\"-foo\")) |", - "+------------------------------+", - "| one-foo |", - "| -foo |", - "| three-foo |", - "+------------------------------+", - ]; - assert_batches_eq!(expected, &actual); - - // Expression evaluation with two dictionaries - let sql = "SELECT concat(d1, d2) FROM test"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------------------------+", - "| concat(test.d1,test.d2) |", - "+-------------------------+", - "| oneblarg |", - "| |", - "| threethree |", - "+-------------------------+", - ]; - assert_batches_eq!(expected, &actual); - - // aggregation - let sql = "SELECT COUNT(d1) FROM test"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+----------------+", - "| COUNT(test.d1) |", - "+----------------+", - "| 2 |", - "+----------------+", - ]; - assert_batches_eq!(expected, &actual); - - // aggregation min - let sql = "SELECT MIN(d1) FROM test"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+--------------+", - "| MIN(test.d1) |", - "+--------------+", - "| one |", - "+--------------+", - ]; - assert_batches_eq!(expected, &actual); - - // aggregation max - let sql = "SELECT MAX(d1) FROM test"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+--------------+", - "| MAX(test.d1) |", - "+--------------+", - "| three |", - "+--------------+", - ]; - assert_batches_eq!(expected, &actual); - - // grouping - let sql = "SELECT d1, COUNT(*) FROM test group by d1"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+----------+", - "| d1 | COUNT(*) |", - "+-------+----------+", - "| | 1 |", - "| one | 1 |", - "| three | 1 |", - "+-------+----------+", - ]; - assert_batches_sorted_eq!(expected, &actual); - - // window functions - let sql = "SELECT d1, row_number() OVER (partition by d1) as rn1 FROM test"; - let actual = execute_to_batches(&ctx, sql).await; - let expected = [ - "+-------+-----+", - "| d1 | rn1 |", - "+-------+-----+", - "| | 1 |", - "| one | 1 |", - "| three | 1 |", - "+-------+-----+", - ]; - assert_batches_sorted_eq!(expected, &actual); - - Ok(()) -} - -#[tokio::test] -async fn sort_on_window_null_string() -> Result<()> { - let d1: DictionaryArray = - vec![Some("one"), None, Some("three")].into_iter().collect(); - let d2: StringArray = vec![Some("ONE"), None, Some("THREE")].into_iter().collect(); - let d3: LargeStringArray = - vec![Some("One"), None, Some("Three")].into_iter().collect(); - - let batch = RecordBatch::try_from_iter(vec![ - ("d1", Arc::new(d1) as ArrayRef), - ("d2", Arc::new(d2) as ArrayRef), - ("d3", Arc::new(d3) as ArrayRef), - ]) - .unwrap(); - - let ctx = - SessionContext::new_with_config(SessionConfig::new().with_target_partitions(1)); - ctx.register_batch("test", batch)?; - - let sql = - "SELECT d1, row_number() OVER (partition by d1) as rn1 FROM test order by d1 asc"; - - let actual = execute_to_batches(&ctx, sql).await; - // NULLS LAST - let expected = [ - "+-------+-----+", - "| d1 | rn1 |", - "+-------+-----+", - "| one | 1 |", - "| three | 1 |", - "| | 1 |", - "+-------+-----+", - ]; - assert_batches_eq!(expected, &actual); - - let sql = - "SELECT d2, row_number() OVER (partition by d2) as rn1 FROM test ORDER BY d2 asc"; - let actual = execute_to_batches(&ctx, sql).await; - // NULLS LAST - let expected = [ - "+-------+-----+", - "| d2 | rn1 |", - "+-------+-----+", - "| ONE | 1 |", - "| THREE | 1 |", - "| | 1 |", - "+-------+-----+", - ]; - assert_batches_eq!(expected, &actual); - - let sql = - "SELECT d2, row_number() OVER (partition by d2 order by d2 desc) as rn1 FROM test ORDER BY d2 desc"; - - let actual = execute_to_batches(&ctx, sql).await; - // NULLS FIRST - let expected = [ - "+-------+-----+", - "| d2 | rn1 |", - "+-------+-----+", - "| | 1 |", - "| THREE | 1 |", - "| ONE | 1 |", - "+-------+-----+", - ]; - assert_batches_eq!(expected, &actual); - - // FIXME sort on LargeUtf8 String has bug. - // let sql = - // "SELECT d3, row_number() OVER (partition by d3) as rn1 FROM test"; - // let actual = execute_to_batches(&ctx, sql).await; - // let expected = vec![ - // "+-------+-----+", - // "| d3 | rn1 |", - // "+-------+-----+", - // "| | 1 |", - // "| One | 1 |", - // "| Three | 1 |", - // "+-------+-----+", - // ]; - // assert_batches_eq!(expected, &actual); - - Ok(()) -} - // Test prepare statement from sql to final result // This test is equivalent with the test parallel_query_with_filter below but using prepare statement #[tokio::test] diff --git a/datafusion/sqllogictest/test_files/select.slt b/datafusion/sqllogictest/test_files/select.slt index ca48c07b09146..18f493595e109 100644 --- a/datafusion/sqllogictest/test_files/select.slt +++ b/datafusion/sqllogictest/test_files/select.slt @@ -116,7 +116,7 @@ VALUES (1,2,3,4,5,6,7,8,9,10,11,12,13,NULL,'F',3.5) # Test non-literal expressions in VALUES query II -VALUES (1, CASE WHEN RANDOM() > 0.5 THEN 1 ELSE 1 END), +VALUES (1, CASE WHEN RANDOM() > 0.5 THEN 1 ELSE 1 END), (2, CASE WHEN RANDOM() > 0.5 THEN 2 ELSE 2 END); ---- 1 1 @@ -496,15 +496,265 @@ ProjectionExec: expr=[c1@0 >= 2 AND c1@0 <= 3 as select_between_data.c1 BETWEEN --MemoryExec: partitions=1, partition_sizes=[1] -# TODO: query_get_indexed_field +###### +# Query indexed field +###### -# TODO: query_nested_get_indexed_field +statement ok +CREATE TABLE indexed_fields +AS VALUES +(make_array(1, 2, 3), 'a'), +(make_array(4, 5, 6), 'b'), +(make_array(7, 8, 9), 'c'); + +query ?T +SELECT * FROM indexed_fields; +---- +[1, 2, 3] a +[4, 5, 6] b +[7, 8, 9] c + +query I +SELECT column1[1] as i0 FROM indexed_fields LIMIT 3; +---- +1 +4 +7 + + +###### +# Query nested indexed field +###### + +statement ok +CREATE TABLE nested_indexed_fields +AS VALUES +(make_array(make_array(0, 1), make_array(2, 3), make_array(3, 4)), 'a'), +(make_array(make_array(5, 6), make_array(7, 8), make_array(9, 10)), 'b'), +(make_array(make_array(11, 12), make_array(13, 14), make_array(15, 16)), 'c'); + +query ?T +SELECT * FROM nested_indexed_fields; +---- +[[0, 1], [2, 3], [3, 4]] a +[[5, 6], [7, 8], [9, 10]] b +[[11, 12], [13, 14], [15, 16]] c + +query ? +SELECT column1[1] as i0 FROM nested_indexed_fields LIMIT 3; +---- +[0, 1] +[5, 6] +[11, 12] + +query I +SELECT column1[1][1] as i0 FROM nested_indexed_fields LIMIT 3; +---- +0 +5 +11 + +###### +# Query nested indexed field on struct +###### + +statement ok +CREATE TABLE nested_structs_data +AS VALUES +(make_array(0, 1, 2, 3), 'a'), +(make_array(4, 5, 6, 7), 'b'), +(make_array(8, 9, 10, 11), 'c'); + +statement ok +CREATE TABLE nested_structs AS SELECT struct(column1) AS some_struct FROM nested_structs_data; + +query ? +SELECT some_struct['c0'] as l0 FROM nested_structs LIMIT 3; +---- +[0, 1, 2, 3] +[4, 5, 6, 7] +[8, 9, 10, 11] + +query ? +SELECT some_struct.c0 as l0 FROM nested_structs LIMIT 3; +---- +[0, 1, 2, 3] +[4, 5, 6, 7] +[8, 9, 10, 11] + +query I +SELECT some_struct['c0'][1] as i0 FROM nested_structs LIMIT 3; +---- +0 +4 +8 + + +###### +# Queries on string dictionary +###### + +statement ok +CREATE TABLE test AS +SELECT + arrow_cast(column1, 'Dictionary(Int32, Utf8)') as d1, + arrow_cast(column2, 'Dictionary(Int32, Utf8)') as d2, + arrow_cast(column3, 'Utf8') as d3 +FROM ( + VALUES + ('one', 'blarg', 'XYZ'), + (NULL, NULL, NULL), + ('three', 'three', 'three') +); + +# Basic SELECT +query ? +SELECT d1 FROM test; +---- +one +NULL +three + +# Basic filtering +query ? +SELECT d1 FROM test WHERE d1 IS NOT NULL; +---- +one +three + +# Comparison with constant +query ? +SELECT d1 FROM test WHERE d1 = 'three'; +---- +three + +# Comparison with another dictionary column +query ? +SELECT d1 FROM test WHERE d1 = d2 +---- +three + +# Order comparison with another dictionary column +query ? +SELECT d1 FROM test WHERE d1 <= d2 +---- +three + +# Comparison with a non-dictionary column +query ? +SELECT d1 FROM test WHERE d1 = d3 +---- +three + +# Filtering with constant +query ? +SELECT d1 FROM test WHERE d1 = 'three' +---- +three + +# Expression evaluation +query T +SELECT concat(d1, '-foo') FROM test +---- +one-foo +-foo +three-foo + +# Expression evaluation with two dictionaries +query T +SELECT concat(d1, d2) FROM test +---- +oneblarg +(empty) +threethree + +# Aggregation +query I +SELECT COUNT(d1) FROM test +---- +2 + +# Aggregation min +query T +SELECT MIN(d1) FROM test +---- +one + +# Aggregation max +query T +SELECT MAX(d1) FROM test +---- +three + +# Grouping +query ?I +SELECT d1, COUNT(*) FROM test GROUP BY d1 ORDER BY d1; +---- +one 1 +three 1 +NULL 1 + +# Window functions +query ?I +SELECT d1, row_number() OVER (PARTITION BY d1) AS rn1 FROM test ORDER BY d1; +---- +one 1 +three 1 +NULL 1 + +# Drop table +statement ok +DROP TABLE test; -# TODO: query_nested_get_indexed_field_on_struct -# TODO: query_on_string_dictionary +###### +# Sort on window string +###### -# TODO: sort_on_window_null_string +statement ok +CREATE TABLE test AS +SELECT + arrow_cast(column1, 'Dictionary(Int32, Utf8)') as d1, + arrow_cast(column2, 'Utf8') as d2, + arrow_cast(column3, 'LargeUtf8') as d3 +FROM ( + VALUES + ('one', 'ONE', 'One'), + (NULL, NULL, NULL), + ('three', 'THREE', 'Three') +); + +# Sort on Dictionary window +query ?I +SELECT d1, row_number() OVER (PARTITION BY d1) AS rn1 FROM test ORDER BY d1 ASC; +---- +one 1 +three 1 +NULL 1 + +# Sort on string window +query TI +SELECT d2, row_number() OVER (PARTITION BY d2) AS rn1 FROM test ORDER BY d2 ASC; +---- +ONE 1 +THREE 1 +NULL 1 + +# Sort on string window +query TI +SELECT d2, row_number() OVER (PARTITION BY d2 ORDER BY d2 DESC) as rn1 FROM test ORDER BY d2 DESC; +---- +NULL 1 +THREE 1 +ONE 1 + +# Sort on LargeUtf8 window +query TI +SELECT d3, row_number() OVER (PARTITION BY d3) AS rn1 FROM test ORDER BY d3 DESC; +---- +NULL 1 +Three 1 +One 1 # # Create time tables with different precisions but the same logical values @@ -1121,7 +1371,7 @@ query II SELECT CASE WHEN B.x > 0 THEN A.x / B.x ELSE 0 END AS value1, CASE WHEN B.x > 0 AND B.y > 0 THEN A.x / B.x ELSE 0 END AS value3 -FROM t AS A, (SELECT * FROM t WHERE x = 0) AS B; +FROM t AS A, (SELECT * FROM t WHERE x = 0) AS B; ---- 0 0 0 0 From 05cd3987eba59df85ce1ffde73b2cc98035a5c4e Mon Sep 17 00:00:00 2001 From: Dejan Simic <10134699+simicd@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:48:53 +0100 Subject: [PATCH 2/2] Update column name --- datafusion/sqllogictest/test_files/select.slt | 55 ++++++++++++------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/datafusion/sqllogictest/test_files/select.slt b/datafusion/sqllogictest/test_files/select.slt index 18f493595e109..a7383209e0b87 100644 --- a/datafusion/sqllogictest/test_files/select.slt +++ b/datafusion/sqllogictest/test_files/select.slt @@ -501,11 +501,16 @@ ProjectionExec: expr=[c1@0 >= 2 AND c1@0 <= 3 as select_between_data.c1 BETWEEN ###### statement ok -CREATE TABLE indexed_fields -AS VALUES -(make_array(1, 2, 3), 'a'), -(make_array(4, 5, 6), 'b'), -(make_array(7, 8, 9), 'c'); +CREATE TABLE indexed_fields AS +SELECT + column1 as some_list, + column2 as some_string +FROM ( + VALUES + (make_array(1, 2, 3), 'a'), + (make_array(4, 5, 6), 'b'), + (make_array(7, 8, 9), 'c') +); query ?T SELECT * FROM indexed_fields; @@ -515,7 +520,7 @@ SELECT * FROM indexed_fields; [7, 8, 9] c query I -SELECT column1[1] as i0 FROM indexed_fields LIMIT 3; +SELECT some_list[1] as i0 FROM indexed_fields LIMIT 3; ---- 1 4 @@ -527,11 +532,16 @@ SELECT column1[1] as i0 FROM indexed_fields LIMIT 3; ###### statement ok -CREATE TABLE nested_indexed_fields -AS VALUES -(make_array(make_array(0, 1), make_array(2, 3), make_array(3, 4)), 'a'), -(make_array(make_array(5, 6), make_array(7, 8), make_array(9, 10)), 'b'), -(make_array(make_array(11, 12), make_array(13, 14), make_array(15, 16)), 'c'); +CREATE TABLE nested_indexed_fields AS +SELECT + column1 as some_list, + column2 as some_string +FROM ( + VALUES + (make_array(make_array(0, 1), make_array(2, 3), make_array(3, 4)), 'a'), + (make_array(make_array(5, 6), make_array(7, 8), make_array(9, 10)), 'b'), + (make_array(make_array(11, 12), make_array(13, 14), make_array(15, 16)), 'c') +); query ?T SELECT * FROM nested_indexed_fields; @@ -541,32 +551,35 @@ SELECT * FROM nested_indexed_fields; [[11, 12], [13, 14], [15, 16]] c query ? -SELECT column1[1] as i0 FROM nested_indexed_fields LIMIT 3; +SELECT some_list[1] as i0 FROM nested_indexed_fields LIMIT 3; ---- [0, 1] [5, 6] [11, 12] query I -SELECT column1[1][1] as i0 FROM nested_indexed_fields LIMIT 3; +SELECT some_list[1][1] as i0 FROM nested_indexed_fields LIMIT 3; ---- 0 5 11 + ###### # Query nested indexed field on struct ###### statement ok -CREATE TABLE nested_structs_data -AS VALUES -(make_array(0, 1, 2, 3), 'a'), -(make_array(4, 5, 6, 7), 'b'), -(make_array(8, 9, 10, 11), 'c'); - -statement ok -CREATE TABLE nested_structs AS SELECT struct(column1) AS some_struct FROM nested_structs_data; +CREATE TABLE nested_structs AS +SELECT + struct(column1) as some_struct, + column2 as some_string +FROM ( + VALUES + (make_array(0, 1, 2, 3), 'a'), + (make_array(4, 5, 6, 7), 'b'), + (make_array(8, 9, 10, 11), 'c') +); query ? SELECT some_struct['c0'] as l0 FROM nested_structs LIMIT 3;