aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/pg_dump/pg_backup.h1
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c12
-rw-r--r--src/bin/pg_dump/pg_dump.c34
-rw-r--r--src/test/regress/expected/large_object.out15
-rw-r--r--src/test/regress/expected/privileges.out8
-rw-r--r--src/test/regress/parallel_schedule2
-rw-r--r--src/test/regress/serial_schedule1
-rw-r--r--src/test/regress/sql/large_object.sql7
-rw-r--r--src/test/regress/sql/privileges.sql6
9 files changed, 72 insertions, 14 deletions
diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h
index 7ee560e8cd4..6f65733e647 100644
--- a/src/bin/pg_dump/pg_backup.h
+++ b/src/bin/pg_dump/pg_backup.h
@@ -116,6 +116,7 @@ typedef struct _restoreOptions
bool *idWanted; /* array showing which dump IDs to emit */
int enable_row_security;
+ int binary_upgrade;
} RestoreOptions;
typedef struct _dumpOptions
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 6539235544c..c9d68d4de92 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -2780,7 +2780,17 @@ _tocEntryRequired(TocEntry *te, teSection curSection, RestoreOptions *ropt)
/* Mask it if we only want schema */
if (ropt->schemaOnly)
- res = res & REQ_SCHEMA;
+ {
+ /*
+ * In binary-upgrade mode, even with schema-only set, we do not mask
+ * out large objects. Only large object definitions, comments and
+ * other information should be generated in binary-upgrade mode (not
+ * the actual data).
+ */
+ if (!(ropt->binary_upgrade && strcmp(te->desc,"BLOB") == 0) &&
+ !(ropt->binary_upgrade && strncmp(te->tag,"LARGE OBJECT ", 13) == 0))
+ res = res & REQ_SCHEMA;
+ }
/* Mask it if we only want data */
if (ropt->dataOnly)
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 180f51c76bc..16f6c92d450 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -747,7 +747,15 @@ main(int argc, char **argv)
getTableDataFKConstraints();
}
- if (dopt.outputBlobs)
+ /*
+ * In binary-upgrade mode, we do not have to worry about the actual blob
+ * data or the associated metadata that resides in the pg_largeobject and
+ * pg_largeobject_metadata tables, respectivly.
+ *
+ * However, we do need to collect blob information as there may be
+ * comments or other information on blobs that we do need to dump out.
+ */
+ if (dopt.outputBlobs || dopt.binary_upgrade)
getBlobs(fout);
/*
@@ -830,6 +838,7 @@ main(int argc, char **argv)
ropt->lockWaitTimeout = dopt.lockWaitTimeout;
ropt->include_everything = dopt.include_everything;
ropt->enable_row_security = dopt.enable_row_security;
+ ropt->binary_upgrade = dopt.binary_upgrade;
if (compressLevel == -1)
ropt->compression = 0;
@@ -2825,8 +2834,14 @@ dumpBlob(Archive *fout, BlobInfo *binfo)
NULL, binfo->rolname,
binfo->dobj.catId, 0, binfo->dobj.dumpId);
- /* Dump ACL if any */
- if (binfo->blobacl)
+ /*
+ * Dump ACL if any
+ *
+ * Do not dump the ACL in binary-upgrade mode, however, as the ACL will be
+ * copied over by pg_upgrade as it is part of the pg_largeobject_metadata
+ * table.
+ */
+ if (binfo->blobacl && !fout->dopt->binary_upgrade)
dumpACL(fout, binfo->dobj.catId, binfo->dobj.dumpId, "LARGE OBJECT",
binfo->dobj.name, NULL, cquery->data,
NULL, binfo->rolname, binfo->blobacl);
@@ -2851,6 +2866,13 @@ dumpBlobs(Archive *fout, void *arg)
int i;
int cnt;
+ /*
+ * Do not dump out blob data in binary-upgrade mode, pg_upgrade will copy
+ * the pg_largeobject table over entirely from the old cluster.
+ */
+ if (fout->dopt->binary_upgrade)
+ return 1;
+
if (g_verbose)
write_msg(NULL, "saving large objects\n");
@@ -8113,7 +8135,8 @@ dumpComment(Archive *fout, const char *target,
}
else
{
- if (dopt->schemaOnly)
+ /* We do dump blob comments in binary-upgrade mode */
+ if (dopt->schemaOnly && !dopt->binary_upgrade)
return;
}
@@ -13496,7 +13519,8 @@ dumpSecLabel(Archive *fout, const char *target,
}
else
{
- if (dopt->schemaOnly)
+ /* We do dump blob security labels in binary-upgrade mode */
+ if (dopt->schemaOnly && !dopt->binary_upgrade)
return;
}
diff --git a/src/test/regress/expected/large_object.out b/src/test/regress/expected/large_object.out
new file mode 100644
index 00000000000..b00d47cc75e
--- /dev/null
+++ b/src/test/regress/expected/large_object.out
@@ -0,0 +1,15 @@
+-- This is more-or-less DROP IF EXISTS LARGE OBJECT 3001;
+WITH unlink AS (SELECT lo_unlink(loid) FROM pg_largeobject WHERE loid = 3001) SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- Test creation of a large object and leave it for testing pg_upgrade
+SELECT lo_create(3001);
+ lo_create
+-----------
+ 3001
+(1 row)
+
+COMMENT ON LARGE OBJECT 3001 IS 'testing comments';
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
index c0cd9fac468..cf6c54dbfc4 100644
--- a/src/test/regress/expected/privileges.out
+++ b/src/test/regress/expected/privileges.out
@@ -12,7 +12,7 @@ DROP ROLE IF EXISTS regressuser3;
DROP ROLE IF EXISTS regressuser4;
DROP ROLE IF EXISTS regressuser5;
DROP ROLE IF EXISTS regressuser6;
-SELECT lo_unlink(oid) FROM pg_largeobject_metadata;
+SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid;
lo_unlink
-----------
(0 rows)
@@ -1174,11 +1174,11 @@ SELECT lo_unlink(2002);
\c -
-- confirm ACL setting
-SELECT oid, pg_get_userbyid(lomowner) ownername, lomacl FROM pg_largeobject_metadata;
+SELECT oid, pg_get_userbyid(lomowner) ownername, lomacl FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid;
oid | ownername | lomacl
------+--------------+------------------------------------------------------------------------------------------
- 1002 | regressuser1 |
1001 | regressuser1 | {regressuser1=rw/regressuser1,=rw/regressuser1}
+ 1002 | regressuser1 |
1003 | regressuser1 | {regressuser1=rw/regressuser1,regressuser2=r/regressuser1}
1004 | regressuser1 | {regressuser1=rw/regressuser1,regressuser2=rw/regressuser1}
1005 | regressuser1 | {regressuser1=rw/regressuser1,regressuser2=r*w/regressuser1,regressuser3=r/regressuser2}
@@ -1547,7 +1547,7 @@ DROP TABLE atest6;
DROP TABLE atestc;
DROP TABLE atestp1;
DROP TABLE atestp2;
-SELECT lo_unlink(oid) FROM pg_largeobject_metadata;
+SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid;
lo_unlink
-----------
1
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 60854066114..4e318763bce 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -84,7 +84,7 @@ test: select_into select_distinct select_distinct_on select_implicit select_havi
# ----------
# Another group of parallel tests
# ----------
-test: brin gin gist spgist privileges security_label collate matview lock replica_identity rowsecurity object_address tablesample groupingsets
+test: brin gin gist spgist privileges security_label collate matview lock replica_identity rowsecurity object_address tablesample groupingsets large_object
# ----------
# Another group of parallel tests
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 985f6c9f02f..e23ad31adb3 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -112,6 +112,7 @@ test: replica_identity
test: rowsecurity
test: object_address
test: tablesample
+test: large_object
test: alter_generic
test: misc
test: psql
diff --git a/src/test/regress/sql/large_object.sql b/src/test/regress/sql/large_object.sql
new file mode 100644
index 00000000000..c06b393dd36
--- /dev/null
+++ b/src/test/regress/sql/large_object.sql
@@ -0,0 +1,7 @@
+-- This is more-or-less DROP IF EXISTS LARGE OBJECT 3001;
+WITH unlink AS (SELECT lo_unlink(loid) FROM pg_largeobject WHERE loid = 3001) SELECT 1;
+
+-- Test creation of a large object and leave it for testing pg_upgrade
+SELECT lo_create(3001);
+
+COMMENT ON LARGE OBJECT 3001 IS 'testing comments';
diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql
index c1837c497af..0be21cdcb0d 100644
--- a/src/test/regress/sql/privileges.sql
+++ b/src/test/regress/sql/privileges.sql
@@ -17,7 +17,7 @@ DROP ROLE IF EXISTS regressuser4;
DROP ROLE IF EXISTS regressuser5;
DROP ROLE IF EXISTS regressuser6;
-SELECT lo_unlink(oid) FROM pg_largeobject_metadata;
+SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid;
RESET client_min_messages;
@@ -729,7 +729,7 @@ SELECT lo_unlink(2002);
\c -
-- confirm ACL setting
-SELECT oid, pg_get_userbyid(lomowner) ownername, lomacl FROM pg_largeobject_metadata;
+SELECT oid, pg_get_userbyid(lomowner) ownername, lomacl FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid;
SET SESSION AUTHORIZATION regressuser3;
@@ -960,7 +960,7 @@ DROP TABLE atestc;
DROP TABLE atestp1;
DROP TABLE atestp2;
-SELECT lo_unlink(oid) FROM pg_largeobject_metadata;
+SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid;
DROP GROUP regressgroup1;
DROP GROUP regressgroup2;