should be it
This commit is contained in:
35
external/duckdb/test/sql/prepared/invalid_prepare.test
vendored
Normal file
35
external/duckdb/test/sql/prepared/invalid_prepare.test
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
# name: test/sql/prepared/invalid_prepare.test
|
||||
# description: Test invalid prepare statements
|
||||
# group: [prepared]
|
||||
|
||||
# cannot execute a statement with prepared statement parameters
|
||||
statement error
|
||||
select ?;
|
||||
----
|
||||
|
||||
# cannot create a view with prepared statement parameters
|
||||
statement error
|
||||
create view v1 as select ?;
|
||||
----
|
||||
|
||||
# start with a higher index than 1
|
||||
statement ok
|
||||
prepare v1 as select $2::int;
|
||||
|
||||
statement error
|
||||
execute v1(0);
|
||||
----
|
||||
|
||||
# cannot cast from varchar to int
|
||||
statement ok
|
||||
prepare v2 as select $1::int;
|
||||
|
||||
statement error
|
||||
execute v2('hello');
|
||||
----
|
||||
|
||||
statement ok
|
||||
prepare v3 as select $1::int where 1=0;
|
||||
|
||||
statement ok
|
||||
execute v3(1);
|
||||
39
external/duckdb/test/sql/prepared/parameter_variants.test
vendored
Normal file
39
external/duckdb/test/sql/prepared/parameter_variants.test
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
# name: test/sql/prepared/parameter_variants.test
|
||||
# description: Test parameter variants
|
||||
# group: [prepared]
|
||||
|
||||
# question mark as parameter
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT CAST(? AS INTEGER), CAST(? AS STRING)
|
||||
|
||||
query II
|
||||
EXECUTE s1(42, 'dpfkg')
|
||||
----
|
||||
42 dpfkg
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s1
|
||||
|
||||
# question mark with indicator
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT CAST(?1 AS INTEGER), CAST(?2 AS STRING)
|
||||
|
||||
query II
|
||||
EXECUTE s1(42, 'dpfkg')
|
||||
----
|
||||
42 dpfkg
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s1
|
||||
|
||||
# question mark with indicator reversed
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT CAST(?2 AS INTEGER), CAST(?1 AS STRING)
|
||||
|
||||
query II
|
||||
EXECUTE s1('dpfkg', 42)
|
||||
----
|
||||
42 dpfkg
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s1
|
||||
37
external/duckdb/test/sql/prepared/prepare_copy.test
vendored
Normal file
37
external/duckdb/test/sql/prepared/prepare_copy.test
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
# name: test/sql/prepared/prepare_copy.test
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
PREPARE q1 AS
|
||||
COPY (
|
||||
select $1 as 'col'
|
||||
) to '__TEST_DIR__/res.csv' (
|
||||
FORMAT csv
|
||||
);
|
||||
|
||||
statement ok
|
||||
execute q1 (42);
|
||||
|
||||
query I
|
||||
select i from '__TEST_DIR__/res.csv' tbl(i);
|
||||
----
|
||||
42
|
||||
|
||||
statement ok
|
||||
PREPARE q2 AS
|
||||
COPY (
|
||||
select 42 as 'col'
|
||||
) to $1 (
|
||||
FORMAT csv
|
||||
);
|
||||
|
||||
statement ok
|
||||
EXECUTE q2('__TEST_DIR__/res2.csv')
|
||||
|
||||
query I
|
||||
select i from '__TEST_DIR__/res2.csv' tbl(i);
|
||||
----
|
||||
42
|
||||
280
external/duckdb/test/sql/prepared/prepare_default_varchar.test
vendored
Normal file
280
external/duckdb/test/sql/prepared/prepare_default_varchar.test
vendored
Normal file
@@ -0,0 +1,280 @@
|
||||
# name: test/sql/prepared/prepare_default_varchar.test
|
||||
# description: Prepared parameters default to VARCHAR if the type could not be deduced
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
# single unbound parameter
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT ?
|
||||
|
||||
query I
|
||||
EXECUTE v1(27)
|
||||
----
|
||||
27
|
||||
|
||||
query I
|
||||
EXECUTE v1('hello world')
|
||||
----
|
||||
hello world
|
||||
|
||||
query I
|
||||
EXECUTE v1([1, 2, 3])
|
||||
----
|
||||
[1, 2, 3]
|
||||
|
||||
# comparison between two parameters
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT ?=?
|
||||
|
||||
query I
|
||||
EXECUTE v2(27, 27)
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
EXECUTE v2('hello world', 'hello mars')
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v2(1, 1.0)
|
||||
----
|
||||
true
|
||||
|
||||
#is true now string to list casting is implemented
|
||||
query I
|
||||
EXECUTE v2([1, 2, 3], '[1, 2, 3]')
|
||||
----
|
||||
true
|
||||
|
||||
statement error
|
||||
EXECUTE v2([[1, 2, 3]], [1, 2, 3])
|
||||
----
|
||||
|
||||
# unbound parameter in scalar subquery
|
||||
statement ok
|
||||
PREPARE v3 AS SELECT (SELECT ?)
|
||||
|
||||
query I
|
||||
EXECUTE v3(27)
|
||||
----
|
||||
27
|
||||
|
||||
query I
|
||||
EXECUTE v3('hello world')
|
||||
----
|
||||
hello world
|
||||
|
||||
query I
|
||||
EXECUTE v3([1, 2, 3])
|
||||
----
|
||||
[1, 2, 3]
|
||||
|
||||
# unbound parameter with IS NULL
|
||||
statement ok
|
||||
PREPARE v4 AS SELECT ? IS NULL
|
||||
|
||||
query I
|
||||
EXECUTE v4(27)
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v4('hello world')
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v4(NULL)
|
||||
----
|
||||
true
|
||||
|
||||
# unbound parameter with IN list
|
||||
statement ok
|
||||
PREPARE v5 AS SELECT ? IN (?, ?)
|
||||
|
||||
query I
|
||||
EXECUTE v5(27, 27, 28)
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
EXECUTE v5('hello world', 'hello', 'world')
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v5(NULL, 27, 28)
|
||||
----
|
||||
NULL
|
||||
|
||||
# unbound parameter with COUNT
|
||||
statement ok
|
||||
PREPARE v6 AS SELECT COUNT(?)
|
||||
|
||||
query I
|
||||
EXECUTE v6(27)
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
EXECUTE v6('hello world')
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
EXECUTE v6(NULL)
|
||||
----
|
||||
0
|
||||
|
||||
# unbound parameter with printf
|
||||
statement ok
|
||||
PREPARE v7 AS SELECT printf('%s: %d', ?, ?)
|
||||
|
||||
query I
|
||||
EXECUTE v7('time', 27)
|
||||
----
|
||||
time: 27
|
||||
|
||||
statement error
|
||||
EXECUTE v7('hello world', [1, 2, 3])
|
||||
----
|
||||
|
||||
# unbound parameter with lists
|
||||
statement ok
|
||||
PREPARE v8 AS SELECT [?]
|
||||
|
||||
query I
|
||||
EXECUTE v8(27)
|
||||
----
|
||||
[27]
|
||||
|
||||
query I
|
||||
EXECUTE v8('hello world')
|
||||
----
|
||||
[hello world]
|
||||
|
||||
query I
|
||||
EXECUTE v8(NULL)
|
||||
----
|
||||
[NULL]
|
||||
|
||||
# unbound parameter with lists and NULL
|
||||
statement ok
|
||||
PREPARE v9 AS SELECT [?, NULL]
|
||||
|
||||
query I
|
||||
EXECUTE v9(27)
|
||||
----
|
||||
[27, NULL]
|
||||
|
||||
query I
|
||||
EXECUTE v9('hello world')
|
||||
----
|
||||
[hello world, NULL]
|
||||
|
||||
query I
|
||||
EXECUTE v9(NULL)
|
||||
----
|
||||
[NULL, NULL]
|
||||
|
||||
# unbound parameter with structs
|
||||
statement ok
|
||||
PREPARE v10 AS SELECT {'x': ?}
|
||||
|
||||
query I
|
||||
EXECUTE v10(27)
|
||||
----
|
||||
{'x': 27}
|
||||
|
||||
query I
|
||||
EXECUTE v10('hello world')
|
||||
----
|
||||
{'x': hello world}
|
||||
|
||||
query I
|
||||
EXECUTE v10(NULL)
|
||||
----
|
||||
{'x': NULL}
|
||||
|
||||
# unbound parameter with structs and NULL
|
||||
statement ok
|
||||
PREPARE v11 AS SELECT {'x': ?, 'y': NULL}
|
||||
|
||||
query I
|
||||
EXECUTE v11(27)
|
||||
----
|
||||
{'x': 27, 'y': NULL}
|
||||
|
||||
query I
|
||||
EXECUTE v11('hello world')
|
||||
----
|
||||
{'x': hello world, 'y': NULL}
|
||||
|
||||
query I
|
||||
EXECUTE v11(NULL)
|
||||
----
|
||||
{'x': NULL, 'y': NULL}
|
||||
|
||||
# values list
|
||||
statement ok
|
||||
PREPARE v12 AS SELECT * FROM (VALUES (?, ?), (?, ?)) tbl(i, j)
|
||||
|
||||
query II
|
||||
EXECUTE v12(27, 28, 29, 30)
|
||||
----
|
||||
27 28
|
||||
29 30
|
||||
|
||||
query II
|
||||
EXECUTE v12('hello', 'world', 'a', NULL)
|
||||
----
|
||||
hello world
|
||||
a NULL
|
||||
|
||||
# case
|
||||
statement ok
|
||||
PREPARE v13 AS SELECT CASE WHEN ? THEN ? ELSE ? END
|
||||
|
||||
query I
|
||||
EXECUTE v13(1=1, 1, 2)
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
EXECUTE v13(1=0, 'hello', 'world')
|
||||
----
|
||||
world
|
||||
|
||||
# parameter and null
|
||||
statement ok
|
||||
PREPARE v14 AS SELECT ?+NULL
|
||||
|
||||
query I
|
||||
EXECUTE v14(1)
|
||||
----
|
||||
NULL
|
||||
|
||||
statement ok
|
||||
PREPARE v15 AS SELECT ?=NULL
|
||||
|
||||
query I
|
||||
EXECUTE v15(1)
|
||||
----
|
||||
NULL
|
||||
|
||||
# issue #2125
|
||||
statement ok
|
||||
PREPARE v16 AS SELECT CASE WHEN (? = 1) AND (? = 2) AND (? = 3) AND ((? IS NULL)) THEN 1.5 ELSE 2.5 END AS a
|
||||
|
||||
query I
|
||||
EXECUTE v16(1, 2, 3, NULL)
|
||||
----
|
||||
1.5
|
||||
|
||||
query I
|
||||
EXECUTE v16(1, 2, 4, NULL)
|
||||
----
|
||||
2.5
|
||||
19
external/duckdb/test/sql/prepared/prepare_from_first.test
vendored
Normal file
19
external/duckdb/test/sql/prepared/prepare_from_first.test
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# name: test/sql/prepared/prepare_from_first.test
|
||||
# description: Test IN with a single NULL element
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification
|
||||
|
||||
statement ok
|
||||
prepare fromFirst as from (select ? fromV) select ? selectV,*;
|
||||
|
||||
query II
|
||||
execute fromFirst('from', 'sel');
|
||||
----
|
||||
sel from
|
||||
|
||||
query II
|
||||
from (select 'from' fromV) select 'sel' selectV,*;
|
||||
----
|
||||
sel from
|
||||
17
external/duckdb/test/sql/prepared/prepare_in.test
vendored
Normal file
17
external/duckdb/test/sql/prepared/prepare_in.test
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# name: test/sql/prepared/prepare_in.test
|
||||
# description: Test IN with a single NULL element
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification
|
||||
|
||||
statement ok
|
||||
create table test(id varchar);
|
||||
|
||||
statement ok
|
||||
prepare p as delete from test where ("id") in ((?));
|
||||
|
||||
query I
|
||||
execute p(null);
|
||||
----
|
||||
0
|
||||
53
external/duckdb/test/sql/prepared/prepare_lambda.test
vendored
Normal file
53
external/duckdb/test/sql/prepared/prepare_lambda.test
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
# name: test/sql/prepared/prepare_lambda.test
|
||||
# description: PREPARE of lambda functions
|
||||
# group: [prepared]
|
||||
|
||||
# list_transform
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT list_transform(?, lambda x: x + 1)
|
||||
|
||||
query I
|
||||
EXECUTE v1([1, 2, 3])
|
||||
----
|
||||
[2, 3, 4]
|
||||
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT list_transform([1, 2, 3], lambda x: x + ?)
|
||||
|
||||
query I
|
||||
EXECUTE v2(1)
|
||||
----
|
||||
[2, 3, 4]
|
||||
|
||||
statement ok
|
||||
PREPARE v3 AS SELECT list_transform(?, lambda x: x + ? + ?)
|
||||
|
||||
query I
|
||||
EXECUTE v3([1, 2, 3], 1, 1)
|
||||
----
|
||||
[3, 4, 5]
|
||||
|
||||
# list_filter
|
||||
statement ok
|
||||
PREPARE v4 AS SELECT list_filter(?, lambda x: x > 1)
|
||||
|
||||
query I
|
||||
EXECUTE v4([1, 2, 3])
|
||||
----
|
||||
[2, 3]
|
||||
|
||||
statement ok
|
||||
PREPARE v5 AS SELECT list_filter([1, 2, 3], lambda x: x > ?)
|
||||
|
||||
query I
|
||||
EXECUTE v5(1)
|
||||
----
|
||||
[2, 3]
|
||||
|
||||
statement ok
|
||||
PREPARE v6 AS SELECT list_filter(?, lambda x: x > ? AND ?)
|
||||
|
||||
query I
|
||||
EXECUTE v6([1, 2, 3], 1, True)
|
||||
----
|
||||
[2, 3]
|
||||
55
external/duckdb/test/sql/prepared/prepare_list_functions.test
vendored
Normal file
55
external/duckdb/test/sql/prepared/prepare_list_functions.test
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
# name: test/sql/prepared/prepare_list_functions.test
|
||||
# description: PREPARE of various LIST functions
|
||||
# group: [prepared]
|
||||
|
||||
# list_aggregate
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT list_aggregate(?, 'min')
|
||||
|
||||
query I
|
||||
EXECUTE v1([1, 2, 3])
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
EXECUTE v1(['hello', 'world'])
|
||||
----
|
||||
hello
|
||||
|
||||
|
||||
query I
|
||||
EXECUTE v1(NULL::INT[])
|
||||
----
|
||||
NULL
|
||||
|
||||
# array_slice
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT array_slice(?, 1, 2);
|
||||
|
||||
query I
|
||||
EXECUTE v2([1, 2, 3]);
|
||||
----
|
||||
[1, 2]
|
||||
|
||||
query I
|
||||
EXECUTE v2('123');
|
||||
----
|
||||
12
|
||||
|
||||
# flatten
|
||||
statement ok
|
||||
PREPARE v3 AS SELECT flatten(?)
|
||||
|
||||
query I
|
||||
EXECUTE v3([[1,2,3],[4,5]]);
|
||||
----
|
||||
[1, 2, 3, 4, 5]
|
||||
|
||||
# list_extract
|
||||
statement ok
|
||||
PREPARE v4 AS SELECT list_extract(?, 2)
|
||||
|
||||
query I
|
||||
EXECUTE v4([1, 2, 3]);
|
||||
----
|
||||
2
|
||||
36
external/duckdb/test/sql/prepared/prepare_maintain_types.test
vendored
Normal file
36
external/duckdb/test/sql/prepared/prepare_maintain_types.test
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
# name: test/sql/prepared/prepare_maintain_types.test
|
||||
# description: Maintain PREPARE parameter types
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
prepare v1 as select cast(111 as short) * $1;
|
||||
|
||||
# literals adapt to the type
|
||||
statement error
|
||||
execute v1(1665);
|
||||
----
|
||||
Overflow
|
||||
|
||||
statement error
|
||||
execute v1('1665');
|
||||
----
|
||||
Overflow
|
||||
|
||||
# explicit casts force the type to be used
|
||||
statement error
|
||||
execute v1('1665'::VARCHAR);
|
||||
----
|
||||
No function matches the given name and argument types
|
||||
|
||||
query I
|
||||
execute v1(1665::BIGINT);
|
||||
----
|
||||
184815
|
||||
|
||||
statement error
|
||||
execute v1(1665::SHORT);
|
||||
----
|
||||
Overflow
|
||||
87
external/duckdb/test/sql/prepared/prepare_mixed_types.test
vendored
Normal file
87
external/duckdb/test/sql/prepared/prepare_mixed_types.test
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
# name: test/sql/prepared/prepare_mixed_types.test
|
||||
# description: Prepared parameters with mixed types
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
# first type up-casts to second type
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT $1::INT, $1::BIGINT
|
||||
|
||||
query II
|
||||
EXECUTE v1(42)
|
||||
----
|
||||
42 42
|
||||
|
||||
# second type up-casts to second type
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT $1::BIGINT, $1::INT
|
||||
|
||||
query II
|
||||
EXECUTE v2(42)
|
||||
----
|
||||
42 42
|
||||
|
||||
# no conversion possible between types
|
||||
statement ok
|
||||
PREPARE v3 AS SELECT $1::BIGINT, $1::UBIGINT
|
||||
|
||||
query II
|
||||
EXECUTE v3(42)
|
||||
----
|
||||
42 42
|
||||
|
||||
statement error
|
||||
EXECUTE v3(-1)
|
||||
----
|
||||
|
||||
# mixed varchar types
|
||||
statement ok
|
||||
PREPARE v4 AS SELECT $1::VARCHAR, $1::DATE
|
||||
|
||||
query II
|
||||
EXECUTE v4('1992-01-01')
|
||||
----
|
||||
1992-01-01 1992-01-01
|
||||
|
||||
# multiple scattered upcasts
|
||||
statement ok
|
||||
PREPARE v5 AS SELECT $1::INT, $1::BIGINT, $1::TINYINT, $1::HUGEINT, $1::SMALLINT
|
||||
|
||||
query IIIII
|
||||
EXECUTE v5(42)
|
||||
----
|
||||
42 42 42 42 42
|
||||
|
||||
# multiple scattered up-casts plus no up-cast possible in the end
|
||||
statement ok
|
||||
PREPARE v6 AS SELECT $1::INT, $1::BIGINT, $1::TINYINT, $1::UBIGINT, $1::SMALLINT, $1::UHUGEINT
|
||||
|
||||
query IIIIII
|
||||
EXECUTE v6(42)
|
||||
----
|
||||
42 42 42 42 42 42
|
||||
|
||||
# concat
|
||||
statement ok
|
||||
PREPARE v7 AS SELECT CONCAT($1::TINYINT, $1)
|
||||
|
||||
query I
|
||||
EXECUTE v7(42)
|
||||
----
|
||||
4242
|
||||
|
||||
# complex prepare with mixed types
|
||||
statement ok
|
||||
PREPARE v8 AS SELECT * FROM (values ('body')) t(field) WHERE CASE WHEN $1 IS NULL THEN 1 ELSE field IN (SELECT * FROM (SELECT UNNEST(string_split($1, ','))) AS fsq) END
|
||||
|
||||
statement ok
|
||||
EXECUTE v8('body')
|
||||
|
||||
# mixed types with unnest
|
||||
statement ok
|
||||
PREPARE v9 AS SELECT UNNEST($1) UNION ALL SELECT * FROM range(1) WHERE $1::INT[]=[1]
|
||||
|
||||
statement ok
|
||||
EXECUTE v9([1])
|
||||
30
external/duckdb/test/sql/prepared/prepare_offset_first.test
vendored
Normal file
30
external/duckdb/test/sql/prepared/prepare_offset_first.test
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
# name: test/sql/prepared/prepare_offset_first.test
|
||||
# description: Test OFFSET and LIMIT with prepared statements
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification
|
||||
|
||||
# Prepare a query with OFFSET and LIMIT as parameters with OFFSET written first in the query
|
||||
statement ok
|
||||
PREPARE q AS SELECT x FROM generate_series(1, 10) t(x) OFFSET ? LIMIT ?;
|
||||
|
||||
# Execute the prepared query with OFFSET = 3 and LIMIT = 5
|
||||
query I
|
||||
EXECUTE q(3, 5);
|
||||
----
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
|
||||
# Verify the result matches the direct query
|
||||
query I
|
||||
SELECT x FROM generate_series(1, 10) t(x) OFFSET 3 LIMIT 5;
|
||||
----
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
41
external/duckdb/test/sql/prepared/prepare_summarize.test
vendored
Normal file
41
external/duckdb/test/sql/prepared/prepare_summarize.test
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
# name: test/sql/prepared/prepare_summarize.test
|
||||
# description: PREPARE of SUMMARIZE/DESCRIBE
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE accounts AS SELECT 1 id, 'Mark' AS name
|
||||
|
||||
# prepare summarize
|
||||
query I nosort summarize
|
||||
SUMMARIZE SELECT * FROM accounts WHERE id = 1;
|
||||
|
||||
statement ok
|
||||
PREPARE query AS SUMMARIZE SELECT * FROM accounts WHERE id = $1;
|
||||
|
||||
query I nosort summarize
|
||||
EXECUTE query(1);
|
||||
|
||||
statement ok
|
||||
PREPARE query AS (SUMMARIZE SELECT * FROM accounts WHERE id = $1);
|
||||
|
||||
query I nosort summarize
|
||||
EXECUTE query(1);
|
||||
|
||||
# prepare describe
|
||||
query I nosort describe
|
||||
DESCRIBE SELECT * FROM accounts WHERE id = 1;
|
||||
|
||||
statement ok
|
||||
PREPARE query AS DESCRIBE SELECT * FROM accounts WHERE id = $1;
|
||||
|
||||
query I nosort describe
|
||||
EXECUTE query(1);
|
||||
|
||||
statement ok
|
||||
PREPARE query AS (DESCRIBE SELECT * FROM accounts WHERE id = $1);
|
||||
|
||||
query I nosort describe
|
||||
EXECUTE query(1);
|
||||
22
external/duckdb/test/sql/prepared/prepare_window_functions.test
vendored
Normal file
22
external/duckdb/test/sql/prepared/prepare_window_functions.test
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
# name: test/sql/prepared/prepare_window_functions.test
|
||||
# description: PREPARE of window functions
|
||||
# group: [prepared]
|
||||
|
||||
# ambiguous window function usage
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT SUM(?) OVER ()
|
||||
|
||||
query I
|
||||
EXECUTE v1(2)
|
||||
----
|
||||
2
|
||||
|
||||
query I
|
||||
EXECUTE v1(2::HUGEINT)
|
||||
----
|
||||
2
|
||||
|
||||
query I
|
||||
EXECUTE v1(0.5)
|
||||
----
|
||||
0.5
|
||||
33
external/duckdb/test/sql/prepared/prepared_named_param.test
vendored
Normal file
33
external/duckdb/test/sql/prepared/prepared_named_param.test
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
# name: test/sql/prepared/prepared_named_param.test
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
prepare q123 as select $param, $other_name, $param;
|
||||
|
||||
query III
|
||||
execute q123(param := 5, other_name := 3);
|
||||
----
|
||||
5 3 5
|
||||
|
||||
statement error
|
||||
execute q123(param := 5, 3)
|
||||
----
|
||||
Not implemented Error: Mixing named parameters and positional parameters is not supported yet
|
||||
|
||||
statement ok
|
||||
prepare q01 as select $1, ?, $2;
|
||||
|
||||
statement error
|
||||
execute q01(4, 2, 0)
|
||||
----
|
||||
Parameter argument/count mismatch, identifiers of the excess parameters: 3
|
||||
|
||||
statement error
|
||||
prepare q02 as select $1, $param, $2;
|
||||
----
|
||||
Not implemented Error: Mixing named and positional parameters is not supported yet
|
||||
|
||||
statement error
|
||||
execute q01(a, 2, 0)
|
||||
----
|
||||
Invalid Input Error: Only scalar parameters, named parameters or NULL supported for EXECUTE
|
||||
29
external/duckdb/test/sql/prepared/prepared_null_binding.test
vendored
Normal file
29
external/duckdb/test/sql/prepared/prepared_null_binding.test
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
# name: test/sql/prepared/prepared_null_binding.test
|
||||
# description: Test binding of prepared statements and constant NULL binding
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT COALESCE(COALESCE(NULL, $1) / 42::BIGINT, 0.5);
|
||||
|
||||
query I
|
||||
EXECUTE v1(42)
|
||||
----
|
||||
1.0
|
||||
|
||||
statement error
|
||||
EXECUTE v1(INTERVAL '1' DAY)
|
||||
----
|
||||
Cannot mix values of type INTERVAL
|
||||
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT COALESCE(CASE WHEN FALSE THEN $1 ELSE NULL END / 42::BIGINT, 0.5);
|
||||
|
||||
query I
|
||||
EXECUTE v2(42)
|
||||
----
|
||||
0.5
|
||||
|
||||
statement error
|
||||
EXECUTE v2(INTERVAL '1' DAY)
|
||||
----
|
||||
Cannot mix values of type INTERVAL
|
||||
62
external/duckdb/test/sql/prepared/prepared_select.test
vendored
Normal file
62
external/duckdb/test/sql/prepared/prepared_select.test
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
# name: test/sql/prepared/prepared_select.test
|
||||
# description: Test order of unmarked prepared statements in select
|
||||
# group: [prepared]
|
||||
|
||||
# select - from - where with subquery
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT ?::VARCHAR FROM (SELECT ?::INTEGER) tbl(i) WHERE i > ?::INTEGER
|
||||
|
||||
query I
|
||||
EXECUTE s1('hello', 2, 1)
|
||||
----
|
||||
hello
|
||||
|
||||
# select - from - where - groupby - having
|
||||
statement ok
|
||||
PREPARE s2 AS
|
||||
SELECT FIRST(?::VARCHAR)
|
||||
FROM (VALUES (?::INTEGER)) tbl(i)
|
||||
WHERE i > ?::INTEGER
|
||||
GROUP BY i % ?::INTEGER
|
||||
HAVING SUM(i)::VARCHAR <> ?::VARCHAR
|
||||
|
||||
query I
|
||||
EXECUTE s2('hello', 2, 1, 2, 'blabla')
|
||||
----
|
||||
hello
|
||||
|
||||
query I
|
||||
EXECUTE s2('hello', 2, 1, 2, '2')
|
||||
----
|
||||
|
||||
# union
|
||||
statement ok
|
||||
PREPARE s3 AS
|
||||
SELECT LENGTH(?::VARCHAR)
|
||||
UNION ALL
|
||||
SELECT ?::INTEGER
|
||||
ORDER BY 1
|
||||
|
||||
query I
|
||||
EXECUTE s3('hello', 3)
|
||||
----
|
||||
3
|
||||
5
|
||||
|
||||
# IN clause
|
||||
statement ok
|
||||
PREPARE s4 AS SELECT ?::INTEGER IN (?::INTEGER, ?::INTEGER, ?::INTEGER)
|
||||
|
||||
query I
|
||||
EXECUTE s4(1, 2, 3, 1)
|
||||
----
|
||||
1
|
||||
|
||||
# IN clause with subquery
|
||||
statement ok
|
||||
PREPARE s5 AS SELECT ?::INTEGER IN (SELECT i FROM (VALUES (?::INTEGER), (?::INTEGER), (?::INTEGER)) tbl(i))
|
||||
|
||||
query I
|
||||
EXECUTE s5(1, 2, 3, 1)
|
||||
----
|
||||
1
|
||||
42
external/duckdb/test/sql/prepared/prepared_update.test
vendored
Normal file
42
external/duckdb/test/sql/prepared/prepared_update.test
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
# name: test/sql/prepared/prepared_update.test
|
||||
# description: Test order of unmarked prepared statements
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER, j VARCHAR)
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1, 'hello')
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS UPDATE integers SET i=?, j=?;
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(2, 'world')
|
||||
|
||||
query II
|
||||
SELECT * FROM integers
|
||||
----
|
||||
2 world
|
||||
|
||||
statement ok
|
||||
PREPARE s2 AS UPDATE integers SET j=? WHERE i=?;
|
||||
|
||||
statement ok
|
||||
EXECUTE s2('test', 2)
|
||||
|
||||
query II
|
||||
SELECT * FROM integers
|
||||
----
|
||||
2 test
|
||||
|
||||
statement ok
|
||||
PREPARE s3 AS UPDATE integers SET j=? WHERE i=? AND j=?;
|
||||
|
||||
statement ok
|
||||
EXECUTE s3('test2', 2, 'test')
|
||||
|
||||
query II
|
||||
SELECT * FROM integers
|
||||
----
|
||||
2 test2
|
||||
79
external/duckdb/test/sql/prepared/test_basic_prepare.test
vendored
Normal file
79
external/duckdb/test/sql/prepared/test_basic_prepare.test
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
# name: test/sql/prepared/test_basic_prepare.test
|
||||
# description: Basic prepared statements
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT CAST($1 AS INTEGER), CAST($2 AS STRING)
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(42, 'dpfkg')
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(43, 'asdf')
|
||||
|
||||
# not enough params
|
||||
statement error
|
||||
EXECUTE s1(43)
|
||||
----
|
||||
|
||||
# too many
|
||||
statement error
|
||||
EXECUTE s1(43, 'asdf', 42)
|
||||
----
|
||||
|
||||
# wrong non-castable types
|
||||
statement error
|
||||
EXECUTE s1('asdf', 'asdf')
|
||||
----
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s1
|
||||
|
||||
# we can deallocate non-existing statements
|
||||
statement ok
|
||||
DEALLOCATE s2
|
||||
|
||||
# now its gone
|
||||
statement error
|
||||
EXECUTE s1(42, 'dpfkg')
|
||||
----
|
||||
|
||||
# prepare a statement that cannot be prepared
|
||||
statement error
|
||||
PREPARE EXPLAIN SELECT 42
|
||||
----
|
||||
Parser Error: syntax error at or near "SELECT"
|
||||
|
||||
statement error
|
||||
PREPARE CREATE TABLE a(i INTEGER)
|
||||
----
|
||||
Parser Error: syntax error at or near "CREATE"
|
||||
|
||||
statement error
|
||||
SELECT * FROM a;
|
||||
----
|
||||
|
||||
# type will be resolved to "double"
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT $1+$2
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s1
|
||||
|
||||
# but this works
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT NOT($1), 10+$2, $3+20, 4 IN (2, 3, $4), $5 IN (2, 3, 4)
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(1, 2, 3, 4, 2)
|
||||
|
||||
# these types default to varchar
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT $1
|
||||
|
||||
statement ok
|
||||
PREPARE s2 AS SELECT (SELECT $1)
|
||||
|
||||
statement ok
|
||||
PREPARE s3 AS SELECT $1=$2
|
||||
|
||||
56
external/duckdb/test/sql/prepared/test_issue_2079.test
vendored
Normal file
56
external/duckdb/test/sql/prepared/test_issue_2079.test
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
# name: test/sql/prepared/test_issue_2079.test
|
||||
# description: Issue 2079: Type inference for parameterized queries
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT ? + 1.0 AS a
|
||||
|
||||
query I
|
||||
EXECUTE v1(2.0)
|
||||
----
|
||||
3.0
|
||||
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT ? * 2.0 AS a
|
||||
|
||||
query I
|
||||
EXECUTE v2(2.0)
|
||||
----
|
||||
4.0
|
||||
|
||||
statement ok
|
||||
PREPARE v3 AS SELECT ? = 2.0 AS a
|
||||
|
||||
query I
|
||||
EXECUTE v3(2.0)
|
||||
----
|
||||
True
|
||||
|
||||
statement ok
|
||||
PREPARE v4 AS SELECT 2.0 IN (1.0, 1.5, ?)
|
||||
|
||||
query I
|
||||
EXECUTE v4(2.0)
|
||||
----
|
||||
True
|
||||
|
||||
query I
|
||||
EXECUTE v4(2.5)
|
||||
----
|
||||
False
|
||||
|
||||
statement ok
|
||||
PREPARE v5 AS SELECT ? IN (1.0, 1.5, 2.0)
|
||||
|
||||
query I
|
||||
EXECUTE v5(2.0)
|
||||
----
|
||||
True
|
||||
|
||||
query I
|
||||
EXECUTE v5(2.5)
|
||||
----
|
||||
False
|
||||
12
external/duckdb/test/sql/prepared/test_issue_4010.test
vendored
Normal file
12
external/duckdb/test/sql/prepared/test_issue_4010.test
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# name: test/sql/prepared/test_issue_4010.test
|
||||
# description: Issue 4010: SIGSEGV in duckdb_jdbc
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE table T1(A0 TIMESTAMP, A1 INTEGER, A2 VARCHAR, A3 VARCHAR, A4 INTEGER, A5 DOUBLE)
|
||||
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT (SUM(CASE WHEN ((T1.A2 = ($1)::text) AND (T1.A3 = ($1)::text)) THEN T1.A4 ELSE (0)::int END) / ((SUM(CASE WHEN ((T1.A2 = ($1)::text) AND (T1.A3 = ($1)::text)) THEN T1.A4 ELSE (0)::int END) + SUM(CASE WHEN ((T1.A2 = ($2)::text) AND (T1.A3 = ($1)::text)) THEN T1.A4 ELSE (0)::int END)))::float8) AS A00036933 FROM T1
|
||||
35
external/duckdb/test/sql/prepared/test_issue_4042.test
vendored
Normal file
35
external/duckdb/test/sql/prepared/test_issue_4042.test
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
# name: test/sql/prepared/test_issue_4042.test
|
||||
# description: Issue 4042: Text/varchar parameters cause "Binder Error: Inconsistent types found for parameter" when used in a combination with bigint column.
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE stringliterals AS SELECT 1 AS ID, 1::BIGINT AS a1,'value-1' AS a2,'value-1' AS a3,10::BIGINT AS a4
|
||||
|
||||
statement ok
|
||||
PREPARE v1 AS
|
||||
SELECT ((SUM(CASE
|
||||
WHEN ((stringliterals.a2 = ($1)::text) AND (stringliterals.a3 = ($1)::text))
|
||||
THEN stringliterals.a4
|
||||
ELSE (0)::int
|
||||
END) +
|
||||
SUM(CASE
|
||||
WHEN ((stringliterals.a2 = ($2)::text) AND (stringliterals.a3 = ($2)::text))
|
||||
THEN stringliterals.a4
|
||||
ELSE (0)::int
|
||||
END)) / ((SUM(CASE
|
||||
WHEN ((stringliterals.a2 = ($1)::text) AND (stringliterals.a3 = ($1)::text))
|
||||
THEN stringliterals.a4
|
||||
ELSE (0)::int
|
||||
END) +
|
||||
SUM(CASE
|
||||
WHEN ((stringliterals.a2 = ($2)::text) AND (stringliterals.a3 = ($2)::text))
|
||||
THEN stringliterals.a4
|
||||
ELSE (0)::int
|
||||
END)))::float8) AS A00000185
|
||||
FROM stringliterals
|
||||
|
||||
statement ok
|
||||
EXECUTE v1('value-1', 'value-2')
|
||||
14
external/duckdb/test/sql/prepared/test_issue_6276.test
vendored
Normal file
14
external/duckdb/test/sql/prepared/test_issue_6276.test
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
# name: test/sql/prepared/test_issue_6276.test
|
||||
# description: Issue 6276: Spurious additional parameter required in prepared statement
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT CASE ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS x
|
||||
|
||||
query I
|
||||
EXECUTE V1(1, 2, 3, 4, 5, 6);
|
||||
----
|
||||
6
|
||||
304
external/duckdb/test/sql/prepared/test_prepare_ambiguous_type.test
vendored
Normal file
304
external/duckdb/test/sql/prepared/test_prepare_ambiguous_type.test
vendored
Normal file
@@ -0,0 +1,304 @@
|
||||
# name: test/sql/prepared/test_prepare_ambiguous_type.test
|
||||
# description: PREPARE of ambiguous types
|
||||
# group: [prepared]
|
||||
|
||||
# typeof
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT typeof(?)
|
||||
|
||||
query I
|
||||
EXECUTE v1(3::int)
|
||||
----
|
||||
INTEGER
|
||||
|
||||
query I
|
||||
EXECUTE v1('hello')
|
||||
----
|
||||
VARCHAR
|
||||
|
||||
query I
|
||||
EXECUTE v1([1, 2, 3])
|
||||
----
|
||||
INTEGER[]
|
||||
|
||||
# direct select without cast
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT ?
|
||||
|
||||
query I
|
||||
EXECUTE v2(3::int)
|
||||
----
|
||||
3
|
||||
|
||||
query I
|
||||
EXECUTE v2('hello')
|
||||
----
|
||||
hello
|
||||
|
||||
query I
|
||||
EXECUTE v2([1, 2, 3])
|
||||
----
|
||||
[1, 2, 3]
|
||||
|
||||
# ambiguous comparison
|
||||
statement ok
|
||||
PREPARE v3 AS SELECT ?=?
|
||||
|
||||
query I
|
||||
EXECUTE v3(3::int, 4::bigint)
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v3('hello', 'hello')
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
EXECUTE v3([1, 2, 3], [1, 2, 3])
|
||||
----
|
||||
true
|
||||
|
||||
# ambiguous function usage (date_part)
|
||||
statement ok
|
||||
PREPARE v4 AS SELECT extract(year from ?)
|
||||
|
||||
query I
|
||||
EXECUTE v4(DATE '1992-01-01')
|
||||
----
|
||||
1992
|
||||
|
||||
query I
|
||||
EXECUTE v4(TIMESTAMP '1992-01-01 23:00:20')
|
||||
----
|
||||
1992
|
||||
|
||||
# printf
|
||||
statement ok
|
||||
PREPARE v5 AS SELECT printf('%s', ?)
|
||||
|
||||
statement error
|
||||
EXECUTE v5(4)
|
||||
----
|
||||
<REGEX>:.*Invalid Input Error.*Invalid type specifier.*
|
||||
|
||||
query I
|
||||
EXECUTE v5('hello')
|
||||
----
|
||||
hello
|
||||
|
||||
statement ok
|
||||
PREPARE v6 AS SELECT printf('%d', ?)
|
||||
|
||||
query I
|
||||
EXECUTE v6(4)
|
||||
----
|
||||
4
|
||||
|
||||
statement error
|
||||
EXECUTE v6('hello')
|
||||
----
|
||||
<REGEX>:.*Invalid Input Error.*Invalid type specifier.*
|
||||
|
||||
# lists and structs
|
||||
statement ok
|
||||
PREPARE v7 AS SELECT [?]
|
||||
|
||||
query I
|
||||
EXECUTE v7(1)
|
||||
----
|
||||
[1]
|
||||
|
||||
query I
|
||||
EXECUTE v7('hello')
|
||||
----
|
||||
[hello]
|
||||
|
||||
query I
|
||||
EXECUTE v7([1,2,3])
|
||||
----
|
||||
[[1, 2, 3]]
|
||||
|
||||
|
||||
query I
|
||||
EXECUTE v7(NULL)
|
||||
----
|
||||
[NULL]
|
||||
|
||||
statement ok
|
||||
PREPARE v8 AS SELECT [?, ?, ?]
|
||||
|
||||
query I
|
||||
EXECUTE v8(1, 2, 3)
|
||||
----
|
||||
[1, 2, 3]
|
||||
|
||||
query I
|
||||
EXECUTE v8(NULL, NULL, NULL)
|
||||
----
|
||||
[NULL, NULL, NULL]
|
||||
|
||||
query I
|
||||
EXECUTE v8('hello', 'world', NULL)
|
||||
----
|
||||
[hello, world, NULL]
|
||||
|
||||
statement ok
|
||||
PREPARE v9 AS SELECT {'a': ?}
|
||||
|
||||
query I
|
||||
EXECUTE v9(42)
|
||||
----
|
||||
{'a': 42}
|
||||
|
||||
query I
|
||||
EXECUTE v9([1,2,3])
|
||||
----
|
||||
{'a': [1, 2, 3]}
|
||||
|
||||
query I
|
||||
EXECUTE v9(NULL)
|
||||
----
|
||||
{'a': NULL}
|
||||
|
||||
statement ok
|
||||
PREPARE v10 AS SELECT {'a': ?, 'b': 42, 'c': ?}
|
||||
|
||||
query I
|
||||
EXECUTE v10(33, [1, 2, 3])
|
||||
----
|
||||
{'a': 33, 'b': 42, 'c': [1, 2, 3]}
|
||||
|
||||
query I
|
||||
EXECUTE v10(NULL, {'a': 88})
|
||||
----
|
||||
{'a': NULL, 'b': 42, 'c': {'a': 88}}
|
||||
|
||||
statement ok
|
||||
PREPARE v11 AS SELECT ROW(?, ?)
|
||||
|
||||
query I
|
||||
EXECUTE v11(11, 'hello')
|
||||
----
|
||||
(11, hello)
|
||||
|
||||
statement ok
|
||||
PREPARE v12 AS SELECT ? IS NULL
|
||||
|
||||
query I
|
||||
EXECUTE v12('hello')
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v12([1, 2, 3])
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v12(NULL)
|
||||
----
|
||||
true
|
||||
|
||||
# subqueries
|
||||
statement ok
|
||||
PREPARE v13 AS SELECT (SELECT ?)
|
||||
|
||||
query I
|
||||
EXECUTE v13(3::int)
|
||||
----
|
||||
3
|
||||
|
||||
query I
|
||||
EXECUTE v13('hello')
|
||||
----
|
||||
hello
|
||||
|
||||
query I
|
||||
EXECUTE v13([1, 2, 3])
|
||||
----
|
||||
[1, 2, 3]
|
||||
|
||||
|
||||
# ambiguous aggregate usage
|
||||
statement ok
|
||||
PREPARE v14 AS SELECT SUM(?) FROM RANGE(100)
|
||||
|
||||
query I
|
||||
EXECUTE v14(2)
|
||||
----
|
||||
200
|
||||
|
||||
query I
|
||||
EXECUTE v14(2::HUGEINT)
|
||||
----
|
||||
200
|
||||
|
||||
query I
|
||||
EXECUTE v14(0.005)
|
||||
----
|
||||
0.5
|
||||
|
||||
# ambiguous function usage (addition)
|
||||
statement ok
|
||||
PREPARE v15 AS SELECT ?+?
|
||||
|
||||
query I
|
||||
EXECUTE v15(0.25, 0.25)
|
||||
----
|
||||
0.5
|
||||
|
||||
query I
|
||||
EXECUTE v15(1000000000000000000000000000000000000::hugeint, 1000000000000000000000000000000000000::hugeint)
|
||||
----
|
||||
2000000000000000000000000000000000000
|
||||
|
||||
# array contains usage
|
||||
statement ok
|
||||
PREPARE v17 AS SELECT ARRAY_CONTAINS(?, ?)
|
||||
|
||||
query I
|
||||
EXECUTE v17([1, 2, 3], 1)
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
EXECUTE v17([], 1)
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
EXECUTE v17(['hello', NULL, 'world'], 'world')
|
||||
----
|
||||
true
|
||||
|
||||
statement ok
|
||||
PREPARE v18 AS SELECT ARRAY_CONTAINS([1, 2, 3], ?)
|
||||
|
||||
query I
|
||||
EXECUTE v18(1)
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
EXECUTE v18(0)
|
||||
----
|
||||
false
|
||||
|
||||
statement error
|
||||
EXECUTE v18([1])
|
||||
----
|
||||
<REGEX>:.*Binder Error.*Cannot deduce template type.*
|
||||
|
||||
statement ok
|
||||
PREPARE v19 AS SELECT ARRAY_CONTAINS(?, 1)
|
||||
|
||||
query I
|
||||
EXECUTE v19([1, 2, 3])
|
||||
----
|
||||
true
|
||||
|
||||
statement error
|
||||
EXECUTE v19(0)
|
||||
----
|
||||
<REGEX>:.*Binder Error.*No function matches.*
|
||||
36
external/duckdb/test/sql/prepared/test_prepare_delete.test
vendored
Normal file
36
external/duckdb/test/sql/prepared/test_prepare_delete.test
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
# name: test/sql/prepared/test_prepare_delete.test
|
||||
# description: PREPARE for DELETE
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE b (i TINYINT)
|
||||
|
||||
statement ok
|
||||
INSERT INTO b VALUES (1), (2), (3), (4), (5)
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS DELETE FROM b WHERE i=$1
|
||||
|
||||
query I
|
||||
SELECT * FROM b ORDER BY 1
|
||||
----
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(3)
|
||||
|
||||
query I
|
||||
SELECT * FROM b ORDER BY 1
|
||||
----
|
||||
1
|
||||
2
|
||||
4
|
||||
5
|
||||
|
||||
statement ok
|
||||
DROP TABLE b CASCADE
|
||||
|
||||
70
external/duckdb/test/sql/prepared/test_prepare_delete_update.test
vendored
Normal file
70
external/duckdb/test/sql/prepared/test_prepare_delete_update.test
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
# name: test/sql/prepared/test_prepare_delete_update.test
|
||||
# description: PREPARE for DELETE/UPDATE
|
||||
# group: [prepared]
|
||||
|
||||
# DELETE
|
||||
statement ok
|
||||
CREATE TABLE b (i TINYINT)
|
||||
|
||||
statement ok
|
||||
INSERT INTO b VALUES (1), (2), (3), (4), (5)
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS DELETE FROM b WHERE i=$1
|
||||
|
||||
query I
|
||||
SELECT * FROM b ORDER BY 1
|
||||
----
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(3)
|
||||
|
||||
query I
|
||||
SELECT * FROM b ORDER BY 1
|
||||
----
|
||||
1
|
||||
2
|
||||
4
|
||||
5
|
||||
|
||||
statement ok
|
||||
DROP TABLE b CASCADE
|
||||
|
||||
# UPDATE
|
||||
statement ok
|
||||
CREATE TABLE b (i TINYINT)
|
||||
|
||||
statement ok
|
||||
INSERT INTO b VALUES (1), (2), (3), (4), (5)
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS UPDATE b SET i=$1 WHERE i=$2
|
||||
|
||||
query I
|
||||
SELECT * FROM b ORDER BY 1
|
||||
----
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(6, 3)
|
||||
|
||||
query I
|
||||
SELECT * FROM b ORDER BY 1
|
||||
----
|
||||
1
|
||||
2
|
||||
4
|
||||
5
|
||||
6
|
||||
|
||||
statement ok
|
||||
DROP TABLE b CASCADE
|
||||
30
external/duckdb/test/sql/prepared/test_prepare_drop.test
vendored
Normal file
30
external/duckdb/test/sql/prepared/test_prepare_drop.test
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
# name: test/sql/prepared/test_prepare_drop.test
|
||||
# description: PREPARE and DROPping tables
|
||||
# group: [prepared]
|
||||
|
||||
statement ok con1
|
||||
CREATE TABLE a (i TINYINT)
|
||||
|
||||
statement ok con2
|
||||
PREPARE p1 AS SELECT * FROM a
|
||||
|
||||
statement ok con2
|
||||
EXECUTE p1
|
||||
|
||||
# only the conn which did the prepare can execute
|
||||
statement error con1
|
||||
EXECUTE p1
|
||||
----
|
||||
|
||||
# we can drop the table though
|
||||
statement ok con1
|
||||
DROP TABLE a
|
||||
|
||||
# after dropping the table, the statement fails
|
||||
statement error con2
|
||||
EXECUTE p1
|
||||
----
|
||||
|
||||
# but when we take the statement away
|
||||
statement ok con2
|
||||
DEALLOCATE p1
|
||||
15
external/duckdb/test/sql/prepared/test_prepare_error.test
vendored
Normal file
15
external/duckdb/test/sql/prepared/test_prepare_error.test
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# name: test/sql/prepared/test_prepare_error.test
|
||||
# description: Error in prepared statement
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT ?::VARCHAR::INT
|
||||
|
||||
statement error
|
||||
EXECUTE v1('hello')
|
||||
----
|
||||
|
||||
query I
|
||||
EXECUTE v1('3')
|
||||
----
|
||||
3
|
||||
53
external/duckdb/test/sql/prepared/test_prepare_insert.test_slow
vendored
Normal file
53
external/duckdb/test/sql/prepared/test_prepare_insert.test_slow
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
# name: test/sql/prepared/test_prepare_insert.test_slow
|
||||
# description: PREPARE for INSERT
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE b (i TINYINT)
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS INSERT INTO b VALUES (cast($1 as tinyint)), ($2 + 1), ($3)
|
||||
|
||||
statement ok
|
||||
EXECUTE s1 (42, 41, 42)
|
||||
|
||||
query I
|
||||
SELECT * FROM b
|
||||
----
|
||||
42
|
||||
42
|
||||
42
|
||||
|
||||
statement error
|
||||
EXECUTE s1 (42, 41, 10000)
|
||||
----
|
||||
|
||||
statement ok
|
||||
CREATE TABLE c (i INTEGER)
|
||||
|
||||
statement ok
|
||||
PREPARE s2 AS INSERT INTO c VALUES ($1)
|
||||
|
||||
loop val 0 1000
|
||||
|
||||
statement ok
|
||||
EXECUTE s2(${val})
|
||||
|
||||
endloop
|
||||
|
||||
query III
|
||||
SELECT COUNT(*), MIN(i), MAX(i) FROM c
|
||||
----
|
||||
1000 0 999
|
||||
|
||||
statement ok
|
||||
DROP TABLE b
|
||||
|
||||
statement ok
|
||||
DROP TABLE c
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s2
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s1
|
||||
14
external/duckdb/test/sql/prepared/test_prepare_issue_5132.test
vendored
Normal file
14
external/duckdb/test/sql/prepared/test_prepare_issue_5132.test
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
# name: test/sql/prepared/test_prepare_issue_5132.test
|
||||
# description: Test reproducible example in #5132
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
create table test as select 42 i
|
||||
|
||||
statement ok
|
||||
prepare q1 as SELECT cast(? AS VARCHAR) FROM test
|
||||
|
||||
query T
|
||||
execute q1('oops')
|
||||
----
|
||||
oops
|
||||
11
external/duckdb/test/sql/prepared/test_prepare_issue_8500.test
vendored
Normal file
11
external/duckdb/test/sql/prepared/test_prepare_issue_8500.test
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# name: test/sql/prepared/test_prepare_issue_8500.test
|
||||
# description: Issue #8500 - Prepared statement results in INTERVAL type
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PREPARE S1 AS SELECT (? / 1) + 1;
|
||||
|
||||
query I
|
||||
EXECUTE S1(42)
|
||||
----
|
||||
43
|
||||
40
external/duckdb/test/sql/prepared/test_prepare_null.test
vendored
Normal file
40
external/duckdb/test/sql/prepared/test_prepare_null.test
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
# name: test/sql/prepared/test_prepare_null.test
|
||||
# description: PREPARE with NULL
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE b (i TINYINT)
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS INSERT INTO b VALUES ($1)
|
||||
|
||||
statement ok
|
||||
EXECUTE s1 (NULL)
|
||||
|
||||
query I
|
||||
SELECT i FROM b
|
||||
----
|
||||
NULL
|
||||
|
||||
statement ok
|
||||
PREPARE s2 AS UPDATE b SET i=$1
|
||||
|
||||
statement ok
|
||||
EXECUTE s2 (NULL)
|
||||
|
||||
query I
|
||||
SELECT i FROM b
|
||||
----
|
||||
NULL
|
||||
|
||||
statement ok
|
||||
PREPARE s3 AS DELETE FROM b WHERE i=$1
|
||||
|
||||
statement ok
|
||||
EXECUTE s3 (NULL)
|
||||
|
||||
query I
|
||||
SELECT i FROM b
|
||||
----
|
||||
NULL
|
||||
|
||||
43
external/duckdb/test/sql/prepared/test_prepare_select.test
vendored
Normal file
43
external/duckdb/test/sql/prepared/test_prepare_select.test
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# name: test/sql/prepared/test_prepare_select.test
|
||||
# description: PREPARE for SELECT clause
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE a (i TINYINT)
|
||||
|
||||
statement ok
|
||||
INSERT INTO a VALUES (42)
|
||||
|
||||
statement ok
|
||||
PREPARE s3 AS SELECT * FROM a WHERE i=$1
|
||||
|
||||
statement ok
|
||||
EXECUTE s3(10000)
|
||||
|
||||
statement ok
|
||||
EXECUTE s3(42)
|
||||
|
||||
statement ok
|
||||
EXECUTE s3(84)
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s3
|
||||
|
||||
# can't run a query with a param without PREPARE
|
||||
statement error
|
||||
SELECT * FROM a WHERE i=$1
|
||||
----
|
||||
|
||||
# also can't run a query with a param when casting
|
||||
statement error
|
||||
SELECT * FROM a WHERE i=CAST($1 AS VARCHAR)
|
||||
----
|
||||
|
||||
# issue that swallows an UNKNOWN type, if not explicitly setting the rebind-flag
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS SELECT to_years($1), CAST(list_value($1) AS BIGINT[]);
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(1);
|
||||
|
||||
32
external/duckdb/test/sql/prepared/test_prepare_subquery.test
vendored
Normal file
32
external/duckdb/test/sql/prepared/test_prepare_subquery.test
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
# name: test/sql/prepared/test_prepare_subquery.test
|
||||
# description: Prepared statements and subqueries
|
||||
# group: [prepared]
|
||||
|
||||
# simple subquery
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT * FROM (SELECT $1::INTEGER) sq1;
|
||||
|
||||
statement ok
|
||||
EXECUTE v1(42)
|
||||
|
||||
# subquery with non-fulfillable predicate
|
||||
statement ok
|
||||
PREPARE v2 AS SELECT * FROM (SELECT $1::INTEGER WHERE 1=0) sq1;
|
||||
|
||||
statement ok
|
||||
EXECUTE v2(42)
|
||||
|
||||
# prepared statement in correlated scalar subquery
|
||||
statement ok
|
||||
PREPARE v3 AS SELECT (SELECT $1::INT+sq1.i) FROM (SELECT 42 AS i) sq1;
|
||||
|
||||
statement ok
|
||||
EXECUTE v3(42)
|
||||
|
||||
# prepared statement in nested correlated scalar subquery
|
||||
statement ok
|
||||
PREPARE v4 AS SELECT (SELECT (SELECT $1::INT+sq1.i)+$2::INT+sq1.i) FROM (SELECT 42 AS i) sq1;
|
||||
|
||||
statement ok
|
||||
EXECUTE v4(20, 20)
|
||||
|
||||
19
external/duckdb/test/sql/prepared/test_prepare_types.test
vendored
Normal file
19
external/duckdb/test/sql/prepared/test_prepare_types.test
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# name: test/sql/prepared/test_prepare_types.test
|
||||
# description: PREPARE many types for INSERT
|
||||
# group: [prepared]
|
||||
|
||||
# prepare different types in insert
|
||||
statement ok
|
||||
CREATE TABLE test(a TINYINT, b SMALLINT, c INTEGER, d BIGINT, e REAL, f DOUBLE, g DATE, h VARCHAR)
|
||||
|
||||
statement ok
|
||||
PREPARE s1 AS INSERT INTO test VALUES ($1,$2,$3,$4,$5,$6,$7,$8);
|
||||
|
||||
statement ok
|
||||
EXECUTE s1(1,2,3,4,1.5,2.5,'1992-10-20', 'hello world');
|
||||
|
||||
query IIIIRRTT
|
||||
SELECT * FROM test
|
||||
----
|
||||
1 2 3 4 1.500000 2.500000 1992-10-20 hello world
|
||||
|
||||
26
external/duckdb/test/sql/prepared/test_prepare_unused_cte.test
vendored
Normal file
26
external/duckdb/test/sql/prepared/test_prepare_unused_cte.test
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# name: test/sql/prepared/test_prepare_unused_cte.test
|
||||
# description: Test binding unreferenced CTE parameters
|
||||
# group: [prepared]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE "user" (name string);
|
||||
|
||||
statement ok
|
||||
PREPARE s2965 AS
|
||||
WITH temp_first AS (
|
||||
SELECT * FROM "user"
|
||||
WHERE "name" = ?
|
||||
), temp_second AS (
|
||||
SELECT * FROM "user"
|
||||
WHERE "name" = ?
|
||||
)
|
||||
SELECT * FROM temp_second;
|
||||
|
||||
statement ok
|
||||
EXECUTE s2965('val1', 'val2')
|
||||
|
||||
statement ok
|
||||
DEALLOCATE s2965
|
||||
Reference in New Issue
Block a user