diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-01-25 17:51:59 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-01-25 17:51:59 -0500 |
commit | bd1ad1b019cda851a3e925133c056930368e6424 (patch) | |
tree | 7a0457da38302b33a9ffb79f2904174b22b1805c /src | |
parent | 88452d5ba6b3e8ad49133ac1a660ce0725710f8c (diff) | |
download | postgresql-bd1ad1b019cda851a3e925133c056930368e6424.tar.gz postgresql-bd1ad1b019cda851a3e925133c056930368e6424.zip |
Replace pg_class.relhasexclusion with pg_index.indisexclusion.
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/heap.c | 1 | ||||
-rw-r--r-- | src/backend/catalog/index.c | 31 | ||||
-rw-r--r-- | src/backend/commands/vacuum.c | 17 | ||||
-rw-r--r-- | src/backend/parser/parse_utilcmd.c | 4 | ||||
-rw-r--r-- | src/include/catalog/catversion.h | 2 | ||||
-rw-r--r-- | src/include/catalog/pg_class.h | 24 | ||||
-rw-r--r-- | src/include/catalog/pg_index.h | 24 |
7 files changed, 41 insertions, 62 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 5dfd8141eb6..35e588ffd93 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 86fd11b496b..5254b65f395 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,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); diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 9098c5d5c6f..56637116745 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 10f52954c11..e0ab88232b1 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 df3c95b5f91..35349616bb9 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 b6a34c1779a..33d34d55a4c 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 9bdf4da043c..0dcae6963c1 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 |