add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
CREATE TABLE prop_type(name text PRIMARY KEY);
INSERT INTO prop_type(name) VALUES ('foo'); -- only 'foo', not 'jargon'


CREATE TABLE prop (
id serial PRIMARY KEY,
prop_type text NOT NULL REFERENCES prop_type(name),
norm text NOT NULL,
hash text NOT NULL UNIQUE,
symbols jsonb
);
CREATE TABLE
PREPARE upsert_prop (text, text, text, jsonb) AS
WITH ins AS (
INSERT INTO prop
(prop_type, norm, hash, symbols)
VALUES ($1 , $2 , $3 , $4)
ON CONFLICT (hash) DO UPDATE
SET prop_type = NULL -- never executed, still locks the row
WHERE false
RETURNING id
)
SELECT id FROM ins
UNION ALL
SELECT id FROM prop WHERE hash = $3;
PREPARE
EXECUTE upsert_prop ('jargon', 'j2', 'lXWkZSmoSE0mZ+n4xpWB', '[]'); -- raises EXCEPTION!
ERROR:  insert or update on table "prop" violates foreign key constraint "prop_prop_type_fkey"
DETAIL:  Key (prop_type)=(jargon) is not present in table "prop_type".
EXECUTE upsert_prop ('foo', 'j2', 'lXWkZSmoSE0mZ+n4xpWB', '[]'); -- always returns a value
id
2
SELECT 1
EXECUTE upsert_prop ('foo', 'j2', 'lXWkZSmoSE0mZ+n4xpWB', '[]'); -- always returns a value
id
2
SELECT 1