Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 144c2ce

Browse files
committed
Fix ON CONFLICT DO NOTHING/UPDATE for temporal indexes
A PRIMARY KEY or UNIQUE constraint with WITHOUT OVERLAPS will be a GiST index, not a B-Tree, but it will still have indisunique set. The code for ON CONFLICT fails if it sees a non-btree index that has indisunique. This commit fixes that and adds some tests. But now that we can't just test indisunique, we also need some extra checks to prevent DO UPDATE from running against a WITHOUT OVERLAPS constraint (because the conflict could happen against more than one row, and we'd only update one). Author: Paul A. Jungwirth <pj@illuminatedcomputing.com> Discussion: https://www.postgresql.org/message-id/1426589a-83cb-4a89-bf40-713970c07e63@illuminatedcomputing.com
1 parent 5caa057 commit 144c2ce

File tree

4 files changed

+298
-2
lines changed

4 files changed

+298
-2
lines changed

src/backend/executor/execIndexing.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ ExecOpenIndices(ResultRelInfo *resultRelInfo, bool speculative)
210210
* If the indexes are to be used for speculative insertion, add extra
211211
* information required by unique index entries.
212212
*/
213-
if (speculative && ii->ii_Unique)
213+
if (speculative && ii->ii_Unique && !indexDesc->rd_index->indisexclusion)
214214
BuildSpeculativeIndexInfo(indexDesc, ii);
215215

216216
relationDescs[i] = indexDesc;

src/backend/optimizer/util/plancat.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ infer_arbiter_indexes(PlannerInfo *root)
815815
*/
816816
if (indexOidFromConstraint == idxForm->indexrelid)
817817
{
818-
if (!idxForm->indisunique && onconflict->action == ONCONFLICT_UPDATE)
818+
if (idxForm->indisexclusion && onconflict->action == ONCONFLICT_UPDATE)
819819
ereport(ERROR,
820820
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
821821
errmsg("ON CONFLICT DO UPDATE not supported with exclusion constraints")));
@@ -840,6 +840,13 @@ infer_arbiter_indexes(PlannerInfo *root)
840840
if (!idxForm->indisunique)
841841
goto next;
842842

843+
/*
844+
* So-called unique constraints with WITHOUT OVERLAPS are really
845+
* exclusion constraints, so skip those too.
846+
*/
847+
if (idxForm->indisexclusion)
848+
goto next;
849+
843850
/* Build BMS representation of plain (non expression) index attrs */
844851
indexedAttrs = NULL;
845852
for (natt = 0; natt < idxForm->indnkeyatts; natt++)

src/test/regress/expected/without_overlaps.out

