Commit f66e8bf8 authored by Peter Eisentraut's avatar Peter Eisentraut

Remove pg_class.relhaspkey

It is not used for anything internally, and it cannot be relied on for
external uses, so it can just be removed.  To correct recommended way to
check for a primary key is in pg_index.

Discussion: https://www.postgresql.org/message-id/flat/b1a24c6c-6913-f89c-674e-0704f0ed69db@2ndquadrant.com
parent 6b960aae
...@@ -1848,15 +1848,6 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l ...@@ -1848,15 +1848,6 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
</entry> </entry>
</row> </row>
<row>
<entry><structfield>relhaspkey</structfield></entry>
<entry><type>bool</type></entry>
<entry></entry>
<entry>
True if the table has (or once had) a primary key
</entry>
</row>
<row> <row>
<entry><structfield>relhasrules</structfield></entry> <entry><structfield>relhasrules</structfield></entry>
<entry><type>bool</type></entry> <entry><type>bool</type></entry>
......
...@@ -798,7 +798,6 @@ InsertPgClassTuple(Relation pg_class_desc, ...@@ -798,7 +798,6 @@ InsertPgClassTuple(Relation pg_class_desc,
values[Anum_pg_class_relnatts - 1] = Int16GetDatum(rd_rel->relnatts); values[Anum_pg_class_relnatts - 1] = Int16GetDatum(rd_rel->relnatts);
values[Anum_pg_class_relchecks - 1] = Int16GetDatum(rd_rel->relchecks); values[Anum_pg_class_relchecks - 1] = Int16GetDatum(rd_rel->relchecks);
values[Anum_pg_class_relhasoids - 1] = BoolGetDatum(rd_rel->relhasoids); values[Anum_pg_class_relhasoids - 1] = BoolGetDatum(rd_rel->relhasoids);
values[Anum_pg_class_relhaspkey - 1] = BoolGetDatum(rd_rel->relhaspkey);
values[Anum_pg_class_relhasrules - 1] = BoolGetDatum(rd_rel->relhasrules); values[Anum_pg_class_relhasrules - 1] = BoolGetDatum(rd_rel->relhasrules);
values[Anum_pg_class_relhastriggers - 1] = BoolGetDatum(rd_rel->relhastriggers); values[Anum_pg_class_relhastriggers - 1] = BoolGetDatum(rd_rel->relhastriggers);
values[Anum_pg_class_relrowsecurity - 1] = BoolGetDatum(rd_rel->relrowsecurity); values[Anum_pg_class_relrowsecurity - 1] = BoolGetDatum(rd_rel->relrowsecurity);
......
...@@ -125,7 +125,7 @@ static void UpdateIndexRelation(Oid indexoid, Oid heapoid, ...@@ -125,7 +125,7 @@ static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
bool isvalid, bool isvalid,
bool isready); bool isready);
static void index_update_stats(Relation rel, static void index_update_stats(Relation rel,
bool hasindex, bool isprimary, bool hasindex,
double reltuples); double reltuples);
static void IndexCheckExclusion(Relation heapRelation, static void IndexCheckExclusion(Relation heapRelation,
Relation indexRelation, Relation indexRelation,
...@@ -1162,7 +1162,6 @@ index_create(Relation heapRelation, ...@@ -1162,7 +1162,6 @@ index_create(Relation heapRelation,
*/ */
index_update_stats(heapRelation, index_update_stats(heapRelation,
true, true,
isprimary,
-1.0); -1.0);
/* Make the above update visible */ /* Make the above update visible */
CommandCounterIncrement(); CommandCounterIncrement();
...@@ -1364,21 +1363,6 @@ index_constraint_create(Relation heapRelation, ...@@ -1364,21 +1363,6 @@ index_constraint_create(Relation heapRelation,
InvalidOid, conOid, indexRelationId, true); InvalidOid, conOid, indexRelationId, true);
} }
/*
* If needed, mark the table as having a primary key. We assume it can't
* have been so marked already, so no need to clear the flag in the other
* case.
*
* Note: this might better be done by callers. We do it here to avoid
* exposing index_update_stats() globally, but that wouldn't be necessary
* if relhaspkey went away.
*/
if (mark_as_primary)
index_update_stats(heapRelation,
true,
true,
-1.0);
/* /*
* If needed, mark the index as primary and/or deferred in pg_index. * If needed, mark the index as primary and/or deferred in pg_index.
* *
...@@ -2041,7 +2025,6 @@ FormIndexDatum(IndexInfo *indexInfo, ...@@ -2041,7 +2025,6 @@ FormIndexDatum(IndexInfo *indexInfo,
* to ensure we can do all the necessary work in just one update. * to ensure we can do all the necessary work in just one update.
* *
* hasindex: set relhasindex to this value * hasindex: set relhasindex to this value
* isprimary: if true, set relhaspkey true; else no change
* reltuples: if >= 0, set reltuples to this value; else no change * reltuples: if >= 0, set reltuples to this value; else no change
* *
* If reltuples >= 0, relpages and relallvisible are also updated (using * If reltuples >= 0, relpages and relallvisible are also updated (using
...@@ -2058,7 +2041,6 @@ FormIndexDatum(IndexInfo *indexInfo, ...@@ -2058,7 +2041,6 @@ FormIndexDatum(IndexInfo *indexInfo,
static void static void
index_update_stats(Relation rel, index_update_stats(Relation rel,
bool hasindex, bool hasindex,
bool isprimary,
double reltuples) double reltuples)
{ {
Oid relid = RelationGetRelid(rel); Oid relid = RelationGetRelid(rel);
...@@ -2088,7 +2070,7 @@ index_update_stats(Relation rel, ...@@ -2088,7 +2070,7 @@ index_update_stats(Relation rel,
* It is safe to use a non-transactional update even though our * It is safe to use a non-transactional update even though our
* transaction could still fail before committing. Setting relhasindex * transaction could still fail before committing. Setting relhasindex
* true is safe even if there are no indexes (VACUUM will eventually fix * true is safe even if there are no indexes (VACUUM will eventually fix
* it), likewise for relhaspkey. And of course the new relpages and * it). And of course the new relpages and
* reltuples counts are correct regardless. However, we don't want to * reltuples counts are correct regardless. However, we don't want to
* change relpages (or relallvisible) if the caller isn't providing an * change relpages (or relallvisible) if the caller isn't providing an
* updated reltuples count, because that would bollix the * updated reltuples count, because that would bollix the
...@@ -2140,14 +2122,6 @@ index_update_stats(Relation rel, ...@@ -2140,14 +2122,6 @@ index_update_stats(Relation rel,
rd_rel->relhasindex = hasindex; rd_rel->relhasindex = hasindex;
dirty = true; dirty = true;
} }
if (isprimary)
{
if (!rd_rel->relhaspkey)
{
rd_rel->relhaspkey = true;
dirty = true;
}
}
if (reltuples >= 0) if (reltuples >= 0)
{ {
...@@ -2356,11 +2330,9 @@ index_build(Relation heapRelation, ...@@ -2356,11 +2330,9 @@ index_build(Relation heapRelation,
*/ */
index_update_stats(heapRelation, index_update_stats(heapRelation,
true, true,
isprimary,
stats->heap_tuples); stats->heap_tuples);
index_update_stats(indexRelation, index_update_stats(indexRelation,
false,
false, false,
stats->index_tuples); stats->index_tuples);
......
...@@ -909,16 +909,6 @@ vac_update_relstats(Relation relation, ...@@ -909,16 +909,6 @@ vac_update_relstats(Relation relation,
dirty = true; dirty = true;
} }
/*
* If we have discovered that there are no indexes, then there's no
* primary key either. This could be done more thoroughly...
*/
if (pgcform->relhaspkey && !hasindex)
{
pgcform->relhaspkey = false;
dirty = true;
}
/* We also clear relhasrules and relhastriggers if needed */ /* We also clear relhasrules and relhastriggers if needed */
if (pgcform->relhasrules && relation->rd_rules == NULL) if (pgcform->relhasrules && relation->rd_rules == NULL)
{ {
......
...@@ -618,7 +618,6 @@ DefineQueryRewrite(const char *rulename, ...@@ -618,7 +618,6 @@ DefineQueryRewrite(const char *rulename,
classForm->relhasindex = false; classForm->relhasindex = false;
classForm->relkind = RELKIND_VIEW; classForm->relkind = RELKIND_VIEW;
classForm->relhasoids = false; classForm->relhasoids = false;
classForm->relhaspkey = false;
classForm->relfrozenxid = InvalidTransactionId; classForm->relfrozenxid = InvalidTransactionId;
classForm->relminmxid = InvalidMultiXactId; classForm->relminmxid = InvalidMultiXactId;
classForm->relreplident = REPLICA_IDENTITY_NOTHING; classForm->relreplident = REPLICA_IDENTITY_NOTHING;
......
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 201803021 #define CATALOG_VERSION_NO 201803141
#endif #endif
...@@ -61,7 +61,6 @@ CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO ...@@ -61,7 +61,6 @@ CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO
*/ */
int16 relchecks; /* # of CHECK constraints for class */ int16 relchecks; /* # of CHECK constraints for class */
bool relhasoids; /* T if we generate OIDs for rows of rel */ bool relhasoids; /* T if we generate OIDs for rows of rel */
bool relhaspkey; /* has (or has had) PRIMARY KEY index */
bool relhasrules; /* has (or has had) any rules */ bool relhasrules; /* has (or has had) any rules */
bool relhastriggers; /* has (or has had) any TRIGGERs */ bool relhastriggers; /* has (or has had) any TRIGGERs */
bool relhassubclass; /* has (or has had) derived classes */ bool relhassubclass; /* has (or has had) derived classes */
...@@ -99,7 +98,7 @@ typedef FormData_pg_class *Form_pg_class; ...@@ -99,7 +98,7 @@ typedef FormData_pg_class *Form_pg_class;
* ---------------- * ----------------
*/ */
#define Natts_pg_class 33 #define Natts_pg_class 32
#define Anum_pg_class_relname 1 #define Anum_pg_class_relname 1
#define Anum_pg_class_relnamespace 2 #define Anum_pg_class_relnamespace 2
#define Anum_pg_class_reltype 3 #define Anum_pg_class_reltype 3
...@@ -119,20 +118,19 @@ typedef FormData_pg_class *Form_pg_class; ...@@ -119,20 +118,19 @@ typedef FormData_pg_class *Form_pg_class;
#define Anum_pg_class_relnatts 17 #define Anum_pg_class_relnatts 17
#define Anum_pg_class_relchecks 18 #define Anum_pg_class_relchecks 18
#define Anum_pg_class_relhasoids 19 #define Anum_pg_class_relhasoids 19
#define Anum_pg_class_relhaspkey 20 #define Anum_pg_class_relhasrules 20
#define Anum_pg_class_relhasrules 21 #define Anum_pg_class_relhastriggers 21
#define Anum_pg_class_relhastriggers 22 #define Anum_pg_class_relhassubclass 22
#define Anum_pg_class_relhassubclass 23 #define Anum_pg_class_relrowsecurity 23
#define Anum_pg_class_relrowsecurity 24 #define Anum_pg_class_relforcerowsecurity 24
#define Anum_pg_class_relforcerowsecurity 25 #define Anum_pg_class_relispopulated 25
#define Anum_pg_class_relispopulated 26 #define Anum_pg_class_relreplident 26
#define Anum_pg_class_relreplident 27 #define Anum_pg_class_relispartition 27
#define Anum_pg_class_relispartition 28 #define Anum_pg_class_relfrozenxid 28
#define Anum_pg_class_relfrozenxid 29 #define Anum_pg_class_relminmxid 29
#define Anum_pg_class_relminmxid 30 #define Anum_pg_class_relacl 30
#define Anum_pg_class_relacl 31 #define Anum_pg_class_reloptions 31
#define Anum_pg_class_reloptions 32 #define Anum_pg_class_relpartbound 32
#define Anum_pg_class_relpartbound 33
/* ---------------- /* ----------------
* initial contents of pg_class * initial contents of pg_class
...@@ -147,13 +145,13 @@ typedef FormData_pg_class *Form_pg_class; ...@@ -147,13 +145,13 @@ typedef FormData_pg_class *Form_pg_class;
* Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId; * Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId;
* similarly, "1" in relminmxid stands for FirstMultiXactId * similarly, "1" in relminmxid stands for FirstMultiXactId
*/ */
DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 30 0 t f f f f f f t n f 3 1 _null_ _null_ _null_)); DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 30 0 t f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR(""); DESCR("");
DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 22 0 f f f f f f f t n f 3 1 _null_ _null_ _null_)); DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 22 0 f f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR(""); DESCR("");
DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 28 0 t f f f f f f t n f 3 1 _null_ _null_ _null_)); DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 28 0 t f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR(""); DESCR("");
DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 33 0 t f f f f f f t n f 3 1 _null_ _null_ _null_)); DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 32 0 t f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR(""); DESCR("");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment