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

Lines changed: 11 additions & 0 deletions
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

Lines changed: 10 additions & 4 deletions
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

Lines changed: 10 additions & 4 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 2 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy