OSDN Git Service

Replace pg_class.relhasexclusion with pg_index.indisexclusion.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 25 Jan 2011 22:51:59 +0000 (17:51 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 25 Jan 2011 22:51:59 +0000 (17:51 -0500)
There isn't any need to track this state on a table-wide basis, and trying
to do so introduces undesirable semantic fuzziness.  Move the flag to
pg_index, where it clearly describes just a single index and can be
immutable after index creation.

doc/src/sgml/catalogs.sgml
src/backend/catalog/heap.c
src/backend/catalog/index.c
src/backend/commands/vacuum.c
src/backend/parser/parse_utilcmd.c
src/include/catalog/catversion.h
src/include/catalog/pg_class.h
src/include/catalog/pg_index.h

index 0703df6..cdc85e5 100644 (file)
      </row>
 
      <row>
-      <entry><structfield>relhasexclusion</structfield></entry>
-      <entry><type>bool</type></entry>
-      <entry></entry>
-      <entry>
-       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
-      </entry>
-     </row>
-
-     <row>
       <entry><structfield>relhasrules</structfield></entry>
       <entry><type>bool</type></entry>
       <entry></entry>
    <para>
     <literal>pg_class.relchecks</literal> needs to agree with the
     number of check-constraint entries found in this table for each
-    relation.  Also, <literal>pg_class.relhasexclusion</literal> must
-    be true if there are any exclusion-constraint entries for the relation.
+    relation.
    </para>
   </note>
 
      </row>
 
      <row>
+      <entry><structfield>indisexclusion</structfield></entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>If true, this index supports an exclusion constraint</entry>
+     </row>
+
+     <row>
       <entry><structfield>indimmediate</structfield></entry>
       <entry><type>bool</type></entry>
       <entry></entry>
-      <entry>If true, the uniqueness check is enforced immediately on insertion
-      (<structfield>indisunique</> should always be true when this is true)</entry>
+      <entry>If true, the uniqueness check is enforced immediately on
+       insertion
+       (irrelevant if <structfield>indisunique</> is not true)</entry>
      </row>
 
      <row>
index 5dfd814..35e588f 100644 (file)
@@ -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);
index 86fd11b..5254b65 100644 (file)
@@ -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,7 +1751,6 @@ 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);
@@ -1768,7 +1758,6 @@ index_build(Relation heapRelation,
        index_update_stats(indexRelation,
                                           false,
                                           false,
-                                          false,
                                           InvalidOid,
                                           stats->index_tuples);
 
index 9098c5d..5663711 100644 (file)
@@ -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 */
index 10f5295..e0ab882 100644 (file)
@@ -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;
index df3c95b..3534961 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201101111
+#define CATALOG_VERSION_NO     201101251
 
 #endif
index b6a34c1..33d34d5 100644 (file)
@@ -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 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 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 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 */
index 9bdf4da..0dcae69 100644 (file)
@@ -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