should be it

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

View File

@@ -0,0 +1,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);

View 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

View 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

View 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

View 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

View 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

View 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]

View 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

View 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

View 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])

View 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

View 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);

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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')

View 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

View 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.*

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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);

View 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)

View 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

View 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