Skip to content

Commit cd6f479

Browse files
committed
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
1 parent 7d1297d commit cd6f479

File tree

8 files changed

+40
-11
lines changed

8 files changed

+40
-11
lines changed

doc/src/sgml/catalogs.sgml

+11
Original file line numberDiff line numberDiff line change
@@ -3302,6 +3302,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
33023302
A code defining the specific semantics of this dependency relationship; see text
33033303
</para></entry>
33043304
</row>
3305+
3306+
<row>
3307+
<entry role="catalog_table_entry"><para role="column_definition">
3308+
<structfield>refobjversion</structfield> <type>text</type>
3309+
</para>
3310+
<para>
3311+
An optional version for the referenced object.
3312+
</para>
3313+
</entry>
3314+
</row>
3315+
33053316
</tbody>
33063317
</tgroup>
33073318
</table>

src/backend/catalog/dependency.c

+10-4
Original file line numberDiff line numberDiff line change
@@ -1600,7 +1600,9 @@ recordDependencyOnExpr(const ObjectAddress *depender,
16001600

16011601
/* And record 'em */
16021602
recordMultipleDependencies(depender,
1603-
context.addrs->refs, context.addrs->numrefs,
1603+
context.addrs->refs,
1604+
context.addrs->numrefs,
1605+
NULL,
16041606
behavior);
16051607

16061608
free_object_addresses(context.addrs);
@@ -1687,7 +1689,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
16871689
/* Record the self-dependencies with the appropriate direction */
16881690
if (!reverse_self)
16891691
recordMultipleDependencies(depender,
1690-
self_addrs->refs, self_addrs->numrefs,
1692+
self_addrs->refs,
1693+
self_addrs->numrefs,
1694+
NULL,
16911695
self_behavior);
16921696
else
16931697
{
@@ -1707,7 +1711,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
17071711

17081712
/* Record the external dependencies */
17091713
recordMultipleDependencies(depender,
1710-
context.addrs->refs, context.addrs->numrefs,
1714+
context.addrs->refs,
1715+
context.addrs->numrefs,
1716+
NULL,
17111717
behavior);
17121718

17131719
free_object_addresses(context.addrs);
@@ -2679,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
26792685
{
26802686
eliminate_duplicate_dependencies(referenced);
26812687
recordMultipleDependencies(depender,
2682-
referenced->refs, referenced->numrefs,
2688+
referenced->refs, referenced->numrefs, NULL,
26832689
behavior);
26842690
}
26852691

src/backend/catalog/pg_depend.c

+10-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "catalog/pg_extension.h"
2525
#include "commands/extension.h"
2626
#include "miscadmin.h"
27+
#include "utils/builtins.h"
2728
#include "utils/fmgroids.h"
2829
#include "utils/lsyscache.h"
2930
#include "utils/rel.h"
@@ -44,7 +45,7 @@ recordDependencyOn(const ObjectAddress *depender,
4445
const ObjectAddress *referenced,
4546
DependencyType behavior)
4647
{
47-
recordMultipleDependencies(depender, referenced, 1, behavior);
48+
recordMultipleDependencies(depender, referenced, 1, NULL, behavior);
4849
}
4950

5051
/*
@@ -55,6 +56,7 @@ void
5556
recordMultipleDependencies(const ObjectAddress *depender,
5657
const ObjectAddress *referenced,
5758
int nreferenced,
59+
const char *version,
5860
DependencyType behavior)
5961
{
6062
Relation dependDesc;
@@ -115,16 +117,20 @@ recordMultipleDependencies(const ObjectAddress *depender,
115117
* Record the dependency. Note we don't bother to check for duplicate
116118
* dependencies; there's no harm in them.
117119
*/
120+
memset(slot[slot_stored_count]->tts_isnull, false,
121+
slot[slot_stored_count]->tts_tupleDescriptor->natts * sizeof(bool));
122+
118123
slot[slot_stored_count]->tts_values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
119124
slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
120125
slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
121126
slot[slot_stored_count]->tts_values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
122127
slot[slot_stored_count]->tts_values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
123128
slot[slot_stored_count]->tts_values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
124129
slot[slot_stored_count]->tts_values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
125-
126-
memset(slot[slot_stored_count]->tts_isnull, false,
127-
slot[slot_stored_count]->tts_tupleDescriptor->natts * sizeof(bool));
130+
if (version)
131+
slot[slot_stored_count]->tts_values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
132+
else
133+
slot[slot_stored_count]->tts_isnull[Anum_pg_depend_refobjversion - 1] = true;
128134

129135
ExecStoreVirtualTuple(slot[slot_stored_count]);
130136
slot_stored_count++;

src/include/catalog/catversion.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 202011011
56+
#define CATALOG_VERSION_NO 202011012
5757

5858
#endif

src/include/catalog/dependency.h

+1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ extern void recordDependencyOn(const ObjectAddress *depender,
189189
extern void recordMultipleDependencies(const ObjectAddress *depender,
190190
const ObjectAddress *referenced,
191191
int nreferenced,
192+
const char *version,
192193
DependencyType behavior);
193194

194195
extern void recordDependencyOnCurrentExtension(const ObjectAddress *object,

src/include/catalog/pg_depend.h

+4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ CATALOG(pg_depend,2608,DependRelationId)
6161
* field. See DependencyType in catalog/dependency.h.
6262
*/
6363
char deptype; /* see codes in dependency.h */
64+
#ifdef CATALOG_VARLEN
65+
text refobjversion; /* version tracking, NULL if not used or
66+
* unknown */
67+
#endif
6468
} FormData_pg_depend;
6569

6670
/* ----------------

src/include/catalog/toasting.h

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ DECLARE_TOAST(pg_aggregate, 4159, 4160);
5353
DECLARE_TOAST(pg_attrdef, 2830, 2831);
5454
DECLARE_TOAST(pg_constraint, 2832, 2833);
5555
DECLARE_TOAST(pg_default_acl, 4143, 4144);
56+
DECLARE_TOAST(pg_depend, 8888, 8889);
5657
DECLARE_TOAST(pg_description, 2834, 2835);
5758
DECLARE_TOAST(pg_event_trigger, 4145, 4146);
5859
DECLARE_TOAST(pg_extension, 4147, 4148);

src/test/regress/expected/misc_sanity.out

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ WHERE refclassid = 0 OR refobjid = 0 OR
1818
deptype NOT IN ('a', 'e', 'i', 'n', 'p') OR
1919
(deptype != 'p' AND (classid = 0 OR objid = 0)) OR
2020
(deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0));
21-
classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype
22-
---------+-------+----------+------------+----------+-------------+---------
21+
classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype | refobjversion
22+
---------+-------+----------+------------+----------+-------------+---------+---------------
2323
(0 rows)
2424

2525
-- **************** pg_shdepend ****************

0 commit comments

Comments
 (0)