diff options
| author | Stephen Frost | 2017-03-06 22:03:57 +0000 |
|---|---|---|
| committer | Stephen Frost | 2017-03-06 22:03:57 +0000 |
| commit | ff992c074e308ade204a38eb43a6d19c8403414e (patch) | |
| tree | 0843f59303c6e9448249932be4769f9d9d31643c /src/test | |
| parent | a8df75b0a470f477dad75a7408e429e10c13fc07 (diff) | |
pg_upgrade: Fix large object COMMENTS, SECURITY LABELS
When performing a pg_upgrade, we copy the files behind pg_largeobject
and pg_largeobject_metadata, allowing us to avoid having to dump out and
reload the actual data for large objects and their ACLs.
Unfortunately, that isn't all of the information which can be associated
with large objects. Currently, we also support COMMENTs and SECURITY
LABELs with large objects and these were being silently dropped during a
pg_upgrade as pg_dump would skip everything having to do with a large
object and pg_upgrade only copied the tables mentioned to the new
cluster.
As the file copies happen after the catalog dump and reload, we can't
simply include the COMMENTs and SECURITY LABELs in pg_dump's binary-mode
output but we also have to include the actual large object definition as
well. With the definition, comments, and security labels in the pg_dump
output and the file copies performed by pg_upgrade, all of the data and
metadata associated with large objects is able to be successfully pulled
forward across a pg_upgrade.
In 9.6 and master, we can simply adjust the dump bitmask to indicate
which components we don't want. In 9.5 and earlier, we have to put
explciit checks in in dumpBlob() and dumpBlobs() to not include the ACL
or the data when in binary-upgrade mode.
Adjustments made to the privileges regression test to allow another test
(large_object.sql) to be added which explicitly leaves a large object
with a comment in place to provide coverage of that case with
pg_upgrade.
Back-patch to all supported branches.
Discussion: https://postgr.es/m/20170221162655.GE9812@tamriel.snowman.net
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/large_object.out | 15 | ||||
| -rw-r--r-- | src/test/regress/expected/privileges.out | 8 | ||||
| -rw-r--r-- | src/test/regress/parallel_schedule | 2 | ||||
| -rw-r--r-- | src/test/regress/serial_schedule | 1 | ||||
| -rw-r--r-- | src/test/regress/sql/large_object.sql | 8 | ||||
| -rw-r--r-- | src/test/regress/sql/privileges.sql | 6 |
6 files changed, 32 insertions, 8 deletions
diff --git a/src/test/regress/expected/large_object.out b/src/test/regress/expected/large_object.out new file mode 100644 index 0000000000..b00d47cc75 --- /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 f66b4432a1..8ac46ecef2 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -12,7 +12,7 @@ DROP ROLE IF EXISTS regress_user3; DROP ROLE IF EXISTS regress_user4; DROP ROLE IF EXISTS regress_user5; DROP ROLE IF EXISTS regress_user6; -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) @@ -1173,11 +1173,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 | regress_user1 | 1001 | regress_user1 | {regress_user1=rw/regress_user1,=rw/regress_user1} + 1002 | regress_user1 | 1003 | regress_user1 | {regress_user1=rw/regress_user1,regress_user2=r/regress_user1} 1004 | regress_user1 | {regress_user1=rw/regress_user1,regress_user2=rw/regress_user1} 1005 | regress_user1 | {regress_user1=rw/regress_user1,regress_user2=r*w/regress_user1,regress_user3=r/regress_user2} @@ -1546,7 +1546,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 edeb2d6bc7..1f2fb597c4 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 init_privs security_label collate matview lock replica_identity rowsecurity object_address tablesample groupingsets drop_operator +test: brin gin gist spgist privileges init_privs security_label collate matview lock replica_identity rowsecurity object_address tablesample groupingsets drop_operator large_object # ---------- # Another group of parallel tests diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index 27a46d76d5..9ffceff5e0 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -116,6 +116,7 @@ test: object_address test: tablesample test: groupingsets test: drop_operator +test: large_object test: alter_generic test: alter_operator test: misc diff --git a/src/test/regress/sql/large_object.sql b/src/test/regress/sql/large_object.sql new file mode 100644 index 0000000000..a9e18b7c60 --- /dev/null +++ b/src/test/regress/sql/large_object.sql @@ -0,0 +1,8 @@ + +-- 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 00dc7bd4ab..3d74abf043 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -17,7 +17,7 @@ DROP ROLE IF EXISTS regress_user4; DROP ROLE IF EXISTS regress_user5; DROP ROLE IF EXISTS regress_user6; -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 regress_user3; @@ -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 regress_group1; DROP GROUP regress_group2; |