+176
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,182 @@ DROP TABLE temporal_partitioned;
453453
ALTER TABLE temporal_rng REPLICA IDENTITY USING INDEX temporal_rng_pk;
454454
ERROR: cannot use non-unique index "temporal_rng_pk" as replica identity
455455
--
456+
-- ON CONFLICT
457+
--
458+
TRUNCATE temporal_rng;
459+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
460+
-- with a conflict
461+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
462+
-- id matches but no conflict
463+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT DO NOTHING;
464+
-- date matches but no conflict
465+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
466+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
467+
id | valid_at
468+
-------+-------------------------
469+
[1,2) | [2000-01-01,2010-01-01)
470+
[1,2) | [2010-01-01,2020-01-01)
471+
[2,3) | [2005-01-01,2006-01-01)
472+
(3 rows)
473+
474+
TRUNCATE temporal_rng;
475+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
476+
-- with a conflict
477+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
478+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
479+
-- id matches but no conflict
480+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
481+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
482+
-- date matches but no conflict
483+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
484+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
485+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
486+
id | valid_at
487+
-------+-------------------------
488+
[1,2) | [2000-01-01,2010-01-01)
489+
(1 row)
490+
491+
TRUNCATE temporal_rng;
492+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
493+
-- with a conflict
494+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO NOTHING;
495+
-- id matches but no conflict
496+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO NOTHING;
497+
-- date matches but no conflict
498+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO NOTHING;
499+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
500+
id | valid_at
501+
-------+-------------------------
502+
[1,2) | [2000-01-01,2010-01-01)
503+
[1,2) | [2010-01-01,2020-01-01)
504+
[2,3) | [2005-01-01,2006-01-01)
505+
(3 rows)
506+
507+
TRUNCATE temporal_rng;
508+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
509+
-- with a conflict
510+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[2,3)';
511+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
512+
-- id matches but no conflict
513+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[3,4)';
514+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
515+
-- date matches but no conflict
516+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[4,5)';
517+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
518+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
519+
id | valid_at
520+
-------+-------------------------
521+
[1,2) | [2000-01-01,2010-01-01)
522+
(1 row)
523+
524+
TRUNCATE temporal_rng;
525+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
526+
-- with a conflict
527+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO UPDATE SET id = EXCLUDED.id + '[2,3)';
528+
ERROR: ON CONFLICT DO UPDATE not supported with exclusion constraints
529+
-- id matches but no conflict
530+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO UPDATE SET id = EXCLUDED.id + '[3,4)';
531+
ERROR: ON CONFLICT DO UPDATE not supported with exclusion constraints
532+
-- date matches but no conflict
533+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO UPDATE SET id = EXCLUDED.id + '[4,5)';
534+
ERROR: ON CONFLICT DO UPDATE not supported with exclusion constraints
535+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
536+
id | valid_at
537+
-------+-------------------------
538+
[1,2) | [2000-01-01,2010-01-01)
539+
(1 row)
540+
541+
-- with a UNIQUE constraint:
542+
CREATE TABLE temporal3 (
543+
id int4range,
544+
valid_at daterange,
545+
CONSTRAINT temporal3_uq UNIQUE (id, valid_at WITHOUT OVERLAPS)
546+
);
547+
TRUNCATE temporal3;
548+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
549+
-- with a conflict
550+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
551+
-- id matches but no conflict
552+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT DO NOTHING;
553+
-- date matches but no conflict
554+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
555+
SELECT * FROM temporal3 ORDER BY id, valid_at;
556+
id | valid_at
557+
-------+-------------------------
558+
[1,2) | [2000-01-01,2010-01-01)
559+
[1,2) | [2010-01-01,2020-01-01)
560+
[2,3) | [2005-01-01,2006-01-01)
561+
(3 rows)
562+
563+
TRUNCATE temporal3;
564+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
565+
-- with a conflict
566+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
567+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
568+
-- id matches but no conflict
569+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
570+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
571+
-- date matches but no conflict
572+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
573+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
574+
SELECT * FROM temporal3 ORDER BY id, valid_at;
575+
id | valid_at
576+
-------+-------------------------
577+
[1,2) | [2000-01-01,2010-01-01)
578+
(1 row)
579+
580+
TRUNCATE temporal3;
581+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
582+
-- with a conflict
583+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO NOTHING;
584+
-- id matches but no conflict
585+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO NOTHING;
586+
-- date matches but no conflict
587+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO NOTHING;
588+
SELECT * FROM temporal3 ORDER BY id, valid_at;
589+
id | valid_at
590+
-------+-------------------------
591+
[1,2) | [2000-01-01,2010-01-01)
592+
[1,2) | [2010-01-01,2020-01-01)
593+
[2,3) | [2005-01-01,2006-01-01)
594+
(3 rows)
595+
596+
TRUNCATE temporal3;
597+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
598+
-- with a conflict
599+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[2,3)';
600+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
601+
-- id matches but no conflict
602+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[3,4)';
603+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
604+
-- date matches but no conflict
605+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[4,5)';
606+
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
607+
SELECT * FROM temporal3 ORDER BY id, valid_at;
608+
id | valid_at
609+
-------+-------------------------
610+
[1,2) | [2000-01-01,2010-01-01)
611+
(1 row)
612+
613+
TRUNCATE temporal3;
614+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
615+
-- with a conflict
616+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO UPDATE SET id = EXCLUDED.id + '[2,3)';
617+
ERROR: ON CONFLICT DO UPDATE not supported with exclusion constraints
618+
-- id matches but no conflict
619+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO UPDATE SET id = EXCLUDED.id + '[3,4)';
620+
ERROR: ON CONFLICT DO UPDATE not supported with exclusion constraints
621+
-- date matches but no conflict
622+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO UPDATE SET id = EXCLUDED.id + '[4,5)';
623+
ERROR: ON CONFLICT DO UPDATE not supported with exclusion constraints
624+
SELECT * FROM temporal3 ORDER BY id, valid_at;
625+
id | valid_at
626+
-------+-------------------------
627+
[1,2) | [2000-01-01,2010-01-01)
628+
(1 row)
629+
630+
DROP TABLE temporal3;
631+
--
456632
-- test FK dependencies
457633
--
458634
-- can't drop a range referenced by an FK, unless with CASCADE

