Files
email-tracker/external/duckdb/test/sql/upsert/postgres/single_key.test
2025-10-24 19:21:19 -05:00

111 lines
4.2 KiB
SQL

# name: test/sql/upsert/postgres/single_key.test
# group: [postgres]
statement ok
pragma enable_verification;
# insert...on conflict do unique index inference
statement ok
create table insertconflicttest(
key int4,
fruit text,
unique (key)
);
# Explain tests
statement ok
insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit;
# Should display qual actually attributable to internal sequential scan:
statement ok
insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit where insertconflicttest.fruit != 'Cawesh';
# With EXCLUDED.* expression in scan node:
statement ok
insert into insertconflicttest values(0, 'Crowberry') on conflict (key) do update set fruit = excluded.fruit where excluded.fruit != 'Elderberry';
# Does the same, but JSON format shows "Conflict Arbiter Index" as JSON array:
statement ok
insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit where insertconflicttest.fruit != 'Lime' returning *;
# Fails (no unique index inference specification, required for do update variant):
## -- We accept this because there is only 1 Index on the table -- ##
statement ok
insert into insertconflicttest values (1, 'Apple') on conflict do update set fruit = excluded.fruit;
# inference succeeds:
statement ok
insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruit;
statement ok
insert into insertconflicttest values (2, 'Orange') on conflict (key, key, key) do update set fruit = excluded.fruit;
# Succeed, since multi-assignment does not involve subquery:
statement ok
INSERT INTO insertconflicttest VALUES (1, 'Apple'), (2, 'Orange')
ON CONFLICT (key) DO UPDATE SET fruit = excluded.fruit, key = excluded.key;
# Give good diagnostic message when EXCLUDED.* spuriously referenced from
# RETURNING:
## -- We don't support 'excluded' qualified columns in the RETURNING clause yet -- ##
statement error
insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruit RETURNING excluded.fruit;
----
<REGEX>:.*Not implemented Error.*not supported in the RETURNING clause yet.*
# Only suggest <table>.* column when inference element misspelled:
statement error
insert into insertconflicttest values (1, 'Apple') on conflict (keyy) do update set fruit = excluded.fruit;
----
<REGEX>:.*Binder Error.*Table "insertconflicttest" does not have a column.*
# Have useful HINT for EXCLUDED.* RTE within UPDATE:
statement error
insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruitt;
----
<REGEX>:.*Binder Error.*does not have a column named "fruitt".*
# inference fails:
statement error
insert into insertconflicttest values (3, 'Kiwi') on conflict (key, fruit) do update set fruit = excluded.fruit;
----
<REGEX>:.*Binder Error.*not referenced by a UNIQUE/PRIMARY KEY CONSTRAINT or INDEX.*
statement error
insert into insertconflicttest values (4, 'Mango') on conflict (fruit, key) do update set fruit = excluded.fruit;
----
<REGEX>:.*Binder Error.*not referenced by a UNIQUE/PRIMARY KEY CONSTRAINT or INDEX.*
statement error
insert into insertconflicttest values (5, 'Lemon') on conflict (fruit) do update set fruit = excluded.fruit;
----
<REGEX>:.*Binder Error.*not referenced by a UNIQUE/PRIMARY KEY CONSTRAINT or INDEX.*
statement error
insert into insertconflicttest values (6, 'Passionfruit') on conflict (fruit) do update set fruit = excluded.fruit;
----
<REGEX>:.*Binder Error.*not referenced by a UNIQUE/PRIMARY KEY CONSTRAINT or INDEX.*
# Check the target relation can be aliased
statement ok
insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = excluded.fruit;
# ok, no reference to target table
statement ok
insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = ict.fruit;
# ok, alias
# error, references aliased away name
statement error
insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = insertconflicttest.fruit;
----
<REGEX>:.*Binder Error.*Referenced table.*not found.*