From e0bda4dfaed1b216c06f8c1cc1c91396708f7ebf Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Mon, 11 Oct 2021 17:36:05 +0300 Subject: [PATCH 01/11] [PGPRO-5673] add missing grants (caused by CVE-2018-1058 fixes #415 PGPRO-5315) --- .travis.yml | 48 +++++++++++++++++++++++++++++++++++++-------- doc/pgprobackup.xml | 8 ++++++++ tests/backup.py | 12 +++++++++--- tests/checkdb.py | 9 ++++++--- tests/ptrack.py | 12 +++++++++--- tests/restore.py | 12 +++++++++--- 6 files changed, 81 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index b6b8fd217..7a646be03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,13 +26,45 @@ notifications: # Default MODE is basic, i.e. all tests with PG_PROBACKUP_TEST_BASIC=ON env: - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE - - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE +# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE +# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE +# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE +# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE +# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE +# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE +# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=auth_test + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=auth_test + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=auth_test + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=auth_test + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=auth_test + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=auth_test + - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=auth_test + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=backup + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=backup + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=backup + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=backup + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=backup + - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=backup + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=checkdb + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=checkdb + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=checkdb + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=checkdb + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=checkdb + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=checkdb + - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=checkdb + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=restore + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=restore + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=restore + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=restore + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=restore + - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=restore + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=ptrack + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=ptrack + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=ptrack + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=ptrack # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=archive # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=compression @@ -43,7 +75,7 @@ env: # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=replica # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=retention # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore - - PG_VERSION=15 PG_BRANCH=master +# - PG_VERSION=15 PG_BRANCH=master jobs: allow_failures: diff --git a/doc/pgprobackup.xml b/doc/pgprobackup.xml index 740517313..f8b25a9d6 100644 --- a/doc/pgprobackup.xml +++ b/doc/pgprobackup.xml @@ -614,6 +614,8 @@ GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; @@ -634,6 +636,8 @@ GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; @@ -654,6 +658,8 @@ GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; @@ -5541,6 +5547,8 @@ GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; diff --git a/tests/backup.py b/tests/backup.py index 60e70cc28..1a0d99d51 100644 --- a/tests/backup.py +++ b/tests/backup.py @@ -2028,7 +2028,9 @@ def test_backup_with_least_privileges_role(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -2065,7 +2067,9 @@ def test_backup_with_least_privileges_role(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) # >= 10 else: @@ -2101,7 +2105,9 @@ def test_backup_with_least_privileges_role(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) if self.ptrack: diff --git a/tests/checkdb.py b/tests/checkdb.py index aecd4bde1..5e0421a22 100644 --- a/tests/checkdb.py +++ b/tests/checkdb.py @@ -570,7 +570,8 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup;' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -596,7 +597,8 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' # 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup;' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' ) # >= 10 else: @@ -622,7 +624,8 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup;' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' ) if ProbackupTest.enterprise: diff --git a/tests/ptrack.py b/tests/ptrack.py index aa0bbadc1..820aa68dd 100644 --- a/tests/ptrack.py +++ b/tests/ptrack.py @@ -410,7 +410,9 @@ def test_ptrack_unprivileged(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -446,7 +448,9 @@ def test_ptrack_unprivileged(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) # >= 10 else: @@ -480,7 +484,9 @@ def test_ptrack_unprivileged(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) if node.major_version < 11: diff --git a/tests/restore.py b/tests/restore.py index d0353d05f..ebeee31d7 100644 --- a/tests/restore.py +++ b/tests/restore.py @@ -3230,7 +3230,9 @@ def test_missing_database_map(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -3267,7 +3269,9 @@ def test_missing_database_map(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) # >= 10 else: @@ -3302,7 +3306,9 @@ def test_missing_database_map(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" ) if self.ptrack: From 873d5948987c5b6526aa5877fd0cb4a3a5171975 Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 08:55:44 +0300 Subject: [PATCH 02/11] [PGPRO-5673] tests.backup.BackupTest.test_missing_replication_permission_1: fix test for changed 14s output --- tests/backup.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/backup.py b/tests/backup.py index 1a0d99d51..a218cc101 100644 --- a/tests/backup.py +++ b/tests/backup.py @@ -3404,10 +3404,14 @@ def test_missing_replication_permission_1(self): self.assertIn( 'WARNING: Valid full backup on current timeline 2 is not found, trying to look up on previous timelines', output) - - self.assertIn( - 'WARNING: could not connect to database backupdb: FATAL: must be superuser or replication role to start walsender', - output) + + # Messages before 14 + # 'WARNING: could not connect to database backupdb: FATAL: must be superuser or replication role to start walsender' + # Messages for >=14 + # 'WARNING: could not connect to database backupdb: connection to server on socket "/tmp/.s.PGSQL.30983" failed: FATAL: must be superuser or replication role to start walsender' + self.assertRegex( + output, + r'WARNING: could not connect to database backupdb: (connection to server on socket "/tmp/.s.PGSQL.\d+" failed: ){0,1}FATAL: must be superuser or replication role to start walsender') # Clean after yourself self.del_test_dir(module_name, fname) From 6bf001330f893aa6b94bf37e2ea73219ea3138dd Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 09:07:15 +0300 Subject: [PATCH 03/11] [PGPRO-5673] tests.backup.BackupTest.test_missing_replication_permission: fix test for 9.5 --- tests/backup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/backup.py b/tests/backup.py index a218cc101..d1607e1b9 100644 --- a/tests/backup.py +++ b/tests/backup.py @@ -3276,9 +3276,11 @@ def test_missing_replication_permission(self): "\n Output: {0} \n CMD: {1}".format( repr(self.output), self.cmd)) except ProbackupException as e: - self.assertIn( - "FATAL: must be superuser or replication role to start walsender", + # 9.5: ERROR: must be superuser or replication role to run a backup + # >=9.6: FATAL: must be superuser or replication role to start walsender + self.assertRegex( e.message, + "ERROR: must be superuser or replication role to run a backup|FATAL: must be superuser or replication role to start walsender", "\n Unexpected Error Message: {0}\n CMD: {1}".format( repr(e.message), self.cmd)) From 0f550d4cad6ad107de9f1335428daa19280f44cb Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 09:27:34 +0300 Subject: [PATCH 04/11] [PGPRO-5673] tests.checkdb.CheckdbTest.test_checkdb_with_least_privileges: remove grant for nonexistent (in 10) bt_index_check(regclass, bool) --- tests/checkdb.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/tests/checkdb.py b/tests/checkdb.py index 5e0421a22..4e2a1f3ce 100644 --- a/tests/checkdb.py +++ b/tests/checkdb.py @@ -600,7 +600,33 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' ) - # >= 10 + # PG 10 + elif self.get_version(node) > 100000 and self.get_version(node) < 110000: + node.safe_psql( + 'backupdb', + 'CREATE ROLE backup WITH LOGIN; ' + 'GRANT CONNECT ON DATABASE backupdb to backup; ' + 'GRANT USAGE ON SCHEMA pg_catalog TO backup; ' + 'GRANT USAGE ON SCHEMA public TO backup; ' + 'GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; ' + 'GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; ' + 'GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; ' + 'GRANT SELECT ON TABLE pg_catalog.pg_am TO backup; ' + 'GRANT SELECT ON TABLE pg_catalog.pg_class TO backup; ' + 'GRANT SELECT ON TABLE pg_catalog.pg_index TO backup; ' + 'GRANT SELECT ON TABLE pg_catalog.pg_namespace TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.namene(name, name) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.int8(integer) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.charne("char", "char") TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' + ) + # >= 11 else: node.safe_psql( 'backupdb', From 34469d4c29a4f46c451d2af58c97b6d84c1003ff Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 09:34:40 +0300 Subject: [PATCH 05/11] [PGPRO-5673] tests.checkdb.CheckdbTest.test_checkdb_with_least_privileges: remove grant for nonexistent (in 9.5) pg_catalog.pg_control_system() --- .travis.yml | 38 ++++++++++++++++++++------------------ tests/checkdb.py | 1 - 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7a646be03..c17d9ecee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,13 +33,14 @@ env: # - PG_VERSION=10 PG_BRANCH=REL_10_STABLE # - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE # - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=auth_test - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=auth_test - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=auth_test - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=auth_test - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=auth_test - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=auth_test - - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=auth_test + +# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=auth_test +# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=auth_test +# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=auth_test +# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=auth_test +# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=auth_test +# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=auth_test +# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=auth_test - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=backup - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=backup - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup @@ -54,17 +55,18 @@ env: - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=checkdb - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=checkdb - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=checkdb - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=restore - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=restore - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=restore - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=restore - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=restore - - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=restore - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=ptrack - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=ptrack - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=ptrack - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=ptrack +# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=restore +# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=restore +# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore +# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=restore +# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=restore +# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=restore +# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=restore +# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=ptrack +# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=ptrack +# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=ptrack +# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=ptrack + # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=archive # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=compression diff --git a/tests/checkdb.py b/tests/checkdb.py index 4e2a1f3ce..61f8471f3 100644 --- a/tests/checkdb.py +++ b/tests/checkdb.py @@ -568,7 +568,6 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.charne("char", "char") TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' - 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' From ce33c9d184a024034ca2fa6e03e27104cddeb1fd Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 18:38:31 +0300 Subject: [PATCH 06/11] [PGPRO-5673] tests.checkdb.CheckdbTest.test_checkdb_with_least_privileges: remove grant for nonexistent (in amcheck_next) bt_index_check(regclass) --- .travis.yml | 14 +++++++------- tests/checkdb.py | 3 +-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index c17d9ecee..6ccca066c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,13 +41,13 @@ env: # - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=auth_test # - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=auth_test # - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=auth_test - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=backup - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=backup - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=backup - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=backup - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=backup - - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=backup +# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=backup +# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=backup +# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup +# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=backup +# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=backup +# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=backup +# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=backup - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=checkdb - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=checkdb - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=checkdb diff --git a/tests/checkdb.py b/tests/checkdb.py index 61f8471f3..9ebac46c7 100644 --- a/tests/checkdb.py +++ b/tests/checkdb.py @@ -568,8 +568,7 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.charne("char", "char") TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' # amcheck-next function 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' ) # PG 9.6 From 161f64c7ded4e8c173730e039eaf6617d361d9a0 Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 19:32:21 +0300 Subject: [PATCH 07/11] [PGPRO-5673] adapt tests/restore.py to Python-3.5 (used in travis tests) --- .travis.yml | 14 +++++++------- tests/restore.py | 9 +++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6ccca066c..e4b6c7714 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,13 +55,13 @@ env: - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=checkdb - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=checkdb - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=checkdb -# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=restore -# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=restore -# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore -# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=restore -# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=restore -# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=restore -# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=restore + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=restore + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=restore + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=restore + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=restore + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=restore + - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=restore # - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=ptrack # - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=ptrack # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=ptrack diff --git a/tests/restore.py b/tests/restore.py index ebeee31d7..b074668b2 100644 --- a/tests/restore.py +++ b/tests/restore.py @@ -4,7 +4,7 @@ import subprocess import sys from time import sleep -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone import hashlib import shutil import json @@ -2140,7 +2140,8 @@ def test_restore_target_new_options(self): target_name = 'savepoint' - target_time = datetime.now().astimezone().strftime("%Y-%m-%d %H:%M:%S %z") + # in python-3.6+ it can be ...now()..astimezone()... + target_time = datetime.utcnow().replace(tzinfo=timezone.utc).astimezone().strftime("%Y-%m-%d %H:%M:%S %z") with node.connect("postgres") as con: res = con.execute( "INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin)") @@ -2509,7 +2510,7 @@ def test_partial_restore_exclude(self): db_list = {} for line in db_list_splitted: - line = json.loads(line) + line = json.loads(line.decode('utf-8')) db_list[line['datname']] = line['oid'] # FULL backup @@ -2640,7 +2641,7 @@ def test_partial_restore_exclude_tablespace(self): db_list = {} for line in db_list_splitted: - line = json.loads(line) + line = json.loads(line.decode('utf-8')) db_list[line['datname']] = line['oid'] # FULL backup From dcbcc772eae1658cf893519e841df2faa61dd94f Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 20:06:36 +0300 Subject: [PATCH 08/11] [PGPRO-5673] adapt#2 tests/restore.py to Python-3.5 (used in travis tests) --- .travis.yml | 28 +++++++--------------------- tests/backup.py | 15 ++++----------- tests/restore.py | 8 ++++---- 3 files changed, 15 insertions(+), 36 deletions(-) diff --git a/.travis.yml b/.travis.yml index e4b6c7714..6e7866419 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,27 +34,13 @@ env: # - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE # - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE -# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=auth_test -# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=auth_test -# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=auth_test -# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=auth_test -# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=auth_test -# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=auth_test -# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=auth_test -# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=backup -# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=backup -# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup -# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=backup -# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=backup -# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=backup -# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=backup - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=checkdb - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=checkdb - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=checkdb - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=checkdb - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=checkdb - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=checkdb - - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=checkdb + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=backup + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=backup + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=backup + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=backup + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=backup + - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=backup - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=restore - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=restore - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore diff --git a/tests/backup.py b/tests/backup.py index d1607e1b9..e3952ee87 100644 --- a/tests/backup.py +++ b/tests/backup.py @@ -3255,10 +3255,7 @@ def test_missing_replication_permission(self): if ProbackupTest.enterprise: node.safe_psql( "backupdb", - "GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_edition() TO backup") - - node.safe_psql( - "backupdb", + "GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_edition() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_version() TO backup") sleep(2) @@ -3324,7 +3321,7 @@ def test_missing_replication_permission_1(self): if self.get_version(node) < 90600: node.safe_psql( 'backupdb', - "CREATE ROLE backup WITH LOGIN; " + "CREATE ROLE backup WITH LOGIN REPLICATION; " "GRANT CONNECT ON DATABASE backupdb to backup; " "GRANT USAGE ON SCHEMA pg_catalog TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " @@ -3383,16 +3380,12 @@ def test_missing_replication_permission_1(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" - ) + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;") if ProbackupTest.enterprise: node.safe_psql( "backupdb", - "GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_edition() TO backup") - - node.safe_psql( - "backupdb", + "GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_edition() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_version() TO backup") replica.promote() diff --git a/tests/restore.py b/tests/restore.py index b074668b2..7eb1c51b3 100644 --- a/tests/restore.py +++ b/tests/restore.py @@ -2504,13 +2504,13 @@ def test_partial_restore_exclude(self): db_list_raw = node.safe_psql( 'postgres', 'SELECT to_json(a) ' - 'FROM (SELECT oid, datname FROM pg_database) a').rstrip() + 'FROM (SELECT oid, datname FROM pg_database) a').decode('utf-8').rstrip() db_list_splitted = db_list_raw.splitlines() db_list = {} for line in db_list_splitted: - line = json.loads(line.decode('utf-8')) + line = json.loads(line) db_list[line['datname']] = line['oid'] # FULL backup @@ -2641,7 +2641,7 @@ def test_partial_restore_exclude_tablespace(self): db_list = {} for line in db_list_splitted: - line = json.loads(line.decode('utf-8')) + line = json.loads(line) db_list[line['datname']] = line['oid'] # FULL backup @@ -2743,7 +2743,7 @@ def test_partial_restore_include(self): db_list_raw = node.safe_psql( 'postgres', 'SELECT to_json(a) ' - 'FROM (SELECT oid, datname FROM pg_database) a').rstrip() + 'FROM (SELECT oid, datname FROM pg_database) a').decode('utf-8').rstrip() db_list_splitted = db_list_raw.splitlines() From a3878037646b39b7f19a05e073edd7b042897e26 Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Tue, 12 Oct 2021 22:28:37 +0300 Subject: [PATCH 09/11] skip issue_313 test --- .travis.yml | 1 + tests/restore.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6e7866419..a6f4752d3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,6 +68,7 @@ env: jobs: allow_failures: - if: env(PG_BRANCH) = master + - if: env(PG_BRANCH) = REL9_5_STABLE # - if: env(MODE) IN (archive, backup, delta, locking, merge, replica, retention, restore) # Only run CI for master branch commits to limit our travis usage diff --git a/tests/restore.py b/tests/restore.py index 7eb1c51b3..50346620a 100644 --- a/tests/restore.py +++ b/tests/restore.py @@ -3875,7 +3875,8 @@ def test_concurrent_restore(self): # Clean after yourself self.del_test_dir(module_name, fname) - # @unittest.skip("skip") + # skip this test until https://github.com/postgrespro/pg_probackup/pull/399 + @unittest.skip("skip") def test_restore_issue_313(self): """ Check that partially restored PostgreSQL instance cannot be started From 461f957fc76d21a79679b988f27fe68d720ac734 Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Wed, 13 Oct 2021 04:28:05 +0300 Subject: [PATCH 10/11] [PGPRO-5673] cosmetic changes --- .travis.yml | 35 +++++++---------------------------- doc/pgprobackup.xml | 12 ++++-------- tests/backup.py | 29 ++++++++++++++++------------- tests/checkdb.py | 16 ++++++++-------- tests/ptrack.py | 18 +++++++++--------- tests/restore.py | 18 +++++++++--------- 6 files changed, 53 insertions(+), 75 deletions(-) diff --git a/.travis.yml b/.travis.yml index a6f4752d3..7766c6d3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,33 +26,13 @@ notifications: # Default MODE is basic, i.e. all tests with PG_PROBACKUP_TEST_BASIC=ON env: -# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE -# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE -# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE -# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE -# - PG_VERSION=10 PG_BRANCH=REL_10_STABLE -# - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE -# - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE - - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=backup - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=backup - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=backup - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=backup - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=backup - - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=backup - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=restore - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=restore - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=restore - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=restore - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=restore - - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE MODE=restore -# - PG_VERSION=14 PG_BRANCH=REL_14_STABLE MODE=ptrack -# - PG_VERSION=13 PG_BRANCH=REL_13_STABLE MODE=ptrack -# - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=ptrack -# - PG_VERSION=11 PG_BRANCH=REL_11_STABLE MODE=ptrack - + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE + - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=archive # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=backup # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=compression @@ -68,7 +48,6 @@ env: jobs: allow_failures: - if: env(PG_BRANCH) = master - - if: env(PG_BRANCH) = REL9_5_STABLE # - if: env(MODE) IN (archive, backup, delta, locking, merge, replica, retention, restore) # Only run CI for master branch commits to limit our travis usage diff --git a/doc/pgprobackup.xml b/doc/pgprobackup.xml index f8b25a9d6..6a634ea05 100644 --- a/doc/pgprobackup.xml +++ b/doc/pgprobackup.xml @@ -606,6 +606,7 @@ BEGIN; CREATE ROLE backup WITH LOGIN; GRANT USAGE ON SCHEMA pg_catalog TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; @@ -614,8 +615,6 @@ GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; @@ -626,6 +625,7 @@ BEGIN; CREATE ROLE backup WITH LOGIN; GRANT USAGE ON SCHEMA pg_catalog TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean) TO backup; @@ -636,8 +636,6 @@ GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; @@ -648,6 +646,7 @@ BEGIN; CREATE ROLE backup WITH LOGIN; GRANT USAGE ON SCHEMA pg_catalog TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup; @@ -658,8 +657,6 @@ GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; @@ -5537,6 +5534,7 @@ BEGIN; CREATE ROLE backup WITH LOGIN REPLICATION; GRANT USAGE ON SCHEMA pg_catalog TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; +GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup; @@ -5547,8 +5545,6 @@ GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; -GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; COMMIT; diff --git a/tests/backup.py b/tests/backup.py index e3952ee87..a2a242534 100644 --- a/tests/backup.py +++ b/tests/backup.py @@ -2020,17 +2020,17 @@ def test_backup_with_least_privileges_role(self): "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -2055,10 +2055,12 @@ def test_backup_with_least_privileges_role(self): "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; " @@ -2067,9 +2069,7 @@ def test_backup_with_least_privileges_role(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) # >= 10 else: @@ -2095,8 +2095,10 @@ def test_backup_with_least_privileges_role(self): "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; " @@ -2105,9 +2107,7 @@ def test_backup_with_least_privileges_role(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) if self.ptrack: @@ -3321,7 +3321,7 @@ def test_missing_replication_permission_1(self): if self.get_version(node) < 90600: node.safe_psql( 'backupdb', - "CREATE ROLE backup WITH LOGIN REPLICATION; " + "CREATE ROLE backup WITH LOGIN; " "GRANT CONNECT ON DATABASE backupdb to backup; " "GRANT USAGE ON SCHEMA pg_catalog TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " @@ -3335,7 +3335,8 @@ def test_missing_replication_permission_1(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;") + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: node.safe_psql( @@ -3358,7 +3359,8 @@ def test_missing_replication_permission_1(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;") + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + ) # >= 10 else: node.safe_psql( @@ -3380,7 +3382,8 @@ def test_missing_replication_permission_1(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;") + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" + ) if ProbackupTest.enterprise: node.safe_psql( diff --git a/tests/checkdb.py b/tests/checkdb.py index 9ebac46c7..fcc40b2bf 100644 --- a/tests/checkdb.py +++ b/tests/checkdb.py @@ -562,14 +562,14 @@ def test_checkdb_with_least_privileges(self): 'GRANT SELECT ON TABLE pg_catalog.pg_index TO backup; ' 'GRANT SELECT ON TABLE pg_catalog.pg_namespace TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.namene(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.int8(integer) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.charne("char", "char") TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' # amcheck-next function - 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup;' # amcheck-next function ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -587,6 +587,7 @@ def test_checkdb_with_least_privileges(self): 'GRANT SELECT ON TABLE pg_catalog.pg_index TO backup; ' 'GRANT SELECT ON TABLE pg_catalog.pg_namespace TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.namene(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.int8(integer) TO backup; ' @@ -595,8 +596,7 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' # 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' - 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup;' ) # PG 10 elif self.get_version(node) > 100000 and self.get_version(node) < 110000: @@ -614,6 +614,7 @@ def test_checkdb_with_least_privileges(self): 'GRANT SELECT ON TABLE pg_catalog.pg_index TO backup; ' 'GRANT SELECT ON TABLE pg_catalog.pg_namespace TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.namene(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.int8(integer) TO backup; ' @@ -621,8 +622,7 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.charne("char", "char") TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' - 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup;' ) # >= 11 else: @@ -640,6 +640,7 @@ def test_checkdb_with_least_privileges(self): 'GRANT SELECT ON TABLE pg_catalog.pg_index TO backup; ' 'GRANT SELECT ON TABLE pg_catalog.pg_namespace TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; ' + 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.namene(name, name) TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.int8(integer) TO backup; ' @@ -648,8 +649,7 @@ def test_checkdb_with_least_privileges(self): 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; ' 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; ' 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO backup; ' - 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup; ' - 'GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;' + 'GRANT EXECUTE ON FUNCTION bt_index_check(regclass, bool) TO backup;' ) if ProbackupTest.enterprise: diff --git a/tests/ptrack.py b/tests/ptrack.py index 820aa68dd..7a1090a81 100644 --- a/tests/ptrack.py +++ b/tests/ptrack.py @@ -402,17 +402,17 @@ def test_ptrack_unprivileged(self): "GRANT USAGE ON SCHEMA pg_catalog TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -436,10 +436,12 @@ def test_ptrack_unprivileged(self): "GRANT USAGE ON SCHEMA pg_catalog TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; " @@ -448,9 +450,7 @@ def test_ptrack_unprivileged(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) # >= 10 else: @@ -474,8 +474,10 @@ def test_ptrack_unprivileged(self): "GRANT USAGE ON SCHEMA pg_catalog TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; " @@ -484,9 +486,7 @@ def test_ptrack_unprivileged(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) if node.major_version < 11: diff --git a/tests/restore.py b/tests/restore.py index 50346620a..47419e5a9 100644 --- a/tests/restore.py +++ b/tests/restore.py @@ -3223,17 +3223,17 @@ def test_missing_database_map(self): "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) # PG 9.6 elif self.get_version(node) > 90600 and self.get_version(node) < 100000: @@ -3258,10 +3258,12 @@ def test_missing_database_map(self): "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; " @@ -3270,9 +3272,7 @@ def test_missing_database_map(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) # >= 10 else: @@ -3297,8 +3297,10 @@ def test_missing_database_map(self): "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; " "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack + "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; " + "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; " @@ -3307,9 +3309,7 @@ def test_missing_database_map(self): "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; " "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; " - "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup;" + "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;" ) if self.ptrack: From f0edf56748c4ecc5f0c7c887af6e8f2e179b842c Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Wed, 13 Oct 2021 04:30:41 +0300 Subject: [PATCH 11/11] [PGPRO-5673] revert .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7766c6d3a..b6b8fd217 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,7 +43,7 @@ env: # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=replica # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=retention # - PG_VERSION=12 PG_BRANCH=REL_12_STABLE MODE=restore -# - PG_VERSION=15 PG_BRANCH=master + - PG_VERSION=15 PG_BRANCH=master jobs: allow_failures: pFad - Phonifier reborn

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

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


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy