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: