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
This commit is contained in:
parent
6b960aae90
commit
f66e8bf875
@ -1848,15 +1848,6 @@ SCRAM-SHA-256$<replaceable><iteration count></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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* 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
|
|||||||
*/
|
*/
|
||||||
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;
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#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;
|
|||||||
#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;
|
|||||||
* 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("");
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user