should be it
This commit is contained in:
110
external/duckdb/test/sql/parser/columns_aliases.test
vendored
Normal file
110
external/duckdb/test/sql/parser/columns_aliases.test
vendored
Normal 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
|
||||
31
external/duckdb/test/sql/parser/columns_issue9867.test
vendored
Normal file
31
external/duckdb/test/sql/parser/columns_issue9867.test
vendored
Normal 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
|
||||
311
external/duckdb/test/sql/parser/digit_separators.test
vendored
Normal file
311
external/duckdb/test/sql/parser/digit_separators.test
vendored
Normal 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
|
||||
37
external/duckdb/test/sql/parser/division_operator_precedence.test
vendored
Normal file
37
external/duckdb/test/sql/parser/division_operator_precedence.test
vendored
Normal 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
|
||||
81
external/duckdb/test/sql/parser/dollar_quotes_internal_issue2224.test
vendored
Normal file
81
external/duckdb/test/sql/parser/dollar_quotes_internal_issue2224.test
vendored
Normal 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
|
||||
20
external/duckdb/test/sql/parser/expression_depth_limit.test
vendored
Normal file
20
external/duckdb/test/sql/parser/expression_depth_limit.test
vendored
Normal 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)))))));
|
||||
73
external/duckdb/test/sql/parser/from_first.test
vendored
Normal file
73
external/duckdb/test/sql/parser/from_first.test
vendored
Normal 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
|
||||
111
external/duckdb/test/sql/parser/function_chaining.test
vendored
Normal file
111
external/duckdb/test/sql/parser/function_chaining.test
vendored
Normal 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
|
||||
8
external/duckdb/test/sql/parser/giant_query.test_slow
vendored
Normal file
8
external/duckdb/test/sql/parser/giant_query.test_slow
vendored
Normal file
File diff suppressed because one or more lines are too long
37
external/duckdb/test/sql/parser/indirection.test
vendored
Normal file
37
external/duckdb/test/sql/parser/indirection.test
vendored
Normal 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
|
||||
69
external/duckdb/test/sql/parser/invisible_spaces.test
vendored
Normal file
69
external/duckdb/test/sql/parser/invisible_spaces.test
vendored
Normal 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.*
|
||||
42
external/duckdb/test/sql/parser/join_alias.test
vendored
Normal file
42
external/duckdb/test/sql/parser/join_alias.test
vendored
Normal 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
|
||||
14
external/duckdb/test/sql/parser/position_prepare.test
vendored
Normal file
14
external/duckdb/test/sql/parser/position_prepare.test
vendored
Normal 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
|
||||
69
external/duckdb/test/sql/parser/star_expression.test
vendored
Normal file
69
external/duckdb/test/sql/parser/star_expression.test
vendored
Normal 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
|
||||
51
external/duckdb/test/sql/parser/table_at_clause.test
vendored
Normal file
51
external/duckdb/test/sql/parser/table_at_clause.test
vendored
Normal 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
|
||||
108
external/duckdb/test/sql/parser/test_columns.test
vendored
Normal file
108
external/duckdb/test/sql/parser/test_columns.test
vendored
Normal 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
|
||||
145
external/duckdb/test/sql/parser/test_columns_lists.test
vendored
Normal file
145
external/duckdb/test/sql/parser/test_columns_lists.test
vendored
Normal 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
|
||||
61
external/duckdb/test/sql/parser/test_columns_order.test
vendored
Normal file
61
external/duckdb/test/sql/parser/test_columns_order.test
vendored
Normal 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
|
||||
58
external/duckdb/test/sql/parser/test_columns_prepared.test
vendored
Normal file
58
external/duckdb/test/sql/parser/test_columns_prepared.test
vendored
Normal 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
|
||||
287
external/duckdb/test/sql/parser/test_columns_unpacked.test
vendored
Normal file
287
external/duckdb/test/sql/parser/test_columns_unpacked.test
vendored
Normal 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
|
||||
54
external/duckdb/test/sql/parser/test_columns_where.test
vendored
Normal file
54
external/duckdb/test/sql/parser/test_columns_where.test
vendored
Normal 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
|
||||
13
external/duckdb/test/sql/parser/test_long_error.test
vendored
Normal file
13
external/duckdb/test/sql/parser/test_long_error.test
vendored
Normal file
File diff suppressed because one or more lines are too long
73
external/duckdb/test/sql/parser/test_operator_precedence.test
vendored
Normal file
73
external/duckdb/test/sql/parser/test_operator_precedence.test
vendored
Normal 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
|
||||
79
external/duckdb/test/sql/parser/test_value_functions.test
vendored
Normal file
79
external/duckdb/test/sql/parser/test_value_functions.test
vendored
Normal 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
|
||||
79
external/duckdb/test/sql/parser/trailing_commas.test
vendored
Normal file
79
external/duckdb/test/sql/parser/trailing_commas.test
vendored
Normal 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}
|
||||
16
external/duckdb/test/sql/parser/unreserved_keyword_casing.test
vendored
Normal file
16
external/duckdb/test/sql/parser/unreserved_keyword_casing.test
vendored
Normal 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
|
||||
16
external/duckdb/test/sql/parser/values_list_without_brackets.test
vendored
Normal file
16
external/duckdb/test/sql/parser/values_list_without_brackets.test
vendored
Normal 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
|
||||
Reference in New Issue
Block a user