src/test/regress/sql/without_overlaps.sql

+113
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,119 @@ DROP TABLE temporal_partitioned;
319319
-- (should fail)
320320
ALTER TABLE temporal_rng REPLICA IDENTITY USING INDEX temporal_rng_pk;
321321

322+
--
323+
-- ON CONFLICT
324+
--
325+
326+
TRUNCATE temporal_rng;
327+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
328+
-- with a conflict
329+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
330+
-- id matches but no conflict
331+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT DO NOTHING;
332+
-- date matches but no conflict
333+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
334+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
335+
336+
TRUNCATE temporal_rng;
337+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
338+
-- with a conflict
339+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
340+
-- id matches but no conflict
341+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
342+
-- date matches but no conflict
343+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
344+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
345+
346+
TRUNCATE temporal_rng;
347+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
348+
-- with a conflict
349+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO NOTHING;
350+
-- id matches but no conflict
351+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO NOTHING;
352+
-- date matches but no conflict
353+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO NOTHING;
354+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
355+
356+
TRUNCATE temporal_rng;
357+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
358+
-- with a conflict
359+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[2,3)';
360+
-- id matches but no conflict
361+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[3,4)';
362+
-- date matches but no conflict
363+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[4,5)';
364+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
365+
366+
TRUNCATE temporal_rng;
367+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
368+
-- with a conflict
369+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO UPDATE SET id = EXCLUDED.id + '[2,3)';
370+
-- id matches but no conflict
371+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO UPDATE SET id = EXCLUDED.id + '[3,4)';
372+
-- date matches but no conflict
373+
INSERT INTO temporal_rng (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal_rng_pk DO UPDATE SET id = EXCLUDED.id + '[4,5)';
374+
SELECT * FROM temporal_rng ORDER BY id, valid_at;
375+
376+
-- with a UNIQUE constraint:
377+
378+
CREATE TABLE temporal3 (
379+
id int4range,
380+
valid_at daterange,
381+
CONSTRAINT temporal3_uq UNIQUE (id, valid_at WITHOUT OVERLAPS)
382+
);
383+
TRUNCATE temporal3;
384+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
385+
-- with a conflict
386+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
387+
-- id matches but no conflict
388+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT DO NOTHING;
389+
-- date matches but no conflict
390+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT DO NOTHING;
391+
SELECT * FROM temporal3 ORDER BY id, valid_at;
392+
393+
TRUNCATE temporal3;
394+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
395+
-- with a conflict
396+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
397+
-- id matches but no conflict
398+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
399+
-- date matches but no conflict
400+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO NOTHING;
401+
SELECT * FROM temporal3 ORDER BY id, valid_at;
402+
403+
TRUNCATE temporal3;
404+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
405+
-- with a conflict
406+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO NOTHING;
407+
-- id matches but no conflict
408+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO NOTHING;
409+
-- date matches but no conflict
410+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO NOTHING;
411+
SELECT * FROM temporal3 ORDER BY id, valid_at;
412+
413+
TRUNCATE temporal3;
414+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
415+
-- with a conflict
416+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[2,3)';
417+
-- id matches but no conflict
418+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[3,4)';
419+
-- date matches but no conflict
420+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT (id, valid_at) DO UPDATE SET id = EXCLUDED.id + '[4,5)';
421+
SELECT * FROM temporal3 ORDER BY id, valid_at;
422+
423+
TRUNCATE temporal3;
424+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2000-01-01', '2010-01-01'));
425+
-- with a conflict
426+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO UPDATE SET id = EXCLUDED.id + '[2,3)';
427+
-- id matches but no conflict
428+
INSERT INTO temporal3 (id, valid_at) VALUES ('[1,2)', daterange('2010-01-01', '2020-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO UPDATE SET id = EXCLUDED.id + '[3,4)';
429+
-- date matches but no conflict
430+
INSERT INTO temporal3 (id, valid_at) VALUES ('[2,3)', daterange('2005-01-01', '2006-01-01')) ON CONFLICT ON CONSTRAINT temporal3_uq DO UPDATE SET id = EXCLUDED.id + '[4,5)';
431+
SELECT * FROM temporal3 ORDER BY id, valid_at;
432+
433+
DROP TABLE temporal3;
434+
322435
--
323436
-- test FK dependencies
324437
--

0 commit comments

Comments
 (0)