Thread
-
Re: COPY ON_CONFLICT TABLE; save duplicated record to another table.
Zsolt Parragi <zsolt.parragi@percona.com> — 2026-05-06T22:17:35Z
Hello! I tried the patch and found a few issues. 1. Two of them are null pointer dereference crashes, one with partitioned tables: CREATE TABLE part_t (a int PRIMARY KEY, b text) PARTITION BY RANGE (a); CREATE TABLE part_t_p1 PARTITION OF part_t FOR VALUES FROM (0) TO (1000); CREATE TABLE conflict_log ( rel oid, file_name text, line_no bigint, raw_line text ); INSERT INTO part_t VALUES (1, 'pre-existing'); COPY part_t (a, b) FROM stdin WITH (on_conflict 'table', conflict_table 'conflict_log'); 2 row-two 1 dup 3 row-three \. 2. And another with repeateable reads: CREATE TABLE t_rr (a int PRIMARY KEY, b text); CREATE TABLE conflict_log (rel oid, fname text, ln bigint, raw text); INSERT INTO t_rr VALUES (1, 'pre-committed'); BEGIN ISOLATION LEVEL REPEATABLE READ; COPY t_rr FROM stdin WITH (on_conflict 'table', conflict_table 'conflict_log'); 1 dup-row \. 3. There's also a possible data loss scenario, reports 3 copied 0 actual: CREATE TABLE conf_log ( relname oid, fname text, lineno bigint, rawline text ); CREATE TABLE no_idx_tgt (id int, payload text); CREATE FUNCTION noop_trig() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RETURN NEW; END; $$; CREATE TRIGGER noop_before BEFORE INSERT ON no_idx_tgt FOR EACH ROW EXECUTE FUNCTION noop_trig(); COPY no_idx_tgt (id, payload) FROM STDIN WITH (ON_CONFLICT TABLE, CONFLICT_TABLE conf_log); 1 alpha 2 beta 3 gamma \. SELECT 'A: no_idx_tgt count' AS scenario, count(*) AS rows FROM no_idx_tgt; SELECT 'A: conf_log count' AS scenario, count(*) AS rows FROM conf_log; SELECT * FROM no_idx_tgt ORDER BY id; 4. Shouldn't the following error out? CREATE TABLE t (a int PRIMARY KEY, b text); COPY t TO '/dev/null' (ON_CONFLICT TABLE, CONFLICT_TABLE no_such_table);