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,110 @@
# name: test/sql/parser/columns_aliases.test
# description: Test COLUMNS(*) aliases
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers AS SELECT 42 i, 84 j UNION ALL SELECT 13, 14
# verify that COLUMNS(*) maintain names
query II
SELECT i, j FROM (SELECT COLUMNS(*)::VARCHAR FROM integers)
----
42 84
13 14
query IIII
SELECT min_i, min_j, max_i, max_j FROM (SELECT MIN(COLUMNS(*)) AS "min_\0", MAX(COLUMNS(*)) AS "max_\0" FROM integers)
----
13 14 42 84
# regex
statement ok
CREATE TABLE numerics AS SELECT 42 a42, 84 b84, 126 c126, 1000 d
query III
SELECT min_a, min_b, min_c FROM (SELECT MIN(COLUMNS('([a-z])\d+')) AS "min_\1" FROM numerics)
----
42 84 126
# out of range - RE2 just swallows it
query III
SELECT min_, "min__1", "min__2" FROM (SELECT MIN(COLUMNS('([a-z])\d+')) AS "min_\2" FROM numerics)
----
42 84 126
# escape
query III
SELECT "min_\a\", "min_\b\", "min_\c\" FROM (SELECT MIN(COLUMNS('([a-z])\d+')) AS "min_\\\1\\" FROM numerics)
----
42 84 126
# multiple captures
query III
SELECT "a42aa", "b84bb", "c126cc" FROM (SELECT MIN(COLUMNS('([a-z])(\d+)')) AS "\1\2\1\1" FROM numerics)
----
42 84 126
# unterminated escape \
statement error
SELECT MIN(COLUMNS('([a-z])\d+')) AS "\" FROM numerics
----
Backslashes must either be escaped or followed by a number
# invalid backslash code \
statement error
SELECT MIN(COLUMNS('([a-z])\d+')) AS "\a" FROM numerics
----
Backslashes must either be escaped or followed by a number
# no regex is supplied - cannot use \1
statement error
SELECT MIN(COLUMNS(*)) AS "min_\1" FROM numerics
----
no regex is supplied
# generated columns
statement ok
CREATE TABLE tbl (
price INTEGER,
amount_sold INTEGER,
total_profit AS (price * amount_sold),
);
statement ok
INSERT INTO tbl VALUES (5,4);
query III
SELECT price, amount_sold, total_profit FROM (SELECT COLUMNS(*)::VARCHAR FROM tbl)
----
5 4 20
query III
SELECT varchar_price, varchar_amount_sold, varchar_total_profit FROM (SELECT COLUMNS(*)::VARCHAR AS "varchar_\0" FROM tbl)
----
5 4 20
# full outer join using
statement ok
create table a as select 42 as i, 80 as j;
statement ok
create table b as select 43 as i, 84 as k;
statement ok
create table c as select 44 as i, 84 as l;
query III
select i, j, k from (select columns(*)::VARCHAR from a full outer join b using (i)) order by 1;
----
42 80 NULL
43 NULL 84
query IIII
select i, j, k, l from (select columns(*)::VARCHAR from a full outer join b using (i) full outer join c using (i)) order by 1;
----
42 80 NULL NULL
43 NULL 84 NULL
44 NULL NULL 84

View File

@@ -0,0 +1,31 @@
# name: test/sql/parser/columns_issue9867.test
# description: Issue #9867 - COLUMNS(table_name.*) is broken when there are joins
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE df1 AS
SELECT
UNNEST(['K0', 'K1', 'K2', 'K3', 'K4', 'K5']) AS key,
UNNEST([11, 12, 13, 14, 15, 16]) AS A,
UNNEST([21, 22, 23, 24, 25, 26]) AS B
statement ok
CREATE TABLE df2 AS
SELECT
UNNEST(['K0', 'K2', 'K5']) AS key,
UNNEST([2, 3, 5]) AS C
query II rowsort
select sin(columns(df1.* exclude (key))) from df1 join df2 using(key)
----
-0.2879033166650653 0.7625584504796027
-0.9999902065507035 0.836655638536056
0.4201670368266409 -0.8462204041751706
statement error
select sin(columns(dfxx.* exclude (key))) from df1 join df2 using(key)
----
Referenced table "dfxx" not found

View File

