public inbox for [email protected]
help / color / mirror / Atom feed[PATCH v17 2/7] Add pg_depend.refobjversion.
103+ messages / 4 participants
[nested] [flat]
* [PATCH v17 2/7] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 61 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index c2d33c76e0..4dacebf8c9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2950,6 +2950,17 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
</entry>
</row>
+ <row>
+ <entry><structfield>refobjversion</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>
+ An optional version for the referenced object. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3115,7 +3126,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index ffd52c1153..281f5b7c28 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1603,7 +1603,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);
@@ -1690,7 +1692,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
{
@@ -1710,7 +1714,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);
@@ -2682,7 +2688,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 596dafe19c..84a0b99311 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index ab5e92bdc6..62e86a19b6 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -185,6 +185,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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--FCuugMFkClbJLl1L
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v17-0003-Implement-type-regcollation.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH 2/6] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions, for indexes, check constraints and so forth.
Author: Thomas Munro
Reviewed-by:
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 28 ++++++++++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 6 ++++
src/include/catalog/pg_depend.h | 3 ++
src/test/regress/expected/misc_sanity.out | 7 ++--
6 files changed, 66 insertions(+), 33 deletions(-)
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index c4a4df25b8..78c31baa34 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1602,7 +1602,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1689,7 +1690,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1709,7 +1711,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2681,7 +2684,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index f9af245eec..7fdbdf0ae8 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -44,7 +44,22 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior)
{
- recordMultipleDependencies(depender, referenced, 1, behavior);
+ recordMultipleDependencies(depender, referenced, NULL, 1, behavior);
+}
+
+/*
+ * As recordDependencyOn(), but also capture a version string so that changes
+ * in the referenced object can be detected. The meaning of the version
+ * string depends on the referenced object. Currently it is used for
+ * detecting changes in collation versions.
+ */
+void
+recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior)
+{
+ recordMultipleDependencies(depender, referenced, version, 1, behavior);
}
/*
@@ -54,6 +69,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +95,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +108,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +118,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 7f1534aebb..e72f85d8f0 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 0cd6fcf027..77cf0612ed 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -182,8 +182,14 @@ extern void recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior);
+extern void recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior);
+
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..41efb4a2c8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
@@ -103,9 +103,10 @@ ORDER BY 1, 2;
pg_class | relacl | aclitem[]
pg_class | reloptions | text[]
pg_class | relpartbound | pg_node_tree
+ pg_depend | refobjversion | text
pg_index | indexprs | pg_node_tree
pg_index | indpred | pg_node_tree
pg_largeobject | data | bytea
pg_largeobject_metadata | lomacl | aclitem[]
-(11 rows)
+(12 rows)
--
2.20.1
--6c2NcOVqGQ03X4Wi
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="0003-Implement-type-regcollation-v8.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH 2/6] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions, for indexes, check constraints and so forth.
Author: Thomas Munro
Reviewed-by:
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 28 ++++++++++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 6 ++++
src/include/catalog/pg_depend.h | 3 ++
src/test/regress/expected/misc_sanity.out | 7 ++--
6 files changed, 66 insertions(+), 33 deletions(-)
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index c4a4df25b8..78c31baa34 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1602,7 +1602,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1689,7 +1690,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1709,7 +1711,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2681,7 +2684,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index f9af245eec..7fdbdf0ae8 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -44,7 +44,22 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior)
{
- recordMultipleDependencies(depender, referenced, 1, behavior);
+ recordMultipleDependencies(depender, referenced, NULL, 1, behavior);
+}
+
+/*
+ * As recordDependencyOn(), but also capture a version string so that changes
+ * in the referenced object can be detected. The meaning of the version
+ * string depends on the referenced object. Currently it is used for
+ * detecting changes in collation versions.
+ */
+void
+recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior)
+{
+ recordMultipleDependencies(depender, referenced, version, 1, behavior);
}
/*
@@ -54,6 +69,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +95,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +108,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +118,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 7f1534aebb..e72f85d8f0 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 0cd6fcf027..77cf0612ed 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -182,8 +182,14 @@ extern void recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior);
+extern void recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior);
+
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..41efb4a2c8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
@@ -103,9 +103,10 @@ ORDER BY 1, 2;
pg_class | relacl | aclitem[]
pg_class | reloptions | text[]
pg_class | relpartbound | pg_node_tree
+ pg_depend | refobjversion | text
pg_index | indexprs | pg_node_tree
pg_index | indpred | pg_node_tree
pg_largeobject | data | bytea
pg_largeobject_metadata | lomacl | aclitem[]
-(11 rows)
+(12 rows)
--
2.20.1
--Q68bSM7Ycu6FN28Q
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="0003-Implement-type-regcollation-v9.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH 2/6] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions, for indexes, check constraints and so forth.
Author: Thomas Munro
Reviewed-by:
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 28 ++++++++++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 6 ++++
src/include/catalog/pg_depend.h | 3 ++
src/test/regress/expected/misc_sanity.out | 7 ++--
6 files changed, 66 insertions(+), 33 deletions(-)
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index c4a4df25b8..78c31baa34 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1602,7 +1602,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1689,7 +1690,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1709,7 +1711,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2681,7 +2684,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index f9af245eec..7fdbdf0ae8 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -44,7 +44,22 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior)
{
- recordMultipleDependencies(depender, referenced, 1, behavior);
+ recordMultipleDependencies(depender, referenced, NULL, 1, behavior);
+}
+
+/*
+ * As recordDependencyOn(), but also capture a version string so that changes
+ * in the referenced object can be detected. The meaning of the version
+ * string depends on the referenced object. Currently it is used for
+ * detecting changes in collation versions.
+ */
+void
+recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior)
+{
+ recordMultipleDependencies(depender, referenced, version, 1, behavior);
}
/*
@@ -54,6 +69,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +95,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +108,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +118,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 5302973379..887b37e3d0 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 0cd6fcf027..77cf0612ed 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -182,8 +182,14 @@ extern void recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior);
+extern void recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior);
+
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..41efb4a2c8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
@@ -103,9 +103,10 @@ ORDER BY 1, 2;
pg_class | relacl | aclitem[]
pg_class | reloptions | text[]
pg_class | relpartbound | pg_node_tree
+ pg_depend | refobjversion | text
pg_index | indexprs | pg_node_tree
pg_index | indpred | pg_node_tree
pg_largeobject | data | bytea
pg_largeobject_metadata | lomacl | aclitem[]
-(11 rows)
+(12 rows)
--
2.25.1
--6jmy5gypzsv7ulgm
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="0003-Implement-type-regcollation-v11.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v19 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 61 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index dbfb525069..b2a125de78 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2950,6 +2950,17 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
</entry>
</row>
+ <row>
+ <entry><structfield>refobjversion</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>
+ An optional version for the referenced object. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3115,7 +3126,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index ffd52c1153..281f5b7c28 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1603,7 +1603,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);
@@ -1690,7 +1692,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
{
@@ -1710,7 +1714,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);
@@ -2682,7 +2688,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 596dafe19c..84a0b99311 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index ab5e92bdc6..62e86a19b6 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -185,6 +185,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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--u65IjBhB3TIa72Vp
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v19-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v20 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 61 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 6463baf77d..b5106acad0 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2950,6 +2950,17 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
</entry>
</row>
+ <row>
+ <entry><structfield>refobjversion</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>
+ An optional version for the referenced object. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3115,7 +3126,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index ffd52c1153..281f5b7c28 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1603,7 +1603,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);
@@ -1690,7 +1692,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
{
@@ -1710,7 +1714,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);
@@ -2682,7 +2688,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index fa38ee9477..26a7f1d216 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 2c6abe26a5..0ad0597050 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -185,6 +185,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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--Q68bSM7Ycu6FN28Q
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v20-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH 2/6] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions, for indexes, check constraints and so forth.
Author: Thomas Munro
Reviewed-by:
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 28 ++++++++++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 6 ++++
src/include/catalog/pg_depend.h | 3 ++
src/test/regress/expected/misc_sanity.out | 7 ++--
6 files changed, 66 insertions(+), 33 deletions(-)
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index c4a4df25b8..78c31baa34 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1602,7 +1602,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1689,7 +1690,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1709,7 +1711,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2681,7 +2684,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index f9af245eec..7fdbdf0ae8 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -44,7 +44,22 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior)
{
- recordMultipleDependencies(depender, referenced, 1, behavior);
+ recordMultipleDependencies(depender, referenced, NULL, 1, behavior);
+}
+
+/*
+ * As recordDependencyOn(), but also capture a version string so that changes
+ * in the referenced object can be detected. The meaning of the version
+ * string depends on the referenced object. Currently it is used for
+ * detecting changes in collation versions.
+ */
+void
+recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior)
+{
+ recordMultipleDependencies(depender, referenced, version, 1, behavior);
}
/*
@@ -54,6 +69,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +95,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +108,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +118,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 0cd6fcf027..77cf0612ed 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -182,8 +182,14 @@ extern void recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior);
+extern void recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior);
+
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..41efb4a2c8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
@@ -103,9 +103,10 @@ ORDER BY 1, 2;
pg_class | relacl | aclitem[]
pg_class | reloptions | text[]
pg_class | relpartbound | pg_node_tree
+ pg_depend | refobjversion | text
pg_index | indexprs | pg_node_tree
pg_index | indpred | pg_node_tree
pg_largeobject | data | bytea
pg_largeobject_metadata | lomacl | aclitem[]
-(11 rows)
+(12 rows)
--
2.20.1
--mP3DRpeJDSE+ciuQ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="0003-Implement-type-regcollation-v12.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v14 2/7] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud and Peter Eisentraut
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 +++++++
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 28 ++++++++++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 6 ++++
src/include/catalog/pg_depend.h | 3 ++
src/test/regress/expected/misc_sanity.out | 7 ++--
7 files changed, 79 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index c2d33c76e0..ad44c44530 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2950,6 +2950,15 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
</entry>
</row>
+ <row>
+ <entry><structfield>refobjversion</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>
+ An optional version for the referenced object; see text
+ </entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3116,6 +3125,10 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
must be satisfied.
</para>
+ <para>
+ The only current use of <structfield>refobjversion</structfield> is to
+ record dependencies between indexes and collation versions.
+ </para>
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index ffd52c1153..660033b9c1 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1603,7 +1603,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1690,7 +1691,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1710,7 +1712,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2682,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index f9af245eec..7fdbdf0ae8 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -44,7 +44,22 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior)
{
- recordMultipleDependencies(depender, referenced, 1, behavior);
+ recordMultipleDependencies(depender, referenced, NULL, 1, behavior);
+}
+
+/*
+ * As recordDependencyOn(), but also capture a version string so that changes
+ * in the referenced object can be detected. The meaning of the version
+ * string depends on the referenced object. Currently it is used for
+ * detecting changes in collation versions.
+ */
+void
+recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior)
+{
+ recordMultipleDependencies(depender, referenced, version, 1, behavior);
}
/*
@@ -54,6 +69,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +95,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +108,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +118,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 0cd6fcf027..77cf0612ed 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -182,8 +182,14 @@ extern void recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior);
+extern void recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior);
+
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..41efb4a2c8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
@@ -103,9 +103,10 @@ ORDER BY 1, 2;
pg_class | relacl | aclitem[]
pg_class | reloptions | text[]
pg_class | relpartbound | pg_node_tree
+ pg_depend | refobjversion | text
pg_index | indexprs | pg_node_tree
pg_index | indpred | pg_node_tree
pg_largeobject | data | bytea
pg_largeobject_metadata | lomacl | aclitem[]
-(11 rows)
+(12 rows)
--
2.20.1
--wRRV7LY7NUeQGEoC
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v14-0003-Implement-type-regcollation.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v15 2/7] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud and Peter Eisentraut
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 +++++++
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 28 ++++++++++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 6 ++++
src/include/catalog/pg_depend.h | 3 ++
src/test/regress/expected/misc_sanity.out | 7 ++--
7 files changed, 79 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index c2d33c76e0..ad44c44530 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2950,6 +2950,15 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
</entry>
</row>
+ <row>
+ <entry><structfield>refobjversion</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>
+ An optional version for the referenced object; see text
+ </entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3116,6 +3125,10 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
must be satisfied.
</para>
+ <para>
+ The only current use of <structfield>refobjversion</structfield> is to
+ record dependencies between indexes and collation versions.
+ </para>
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index ffd52c1153..660033b9c1 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1603,7 +1603,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1690,7 +1691,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1710,7 +1712,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2682,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 596dafe19c..b7beb2884e 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -44,7 +44,22 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior)
{
- recordMultipleDependencies(depender, referenced, 1, behavior);
+ recordMultipleDependencies(depender, referenced, NULL, 1, behavior);
+}
+
+/*
+ * As recordDependencyOn(), but also capture a version string so that changes
+ * in the referenced object can be detected. The meaning of the version
+ * string depends on the referenced object. Currently it is used for
+ * detecting changes in collation versions.
+ */
+void
+recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior)
+{
+ recordMultipleDependencies(depender, referenced, version, 1, behavior);
}
/*
@@ -54,6 +69,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +95,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +108,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +118,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index ab5e92bdc6..7d9fc866b9 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -182,8 +182,14 @@ extern void recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior);
+extern void recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior);
+
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..41efb4a2c8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
@@ -103,9 +103,10 @@ ORDER BY 1, 2;
pg_class | relacl | aclitem[]
pg_class | reloptions | text[]
pg_class | relpartbound | pg_node_tree
+ pg_depend | refobjversion | text
pg_index | indexprs | pg_node_tree
pg_index | indpred | pg_node_tree
pg_largeobject | data | bytea
pg_largeobject_metadata | lomacl | aclitem[]
-(11 rows)
+(12 rows)
--
2.20.1
--bp/iNruPH9dso1Pn
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v15-0003-Implement-type-regcollation.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v16 2/7] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 ++++++-
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 28 ++++++++++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 6 ++++
src/include/catalog/pg_depend.h | 3 ++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 76 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index c2d33c76e0..4dacebf8c9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2950,6 +2950,17 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
</entry>
</row>
+ <row>
+ <entry><structfield>refobjversion</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>
+ An optional version for the referenced object. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3115,7 +3126,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index ffd52c1153..660033b9c1 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1603,7 +1603,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1690,7 +1691,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1710,7 +1712,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2682,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 596dafe19c..b7beb2884e 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -44,7 +44,22 @@ recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior)
{
- recordMultipleDependencies(depender, referenced, 1, behavior);
+ recordMultipleDependencies(depender, referenced, NULL, 1, behavior);
+}
+
+/*
+ * As recordDependencyOn(), but also capture a version string so that changes
+ * in the referenced object can be detected. The meaning of the version
+ * string depends on the referenced object. Currently it is used for
+ * detecting changes in collation versions.
+ */
+void
+recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior)
+{
+ recordMultipleDependencies(depender, referenced, version, 1, behavior);
}
/*
@@ -54,6 +69,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +95,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +108,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +118,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index ab5e92bdc6..7d9fc866b9 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -182,8 +182,14 @@ extern void recordDependencyOn(const ObjectAddress *depender,
const ObjectAddress *referenced,
DependencyType behavior);
+extern void recordDependencyOnVersion(const ObjectAddress *depender,
+ const ObjectAddress *referenced,
+ const NameData *version,
+ DependencyType behavior);
+
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const NameData *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--sdtB3X0nJg68CQEu
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v16-0003-Implement-type-regcollation.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v16 2/7] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 ++++++-
src/backend/catalog/dependency.c | 11 +++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 3 ++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 57 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index c2d33c76e0..4dacebf8c9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2950,6 +2950,17 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
</entry>
</row>
+ <row>
+ <entry><structfield>refobjversion</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>
+ An optional version for the referenced object. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3115,7 +3126,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index ffd52c1153..660033b9c1 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1603,7 +1603,8 @@ recordDependencyOnExpr(const ObjectAddress *depender,
/* And record 'em */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -1690,7 +1691,8 @@ 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, NULL,
+ self_addrs->numrefs,
self_behavior);
else
{
@@ -1710,7 +1712,8 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
/* Record the external dependencies */
recordMultipleDependencies(depender,
- context.addrs->refs, context.addrs->numrefs,
+ context.addrs->refs, NULL,
+ context.addrs->numrefs,
behavior);
free_object_addresses(context.addrs);
@@ -2682,7 +2685,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, NULL, referenced->numrefs,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 596dafe19c..312d4d3d90 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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, NULL, 1, behavior);
}
/*
@@ -54,6 +55,7 @@ recordDependencyOn(const ObjectAddress *depender,
void
recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const char *version,
int nreferenced,
DependencyType behavior)
{
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index a6577486ce..b7e01a4678 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1560,55 +1560,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index ab5e92bdc6..473342dad2 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -184,6 +184,7 @@ extern void recordDependencyOn(const ObjectAddress *depender,
extern void recordMultipleDependencies(const ObjectAddress *depender,
const ObjectAddress *referenced,
+ const char *version,
int nreferenced,
DependencyType behavior);
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..9f2e10d428 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -61,6 +61,9 @@ 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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--fUYQa+Pmc3FrFX/N
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v16-0003-Implement-type-regcollation.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v29 3/6] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 1714d7116a..e5489197f8 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3302,6 +3302,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 454e569fa9..09c30b13e8 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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++;
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 37e0d7ceab..9faad3d4ff 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1561,55 +1561,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--9jxsPFA5p3P2qPhR
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v29-0004-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v30 3/6] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 7834e0eee0..90161ef3df 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3302,6 +3302,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 454e569fa9..09c30b13e8 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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++;
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 118b282d1c..81550fc11d 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1559,55 +1559,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--vy36zrg552ym33jw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v30-0004-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v23 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index de28bec87f..ebe12affe7 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--MGYHOYXEY6WxJCY8
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v23-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v27 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--o56keubw4jpehgac
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v27-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v28 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and maybe more.
Author: Thomas Munro <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 12 +++++++
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 32 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a28ae89e13..2567863dd9 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3293,6 +3293,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index f515e2c308..1a927377e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -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);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 70baf03178..d86f85d142 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--gclmslubawp3yaq7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v28-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v24 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--wac7ysb48OaltWcw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v24-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* [PATCH v25 2/5] Add pg_depend.refobjversion.
@ 2019-05-28 18:16 Thomas Munro <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Thomas Munro @ 2019-05-28 18:16 UTC (permalink / raw)
Provide a place for the version of referenced database objects to be
recorded. Later commits will be able to use this to record dependencies
on collation versions for indexes and perhaps more things later.
Author: Thomas Munro
Reviewed-by: Julien Rouhaud, Peter Eisentraut and Michael Paquier
Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
---
doc/src/sgml/catalogs.sgml | 13 ++++++-
src/backend/catalog/dependency.c | 14 +++++---
src/backend/catalog/pg_depend.c | 14 +++++---
src/bin/initdb/initdb.c | 44 +++++++++++------------
src/include/catalog/dependency.h | 1 +
src/include/catalog/pg_depend.h | 4 +++
src/include/catalog/toasting.h | 1 +
src/test/regress/expected/misc_sanity.out | 4 +--
8 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 57f3dece43..7299fc89ef 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3292,6 +3292,18 @@ SCRAM-SHA-256$<replaceable><iteration count></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. The only current use of
+ <structfield>refobjversion</structfield> is to record dependencies
+ between indexes and collation versions.
+ </para></entry>
+ </row>
+
</tbody>
</tgroup>
</table>
@@ -3457,7 +3469,6 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
dependencies' restrictions about which objects must be dropped together
must be satisfied.
</para>
-
</sect1>
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index b33a2f94af..070b27c692 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1598,7 +1598,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);
@@ -1685,7 +1687,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
{
@@ -1705,7 +1709,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);
@@ -2677,7 +2683,7 @@ record_object_address_dependencies(const ObjectAddress *depender,
{
eliminate_duplicate_dependencies(referenced);
recordMultipleDependencies(depender,
- referenced->refs, referenced->numrefs,
+ referenced->refs, referenced->numrefs, NULL,
behavior);
}
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 21cfdcace9..5d45e706cb 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -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;
@@ -79,8 +81,6 @@ recordMultipleDependencies(const ObjectAddress *depender,
/* Don't open indexes unless we need to make an update */
indstate = NULL;
- memset(nulls, false, sizeof(nulls));
-
for (i = 0; i < nreferenced; i++, referenced++)
{
/*
@@ -94,6 +94,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(nulls, false, sizeof(nulls));
+ memset(values, 0, sizeof(values));
+
values[Anum_pg_depend_classid - 1] = ObjectIdGetDatum(depender->classId);
values[Anum_pg_depend_objid - 1] = ObjectIdGetDatum(depender->objectId);
values[Anum_pg_depend_objsubid - 1] = Int32GetDatum(depender->objectSubId);
@@ -101,9 +104,12 @@ recordMultipleDependencies(const ObjectAddress *depender,
values[Anum_pg_depend_refclassid - 1] = ObjectIdGetDatum(referenced->classId);
values[Anum_pg_depend_refobjid - 1] = ObjectIdGetDatum(referenced->objectId);
values[Anum_pg_depend_refobjsubid - 1] = Int32GetDatum(referenced->objectSubId);
+ if (version)
+ values[Anum_pg_depend_refobjversion - 1] = CStringGetTextDatum(version);
+ else
+ nulls[Anum_pg_depend_refobjversion - 1] = true;
values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
-
tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
/* fetch index info only when we know we need it */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 786672b1b6..4b2a58cf18 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1572,55 +1572,55 @@ setup_depend(FILE *cmdfd)
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_class;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_proc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_type;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_cast;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_constraint;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_conversion;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_attrdef;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_language;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_operator;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opclass;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_opfamily;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_am;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amop;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_amproc;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_rewrite;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_trigger;\n\n",
/*
* restriction here to avoid pinning the public namespace
*/
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_namespace "
" WHERE nspname LIKE 'pg%';\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_parser;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_dict;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_template;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_ts_config;\n\n",
- "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
+ "INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p',NULL"
" FROM pg_collation;\n\n",
"INSERT INTO pg_shdepend SELECT 0,0,0,0, tableoid,oid, 'p' "
" FROM pg_authid;\n\n",
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index a8f7e9965b..3baa5e498a 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -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,
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index ccf0a98330..7489022795 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -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;
/* ----------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 8f131893dc..e320d82203 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -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);
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 8538173ff8..d40afeef78 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -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 ****************
--
2.20.1
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename="v25-0003-Track-collation-versions-for-indexes.patch"
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-04-22 22:38 Tomas Vondra <[email protected]>
0 siblings, 1 reply; 103+ messages in thread
From: Tomas Vondra @ 2025-04-22 22:38 UTC (permalink / raw)
To: Andres Freund <[email protected]>; Antonin Houska <[email protected]>; +Cc: Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
On 3/18/25 21:12, Andres Freund wrote:
> Hi,
>
> Attached is v2.10, with the following changes:
>
> ...
>
> - committed io_method=worker
>
There's an open item related to this commit (247ce06b883d), based on:
For now the default io_method is changed to "worker". We should re-
evaluate that around beta1, we might want to be careful and set the
default to "sync" for 18.
FWIW the open item is in the "recheck mid-beta" section, but the commit
message says "around beta1" which is not that far away (especially if we
choose to do beta1 on May 8, with the minor releases).
What information we need to gather to make the decision and who's
expected to do it? I assume someone needs to do run some benchmarks, but
is anyone working on it already? What benchmarks, what platforms?
FWIW I'm asking because of the RMT, but I'm also willing to do some of
the tests, if needed - but it'd be good to get some guidance.
regards
--
Tomas Vondra
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-05-09 01:15 Andres Freund <[email protected]>
parent: Tomas Vondra <[email protected]>
0 siblings, 1 reply; 103+ messages in thread
From: Andres Freund @ 2025-05-09 01:15 UTC (permalink / raw)
To: Tomas Vondra <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
Hi,
On 2025-04-23 00:38:01 +0200, Tomas Vondra wrote:
> There's an open item related to this commit (247ce06b883d), based on:
Oops, forgot to reply.
> For now the default io_method is changed to "worker". We should re-
> evaluate that around beta1, we might want to be careful and set the
> default to "sync" for 18.
>
> FWIW the open item is in the "recheck mid-beta" section, but the commit
> message says "around beta1" which is not that far away (especially if we
> choose to do beta1 on May 8, with the minor releases).
I think we certainly should wait for at least beta1 (not that we have a choice
now), to make sure all of this gets at least some coverage.
> What information we need to gather to make the decision and who's
> expected to do it? I assume someone needs to do run some benchmarks, but
> is anyone working on it already? What benchmarks, what platforms?
I guess I'd say "the community". I think it should depend on how many problems
we find, be it correctness or performance regressions. I don't know how to
make that call without seeing how things are going during beta.
And yes, I think this should involve some benchmarking too - generally a good
thing to do during beta, and if it involves AIO, all the better.
> FWIW I'm asking because of the RMT, but I'm also willing to do some of
> the tests, if needed - but it'd be good to get some guidance.
More testing would be welcome!
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-11 21:03 Tomas Vondra <[email protected]>
parent: Andres Freund <[email protected]>
0 siblings, 2 replies; 103+ messages in thread
From: Tomas Vondra @ 2025-07-11 21:03 UTC (permalink / raw)
To: Andres Freund <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
Hi,
I've been running some benchmarks comparing the io_methods, to help with
resolving this PG18 open item. So here are some results, and my brief
analysis of it.
I was hoping to get this out sooner before beta2 :-( and some tests are
still running, but I don't think it'll affect the conclusions.
The TL;DR version
-----------------
* The "worker" method seems good, and I think we should keep it as a
default. We should probably think about increasing the number of workers
a bit, the current io_workers=3 seems to be too low and regresses in a
couple tests.
* The "sync" seems OK too, but it's more of a conservative choice, i.e.
more weight for keeping the PG17 behavior / not causing regressions. But
I haven't seen that (with enough workers). And there are cases when the
"worker" is much faster. It'd be a shame to throw away that benefit.
* There might be bugs in "worker", simply because it has to deal with
multiple concurrent processes etc. But I guess we'll fix those just like
other bugs. I don't think it's a good argument against "worker" default.
* All my tests were done on Linux and NVMe drives. It'd be good to do
similar testing on other platforms (e.g. FreeBSD) and/or storage. I plan
to do some of that, but it'd be great to cover more cases. I can help
with getting my script running, a run takes ~1-2 days.
A more detailed version ...
---------------------------
The benchmark I did works like this:
1) It generates datasets with different data distributions (patterns in
the data - uniform, linear, cyclic, ...). Each table is ~4.3GB of data.
2) It then runs queries on that, with a BETWEEN clause with a certain
selectivity (matching % of the rows), forcing a particular scan type
(indexscan, bitmapscan, seqscan).
3) For each query it measures duration of "cold" and "warm" runs. Cold
means "nothing in page cache / shared buffers", while "warm" means
everything is cached somewhere (by the first "cold" run).
There's a couple relevant parameters varied between the runs:
* effective_io_concurrency = [0, 1, 16, 32]
* shared_buffers = [4GB, 32GB]
Parallel query was disabled for these tests.
The test also included PG17 for comparison, but I forgot PG18 enabled
checksums by default. So PG17 results are with checksums off, which in
some cases means PG17 seems a little bit faster. I'm re-running it with
checksums enabled on PG17, and that seems to eliminate the differences
(as expected).
Scripts
-------
The benchmark scripts/results/charts are available here:
https://github.com/tvondra/iomethod-tests
The SQL data generator and the script driving the benchmark:
* https://github.com/tvondra/iomethod-tests/blob/master/create2.sql
* https://github.com/tvondra/iomethod-tests/blob/master/test-full-cost-2.sh
The script is fairly simple. It first generates the combinations of
parameters to test, randomizes them, and then tests each of them.
Results are recorded in a CSV file "results.csv".
Test machines
-------------
As usual, I did this on two machines I have at home:
* ryzen (~2024)
* Ryzen 9 9900X (12 cores)
* 64GB RAM
* 4x NVMe SSD (Samsung 990 PRO 1TB) in RAID0
* xeon (~2016)
* 2x Xeon 2699v4 (44 cores)
* 64GB RAM
* 1x NVMe SSD WDC Ultrastar DC SN640 960GB
The ryzen is much beefier in terms of I/O, it can do ~20GB/s in
sequential read. The xeon is much more modest (and generally older).
Charts
------
Most of the repository is PDF charts generated from the CSV results.
There's a README explaining the naming convention of the charts, and
some other details.
But in general there are two "types" of charts. The first one fixes all
parameters except for "dataset", and then shows comparison of results
for all datasets.
For example the attached "ryzen-rows-cold-32GB-16-unscaled.pdf" shows
results for:
* ryzen machine
* selectivity calculated as "% of rows" (not pages)
* cold runs, i.e. data not cached
* shared_buffers=32GB
* effective_io_concurrency=16
* unscaled - each plot has custom y-range
There are "scaled" plots too, with all the plots scaled to the same
y-range. This makes it easier to confirm plots from the same PDF (e.g.
how the different scans perform). But that's irrelevant for picking the
io_method default. and it often hides details in some plots.
The other type fixes "dataset" and varies effective_io_concurrency, so
see how it affects duration (e.g. due to prefetching). For example the
attached ryzen-rows-cold-32GB-uniform-unscaled.pdf shows that for the
"uniform" data set.
The charts show behavior for the whole selectivity range, from 0% to
100%, for each scan type. Of course, the scan type may not be the right
choice for that selectivity point. For example, we'd probably not pick
an index scan for 50% selectivity, or a seqscan for 0.01%. But I think
it makes sense to still consider the whole range, for robustness. We
make estimation/planning mistakes fairly regularly, so it's important to
care about what happens in those cases.
Findings
--------
I'm attaching only three PDFs with charts from the cold runs, to keep
the e-mail small (each PDF is ~100-200kB). Feel free to check the other
PDFs in the git repository, but it's all very similar and the attached
PDFs are quite representative.
Some basic observations:
a) index scans
There's almost no difference for indexscans, i.e. the middle column in
the PDFs. There's a bit of variation on some of the cyclic/linear data
sets, but it seems more like random noise than a systemic difference.
Which is not all that surprising, considering index scans don't really
use read_stream yet, so there's no prefetching etc.
b) bitmapscans (ryzen-bitmapscan-uniform.png)
Bitmapscans are much more affected, with a lot of differences. See the
attached PNG image, for example. That shows that at ~10% you get 2x
faster query with io_method=worker than "sync".
And it also shows that PG18 with io_method=sync is much faster than
PG17. Which is a bit surprising, TBH. At first I thought it's due to the
"checksums=off" on PG17 in this run, but that doesn't seem to be the
case - results from PG17 with checksums=on show the same thing. In fact,
the difference increases, which is rather bizarre. (There's a branch
"run2-17-checksums-on" with results from that run.)
I believe this is likely due to the bitmapscan prefetch fixes, which we
decided to not backpatch (IIRC), because the results with e_i_c=0 show
no difference between PG17 and PG18/sync.
The "ryzen" results however demonstrate that 3 workers may be too low.
The timing spikes to ~3000ms (at ~1% selectivity), before quickly
dropping back to ~1000ms. The other datasets show similar difference.
With 12 workers, there's no such problem.
On "xeon" the differences are much smaller, or not visible at all. My
guess it's due to the hardware differences (slower CPU / single NVMe for
storage).
But I'm also wondering what would happen if there are multiple queries
doing bitmapscans. Consider the benchmark is only a backend running
queries, and parallel query is disabled.
The problems with too few workers are much better visible in the
log-scale charts (just add "-log" at the end). See the attached example
(ryzen-bitmapscan-uniform-log.png). It shows how much slower it's
compared to all other methods (effectively regression compared to PG17)
for a huge chunk of the selectivity. I'm sure we'd pick bitmapscan for
some of those queries.
c) seqscan (ryzen-seqscan-uniform.png)
This shows a lot of significant differences between different io_method
options. And by significant I mean ~2x difference, on both machines.
On "ryzen" the "worker" takes ~800ms, while "sync" is ~1700ms. PG17
seems a bit faster, but that's due to missing checksums, and with
checksums it's almost exactly the same as PG18/sync. io_uring is in
between at ~1200ms.
On "xeon" it's very similar, but io_uring does better and worker/3 a bit
worse (which I think is another reason to increase io_workers default).
I believe these differences can be explained by where the work happens
for different io_method cases. And by work I mean memcpy and checksum
verification. With "sync/io_uring" it's in the backend itself, while
with "worker" it's offloaded to the worker processes. So single-process
vs. multi-process memory bandwidth.
Which is nice, but we need to have enough of them ;-)
d) warm runs
The "warm" runs are very uninteresting. There's literally no difference
between the various io_methods. On "ryzen" it's very smooth, while on
"xeon" the "seqscan" is very noisy. I believe this is due to NUMA
effects (two sockets etc.) but I need to verify that. It affects all
io_methods equally, so it's irrelevant for this.
e) indexscan regression (ryzen-indexscan-uniform-pg17-checksums.png)
There's an interesting difference difference I noticed in the run with
checksums on PG17. The full PDF is available here:
https://github.com/tvondra/iomethod-tests/blob/run2-17-checksums-on/ryzen-rows-cold-32GB-16-unscaled...
The interesting thing is that PG17 indexscans on uniform dataset got a
little bit faster. In the attached PDF it's exactly on par with PG18,
but here it got a bit faster. Which makes no sense, if it has to also
verify checksums. I haven't had time to investigate this yet.
Conclusion
----------
That's all I have at the moment. I still think it makes sense to keep
io_method=worker, but bump up the io_workers a bit higher. Could we also
add some suggestions how to pick a good value to the docs?
You can probably find more interesting results in the other PDFs in the
repository. I'm certainly going to keep looking.
You might also run the benchmark on different hardware, and either
build/publish the plots somewhere, or just give me the CSV and I'll do
that. Better to find strange stuff / regressions now.
The repository also has branches with plots showing results with WIP
indexscan prefetching. (It's excluded from the PDFs I presented here).
The conclusions are similar to what we found here - "worker" is good
with enough workers, io_uring is good too. Sync has issues for some of
the data sets, but still helps a lot.
regards
--
Tomas Vondra
Attachments:
[image/png] ryzen-bitmapscan-uniform.png (27.6K, ../../[email protected]/2-ryzen-bitmapscan-uniform.png)
download | view image
[image/png] ryzen-seqscan-uniform.png (31.6K, ../../[email protected]/3-ryzen-seqscan-uniform.png)
download | view image
[application/pdf] ryzen-rows-cold-32GB-16-unscaled.pdf (86.7K, ../../[email protected]/4-ryzen-rows-cold-32GB-16-unscaled.pdf)
download
[application/pdf] ryzen-rows-cold-32GB-uniform-unscaled.pdf (43.4K, ../../[email protected]/5-ryzen-rows-cold-32GB-uniform-unscaled.pdf)
download
[application/pdf] xeon-rows-cold-32GB-16-unscaled.pdf (86.1K, ../../[email protected]/6-xeon-rows-cold-32GB-16-unscaled.pdf)
download
[image/png] ryzen-indexscan-uniform-pg17-checksums.png (26.4K, ../../[email protected]/7-ryzen-indexscan-uniform-pg17-checksums.png)
download | view image
[image/png] ryzen-bitmapscan-uniform-log.png (28.8K, ../../[email protected]/8-ryzen-bitmapscan-uniform-log.png)
download | view image
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-13 18:04 Tomas Vondra <[email protected]>
parent: Tomas Vondra <[email protected]>
1 sibling, 1 reply; 103+ messages in thread
From: Tomas Vondra @ 2025-07-13 18:04 UTC (permalink / raw)
To: Andres Freund <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
On 7/11/25 23:03, Tomas Vondra wrote:
> ...
>
> e) indexscan regression (ryzen-indexscan-uniform-pg17-checksums.png)
>
> There's an interesting difference difference I noticed in the run with
> checksums on PG17. The full PDF is available here:
>
> https://github.com/tvondra/iomethod-tests/blob/run2-17-checksums-on/ryzen-rows-cold-32GB-16-unscaled...
>
> The interesting thing is that PG17 indexscans on uniform dataset got a
> little bit faster. In the attached PDF it's exactly on par with PG18,
> but here it got a bit faster. Which makes no sense, if it has to also
> verify checksums. I haven't had time to investigate this yet.
I was intrigued by this, so I looked into this today.
TL;DR I believe it was caused by something in the filesystem or even the
storage devices, making the "PG17" data directory (or maybe even just
the "uniform" table) a bit faster.
I started by reproducing the behavior with an indexscan matching 10% of
the rows, and it was very easy to reproduce the difference shows on the
chart (all timings in milliseconds):
PG17: 14112.800 ms
PG18: 21612.090 ms
This was perfectly reproducible, affecting the whole table (not just one
part of it), etc. At some point I recalled that I might have initialized
the databases in slightly different ways - one by running the SQL, the
other one by pg_dump/pg_restore (likely with multiple jobs).
I couldn't think of any other difference between the data directories,
so I simply reloaded them by pg_restore (from the same dump). Which
however made them both slow :O
And it didn't matter how many jobs are used, or anything else I tried.
But every now and then an instance (17 or 18) happened to be fast
(~14000 ms). Consistently, for all queries on the table, not randomly.
In the end I recreated the (ext4) filesystem, loaded the databases and
now both instances are fast. I have no idea what the root cause was, and
I assume recreating the filesystem destroyed all the evidence.
I'll rerun the tests - will take a couple days. I don't think it's
likely to change the conclusions, though. It should only affect how PG17
compares to PG18, not how the io_methods compare to each other. Also, I
don't think the "xeon" resuls are affected.
regards
--
Tomas Vondra
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-14 18:36 Andres Freund <[email protected]>
parent: Tomas Vondra <[email protected]>
1 sibling, 1 reply; 103+ messages in thread
From: Andres Freund @ 2025-07-14 18:36 UTC (permalink / raw)
To: Tomas Vondra <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
Hi,
On 2025-07-11 23:03:53 +0200, Tomas Vondra wrote:
> I've been running some benchmarks comparing the io_methods, to help with
> resolving this PG18 open item. So here are some results, and my brief
> analysis of it.
Thanks for doing that!
> The TL;DR version
> -----------------
>
> * The "worker" method seems good, and I think we should keep it as a
> default. We should probably think about increasing the number of workers
> a bit, the current io_workers=3 seems to be too low and regresses in a
> couple tests.
>
> * The "sync" seems OK too, but it's more of a conservative choice, i.e.
> more weight for keeping the PG17 behavior / not causing regressions. But
> I haven't seen that (with enough workers). And there are cases when the
> "worker" is much faster. It'd be a shame to throw away that benefit.
>
> * There might be bugs in "worker", simply because it has to deal with
> multiple concurrent processes etc. But I guess we'll fix those just like
> other bugs. I don't think it's a good argument against "worker" default.
>
> * All my tests were done on Linux and NVMe drives. It'd be good to do
> similar testing on other platforms (e.g. FreeBSD) and/or storage. I plan
> to do some of that, but it'd be great to cover more cases. I can help
> with getting my script running, a run takes ~1-2 days.
FWIW, in my very limited tests on windows, the benefit of worker was
considerably bigger there, due to having much more minimal readahead not
having posix_fadvise...
> The test also included PG17 for comparison, but I forgot PG18 enabled
> checksums by default. So PG17 results are with checksums off, which in
> some cases means PG17 seems a little bit faster. I'm re-running it with
> checksums enabled on PG17, and that seems to eliminate the differences
> (as expected).
My sneaking suspicion is that, independent of AIO, we're not really ready to
default to checksums defaulting to on.
> Findings
> --------
>
> I'm attaching only three PDFs with charts from the cold runs, to keep
> the e-mail small (each PDF is ~100-200kB). Feel free to check the other
> PDFs in the git repository, but it's all very similar and the attached
> PDFs are quite representative.
>
> Some basic observations:
>
> a) index scans
>
> There's almost no difference for indexscans, i.e. the middle column in
> the PDFs. There's a bit of variation on some of the cyclic/linear data
> sets, but it seems more like random noise than a systemic difference.
>
> Which is not all that surprising, considering index scans don't really
> use read_stream yet, so there's no prefetching etc.
Indeed.
> The "ryzen" results however demonstrate that 3 workers may be too low.
> The timing spikes to ~3000ms (at ~1% selectivity), before quickly
> dropping back to ~1000ms. The other datasets show similar difference.
> With 12 workers, there's no such problem.
I don't really know what to do about that - for now we don't have dynamic
#workers, and starting 12 workers on a tiny database doesn't really make
sense... I suspect that on most hardware & queries it won't matter that much,
but clearly, if you have high iops hardware it might. I can perhaps see
increasing the default to 5 or so, but after that... I guess we could try
some autoconf formula based on the size of s_b or such? But that seems
somewhat awkward too.
>
> e) indexscan regression (ryzen-indexscan-uniform-pg17-checksums.png)
>
> There's an interesting difference difference I noticed in the run with
> checksums on PG17. The full PDF is available here:
(there's a subsequent email about this, will reply there)
> Conclusion
> ----------
>
> That's all I have at the moment. I still think it makes sense to keep
> io_method=worker, but bump up the io_workers a bit higher. Could we also
> add some suggestions how to pick a good value to the docs?
.oO(/me ponders a troll patch to re-add a reference the number of spindles in
that tuning advice)
I'm not sure what advice to give here. Maybe just to set it to a considerably
larger number once not running on a tiny system? The incremental overhead of
having an idle worker is rather small unless you're on a really tiny system...
> You might also run the benchmark on different hardware, and either
> build/publish the plots somewhere, or just give me the CSV and I'll do
> that. Better to find strange stuff / regressions now.
Probably the most interesting thing would be some runs with cloud-ish storage
(relatively high iops, very high latency)...
> The repository also has branches with plots showing results with WIP
> indexscan prefetching. (It's excluded from the PDFs I presented here).
Hm, I looked for those, but I couldn't quickly find any plots that include
them. Would I have to generate the plots from a checkout of the repo?
> The conclusions are similar to what we found here - "worker" is good
> with enough workers, io_uring is good too. Sync has issues for some of
> the data sets, but still helps a lot.
Nice.
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-14 18:44 Andres Freund <[email protected]>
parent: Tomas Vondra <[email protected]>
0 siblings, 1 reply; 103+ messages in thread
From: Andres Freund @ 2025-07-14 18:44 UTC (permalink / raw)
To: Tomas Vondra <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
On 2025-07-13 20:04:51 +0200, Tomas Vondra wrote:
> On 7/11/25 23:03, Tomas Vondra wrote:
> > ...
> >
> > e) indexscan regression (ryzen-indexscan-uniform-pg17-checksums.png)
> >
> > There's an interesting difference difference I noticed in the run with
> > checksums on PG17. The full PDF is available here:
> >
> > https://github.com/tvondra/iomethod-tests/blob/run2-17-checksums-on/ryzen-rows-cold-32GB-16-unscaled...
> >
> > The interesting thing is that PG17 indexscans on uniform dataset got a
> > little bit faster. In the attached PDF it's exactly on par with PG18,
> > but here it got a bit faster. Which makes no sense, if it has to also
> > verify checksums. I haven't had time to investigate this yet.
>
> I was intrigued by this, so I looked into this today.
>
> TL;DR I believe it was caused by something in the filesystem or even the
> storage devices, making the "PG17" data directory (or maybe even just
> the "uniform" table) a bit faster.
>
> I started by reproducing the behavior with an indexscan matching 10% of
> the rows, and it was very easy to reproduce the difference shows on the
> chart (all timings in milliseconds):
>
> PG17: 14112.800 ms
> PG18: 21612.090 ms
That's a decidedly nontrivial difference.
Did you keep any metrics from those runs? E.g. whether there were larger IOs
or such?
> This was perfectly reproducible, affecting the whole table (not just one
> part of it), etc. At some point I recalled that I might have initialized
> the databases in slightly different ways - one by running the SQL, the
> other one by pg_dump/pg_restore (likely with multiple jobs).
I guess that's an INSERT ... SELECT vs COPY?
Which one was the faster one?
If this ever re-occurs, it might be interesting to look at the fragmentation
of the underlying files with filefrag.
> I couldn't think of any other difference between the data directories,
> so I simply reloaded them by pg_restore (from the same dump). Which
> however made them both slow :O
So that suggests that COPY is the slow case, interesting.
One potentially relevant factor could be that parallel COPY into logged tables
currently leads to really sub-optimal write patterns, due to us writing back
buffers one-by-one, interspersed by WAL writes and file extensions. I know how
that affects write speed, but it's not entirely obvious how it would affect
read speed...
> And it didn't matter how many jobs are used, or anything else I tried.
> But every now and then an instance (17 or 18) happened to be fast
> (~14000 ms). Consistently, for all queries on the table, not randomly.
>
> In the end I recreated the (ext4) filesystem, loaded the databases and
> now both instances are fast. I have no idea what the root cause was, and
> I assume recreating the filesystem destroyed all the evidence.
Besides differences in filesystem level fragmentation, another potential
theory is that the SSDs were internally more fragmented. Occasionally
dumping/restoring the data could allow the drive to do internal wear
leveling before the new data is loaded, leading to a better layout.
I found that I get more consistent benchmark performance if I delete as much
of the data as possible, run fstrim -v -a and then load the data. And do
another round of fstrim.
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-15 00:13 Tomas Vondra <[email protected]>
parent: Andres Freund <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Tomas Vondra @ 2025-07-15 00:13 UTC (permalink / raw)
To: Andres Freund <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
On 7/14/25 20:44, Andres Freund wrote:
> On 2025-07-13 20:04:51 +0200, Tomas Vondra wrote:
>> On 7/11/25 23:03, Tomas Vondra wrote:
>>> ...
>>>
>>> e) indexscan regression (ryzen-indexscan-uniform-pg17-checksums.png)
>>>
>>> There's an interesting difference difference I noticed in the run with
>>> checksums on PG17. The full PDF is available here:
>>>
>>> https://github.com/tvondra/iomethod-tests/blob/run2-17-checksums-on/ryzen-rows-cold-32GB-16-unscaled...
>>>
>>> The interesting thing is that PG17 indexscans on uniform dataset got a
>>> little bit faster. In the attached PDF it's exactly on par with PG18,
>>> but here it got a bit faster. Which makes no sense, if it has to also
>>> verify checksums. I haven't had time to investigate this yet.
>>
>> I was intrigued by this, so I looked into this today.
>>
>> TL;DR I believe it was caused by something in the filesystem or even the
>> storage devices, making the "PG17" data directory (or maybe even just
>> the "uniform" table) a bit faster.
>>
>> I started by reproducing the behavior with an indexscan matching 10% of
>> the rows, and it was very easy to reproduce the difference shows on the
>> chart (all timings in milliseconds):
>>
>> PG17: 14112.800 ms
>> PG18: 21612.090 ms
>
> That's a decidedly nontrivial difference.
>
It is. It surprised me.
> Did you keep any metrics from those runs? E.g. whether there were larger IOs
> or such?
>
Unfortunately no. I should have investigated more before rebuilding the
filesystem. But I suspect I might be able to reproduce it, if I do the
loads in a loop or something like that.
>
>> This was perfectly reproducible, affecting the whole table (not just one
>> part of it), etc. At some point I recalled that I might have initialized
>> the databases in slightly different ways - one by running the SQL, the
>> other one by pg_dump/pg_restore (likely with multiple jobs).
>
> I guess that's an INSERT ... SELECT vs COPY?
>
> Which one was the faster one?
>
I suspect I initialized one instance by the SQL script that generates
data by INSERT ... SELECT for tables one by one (and then builds
indexes, also one by one). And then I might have initialized the other
database by pg_dump/pg_restore, so that'd be COPY.
FWIW I might have used pg_restore with parallelism, and I suspect that
might be more important than INSERT vs. COPY.
But maybe I'm misremembering things, I rebuilt the benchmark databases
so many times over the past couple days ... not sure.
> If this ever re-occurs, it might be interesting to look at the fragmentation
> of the underlying files with filefrag.
>
Yeah, I'll keep that in mind. And I'll try to reproduce this, once I'm
done with those benchmarks.
>
>> I couldn't think of any other difference between the data directories,
>> so I simply reloaded them by pg_restore (from the same dump). Which
>> however made them both slow :O
>
> So that suggests that COPY is the slow case, interesting.
>
> One potentially relevant factor could be that parallel COPY into logged tables
> currently leads to really sub-optimal write patterns, due to us writing back
> buffers one-by-one, interspersed by WAL writes and file extensions. I know how
> that affects write speed, but it's not entirely obvious how it would affect
> read speed...
>
Maybe. I don't remember which database I loaded first. But this time I
simply copied a backup of the data directory from a different device,
which would "cleanup" the write pattern.
I'd assume filesystems allocate space in larger chunks, e.g. ext4 does
delayed allocation (and I don't see why that wouldn't work here).
>
>> And it didn't matter how many jobs are used, or anything else I tried.
>> But every now and then an instance (17 or 18) happened to be fast
>> (~14000 ms). Consistently, for all queries on the table, not randomly.
>>
>> In the end I recreated the (ext4) filesystem, loaded the databases and
>> now both instances are fast. I have no idea what the root cause was, and
>> I assume recreating the filesystem destroyed all the evidence.
>
> Besides differences in filesystem level fragmentation, another potential
> theory is that the SSDs were internally more fragmented. Occasionally
> dumping/restoring the data could allow the drive to do internal wear
> leveling before the new data is loaded, leading to a better layout.
>
> I found that I get more consistent benchmark performance if I delete as much
> of the data as possible, run fstrim -v -a and then load the data. And do
> another round of fstrim.
>
Maybe, but the filesystem is far from full, which I think helps wear
leveling. The RAID has ~4TB and only ~500GB was ever used. But who
knows, and if that's the cause, we'll never really know I'm afraid. It's
hard to confirm what happens inside a SSD :-(
regards
--
Tomas Vondra
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-15 00:30 Tomas Vondra <[email protected]>
parent: Andres Freund <[email protected]>
0 siblings, 1 reply; 103+ messages in thread
From: Tomas Vondra @ 2025-07-15 00:30 UTC (permalink / raw)
To: Andres Freund <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
On 7/14/25 20:36, Andres Freund wrote:
> Hi,
>
> On 2025-07-11 23:03:53 +0200, Tomas Vondra wrote:
>> I've been running some benchmarks comparing the io_methods, to help with
>> resolving this PG18 open item. So here are some results, and my brief
>> analysis of it.
>
> Thanks for doing that!
>
>
>
>> The TL;DR version
>> -----------------
>>
>> * The "worker" method seems good, and I think we should keep it as a
>> default. We should probably think about increasing the number of workers
>> a bit, the current io_workers=3 seems to be too low and regresses in a
>> couple tests.
>>
>> * The "sync" seems OK too, but it's more of a conservative choice, i.e.
>> more weight for keeping the PG17 behavior / not causing regressions. But
>> I haven't seen that (with enough workers). And there are cases when the
>> "worker" is much faster. It'd be a shame to throw away that benefit.
>>
>> * There might be bugs in "worker", simply because it has to deal with
>> multiple concurrent processes etc. But I guess we'll fix those just like
>> other bugs. I don't think it's a good argument against "worker" default.
>>
>> * All my tests were done on Linux and NVMe drives. It'd be good to do
>> similar testing on other platforms (e.g. FreeBSD) and/or storage. I plan
>> to do some of that, but it'd be great to cover more cases. I can help
>> with getting my script running, a run takes ~1-2 days.
>
> FWIW, in my very limited tests on windows, the benefit of worker was
> considerably bigger there, due to having much more minimal readahead not
> having posix_fadvise...
>
>
>> The test also included PG17 for comparison, but I forgot PG18 enabled
>> checksums by default. So PG17 results are with checksums off, which in
>> some cases means PG17 seems a little bit faster. I'm re-running it with
>> checksums enabled on PG17, and that seems to eliminate the differences
>> (as expected).
>
> My sneaking suspicion is that, independent of AIO, we're not really ready to
> default to checksums defaulting to on.
>
>
>> Findings
>> --------
>>
>> I'm attaching only three PDFs with charts from the cold runs, to keep
>> the e-mail small (each PDF is ~100-200kB). Feel free to check the other
>> PDFs in the git repository, but it's all very similar and the attached
>> PDFs are quite representative.
>>
>> Some basic observations:
>>
>> a) index scans
>>
>> There's almost no difference for indexscans, i.e. the middle column in
>> the PDFs. There's a bit of variation on some of the cyclic/linear data
>> sets, but it seems more like random noise than a systemic difference.
>>
>> Which is not all that surprising, considering index scans don't really
>> use read_stream yet, so there's no prefetching etc.
>
> Indeed.
>
>
>> The "ryzen" results however demonstrate that 3 workers may be too low.
>> The timing spikes to ~3000ms (at ~1% selectivity), before quickly
>> dropping back to ~1000ms. The other datasets show similar difference.
>> With 12 workers, there's no such problem.
>
> I don't really know what to do about that - for now we don't have dynamic
> #workers, and starting 12 workers on a tiny database doesn't really make
> sense... I suspect that on most hardware & queries it won't matter that much,
> but clearly, if you have high iops hardware it might. I can perhaps see
> increasing the default to 5 or so, but after that... I guess we could try
> some autoconf formula based on the size of s_b or such? But that seems
> somewhat awkward too.
>
True. I don't have a great idea either. FWIW most of our defaults are
very conservative/low, and you have to bump them up on bigger machines
anyway. So having to bump one more GUC is not a big deal, and I don't
think we have to invent some magic formula for this one.
Also, autoconf wouldn't even know about s_b size, it'd have to be
something at startup. We could do some automated sizing if set to -1,
perhaps. But is s_b even a good value to tie this to? I doubt that.
>
>
>>
>> e) indexscan regression (ryzen-indexscan-uniform-pg17-checksums.png)
>>
>> There's an interesting difference difference I noticed in the run with
>> checksums on PG17. The full PDF is available here:
>
> (there's a subsequent email about this, will reply there)
>
>
>> Conclusion
>> ----------
>>
>> That's all I have at the moment. I still think it makes sense to keep
>> io_method=worker, but bump up the io_workers a bit higher. Could we also
>> add some suggestions how to pick a good value to the docs?
>
> .oO(/me ponders a troll patch to re-add a reference the number of spindles in
> that tuning advice)
>
;-)
> I'm not sure what advice to give here. Maybe just to set it to a considerably
> larger number once not running on a tiny system? The incremental overhead of
> having an idle worker is rather small unless you're on a really tiny system...
>
Too bad the patch doesn't collect any stats about how utilized the
workers are :-( That'd make it a bit easier, we could even print
something into the log if the queues overflow "too often", similarly to
max_wal_size when checkpoints happen too often.
>
>> You might also run the benchmark on different hardware, and either
>> build/publish the plots somewhere, or just give me the CSV and I'll do
>> that. Better to find strange stuff / regressions now.
>
> Probably the most interesting thing would be some runs with cloud-ish storage
> (relatively high iops, very high latency)...
>
Yeah, I've started a test on a cloud VM. Will see in a day or two. And
another on FreeBSD, for good measure.
>
>> The repository also has branches with plots showing results with WIP
>> indexscan prefetching. (It's excluded from the PDFs I presented here).
>
> Hm, I looked for those, but I couldn't quickly find any plots that include
> them. Would I have to generate the plots from a checkout of the repo?
>
No, the charts are there, you don't need to generate them.
Look into the "with-indexscan-prefetch-run2-17-checksums" branch. E.g.
this is the same "ryzen" plot I shared earlier, but with "indexscan
prefetch" column:
https://github.com/tvondra/iomethod-tests/blob/with-indexscan-prefetch-run2-17-checksums/ryzen-rows-...
It might be better to look at the "scaled" charts, which makes it easier
to compare the different scans (and the benefit of prefetching).
https://github.com/tvondra/iomethod-tests/blob/with-indexscan-prefetch-run2-17-checksums/ryzen-rows-...
>
>> The conclusions are similar to what we found here - "worker" is good
>> with enough workers, io_uring is good too. Sync has issues for some of
>> the data sets, but still helps a lot.
>
> Nice.
>
> Greetings,
>
> Andres Freund
regards
--
Tomas Vondra
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-22 13:51 Tomas Vondra <[email protected]>
parent: Tomas Vondra <[email protected]>
0 siblings, 1 reply; 103+ messages in thread
From: Tomas Vondra @ 2025-07-22 13:51 UTC (permalink / raw)
To: Andres Freund <[email protected]>; +Cc: Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
Hi,
I kept running the tests on additional storage systems, both "local"
(e.g. RAID on SATA SSDs) and "cloud" (Azure Premium SSD volumes). And
also on FreeBSD/ZFS, to see what non-Linux systems do. I pushed all the
results to the same github repository, into separate branches.
I'm attaching three example charts, from these "new" systems.
In general, it doesn't change the earlier conclusions at all. Most of
the earlier observations apply to these results from these machines with
reasonably different types of storage. So I still think we should stick
to "worker", but consider increasing the default number of workers.
It's possible there's machine with storage/hardware that would work
better with some other io_method value, but that's why it's a GUC. The
default should work for most systems.
I plan to let the current tests complete, but that's about it. I don't
plan to test additional systems for this thread. I'll keep running tests
for the index-prefetch thread, but that's focused on other questions.
regards
--
Tomas Vondra
Attachments:
[application/pdf] freebsd_d16-rows-cold-32GB-16-unscaled.pdf (163.9K, ../../[email protected]/2-freebsd_d16-rows-cold-32GB-16-unscaled.pdf)
download
[application/pdf] d16_premium_ssd-rows-cold-32GB-16-unscaled.pdf (195.3K, ../../[email protected]/3-d16_premium_ssd-rows-cold-32GB-16-unscaled.pdf)
download
[application/pdf] ryzen_sata-rows-cold-32GB-16-unscaled.pdf (194.2K, ../../[email protected]/4-ryzen_sata-rows-cold-32GB-16-unscaled.pdf)
download
^ permalink raw reply [nested|flat] 103+ messages in thread
* Re: AIO v2.5
@ 2025-07-29 16:41 Nathan Bossart <[email protected]>
parent: Tomas Vondra <[email protected]>
0 siblings, 0 replies; 103+ messages in thread
From: Nathan Bossart @ 2025-07-29 16:41 UTC (permalink / raw)
To: Tomas Vondra <[email protected]>; +Cc: Andres Freund <[email protected]>; Antonin Houska <[email protected]>; Noah Misch <[email protected]>; pgsql-hackers; Thomas Munro <[email protected]>; Heikki Linnakangas <[email protected]>; Robert Haas <[email protected]>; Jakub Wartak <[email protected]>; Jelte Fennema-Nio <[email protected]>
[RMT hat]
On Tue, Jul 22, 2025 at 03:51:12PM +0200, Tomas Vondra wrote:
> In general, it doesn't change the earlier conclusions at all. Most of
> the earlier observations apply to these results from these machines with
> reasonably different types of storage. So I still think we should stick
> to "worker", but consider increasing the default number of workers.
>
> It's possible there's machine with storage/hardware that would work
> better with some other io_method value, but that's why it's a GUC. The
> default should work for most systems.
Given there have been no further proposals or discussion, we have marked
the related open item as "Won't Fix". This means we plan to ship v18 with
io_method=worker and io_workers=3 by default.
--
nathan
^ permalink raw reply [nested|flat] 103+ messages in thread
end of thread, other threads:[~2025-07-29 16:41 UTC | newest]
Thread overview: 103+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v29 3/6] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH 2/6] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v16 2/7] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH 2/6] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH 2/6] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v19 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v15 2/7] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v30 3/6] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v20 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v17 2/7] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v14 2/7] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v16 2/7] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v23 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH 2/6] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v28 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v24 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v27 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2019-05-28 18:16 [PATCH v25 2/5] Add pg_depend.refobjversion. Thomas Munro <[email protected]>
2025-04-22 22:38 Re: AIO v2.5 Tomas Vondra <[email protected]>
2025-05-09 01:15 ` Re: AIO v2.5 Andres Freund <[email protected]>
2025-07-11 21:03 ` Re: AIO v2.5 Tomas Vondra <[email protected]>
2025-07-13 18:04 ` Re: AIO v2.5 Tomas Vondra <[email protected]>
2025-07-14 18:44 ` Re: AIO v2.5 Andres Freund <[email protected]>
2025-07-15 00:13 ` Re: AIO v2.5 Tomas Vondra <[email protected]>
2025-07-14 18:36 ` Re: AIO v2.5 Andres Freund <[email protected]>
2025-07-15 00:30 ` Re: AIO v2.5 Tomas Vondra <[email protected]>
2025-07-22 13:51 ` Re: AIO v2.5 Tomas Vondra <[email protected]>
2025-07-29 16:41 ` Re: AIO v2.5 Nathan Bossart <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox