should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,287 @@
# name: test/sql/parser/test_columns_unpacked.test
# group: [parser]
statement ok
PRAGMA enable_verification
query I
select COALESCE(*COLUMNS(*)) from (select NULL, 2, 3) t(a, b, c);
----
2
query I
select column_name from (describe select COALESCE(*COLUMNS(*)) from (select NULL, 2, 3) t(a, b, c));
----
COALESCE(t.a, t.b, t.c)
# Aliasing the result
query I
select column_name from (describe select COALESCE(*COLUMNS(*)) as a from (select NULL, 2, 3) t(a, b, c));
----
a
statement ok
create table contains_test as select '123abc234' a, 4 b, 'abc' c;
# Feed columns a and c into contains, equivalent to contains(a, c)
query I
select contains(*COLUMNS('[a|c]')) from contains_test;
----
true
# COLUMNS and *COLUMNS are equivalent as a root expression
query II
select COLUMNS('[a|c]') from contains_test;
----
123abc234 abc
statement error
select *COLUMNS('[a|c]') from contains_test;
----
*COLUMNS not allowed at the root level, use COLUMNS instead
statement ok
create table sales as from ( values
(150, '2017/06/12'::DATE, 3),
(125, '2017/08/29'::DATE, 2),
(175, '2017/06/12'::DATE, 4),
) t(amount, date, priority)
query I
SELECT first(amount ORDER BY date ASC, priority DESC) FROM sales;
----
175
# TODO: this could be supported
statement error
select first(amount ORDER BY *COLUMNS('date|priority') ASC) from sales;
----
*COLUMNS(...) is not supported in the order expression
# Using a lambda in *COLUMNS
query I
select COALESCE(*COLUMNS(lambda c: c in ('a', 'c'))) from (select NULL, 2, 3) t(a, b, c);
----
3
# IN (...)
query I
select 2 in (*COLUMNS(*)) from (select 1, 2, 3) t(a, b, c);
----
true
# IN in WHERE clause
query III
from (VALUES (1, 2, 3), (2, 3, 0), (0, 0, 1)) tbl(a, b, c) where 1 IN (*COLUMNS(*));
----
1 2 3
0 0 1
statement ok
create table data AS (
SELECT * FROM (VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Alice'),
(4, 'Carol')
) AS t(id, name)
)
# Using struct pack:
query I
select struct_pack(*COLUMNS(*)) from data
----
{'id': 1, 'name': Alice}
{'id': 2, 'name': Bob}
{'id': 3, 'name': Alice}
{'id': 4, 'name': Carol}
# It can not be used inside a COLUMNS expression
statement error
SELECT COLUMNS(*COLUMNS(*)) FROM (VALUES ('test'))
----
COLUMNS expression is not allowed inside another COLUMNS expression
statement error
SELECT *COLUMNS(COLUMNS(*)) FROM (VALUES ('test'))
----
COLUMNS expression is not allowed inside another COLUMNS expression
# COLUMNS and *COLUMNS of different expressions
query III
select COLUMNS(*), struct_pack(COLUMNS(['id'])) from data
----
1 Alice {'id': 1}
2 Bob {'id': 2}
3 Alice {'id': 3}
4 Carol {'id': 4}
# (temporary limitation)
# *COLUMNS with different expressions can not appear in the same expression
statement error
select struct_pack(struct_pack(*COLUMNS(['id']), struct_pack(*COLUMNS(['name'])))) from data
----
Multiple different STAR/COLUMNS in the same expression are not supported
# When they share the same expression, this is allowed:
query I
select struct_pack(
b := struct_pack(*COLUMNS(['id'])),
a := struct_pack(*COLUMNS(['id']))
) from data
----
{'b': {'id': 1}, 'a': {'id': 1}}
{'b': {'id': 2}, 'a': {'id': 2}}
{'b': {'id': 3}, 'a': {'id': 3}}
{'b': {'id': 4}, 'a': {'id': 4}}
# Multiple *COLUMNS in the same statement are allowed
# Whether they share the same expression or not:
query II
select struct_pack(*COLUMNS('id')) a, struct_pack(*COLUMNS('name')) from data
----
{'id': 1} {'name': Alice}
{'id': 2} {'name': Bob}
{'id': 3} {'name': Alice}
{'id': 4} {'name': Carol}
# Varargs function
query I
select CONCAT(*COLUMNS(*), *COLUMNS(*)) from data
----
1Alice1Alice
2Bob2Bob
3Alice3Alice
4Carol4Carol
# *COLUMNS inside COLUMNS lambda
statement error
select COLUMNS(lambda col: *COLUMNS('id')) from data
----
COLUMNS expression is not allowed inside another COLUMNS expression
statement error
select *COLUMNS(lambda col: *COLUMNS(*)) from data
----
COLUMNS expression is not allowed inside another COLUMNS expression
# *COLUMNS expanding to more than one column in binary op
statement error
with integers as (
SELECT * FROM (VALUES
(42, 31),
(85, 76),
) as t(a, b)
)
select *COLUMNS(*) + 42 from integers
----
No function matches the given name and argument types '+(INTEGER, INTEGER, INTEGER_LITERAL)'.
query I
with integers as (
SELECT * FROM (VALUES
(42, 31),
(85, 76),
) as t(a, b)
)
select *COLUMNS('a') + 42 from integers
----
84
127
# Expands to the expression: [a + a, a + b]
query I
with integers as (
select * FROM (VALUES
(21, 42),
(1337, 7331)
) as t(a, b)
)
select [(UNPACK(a + COLUMNS(['a', 'b'])))] from integers
----
[42, 63]
[2674, 8668]
# UNPACK operator nested inside another UNPACK operator
statement error
select
[
UNPACK([
UNPACK(COLUMNS(*)),
a + b
])
]
from (
select 42 a, 21 b
)
----
UNPACK can only be used in combination with a STAR (*) expression or COLUMNS expression
# Cast every column to VARCHAR before unpacking into the list
query I
select
[UNPACK(COLUMNS(*)::VARCHAR)]
from (
select
21::INTEGER a,
True::BOOL b,
0.1234::DOUBLE c
)
----
[21, true, 0.1234]
# Two different COLUMNS inside an UNPACK (could be supported in the future)
statement error
select
[
UNPACK(
[
COLUMNS(['a', 'b']),
COLUMNS(['c'])
]
)
]
from (select 21 a, 42 b, 1337 c)
----
Multiple different STAR/COLUMNS in the same expression are not supported
# An UNPACK without a COLUMNS inside of it
statement error
select
[
UNPACK(
[
'test'
]
)
]
from (select 21 a, 42 b, 1337 c)
----
UNPACK can only be used in combination with a STAR (*) expression or COLUMNS expression
statement error
select
[
UNPACK(
[
COLUMNS([]::VARCHAR[])
]
)
]
from (select 21 a, 42 b, 1337 c)
----
Star expression "COLUMNS(CAST(main.list_value() AS VARCHAR[]))" resulted in an empty set of columns
statement error
select
[
UNPACK(
[
COLUMNS(['d'])
]
)
]
from (select 21 a, 42 b, 1337 c)
----
Column "d" was selected but was not found in the FROM clause