@@ -0,0 +1,311 @@
# name: test/sql/parser/digit_separators.test
# group: [parser]
statement ok
PRAGMA enable_verification
# Simple parse test
query I
SELECT 1_2
----
12
# With decimal notation
query I
SELECT 1_2.1_2E1_0
----
12.12e10
# With string converison
query I
SELECT '1_2.1_2E1_0'::DOUBLE
----
12.12e10
# We cant have multiple underscores, in that case it gets interpreted as the column name
query I
SELECT 1__2
----
1
query I
SELECT 1_000_000
----
1000000
query I
SELECT '1000_000_000'::INT
----
1_000_000_000
statement error
SELECT '1000__000__000'::INT
----
Could not convert string '1000__000__000' to INT32
# Cant start with an underscore
statement error
SELECT '_1_2'::INT
----
Could not convert string '_1_2' to INT32
# Cant end with an underscore
statement error
SELECT '1_2_'::INT
----
Could not convert string '1_2_' to INT32
# Decimals
query I
SELECT 1_2.1_2
----
12.12
query I
SELECT 12.1_2
----
12.12
query I
SELECT 1_2.12
----
12.12
# Cant start with an underscore
statement error
SELECT '_12.12'::DECIMAL(4,2)
----
Conversion Error: Could not convert string "_12.12" to DECIMAL(4,2)
statement error
SELECT '12._12'::DECIMAL(4,2)
----
Conversion Error: Could not convert string "12._12" to DECIMAL(4,2)
# Cant end with an underscore
statement error
SELECT '12_.12'::DECIMAL(4,2)
----
Conversion Error: Could not convert string "12_.12" to DECIMAL(4,2)
statement error
SELECT '12.12_'::DECIMAL(4,2)
----
Conversion Error: Could not convert string "12.12_" to DECIMAL(4,2)
# Floats
statement error
SELECT '1__2.1__2'::FLOAT
----
Conversion Error: Could not convert string '1__2.1__2' to FLOAT
query I
SELECT '12.1_2'::FLOAT
----
12.12
query I
SELECT '1_2.12'::FLOAT
----
12.12
query I
SELECT '12.1_2e2'::FLOAT
----
12.12e2
# Cant start with an underscore
statement error
SELECT '_12.12'::FLOAT == 12.12
----
Conversion Error: Could not convert string '_12.12' to FLOAT
statement error
SELECT '12._12'::FLOAT == 12.12
----
Conversion Error: Could not convert string '12._12' to FLOAT
statement error
SELECT '12._12e2'::FLOAT == 12.12e2
----
Conversion Error: Could not convert string '12._12e2' to FLOAT
# Cant end with an underscore
statement error
SELECT '12_.12'::FLOAT == 12.12
----
Conversion Error: Could not convert string '12_.12' to FLOAT
statement error
SELECT '12.12_'::FLOAT == 12.12
----
Conversion Error: Could not convert string '12.12_' to FLOAT
statement error
SELECT '12.12_e2'::FLOAT == 12.12e2
----
Conversion Error: Could not convert string '12.12_e2' to FLOAT
# Large reals > 19 digits
query I
SELECT 1_000_000_000_000_000_000_000::DOUBLE
----
1e+21
query I
SELECT .000_000_000_000_000_000_000_123::DOUBLE
----
123e-23
query I
SELECT 1_000_000_000_000_000_000_000.5::DOUBLE
----
1000000000000000000000.5
query I
SELECT '1_000_000_000.000_000_000_5'::DOUBLE
----
1000000000.0000000005
# Cant start with an underscore
statement error
SELECT '_1_000_000_000_000_000_000_000'::DOUBLE == 1e+21
----
Conversion Error: Could not convert string '_1_000_000_000_000_000_000_000' to DOUBLE
statement error
SELECT '._000_000_000_000_000_000_000_123'::DOUBLE == 123e-23
----
Conversion Error: Could not convert string '._000_000_000_000_000_000_000_123' to DOUBLE
# Cant end with an underscore
statement error
SELECT '1_000_000_000_000_000_000_000_'::DOUBLE == 1e+21
----
Conversion Error: Could not convert string '1_000_000_000_000_000_000_000_' to DOUBLE
statement error
SELECT '.000_000_000_000_000_000_000_123_'::DOUBLE == 123e-23
----
Conversion Error: Could not convert string '.000_000_000_000_000_000_000_123_' to DOUBLE
# Exponents
statement error
select '20e10_'::FLOAT
----
Conversion Error: Could not convert string '20e10_' to FLOAT
statement error
select '20e_10'::FLOAT
----
Conversion Error: Could not convert string '20e_10' to FLOAT
statement error
select '20e10_'::BIGINT
----
Conversion Error: Could not convert string '20e10_' to INT64
statement error
select '20e_10'::BIGINT
----
Conversion Error: Could not convert string '20e_10' to INT64
query I
SELECT 12e1_0::BIGINT == 12e10::BIGINT
----
true
statement error
SELECT '12e10_'::BIGINT == 12e10::BIGINT
----
Conversion Error: Could not convert string '12e10_' to INT64
statement error
SELECT '_12e10::BIGINT' == 12e10::BIGINT
----
Conversion Error: Could not convert string '_12e10::BIGINT' to INT64
# Binary notation (trailing, leading and duplicate underscores)
query I
SELECT '0b01_01'::INT
----
5
query I
SELECT '0b0_1_0_1'::INT
----
5
statement error
SELECT '0b0_1_0_1_'::INT
----
Conversion Error: Could not convert string '0b0_1_0_1_' to INT32
statement error
SELECT '0b_0_1_0_1'::INT
----
Conversion Error: Could not convert string '0b_0_1_0_1' to INT32
statement error
SELECT '0b0__1_0_1'::INT
----
Conversion Error: Could not convert string '0b0__1_0_1' to INT32
# Hex notation (trailing, leading and duplicate underscores)
query I
SELECT '0xFF_FF'::INT;
----
65535
query I
SELECT '0xF_F_F_F'::INT;
----
65535
statement error
SELECT '0x0_F_F_F_'::INT
----
Conversion Error: Could not convert string '0x0_F_F_F_' to INT32
statement error
SELECT '0x_F_F_F'::INT
----
Conversion Error: Could not convert string '0x_F_F_F' to INT32
statement error
SELECT '0x0__F_F_F'::INT
----
Conversion Error: Could not convert string '0x0__F_F_F' to INT32
# Test decimals keep their width
query IIII
SELECT typeof(10.00), typeof(10.0_0), typeof(1_0.00), typeof(1_0.0_0);
----
DECIMAL(4,2) DECIMAL(4,2) DECIMAL(4,2) DECIMAL(4,2)
query I
select 1_2e1_0::FLOAT
----
1.2e+11
query I
select '1_2e1_0'::FLOAT
----
1.2e+11
query I
select 1_2e1_0::BIGINT
----
120000000000
query I
select '1_2e1_0'::BIGINT
----
120000000000

