Add pg_depend.refobjversion.
authorThomas Munro <tmunro@postgresql.org>
Mon, 2 Nov 2020 06:40:49 +0000 (19:40 +1300)
committerThomas Munro <tmunro@postgresql.org>
Mon, 2 Nov 2020 11:44:59 +0000 (00:44 +1300)
Provide a place for the version of referenced database objects to be
recorded.  A follow-up commit will use this to record dependencies on
collation versions for indexes, but similar ideas for other kinds of
objects have also been mooted.

Author: Thomas Munro <thomas.munro@gmail.com>
Reviewed-by: Julien Rouhaud <rjuju123@gmail.com>
Reviewed-by: Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com

doc/src/sgml/catalogs.sgml
src/backend/catalog/dependency.c
src/backend/catalog/pg_depend.c
src/include/catalog/catversion.h
src/include/catalog/dependency.h
src/include/catalog/pg_depend.h
src/include/catalog/toasting.h
src/test/regress/expected/misc_sanity.out

index d0d2598290e1f506f5c883533fe12c05cd5939e0..c3f324f05eb4c9e40ca8438099e5cab15215ec42 100644 (file)
@@ -3302,6 +3302,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
        A code defining the specific semantics of this dependency relationship; see text
       </para></entry>
      </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>refobjversion</structfield> <type>text</type>
+       </para>
+       <para>
+        An optional version for the referenced object.
+       </para>
+      </entry>
+     </row>
+
     </tbody>
    </tgroup>
   </table>
