diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 0703df6434..cdc85e5cc0 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1706,17 +1706,6 @@
-
- relhasexclusion
- bool
-
-
- For a table, true if the table has (or once had) any exclusion
- constraints; for an index, true if the index supports an exclusion
- constraint
-
-
-
relhasrules
bool
@@ -2046,8 +2035,7 @@
pg_class.relchecks needs to agree with the
number of check-constraint entries found in this table for each
- relation. Also, pg_class.relhasexclusion must
- be true if there are any exclusion-constraint entries for the relation.
+ relation.
@@ -3056,12 +3044,20 @@
(indisunique> should always be true when this is true)
+
+ indisexclusion
+ bool
+
+ If true, this index supports an exclusion constraint
+
+
indimmediate
bool
- If true, the uniqueness check is enforced immediately on insertion
- (indisunique> should always be true when this is true)
+ If true, the uniqueness check is enforced immediately on
+ insertion
+ (irrelevant if indisunique> is not true)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 5dfd8141eb..35e588ffd9 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -703,7 +703,6 @@ InsertPgClassTuple(Relation pg_class_desc,
values[Anum_pg_class_relchecks - 1] = Int16GetDatum(rd_rel->relchecks);
values[Anum_pg_class_relhasoids - 1] = BoolGetDatum(rd_rel->relhasoids);
values[Anum_pg_class_relhaspkey - 1] = BoolGetDatum(rd_rel->relhaspkey);
- values[Anum_pg_class_relhasexclusion - 1] = BoolGetDatum(rd_rel->relhasexclusion);
values[Anum_pg_class_relhasrules - 1] = BoolGetDatum(rd_rel->relhasrules);
values[Anum_pg_class_relhastriggers - 1] = BoolGetDatum(rd_rel->relhastriggers);
values[Anum_pg_class_relhassubclass - 1] = BoolGetDatum(rd_rel->relhassubclass);
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 86fd11b496..5254b65f39 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -96,10 +96,11 @@ static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
Oid *classOids,
int16 *coloptions,
bool primary,
+ bool isexclusion,
bool immediate,
bool isvalid);
static void index_update_stats(Relation rel,
- bool hasindex, bool isprimary, bool hasexclusion,
+ bool hasindex, bool isprimary,
Oid reltoastidxid, double reltuples);
static void IndexCheckExclusion(Relation heapRelation,
Relation indexRelation,
@@ -523,6 +524,7 @@ UpdateIndexRelation(Oid indexoid,
Oid *classOids,
int16 *coloptions,
bool primary,
+ bool isexclusion,
bool immediate,
bool isvalid)
{
@@ -591,6 +593,7 @@ UpdateIndexRelation(Oid indexoid,
values[Anum_pg_index_indnatts - 1] = Int16GetDatum(indexInfo->ii_NumIndexAttrs);
values[Anum_pg_index_indisunique - 1] = BoolGetDatum(indexInfo->ii_Unique);
values[Anum_pg_index_indisprimary - 1] = BoolGetDatum(primary);
+ values[Anum_pg_index_indisexclusion - 1] = BoolGetDatum(isexclusion);
values[Anum_pg_index_indimmediate - 1] = BoolGetDatum(immediate);
values[Anum_pg_index_indisclustered - 1] = BoolGetDatum(false);
values[Anum_pg_index_indisvalid - 1] = BoolGetDatum(isvalid);
@@ -819,7 +822,6 @@ index_create(Relation heapRelation,
indexRelation->rd_rel->relam = accessMethodObjectId;
indexRelation->rd_rel->relkind = RELKIND_INDEX;
indexRelation->rd_rel->relhasoids = false;
- indexRelation->rd_rel->relhasexclusion = is_exclusion;
/*
* store index's pg_class entry
@@ -854,7 +856,7 @@ index_create(Relation heapRelation,
* ----------------
*/
UpdateIndexRelation(indexRelationId, heapRelationId, indexInfo,
- classObjectId, coloptions, isprimary,
+ classObjectId, coloptions, isprimary, is_exclusion,
!deferrable,
!concurrent);
@@ -1024,7 +1026,6 @@ index_create(Relation heapRelation,
index_update_stats(heapRelation,
true,
isprimary,
- is_exclusion,
InvalidOid,
heapRelation->rd_rel->reltuples);
/* Make the above update visible */
@@ -1190,7 +1191,6 @@ index_constraint_create(Relation heapRelation,
index_update_stats(heapRelation,
true,
true,
- false,
InvalidOid,
heapRelation->rd_rel->reltuples);
@@ -1375,7 +1375,7 @@ BuildIndexInfo(Relation index)
ii->ii_PredicateState = NIL;
/* fetch exclusion constraint info if any */
- if (index->rd_rel->relhasexclusion)
+ if (indexStruct->indisexclusion)
{
RelationGetExclusionInfo(index,
&ii->ii_ExclusionOps,
@@ -1486,7 +1486,6 @@ FormIndexDatum(IndexInfo *indexInfo,
*
* hasindex: set relhasindex to this value
* isprimary: if true, set relhaspkey true; else no change
- * hasexclusion: if true, set relhasexclusion true; else no change
* reltoastidxid: if not InvalidOid, set reltoastidxid to this value;
* else no change
* reltuples: set reltuples to this value
@@ -1503,7 +1502,7 @@ FormIndexDatum(IndexInfo *indexInfo,
*/
static void
index_update_stats(Relation rel,
- bool hasindex, bool isprimary, bool hasexclusion,
+ bool hasindex, bool isprimary,
Oid reltoastidxid, double reltuples)
{
BlockNumber relpages = RelationGetNumberOfBlocks(rel);
@@ -1542,9 +1541,9 @@ index_update_stats(Relation rel,
* It is safe to use a non-transactional update even though our
* transaction could still fail before committing. Setting relhasindex
* true is safe even if there are no indexes (VACUUM will eventually fix
- * it), likewise for relhaspkey and relhasexclusion. And of course the
- * relpages and reltuples counts are correct (or at least more so than the
- * old values) regardless.
+ * it), likewise for relhaspkey. And of course the relpages and reltuples
+ * counts are correct (or at least more so than the old values)
+ * regardless.
*/
pg_class = heap_open(RelationRelationId, RowExclusiveLock);
@@ -1597,14 +1596,6 @@ index_update_stats(Relation rel,
dirty = true;
}
}
- if (hasexclusion)
- {
- if (!rd_rel->relhasexclusion)
- {
- rd_rel->relhasexclusion = true;
- dirty = true;
- }
- }
if (OidIsValid(reltoastidxid))
{
Assert(rd_rel->relkind == RELKIND_TOASTVALUE);
@@ -1760,13 +1751,11 @@ index_build(Relation heapRelation,
index_update_stats(heapRelation,
true,
isprimary,
- (indexInfo->ii_ExclusionOps != NULL),
(heapRelation->rd_rel->relkind == RELKIND_TOASTVALUE) ?
RelationGetRelid(indexRelation) : InvalidOid,
stats->heap_tuples);
index_update_stats(indexRelation,
- false,
false,
false,
InvalidOid,
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 9098c5d5c6..5663711674 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -524,21 +524,12 @@ vac_update_relstats(Relation relation,
/*
* If we have discovered that there are no indexes, then there's no
- * primary key either, nor any exclusion constraints. This could be done
- * more thoroughly...
+ * primary key either. This could be done more thoroughly...
*/
- if (!hasindex)
+ if (pgcform->relhaspkey && !hasindex)
{
- if (pgcform->relhaspkey)
- {
- pgcform->relhaspkey = false;
- dirty = true;
- }
- if (pgcform->relhasexclusion && pgcform->relkind != RELKIND_INDEX)
- {
- pgcform->relhasexclusion = false;
- dirty = true;
- }
+ pgcform->relhaspkey = false;
+ dirty = true;
}
/* We also clear relhasrules and relhastriggers if needed */
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 10f52954c1..e0ab88232b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -949,7 +949,7 @@ generateClonedIndexStmt(CreateStmtContext *cxt, Relation source_idx,
* certainly isn't. If it is or might be from a constraint, we have to
* fetch the pg_constraint record.
*/
- if (index->primary || index->unique || idxrelrec->relhasexclusion)
+ if (index->primary || index->unique || idxrec->indisexclusion)
{
Oid constraintId = get_index_constraint(source_relid);
@@ -970,7 +970,7 @@ generateClonedIndexStmt(CreateStmtContext *cxt, Relation source_idx,
index->initdeferred = conrec->condeferred;
/* If it's an exclusion constraint, we need the operator names */
- if (idxrelrec->relhasexclusion)
+ if (idxrec->indisexclusion)
{
Datum *elems;
int nElems;
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index df3c95b5f9..35349616bb 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 201101111
+#define CATALOG_VERSION_NO 201101251
#endif
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index b6a34c1779..33d34d55a4 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -61,7 +61,6 @@ CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO
int2 relchecks; /* # of CHECK constraints for class */
bool relhasoids; /* T if we generate OIDs for rows of rel */
bool relhaspkey; /* has (or has had) PRIMARY KEY index */
- bool relhasexclusion; /* has (or has had) exclusion constraint */
bool relhasrules; /* has (or has had) any rules */
bool relhastriggers; /* has (or has had) any TRIGGERs */
bool relhassubclass; /* has (or has had) derived classes */
@@ -93,7 +92,7 @@ typedef FormData_pg_class *Form_pg_class;
* ----------------
*/
-#define Natts_pg_class 27
+#define Natts_pg_class 26
#define Anum_pg_class_relname 1
#define Anum_pg_class_relnamespace 2
#define Anum_pg_class_reltype 3
@@ -114,13 +113,12 @@ typedef FormData_pg_class *Form_pg_class;
#define Anum_pg_class_relchecks 18
#define Anum_pg_class_relhasoids 19
#define Anum_pg_class_relhaspkey 20
-#define Anum_pg_class_relhasexclusion 21
-#define Anum_pg_class_relhasrules 22
-#define Anum_pg_class_relhastriggers 23
-#define Anum_pg_class_relhassubclass 24
-#define Anum_pg_class_relfrozenxid 25
-#define Anum_pg_class_relacl 26
-#define Anum_pg_class_reloptions 27
+#define Anum_pg_class_relhasrules 21
+#define Anum_pg_class_relhastriggers 22
+#define Anum_pg_class_relhassubclass 23
+#define Anum_pg_class_relfrozenxid 24
+#define Anum_pg_class_relacl 25
+#define Anum_pg_class_reloptions 26
/* ----------------
* initial contents of pg_class
@@ -132,13 +130,13 @@ typedef FormData_pg_class *Form_pg_class;
*/
/* Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId */
-DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 28 0 t f f f f f 3 _null_ _null_ ));
+DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 28 0 t f f f f 3 _null_ _null_ ));
DESCR("");
-DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 19 0 f f f f f f 3 _null_ _null_ ));
+DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 19 0 f f f f f 3 _null_ _null_ ));
DESCR("");
-DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 25 0 t f f f f f 3 _null_ _null_ ));
+DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 25 0 t f f f f 3 _null_ _null_ ));
DESCR("");
-DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 27 0 t f f f f f 3 _null_ _null_ ));
+DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 26 0 t f f f f 3 _null_ _null_ ));
DESCR("");
#define RELKIND_INDEX 'i' /* secondary index */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index 9bdf4da043..0dcae6963c 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -35,6 +35,7 @@ CATALOG(pg_index,2610) BKI_WITHOUT_OIDS BKI_SCHEMA_MACRO
int2 indnatts; /* number of columns in index */
bool indisunique; /* is this a unique index? */
bool indisprimary; /* is this index for primary key? */
+ bool indisexclusion; /* is this index for exclusion constraint? */
bool indimmediate; /* is uniqueness enforced immediately? */
bool indisclustered; /* is this the index last clustered by? */
bool indisvalid; /* is this index valid for use by queries? */
@@ -63,22 +64,23 @@ typedef FormData_pg_index *Form_pg_index;
* compiler constants for pg_index
* ----------------
*/
-#define Natts_pg_index 15
+#define Natts_pg_index 16
#define Anum_pg_index_indexrelid 1
#define Anum_pg_index_indrelid 2
#define Anum_pg_index_indnatts 3
#define Anum_pg_index_indisunique 4
#define Anum_pg_index_indisprimary 5
-#define Anum_pg_index_indimmediate 6
-#define Anum_pg_index_indisclustered 7
-#define Anum_pg_index_indisvalid 8
-#define Anum_pg_index_indcheckxmin 9
-#define Anum_pg_index_indisready 10
-#define Anum_pg_index_indkey 11
-#define Anum_pg_index_indclass 12
-#define Anum_pg_index_indoption 13
-#define Anum_pg_index_indexprs 14
-#define Anum_pg_index_indpred 15
+#define Anum_pg_index_indisexclusion 6
+#define Anum_pg_index_indimmediate 7
+#define Anum_pg_index_indisclustered 8
+#define Anum_pg_index_indisvalid 9
+#define Anum_pg_index_indcheckxmin 10
+#define Anum_pg_index_indisready 11
+#define Anum_pg_index_indkey 12
+#define Anum_pg_index_indclass 13
+#define Anum_pg_index_indoption 14
+#define Anum_pg_index_indexprs 15
+#define Anum_pg_index_indpred 16
/*
* Index AMs that support ordered scans must support these two indoption