View File

@@ -0,0 +1,37 @@
# name: test/sql/parser/division_operator_precedence.test
# description: Test division operator precedence
# group: [parser]
statement ok
PRAGMA enable_verification
# division operator precedence
query I
SELECT 6 * 1 / 2
----
3
query I
SELECT 6 * 1 // 2
----
3
query I
SELECT (6 * 1) // 2
----
3
query I
SELECT 6 * (1 // 2)
----
0
query I
SELECT 6 + 1 / 2
----
6.5
query I
SELECT 6 + 1 // 2
----
6

View File

@@ -0,0 +1,81 @@
# name: test/sql/parser/dollar_quotes_internal_issue2224.test
# description: Unexpected implicit conversion of string literal with full-width space
# group: [parser]
# we replace unicode spaces in query strings, except if they are quoted
# internal issue 2224 found that this doesn't work properly for double-dollar quoting
# lhs is regular space, rhs is a wider unicode space, so this should be false
#query I
#select $$ $$ = $$ $$;
#----
#false
query I
select $tag$ $tag$ = $tag$ $tag$;
----
false
# worked properly before for these quotes
query I
select ' ' = ' ';
----
false
# just checking if parsing didn't break by fixing the dollar thing
query I
select $$$$ = '';
----
true
query I
select $tag$$tag$ = '';
----
true
query I
select '' = $$$$;
----
true
query I
select '' = $tag$$tag$;
----
true
query I
select $$ $$ = $$ $$ or ' ' = ' ';
----
false
query I
select $tag$ $tag$ = $tag$ $tag$ or ' ' = ' ';
----
false
query I
select ' ' = ' ' or $$ $$ = $$ $$;
----
false
query I
select ' ' = ' ' or $tag$ $tag$ = $tag$ $tag$;
----
false
# we can nest dollars if tags don't match
query I
select $tag$ $duck$ $tag$ = $tag$ $duck$ $tag$;
----
false
# of course we have to try this too
query I
select $🦆$du ck$🦆$ = $🦆$du ck$🦆$;
----
false
# and some more unicode
query I
select $ü$x x$ü$ = $ü$x x$ü$;
----
false

View File

@@ -0,0 +1,20 @@
# name: test/sql/parser/expression_depth_limit.test
# description: Test max expression depth limit
# group: [parser]
statement ok
SELECT (1+(1+(1+(1+(1+(1+(1+1)))))));
statement ok
SET max_expression_depth TO 7;
statement error
SELECT (1+(1+(1+(1+(1+(1+(1+1)))))));
----
expression depth limit
statement ok
SET max_expression_depth TO 1000;
statement ok
SELECT (1+(1+(1+(1+(1+(1+(1+1)))))));

View File

@@ -0,0 +1,73 @@
# name: test/sql/parser/from_first.test
# description: Test FROM first
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers(i INTEGER);
statement ok
INSERT INTO integers VALUES (1), (2), (3), (NULL);
query I
FROM integers
----
1
2
3
NULL
query I
FROM integers SELECT i + 1
----
2
3
4
NULL
query I
FROM integers LIMIT 2
----
1
2
query I
FROM integers WHERE i IS NOT NULL
----
1
2
3
query I
FROM integers ORDER BY i DESC NULLS FIRST
----
NULL
3
2
1
query I
FROM integers SELECT DISTINCT i%2 WHERE i>0 ORDER BY ALL
----
0
1
query II
FROM integers SELECT i%2 AS g, SUM(i) sum GROUP BY g HAVING sum IS NOT NULL ORDER BY ALL
----
0 2
1 4
query I rowsort
FROM integers JOIN integers i2 USING (i)
----
1
2
3
query I
FROM integers i1, integers i2 SELECT COUNT(*)
----
16

View File

@@ -0,0 +1,111 @@
# name: test/sql/parser/function_chaining.test
# description: Test function chaining
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE varchars(v VARCHAR);
statement ok
INSERT INTO varchars VALUES ('Hello'), ('World')
statement error
SELECT x.lower() FROM varchars
----
not found in FROM clause
# conflict
statement error
SELECT main.lower() FROM varchars AS t(main)
----
No function matches the given name and argument types
query I
SELECT v.lower() FROM varchars
----
hello
world
query I
SELECT (v).lower() FROM varchars
----
hello
world
statement error
SELECT v.lowe() FROM varchars
----
Function with name lowe does not exist
query I
SELECT varchars.v.lower() FROM varchars
----
hello
world
query I
SELECT v.lower().upper() FROM varchars
----
HELLO
WORLD
query I
SELECT v.lower()[:3] FROM varchars
----
hel
wor
query I
SELECT v.lower()[:3] FROM varchars
----
hel
wor
statement ok
DELETE FROM varchars
statement ok
INSERT INTO varchars VALUES ('Hello World');
# list functions
query I
SELECT v.split(' ') FROM varchars
----
[Hello, World]
query I
SELECT v.split(' ').apply(lambda x: x.lower()) FROM varchars
----
[hello, world]
query I
SELECT v.split(' ').apply(lambda x: x.lower()).filter(lambda x: x[1] == 'h') FROM varchars
----
[hello]
query I
SELECT v.split(' ').length() FROM varchars
----
2
# list aggr
query I
SELECT v.split(' ').aggregate('count') FROM varchars
----
2
query I
SELECT v.split(' ').aggregate('min') FROM varchars
----
Hello
# prepared statements
statement ok
PREPARE v1 AS SELECT ?.split(' ')[1].lower()
query I
EXECUTE v1('Hello World')
----
hello

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
# name: test/sql/parser/indirection.test
# description: Test indirection
# group: [parser]
statement ok
PRAGMA enable_verification
# . after case
query I
select case when true then {'a': 42} end.a;
----
42
# brackets after ARRAY constant
query I
select [42][1];
----
42
query I
select array[42][1];
----
42
# brackets after list comprehension
query I
select [a for a in [42, 84]][1];
----
42
statement ok
prepare v1 as select $1[1];
query I
execute v1([42]);
----
42

View File

@@ -0,0 +1,69 @@
# name: test/sql/parser/invisible_spaces.test
# description: Test invisible spaces
# group: [parser]
statement ok
PRAGMA enable_verification
# non-breaking space
query I
SELECT 42;
----
42
# test all special unicode spaces
# see https://jkorpela.fi/chars/spaces.html for a list
foreach unicode_space       
query I
SELECT${unicode_space}42;
----
42
# unicode space in strings are not modified
query I
SELECT${unicode_space}strlen('${unicode_space}')>=2;
----
true
# unicode spaces in strings with escaped quotes
query I
SELECT${unicode_space}strlen(' ''${unicode_space}')>=4;
----
true
# unicode space in comment
query I
SELECT${unicode_space} -- ${unicode_space};
42
----
42
# multiple unicode spaces
query I
SELECT${unicode_space}42${unicode_space}${unicode_space}${unicode_space}${unicode_space}${unicode_space}
----
42
# invisible space in identifiers
query I
SELECT a${unicode_space} FROM (SELECT 42) t(a);
----
42
endloop
# the query can still fail even after replacing unicode spaces
statement error
SELEC 
----
<REGEX>:.*Parser Error.*syntax error.*
# only a unicode space
statement ok
 
statement error
S
----
<REGEX>:.*Parser Error.*syntax error.*

View File

@@ -0,0 +1,42 @@
# name: test/sql/parser/join_alias.test
# description: Fix #10685: JOIN clause can be aliased, but alias cannot be referenced
# group: [parser]
statement ok
PRAGMA enable_verification
query II rowsort
select t.*
from (
(values (1), (2)) as t1 (a)
cross join
(values (3), (4)) as t2 (b)
) as t
----
1 3
1 4
2 3
2 4
# column alias
query II rowsort
select x, y
from (
(values (1), (2)) as t1 (a)
cross join
(values (3), (4)) as t2 (b)
) as t(x, y)
----
1 3
1 4
2 3
2 4
statement error
from (
(values (1), (2)) as t1 (a)
cross join
(values (3), (4)) as t2 (b)
) as t(x, y, z)
----
has 2 columns available but 3 columns specified

View File

@@ -0,0 +1,14 @@
# name: test/sql/parser/position_prepare.test
# description: Test prepared statement parameters in POSITION
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
PREPARE v1 AS SELECT POSITION(? in ?)
query I
EXECUTE v1('e', 'hello world')
----
2

View File

@@ -0,0 +1,69 @@
# name: test/sql/parser/star_expression.test
# description: Test star expression in different places
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers AS SELECT 42 i, 84 j UNION ALL SELECT 13, 14
statement error
SELECT * FROM integers WHERE *
----
Use COLUMNS(*) instead
statement error
SELECT * FROM integers WHERE * IS NOT NULL
----
Use COLUMNS(*) instead
query II
SELECT * FROM integers WHERE COLUMNS(*) IS NULL ORDER BY ALL
----
statement error
SELECT * FROM integers GROUP BY COLUMNS(*)
----
not supported
statement error
SELECT * FROM integers GROUP BY * + 42
----
not supported
statement error
SELECT * FROM integers GROUP BY i HAVING * > 42
----
not supported
statement error
SELECT * FROM integers GROUP BY i HAVING COLUMNS(*)>42
----
not supported
query II
SELECT * FROM integers ORDER BY *, *
----
13 14
42 84
statement error
SELECT * FROM integers ORDER BY * + 42
----
cannot be applied to a star expression
statement error
INSERT INTO integers VALUES (*, *)
----
not supported
statement error
VALUES (*)
----
not supported
statement error
FROM read_csv(*, *);
----
not supported

View File

@@ -0,0 +1,51 @@
# name: test/sql/parser/table_at_clause.test
# description: Test table AT (TIMESTAMP => ...)
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE tbl(i INTEGER)
statement error
SELECT * FROM tbl AT (TIMESTAMP => TIMESTAMP '2020-01-01')
----
Catalog type does not support time travel
statement error
SELECT * FROM tbl AT (VERSION => 42)
----
Catalog type does not support time travel
statement error
SELECT * FROM tbl t(c1, c2) AT (TIMESTAMP => '2020-01-01')
----
Catalog type does not support time travel
statement ok
SET VARIABLE my_timestamp = TIMESTAMP '2020-01-01'
statement error
SELECT * FROM tbl AT (TIMESTAMP => getvariable('my_timestamp'))
----
Catalog type does not support time travel
require icu
require no_extension_autoloading "FIXME: TIMESTAMPTZ - INTERVAL"
statement error
SELECT * FROM tbl AT (TIMESTAMP => NOW() - INTERVAL '3 days')
----
Catalog type does not support time travel
statement error
SELECT * FROM tbl AT (TIMESTAMP => TIMESTAMP '2020-01-01' + a)
----
AT clause cannot contain column names
statement error
SELECT * FROM tbl AT (TIMESTAMP => (SELECT MIN(ts) FROM tbl))
----
AT clause cannot contain subqueries

View File

@@ -0,0 +1,108 @@
# name: test/sql/parser/test_columns.test
# description: Test the columns expression
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers AS SELECT 42 i, 84 j UNION ALL SELECT 13, 14
query II
SELECT COLUMNS(*) FROM integers
----
42 84
13 14
query IIII
SELECT MIN(COLUMNS(*)), MAX(COLUMNS(*)) FROM integers
----
13 14 42 84
query II
SELECT MIN(COLUMNS(* EXCLUDE (j))), MAX(COLUMNS(* EXCLUDE (i))) FROM integers
----
13 84
query II
SELECT MIN(COLUMNS(* REPLACE (i+j AS i))) FROM integers
----
27 14
query II
SELECT COLUMNS(*) + 1 FROM integers
----
43 85
14 15
# multiple COLUMNS work, as long as the star inside the columns is the same
query II
SELECT COLUMNS(*) + COLUMNS(*) FROM integers
----
84 168
26 28
# regex
statement ok
CREATE TABLE grouped_table AS SELECT 1 id, 42 index1, 84 index2 UNION ALL SELECT 2, 13, 14
statement error
SELECT COLUMNS('indxe.*') FROM grouped_table
----
"index1"
query III
SELECT id, MIN(COLUMNS('index[0-9]')) FROM grouped_table GROUP BY all ORDER BY ALL
----
1 42 84
2 13 14
# partial match
query III
SELECT id, MIN(COLUMNS('[0-9]')) FROM grouped_table GROUP BY all ORDER BY ALL
----
1 42 84
2 13 14
# regex without matches
statement error
SELECT id, MIN(COLUMNS('xxx')) FROM grouped_table GROUP BY all
----
# empty regex
statement error
SELECT MIN(COLUMNS('xxx')) FROM grouped_table
----
# invalid regex
statement error
SELECT MIN(COLUMNS('[asdadd')) FROM grouped_table
----
# multiple different COLUMNS statements in the same expression are not supported
statement error
SELECT COLUMNS(*) + COLUMNS(* EXCLUDE(j)) FROM integers
----
# COLUMNS in subquery without FROM clause
statement error
SELECT (SELECT COLUMNS(*)) FROM integers
----
statement error
SELECT columns(['a', null]) FROM values (42) t(a);
----
does not support NULL input parameters
# COLUMNS in order by clause
query III
SELECT * FROM grouped_table ORDER BY COLUMNS('index[0-9]');
----
2 13 14
1 42 84
query III
SELECT * FROM grouped_table ORDER BY COLUMNS(*);
----
1 42 84
2 13 14

View File

@@ -0,0 +1,145 @@
# name: test/sql/parser/test_columns_lists.test
# description: Test the columns expression with list comprehension
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers AS SELECT 42 i, 84 j UNION ALL SELECT 13, 14
query II
SELECT COLUMNS([x for x in *]) FROM integers
----
42 84
13 14
query I
SELECT COLUMNS([x for x in (*) if x <> 'i']) FROM integers
----
84
14
# short-hand, allow directly specifying the lambda
query I
SELECT COLUMNS(lambda x: x <> 'i') FROM integers
----
84
14
query I
SELECT COLUMNS([x for x in (*) if x SIMILAR TO 'i']) FROM integers
----
42
13
query I
SELECT COLUMNS(['i', 'i']) FROM integers
----
42
13
query I
SELECT COLUMNS(list_concat(['i'], ['i'])) FROM integers
----
42
13
# star with exclude
query I
SELECT COLUMNS([x for x in (* EXCLUDE (i))]) FROM integers
----
84
14
# multiple columns that are the same works
query I
SELECT COLUMNS(['i']) + COLUMNS(['i']) FROM integers
----
84
26
# columns must be returned as strings
statement error
SELECT COLUMNS([i, j]) FROM integers
----
COLUMNS expression can only contain lambda parameters
# nested columns
statement error
SELECT COLUMNS([x for x in COLUMNS(*)]) FROM integers
----
COLUMNS expression is not allowed inside another COLUMNS expression
statement error
SELECT COLUMNS(COLUMNS(*)) FROM integers
----
COLUMNS expression is not allowed inside another COLUMNS expression
statement error
SELECT * + 42 FROM integers
----
cannot be applied to a star expression
# empty lambda
statement error
SELECT COLUMNS([x for x in (*) if x = 'k']) FROM integers
----
resulted in an empty set of columns
# columns that are not found
statement error
SELECT COLUMNS(['k']) FROM integers
----
not found in the FROM clause
# COLUMNS and joins
query I rowsort
SELECT COLUMNS([x for x in (*) if x LIKE 'i']) FROM integers i1 JOIN integers i2 USING (i)
----
13
42
query II rowsort
SELECT COLUMNS([x for x in (*) if x LIKE 'i']) FROM integers i1 JOIN integers i2 ON (i1.i=i2.i)
----
13 13
42 42
# wrong parameter type
statement error
SELECT COLUMNS([43]) FROM integers
----
VARCHAR argument
statement error
SELECT COLUMNS([NULL]) FROM integers
----
VARCHAR argument
statement error
SELECT COLUMNS([]::VARCHAR[]) FROM integers
----
empty set of columns
statement error
SELECT COLUMNS(NULL::VARCHAR[]) FROM integers
----
empty set of columns
statement error
SELECT COLUMNS(NULL::VARCHAR) FROM integers
----
does not support NULL
# different columns
statement error
SELECT COLUMNS(['i']) + COLUMNS(['j']) FROM integers
----
Multiple different STAR/COLUMNS in the same expression are not supported
# star with replace
statement error
SELECT COLUMNS([x for x in (* REPLACE (i AS i))]) FROM integers
----
only allowed as the root element

View File

@@ -0,0 +1,61 @@
# name: test/sql/parser/test_columns_order.test
# description: Test the columns expression in the ORDER BY
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE tbl(col1 INTEGER, col2 INTEGER, col3 INTEGER);
statement ok
INSERT INTO tbl VALUES (1, 200, 10), (2, 100, 20), (3, 200, 0)
query III
SELECT * FROM tbl ORDER BY COLUMNS('col1|col3')
----
1 200 10
2 100 20
3 200 0
query III
SELECT * FROM tbl ORDER BY COLUMNS('col2|col3')
----
2 100 20
3 200 0
1 200 10
query III
SELECT * FROM tbl ORDER BY COLUMNS('col2|col3') DESC
----
1 200 10
3 200 0
2 100 20
query III
SELECT * FROM tbl ORDER BY COLUMNS('col2') DESC, COLUMNS('col3') ASC
----
3 200 0
1 200 10
2 100 20
query III
SELECT * FROM tbl ORDER BY COLUMNS(lambda x: x[-1] IN ('2', '3'))
----
2 100 20
3 200 0
1 200 10
# set ops
query III
FROM tbl UNION FROM tbl ORDER BY COLUMNS('col2|col3') DESC
----
1 200 10
3 200 0
2 100 20
statement error
SELECT * FROM tbl ORDER BY COLUMNS('xxxx')
----
No matching columns found that match regex

View File

@@ -0,0 +1,58 @@
# name: test/sql/parser/test_columns_prepared.test
# description: Test the columns expression
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
create or replace table my_table as
select 'test1' as column1, 1 as column2, 'quack' as column3
union all
select 'test2' as column1, 2 as column2, 'quacks' as column3
union all
select 'test3' as column1, 3 as column2, 'quacking' as column3
statement ok
prepare v1 as
select
COLUMNS(?)
from my_table
query I
EXECUTE v1('col.*1')
----
test1
test2
test3
query I
EXECUTE v1('col.*2')
----
1
2
3
query I
EXECUTE v1('col.*3')
----
quack
quacks
quacking
query II
EXECUTE v1(['column1', 'column2'])
----
test1 1
test2 2
test3 3
statement error
EXECUTE v1(NULL::VARCHAR)
----
does not support NULL
statement error
EXECUTE v1(42)
----
VARCHAR argument

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

View File

@@ -0,0 +1,54 @@
# name: test/sql/parser/test_columns_where.test
# description: Test the columns expression in the WHERE clause
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE tbl(col1 INTEGER, col2 INTEGER, col3 INTEGER);
statement ok
INSERT INTO tbl VALUES (1, 200, 10), (2, 100, 20), (3, 200, 0)
query III
SELECT * FROM tbl WHERE COLUMNS(*) >= 2 ORDER BY ALL
----
2 100 20
query III
SELECT * FROM tbl WHERE COLUMNS(['col1', 'col2']) >= 2 ORDER BY ALL
----
2 100 20
3 200 0
query III
SELECT * FROM tbl WHERE COLUMNS(['col1', 'col2']) >= 2 AND COLUMNS(*) IS NOT NULL ORDER BY ALL
----
2 100 20
3 200 0
query III
SELECT * FROM tbl WHERE COLUMNS(['col1', 'col2']) >= 2 AND COLUMNS(['col1', 'col3']) < 10 ORDER BY ALL
----
3 200 0
statement error
SELECT * FROM tbl WHERE COLUMNS(['nonexistent']) >= 2 ORDER BY ALL
----
nonexistent
statement error
SELECT * FROM tbl WHERE COLUMNS(* EXCLUDE (col1, col2, col3)) >= 2 ORDER BY ALL
----
empty set of columns
statement error
SELECT * FROM tbl WHERE * ORDER BY ALL
----
STAR expression is not allowed in the WHERE clause
statement error
SELECT * FROM tbl WHERE * >= 2 ORDER BY ALL
----
Use COLUMNS(*) instead

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,73 @@
# name: test/sql/parser/test_operator_precedence.test
# description: Test operator precedence
# group: [parser]
statement ok
PRAGMA enable_verification
# basic arithmetic precedence
query I
SELECT 2*3+1
----
7
query I
SELECT 1+2*3
----
7
# ** precedence (issue 3561)
query I
SELECT 2^2 + 1;
----
5
query I
SELECT 2**2 + 1;
----
5
query I
SELECT 1+2**2;
----
5
query I
SELECT 1+2^2;
----
5
query I
SELECT 2**4 / 2;
----
8
query I
SELECT 2**(4 / 2);
----
4
query I
SELECT 16/2**4;
----
1
query I
SELECT (16/2)**4;
----
4096
query I
SELECT 2**3**2;
----
64
query I
SELECT 2^3**2;
----
64
query I
SELECT 2**3^2;
----
64

View File

@@ -0,0 +1,79 @@
# name: test/sql/parser/test_value_functions.test
# description: Test SQL value functions
# group: [parser]
require no_extension_autoloading "FIXME: Unimplemented type for cast (TIMESTAMP WITH TIME ZONE -> DATE)"
statement ok
PRAGMA enable_verification
# by default these columns can be used as per usual
query I
SELECT user FROM (VALUES ('hello world')) t(user)
----
hello world
# if the column is not found they are turned into the SQL value function
query I
SELECT user
----
duckdb
query I
SELECT UsEr
----
duckdb
# Issue #10363 - we also prefer table-as-struct over value functions
query I
SELECT user FROM (VALUES (42)) user(x)
----
{'x': 42}
# run all SQL value functions
# need to run without verification since CURRENT_TIME etc break verification
statement ok
PRAGMA disable_verification
require icu
foreach value_function current_catalog current_date current_schema current_role current_time current_timestamp current_user localtime localtimestamp session_user user
statement ok
SELECT ${value_function}
endloop
statement error
SELECT useRrr
----
useRrr
# value function in having
query II
select
1 as one,
max(cast('1000-05-01 00:00:00' as timestamp)) as mt
group by one
having max(cast('1000-05-01 00:00:00' as timestamp)) <= current_timestamp;
----
1 1000-05-01 00:00:00
query II
select a as "b", "b" + 1 from (VALUES (84), (42)) t(a) ORDER BY ALL;
----
42 43
84 85
# value function conflict in ORDER BY
query I
select a as "CURRENT_TIMESTAMP" from (VALUES (84), (42)) t(a) order by "CURRENT_TIMESTAMP" + 1;
----
42
84
# value function conflict in WHERE
query I
select a as localtime from (VALUES ('2018-01-01'), ('2022-01-01')) t(a) where localtime >= '2020-01-01'
----
2022-01-01

View File

@@ -0,0 +1,79 @@
# name: test/sql/parser/trailing_commas.test
# description: Test trailing commas
# group: [parser]
statement ok
PRAGMA enable_verification
query I
SELECT 42,
----
42
query II
SELECT 42,
84,
----
42 84
query II
SELECT DISTINCT 42,
84,
----
42 84
query I
VALUES (42,)
----
42
query I
VALUES (42,),
----
42
query I
SELECT * FROM (VALUES (42,))
----
42
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER,);
statement ok
INSERT INTO integers VALUES (42, 84,),;
query II
SELECT * FROM integers,
----
42 84
query II
SELECT i, SUM(j) FROM integers GROUP BY i,
----
42 84
statement ok
UPDATE integers SET i=100,
query I
SELECT i FROM integers
----
100
# lists
query I
SELECT [1,]
----
[1]
query I
SELECT ARRAY[1,]
----
[1]
# structs
query I
SELECT {'a': 42, 'b': 84,}
----
{'a': 42, 'b': 84}

View File

@@ -0,0 +1,16 @@
# name: test/sql/parser/unreserved_keyword_casing.test
# description: Issue #6092 - Unreserved keywords used as column names don't retain their casing
# group: [parser]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE people(Name VARCHAR, STATE VARCHAR, Country VARCHAR);
query IIIIII
DESCRIBE people
----
Name VARCHAR YES NULL NULL NULL
STATE VARCHAR YES NULL NULL NULL
Country VARCHAR YES NULL NULL NULL

View File

@@ -0,0 +1,16 @@
# name: test/sql/parser/values_list_without_brackets.test
# description: Test values list without brackets
# group: [parser]
statement ok
PRAGMA enable_verification
query I
SELECT * FROM values (42) t;
----
42
query II
SELECT * FROM values (42) t, values (84) x;
----
42 84