Commit cd6f479e authored by Thomas Munro's avatar Thomas Munro

Add pg_depend.refobjversion.

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: default avatarJulien Rouhaud <rjuju123@gmail.com>
Reviewed-by: default avatarPeter Eisentraut <peter.eisentraut@2ndquadrant.com>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
parent 7d1297df
...@@ -3302,6 +3302,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l ...@@ -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 A code defining the specific semantics of this dependency relationship; see text
</para></entry> </para></entry>
</row> </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> </tbody>
</tgroup> </tgroup>
</table> </table>
......
...@@ -1600,7 +1600,9 @@ recordDependencyOnExpr(const ObjectAddress *depender, ...@@ -1600,7 +1600,9 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */ /* And record 'em */
recordMultipleDependencies(depender, recordMultipleDependencies(depender,
context.addrs->refs, context.addrs->numrefs, context.addrs->refs,
context.addrs->numrefs,
NULL,
behavior); behavior);
free_object_addresses(context.addrs); free_object_addresses(context.addrs);
...@@ -1687,7 +1689,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender, ...@@ -1687,7 +1689,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the self-dependencies with the appropriate direction */ /* Record the self-dependencies with the appropriate direction */
if (!reverse_self) if (!reverse_self)
recordMultipleDependencies(depender, recordMultipleDependencies(depender,
self_addrs->refs, self_addrs->numrefs, self_addrs->refs,
self_addrs->numrefs,
NULL,
self_behavior); self_behavior);
else else
{ {
...@@ -1707,7 +1711,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender, ...@@ -1707,7 +1711,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */ /* Record the external dependencies */
recordMultipleDependencies(depender, recordMultipleDependencies(depender,
context.addrs->refs, context.addrs->numrefs, context.addrs->refs,
context.addrs->numrefs,
NULL,
behavior); behavior);
free_object_addresses(context.addrs); free_object_addresses(context.addrs);
...@@ -2679,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender, ...@@ -2679,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{ {
eliminate_duplicate_dependencies(referenced); eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender, recordMultipleDependencies(depender,
referenced->refs, referenced->numrefs, referenced->refs, referenced->numrefs, NULL,
behavior); behavior);
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "catalog/pg_extension.h" #include "catalog/pg_extension.h"
#include "commands/extension.h" #include "commands/extension.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h" #include "utils/fmgroids.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/rel.h" #include "utils/rel.h"
...@@ -44,7 +45,7 @@ recordDependencyOn(const ObjectAddress *depender, ...@@ -44,7 +45,7 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced, const ObjectAddress *referenced,
DependencyType behavior) DependencyType behavior)
{ {
recordMultipleDependencies(depender, referenced, 1, behavior); recordMultipleDependencies(depender, referenced, 1, NULL, behavior);
} }
/* /*
...@@ -55,6 +56,7 @@ void ...@@ -55,6 +56,7 @@ void
recordMultipleDependencies(const ObjectAddress *depender, recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced, const ObjectAddress *referenced,
int nreferenced, int nreferenced,
const char *version,
DependencyType behavior) DependencyType behavior)
{ {
Relation dependDesc; Relation dependDesc;
...@@ -115,6 +117,9 @@ recordMultipleDependencies(const ObjectAddress *depender, ...@@ -115,6 +117,9 @@ recordMultipleDependencies(const ObjectAddress *depender,
* Record the dependency. Note we don't bother to check for duplicate * Record the dependency. Note we don't bother to check for duplicate
* dependencies; there's no harm in them. * 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_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_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId); slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
...@@ -122,9 +127,10 @@ recordMultipleDependencies(const ObjectAddress *depender, ...@@ -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_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_objid - 1] = ObjectIdGetDatum(depender->objectId);
slot[slot_stored_count]->tts_values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId); slot[slot_stored_count]->tts_values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
if (version)
memset(slot[slot_stored_count]->tts_isnull, false, slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
slot[slot_stored_count]->tts_tupleDescriptor->natts * sizeof(bool)); else
slot[slot_stored_count]->tts_isnull[Anum_pg_depend_refobjversion - 1] = true;
ExecStoreVirtualTuple(slot[slot_stored_count]); ExecStoreVirtualTuple(slot[slot_stored_count]);
slot_stored_count++; slot_stored_count++;
......
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 202011011 #define CATALOG_VERSION_NO 202011012
#endif #endif
...@@ -189,6 +189,7 @@ extern void recordDependencyOn(const ObjectAddress *depender, ...@@ -189,6 +189,7 @@ extern void recordDependencyOn(const ObjectAddress *depender,
extern void recordMultipleDependencies(const ObjectAddress *depender, extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced, const ObjectAddress *referenced,
int nreferenced, int nreferenced,
const char *version,
DependencyType behavior); DependencyType behavior);
extern void recordDependencyOnCurrentExtension(const ObjectAddress *object, extern void recordDependencyOnCurrentExtension(const ObjectAddress *object,
......
...@@ -61,6 +61,10 @@ CATALOG(pg_depend,2608,DependRelationId) ...@@ -61,6 +61,10 @@ CATALOG(pg_depend,2608,DependRelationId)
* field. See DependencyType in catalog/dependency.h. * field. See DependencyType in catalog/dependency.h.
*/ */
char deptype; /* see codes in 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; } FormData_pg_depend;
/* ---------------- /* ----------------
......
...@@ -53,6 +53,7 @@ DECLARE_TOAST(pg_aggregate, 4159, 4160); ...@@ -53,6 +53,7 @@ DECLARE_TOAST(pg_aggregate, 4159, 4160);
DECLARE_TOAST(pg_attrdef, 2830, 2831); DECLARE_TOAST(pg_attrdef, 2830, 2831);
DECLARE_TOAST(pg_constraint, 2832, 2833); DECLARE_TOAST(pg_constraint, 2832, 2833);
DECLARE_TOAST(pg_default_acl, 4143, 4144); DECLARE_TOAST(pg_default_acl, 4143, 4144);
DECLARE_TOAST(pg_depend, 8888, 8889);
DECLARE_TOAST(pg_description, 2834, 2835); DECLARE_TOAST(pg_description, 2834, 2835);
DECLARE_TOAST(pg_event_trigger, 4145, 4146); DECLARE_TOAST(pg_event_trigger, 4145, 4146);
DECLARE_TOAST(pg_extension, 4147, 4148); DECLARE_TOAST(pg_extension, 4147, 4148);
......
...@@ -18,8 +18,8 @@ WHERE refclassid = 0 OR refobjid = 0 OR ...@@ -18,8 +18,8 @@ WHERE refclassid = 0 OR refobjid = 0 OR
deptype NOT IN ('a', 'e', 'i', 'n', 'p') 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
(deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0)); (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) (0 rows)
-- **************** pg_shdepend **************** -- **************** pg_shdepend ****************
......
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