index f515e2c308bc5657ab7b425041eea856661813ea..1a927377e739d6c20d2e7b2fcdc9f63ce1fc1eb5 100644 (file)
@@ -1600,7 +1600,9 @@ recordDependencyOnExpr(const ObjectAddress *depender,
 
        /* And record 'em */
        recordMultipleDependencies(depender,
-                                                          context.addrs->refs, context.addrs->numrefs,
+                                                          context.addrs->refs,
+                                                          context.addrs->numrefs,
+                                                          NULL,
                                                           behavior);
 
        free_object_addresses(context.addrs);
@@ -1687,7 +1689,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
                /* Record the self-dependencies with the appropriate direction */
                if (!reverse_self)
                        recordMultipleDependencies(depender,
-                                                                          self_addrs->refs, self_addrs->numrefs,
+                                                                          self_addrs->refs,
+                                                                          self_addrs->numrefs,
+                                                                          NULL,
                                                                           self_behavior);
                else
                {
@@ -1707,7 +1711,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
 
        /* Record the external dependencies */
        recordMultipleDependencies(depender,
-                                                          context.addrs->refs, context.addrs->numrefs,
+                                                          context.addrs->refs,
+                                                          context.addrs->numrefs,
+                                                          NULL,
                                                           behavior);
 
        free_object_addresses(context.addrs);
@@ -2679,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
 {
        eliminate_duplicate_dependencies(referenced);
        recordMultipleDependencies(depender,
-                                                          referenced->refs, referenced->numrefs,
+                                                          referenced->refs, referenced->numrefs, NULL,
                                                           behavior);
 }
 
index 454e569fa98d40476aa1dd6201ae0239b05d7a88..09c30b13e884386340b36acb5a8ee351d0d7075c 100644 (file)
@@ -24,6 +24,7 @@
 #include "catalog/pg_extension.h"
 #include "commands/extension.h"
 #include "miscadmin.h"
+#include "utils/builtins.h"
 #include "utils/fmgroids.h"
 #include "utils/lsyscache.h"
 #include "utils/rel.h"
@@ -44,7 +45,7 @@ recordDependencyOn(const ObjectAddress *depender,
                                   const ObjectAddress *referenced,
                                   DependencyType behavior)
 {
-       recordMultipleDependencies(depender, referenced, 1, behavior);
+       recordMultipleDependencies(depender, referenced, 1, NULL, behavior);
 }
 
 /*
@@ -55,6 +56,7 @@ void
 recordMultipleDependencies(const ObjectAddress *depender,
                                                   const ObjectAddress *referenced,
                                                   int nreferenced,
+                                                  const char *version,
                                                   DependencyType behavior)
 {
        Relation        dependDesc;
@@ -115,6 +117,9 @@ recordMultipleDependencies(const ObjectAddress *depender,
                 * Record the dependency.  Note we don't bother to check for duplicate
                 * dependencies; there's no harm in them.
                 */
+               memset(slot[slot_stored_count]->tts_isnull, false,
+                          slot[slot_stored_count]->tts_tupleDescriptor->natts * sizeof(bool));
+
                slot[slot_stored_count]->tts_values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
                slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
                slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
@@ -122,9 +127,10 @@ recordMultipleDependencies(const ObjectAddress *depender,
                slot[slot_stored_count]->tts_values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
                slot[slot_stored_count]->tts_values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
                slot[slot_stored_count]->tts_values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
-
-               memset(slot[slot_stored_count]->tts_isnull, false,
-                          slot[slot_stored_count]->tts_tupleDescriptor->natts * sizeof(bool));
+               if (version)
+                       slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+               else
+                       slot[slot_stored_count]->tts_isnull[Anum_pg_depend_refobjversion - 1] = true;
 
                ExecStoreVirtualTuple(slot[slot_stored_count]);
                slot_stored_count++;
index fbb729a0b2ef8857af65724a570c128582f58634..6610e3c23f71716a2971e8c20f97cfecd41a06f0 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     202011011
+#define CATALOG_VERSION_NO     202011012
 
 #endif
index a8f7e9965b7c3eb9102f86540a8747760c6afee8..3baa5e498aa9b145a61ae59dfe33c1cd7a301e05 100644 (file)
@@ -189,6 +189,7 @@ extern void recordDependencyOn(const ObjectAddress *depender,
 extern void recordMultipleDependencies(const ObjectAddress *depender,
                                                                           const ObjectAddress *referenced,
                                                                           int nreferenced,
+                                                                          const char *version,
                                                                           DependencyType behavior);
 
 extern void recordDependencyOnCurrentExtension(const ObjectAddress *object,
index ccf0a983301c0502d30bd03588c1c46c2c3855eb..7489022795296055ff2bf45333f2fd9a2933ee22 100644 (file)
@@ -61,6 +61,10 @@ CATALOG(pg_depend,2608,DependRelationId)
         * field.  See DependencyType in catalog/dependency.h.
         */
        char            deptype;                /* see codes in dependency.h */
+#ifdef CATALOG_VARLEN
+       text            refobjversion;  /* version tracking, NULL if not used or
+                                                                * unknown */
+#endif
 } FormData_pg_depend;
 
 /* ----------------
index 8f131893dc4b1ff539cc5396675939f28911bd18..e320d822039b28305e27be62afe63e9668bdc881 100644 (file)
@@ -53,6 +53,7 @@ DECLARE_TOAST(pg_aggregate, 4159, 4160);
 DECLARE_TOAST(pg_attrdef, 2830, 2831);
 DECLARE_TOAST(pg_constraint, 2832, 2833);
 DECLARE_TOAST(pg_default_acl, 4143, 4144);
+DECLARE_TOAST(pg_depend, 8888, 8889);
 DECLARE_TOAST(pg_description, 2834, 2835);
 DECLARE_TOAST(pg_event_trigger, 4145, 4146);
 DECLARE_TOAST(pg_extension, 4147, 4148);
index 8538173ff8cdfcf53094af2b8eb0e9821d0b3aa2..d40afeef784c9a167feb08a51d9bc979cd0835a8 100644 (file)
@@ -18,8 +18,8 @@ WHERE refclassid = 0 OR refobjid = 0 OR
       deptype NOT IN ('a', 'e', 'i', 'n', 'p') OR
       (deptype != 'p' AND (classid = 0 OR objid = 0)) OR
       (deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0));
- classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype 
----------+-------+----------+------------+----------+-------------+---------
+ classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype | refobjversion 
+---------+-------+----------+------------+----------+-------------+---------+---------------
 (0 rows)
 
 -- **************** pg_shdepend ****************