mirror of
https://github.com/postgres/postgres.git
synced 2025-11-04 20:11:56 +03:00
Add temporal PRIMARY KEY and UNIQUE constraints
Add WITHOUT OVERLAPS clause to PRIMARY KEY and UNIQUE constraints. These are backed by GiST indexes instead of B-tree indexes, since they are essentially exclusion constraints with = for the scalar parts of the key and && for the temporal part. Author: Paul A. Jungwirth <pj@illuminatedcomputing.com> Reviewed-by: Peter Eisentraut <peter@eisentraut.org> Reviewed-by: jian he <jian.universality@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/CA+renyUApHgSZF9-nd-a0+OPGharLQLO=mDHcY4_qQ0+noCUVg@mail.gmail.com
This commit is contained in:
18
src/backend/utils/cache/relcache.c
vendored
18
src/backend/utils/cache/relcache.c
vendored
@@ -5568,11 +5568,14 @@ RelationGetIdentityKeyBitmap(Relation relation)
|
||||
/*
|
||||
* RelationGetExclusionInfo -- get info about index's exclusion constraint
|
||||
*
|
||||
* This should be called only for an index that is known to have an
|
||||
* associated exclusion constraint. It returns arrays (palloc'd in caller's
|
||||
* context) of the exclusion operator OIDs, their underlying functions'
|
||||
* OIDs, and their strategy numbers in the index's opclasses. We cache
|
||||
* all this information since it requires a fair amount of work to get.
|
||||
* This should be called only for an index that is known to have an associated
|
||||
* exclusion constraint or primary key/unique constraint using WITHOUT
|
||||
* OVERLAPS.
|
||||
|
||||
* It returns arrays (palloc'd in caller's context) of the exclusion operator
|
||||
* OIDs, their underlying functions' OIDs, and their strategy numbers in the
|
||||
* index's opclasses. We cache all this information since it requires a fair
|
||||
* amount of work to get.
|
||||
*/
|
||||
void
|
||||
RelationGetExclusionInfo(Relation indexRelation,
|
||||
@@ -5636,7 +5639,10 @@ RelationGetExclusionInfo(Relation indexRelation,
|
||||
int nelem;
|
||||
|
||||
/* We want the exclusion constraint owning the index */
|
||||
if (conform->contype != CONSTRAINT_EXCLUSION ||
|
||||
if ((conform->contype != CONSTRAINT_EXCLUSION &&
|
||||
!(conform->conwithoutoverlaps && (
|
||||
conform->contype == CONSTRAINT_PRIMARY
|
||||
|| conform->contype == CONSTRAINT_UNIQUE))) ||
|
||||
conform->conindid != RelationGetRelid(indexRelation))
|
||||
continue;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user