mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
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: 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
This commit is contained in:
@ -3302,6 +3302,17 @@ SCRAM-SHA-256$<replaceable><iteration count></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,
|
|||||||
|
|
||||||
/* 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,
|
|||||||
/* 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,
|
|||||||
|
|
||||||
/* 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,
|
|||||||
{
|
{
|
||||||
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 @@
|
|||||||
#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,
|
|||||||
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
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 202011011
|
#define CATALOG_VERSION_NO 202011012
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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)
|
|||||||
* 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);
|
|||||||
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
|
|||||||
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 ****************
|
||||||
|
Reference in New Issue
Block a user