On Wed, Oct 20, 2021 at 09:19:51AM -0300, Alvaro Herrera wrote:
> Ouch ... this means that pg_shdepends contents are broken for databases
> created with 14.0?  hmm ... yes.

Yes, it means so :(

I have fixed the issue for now, and monitored the rest of the tree.

Another issue is that we have zero coverage for this area of the code
when creating a database from a template and copying over shared
dependencies:
https://coverage.postgresql.org/src/backend/catalog/pg_shdepend.c.gcov.html

It is easy enough to get an error on the new database with
pg_describe_object().  Your part about adding a shared dependency with
a table on a given role is simple enough, as well.  While looking for
a place where to put such a test, 020_createdb.pl felt like a natural
place and we don't have any coverage for the case of TEMPLATE with
createdb.  So I would like to suggest something like the attached for
HEAD.
--
Michael
diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl
index 3db2f13ae2..5e03ac8937 100644
--- a/src/bin/scripts/t/020_createdb.pl
+++ b/src/bin/scripts/t/020_createdb.pl
@@ -6,7 +6,7 @@ use warnings;
 
 use PostgresNode;
 use TestLib;
-use Test::More tests => 22;
+use Test::More tests => 25;
 
 program_help_ok('createdb');
 program_version_ok('createdb');
@@ -28,6 +28,28 @@ $node->issues_sql_like(
 $node->command_fails([ 'createdb', 'foobar1' ],
 	'fails if database already exists');
 
+# Check use of templates with shared dependencies copied from the template.
+my ($ret, $stdout, $stderr) = $node->psql(
+	'foobar2',
+	'CREATE ROLE role_foobar;
+CREATE TABLE tab_foobar (id int);
+ALTER TABLE tab_foobar owner to role_foobar;');
+$node->issues_sql_like(
+	[ 'createdb', '-l', 'C', '-T', 'foobar2', 'foobar3' ],
+	qr/statement: CREATE DATABASE foobar3 TEMPLATE foobar2/,
+	'create database with template');
+($ret, $stdout, $stderr) = $node->psql(
+	'foobar3',
+	"SELECT pg_describe_object(classid, objid, objsubid) AS obj,
+       pg_describe_object(refclassid, refobjid, 0) AS refobj
+   FROM pg_shdepend s JOIN pg_database d ON (d.oid = s.dbid)
+   WHERE d.datname = 'foobar3';", on_error_die => 1);
+chomp($stdout);
+like(
+	$stdout,
+	qr/^tab_foobar|role role_foobar$/,
+	'shared dependencies copied over to target database');
+
 # Check quote handling with incorrect option values.
 $node->command_checks_all(
 	[ 'createdb', '--encoding', "foo'; SELECT '1", 'foobar2' ],

Attachment: signature.asc
Description: PGP signature

Reply via email to