pg_class.relhaspkey doesn't seem to be used or useful for anything, so
can we remove it?  See attached patch.

-- 
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 01004383b0a3d30d519b9dc219b54c8d753df8ee Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pete...@gmx.net>
Date: Sat, 24 Feb 2018 21:25:08 -0500
Subject: [PATCH] Remove pg_class.relhaspkey

It's not used for anything internally, and it can't be relied on for
external uses, so it can just be removed.
---
 doc/src/sgml/catalogs.sgml          |  9 ---------
 src/backend/catalog/heap.c          |  1 -
 src/backend/catalog/index.c         | 32 ++-----------------------------
 src/backend/commands/vacuum.c       | 10 ----------
 src/backend/rewrite/rewriteDefine.c |  1 -
 src/include/catalog/pg_class.h      | 38 ++++++++++++++++++-------------------
 6 files changed, 20 insertions(+), 71 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 71e20f2740..b93eef4efc 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1848,15 +1848,6 @@ <title><structname>pg_class</structname> Columns</title>
       </entry>
      </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>
       <entry><structfield>relhasrules</structfield></entry>
       <entry><type>bool</type></entry>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index cf36ce4add..3d80ff9e5b 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -798,7 +798,6 @@ InsertPgClassTuple(Relation pg_class_desc,
        values[Anum_pg_class_relnatts - 1] = Int16GetDatum(rd_rel->relnatts);
        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_relhasrules - 1] = 
BoolGetDatum(rd_rel->relhasrules);
        values[Anum_pg_class_relhastriggers - 1] = 
BoolGetDatum(rd_rel->relhastriggers);
        values[Anum_pg_class_relrowsecurity - 1] = 
BoolGetDatum(rd_rel->relrowsecurity);
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 564f2069cf..6268c10e11 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -125,7 +125,7 @@ static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
                                        bool isvalid,
                                        bool isready);
 static void index_update_stats(Relation rel,
-                                  bool hasindex, bool isprimary,
+                                  bool hasindex,
                                   double reltuples);
 static void IndexCheckExclusion(Relation heapRelation,
                                        Relation indexRelation,
@@ -1162,7 +1162,6 @@ index_create(Relation heapRelation,
                 */
                index_update_stats(heapRelation,
                                                   true,
-                                                  isprimary,
                                                   -1.0);
                /* Make the above update visible */
                CommandCounterIncrement();
@@ -1364,21 +1363,6 @@ index_constraint_create(Relation heapRelation,
                                                         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.
         *
@@ -2041,7 +2025,6 @@ FormIndexDatum(IndexInfo *indexInfo,
  * to ensure we can do all the necessary work in just one update.
  *
  * 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
  *
  * If reltuples >= 0, relpages and relallvisible are also updated (using
@@ -2058,7 +2041,6 @@ FormIndexDatum(IndexInfo *indexInfo,
 static void
 index_update_stats(Relation rel,
                                   bool hasindex,
-                                  bool isprimary,
                                   double reltuples)
 {
        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
         * 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 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
         * change relpages (or relallvisible) if the caller isn't providing an
         * updated reltuples count, because that would bollix the
@@ -2140,14 +2122,6 @@ index_update_stats(Relation rel,
                rd_rel->relhasindex = hasindex;
                dirty = true;
        }
-       if (isprimary)
-       {
-               if (!rd_rel->relhaspkey)
-               {
-                       rd_rel->relhaspkey = true;
-                       dirty = true;
-               }
-       }
 
        if (reltuples >= 0)
        {
@@ -2356,11 +2330,9 @@ index_build(Relation heapRelation,
         */
        index_update_stats(heapRelation,
                                           true,
-                                          isprimary,
                                           stats->heap_tuples);
 
        index_update_stats(indexRelation,
-                                          false,
                                           false,
                                           stats->index_tuples);
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 7aca69a0ba..1fad073192 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -929,16 +929,6 @@ vac_update_relstats(Relation relation,
                        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 */
                if (pgcform->relhasrules && relation->rd_rules == NULL)
                {
diff --git a/src/backend/rewrite/rewriteDefine.c 
b/src/backend/rewrite/rewriteDefine.c
index f3a9b639a8..679be605f1 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -618,7 +618,6 @@ DefineQueryRewrite(const char *rulename,
                classForm->relhasindex = false;
                classForm->relkind = RELKIND_VIEW;
                classForm->relhasoids = false;
-               classForm->relhaspkey = false;
                classForm->relfrozenxid = InvalidTransactionId;
                classForm->relminmxid = InvalidMultiXactId;
                classForm->relreplident = REPLICA_IDENTITY_NOTHING;
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 26b1866c69..97026bfc2e 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
         */
        int16           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            relhasrules;    /* has (or has had) any rules */
        bool            relhastriggers; /* has (or has had) any TRIGGERs */
        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_relnamespace                     2
 #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_relchecks                                18
 #define Anum_pg_class_relhasoids                       19
-#define Anum_pg_class_relhaspkey                       20
-#define Anum_pg_class_relhasrules                      21
-#define Anum_pg_class_relhastriggers           22
-#define Anum_pg_class_relhassubclass           23
-#define Anum_pg_class_relrowsecurity           24
-#define Anum_pg_class_relforcerowsecurity      25
-#define Anum_pg_class_relispopulated           26
-#define Anum_pg_class_relreplident                     27
-#define Anum_pg_class_relispartition           28
-#define Anum_pg_class_relfrozenxid                     29
-#define Anum_pg_class_relminmxid                       30
-#define Anum_pg_class_relacl                           31
-#define Anum_pg_class_reloptions                       32
-#define Anum_pg_class_relpartbound                     33
+#define Anum_pg_class_relhasrules                      20
+#define Anum_pg_class_relhastriggers           21
+#define Anum_pg_class_relhassubclass           22
+#define Anum_pg_class_relrowsecurity           23
+#define Anum_pg_class_relforcerowsecurity      24
+#define Anum_pg_class_relispopulated           25
+#define Anum_pg_class_relreplident                     26
+#define Anum_pg_class_relispartition           27
+#define Anum_pg_class_relfrozenxid                     28
+#define Anum_pg_class_relminmxid                       29
+#define Anum_pg_class_relacl                           30
+#define Anum_pg_class_reloptions                       31
+#define Anum_pg_class_relpartbound                     32
 
 /* ----------------
  *             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;
  * 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("");
-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("");
-DATA(insert OID = 1255 (  pg_proc              PGNSP 81 0 PGUID 0 0 0 0 0 0 0 
f f p r 29 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 29 0 t f f f f f t n f 3 1 _null_ _null_ _null_));
 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("");
 
 
-- 
2.16.2

Reply via email to