| CREATE EXTENSION adminpack; |
| -- create new file |
| SELECT pg_file_write('test_file1', 'test1', false); |
| pg_file_write |
| --------------- |
| 5 |
| (1 row) |
| |
| SELECT pg_read_file('test_file1'); |
| pg_read_file |
| -------------- |
| test1 |
| (1 row) |
| |
| -- append |
| SELECT pg_file_write('test_file1', 'test1', true); |
| pg_file_write |
| --------------- |
| 5 |
| (1 row) |
| |
| SELECT pg_read_file('test_file1'); |
| pg_read_file |
| -------------- |
| test1test1 |
| (1 row) |
| |
| -- error, already exists |
| SELECT pg_file_write('test_file1', 'test1', false); |
| ERROR: file "test_file1" exists |
| SELECT pg_read_file('test_file1'); |
| pg_read_file |
| -------------- |
| test1test1 |
| (1 row) |
| |
| -- disallowed file paths for non-superusers and users who are |
| -- not members of pg_write_server_files |
| <<<<<<< HEAD |
| CREATE ROLE regress_user1; |
| NOTICE: resource queue required -- using default resource queue "pg_default" |
| GRANT pg_read_all_settings TO regress_user1; |
| GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_user1; |
| SET ROLE regress_user1; |
| SELECT pg_file_write('../test_file0', 'test0', false); |
| ERROR: only superuser may access generic file functions |
| ======= |
| CREATE ROLE regress_adminpack_user1; |
| GRANT pg_read_all_settings TO regress_adminpack_user1; |
| GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_adminpack_user1; |
| SET ROLE regress_adminpack_user1; |
| SELECT pg_file_write('../test_file0', 'test0', false); |
| ERROR: path must be in or below the data directory |
| >>>>>>> REL_16_9 |
| SELECT pg_file_write('/tmp/test_file0', 'test0', false); |
| ERROR: only superuser may access generic file functions |
| SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4', false); |
| ERROR: only superuser may access generic file functions |
| SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false); |
| <<<<<<< HEAD |
| ERROR: only superuser may access generic file functions |
| ======= |
| ERROR: absolute path not allowed |
| >>>>>>> REL_16_9 |
| RESET ROLE; |
| REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_adminpack_user1; |
| REVOKE pg_read_all_settings FROM regress_adminpack_user1; |
| DROP ROLE regress_adminpack_user1; |
| -- sync |
| SELECT pg_file_sync('test_file1'); -- sync file |
| pg_file_sync |
| -------------- |
| |
| (1 row) |
| |
| SELECT pg_file_sync('pg_stat'); -- sync directory |
| pg_file_sync |
| -------------- |
| |
| (1 row) |
| |
| SELECT pg_file_sync('test_file2'); -- not there |
| ERROR: could not stat file "test_file2": No such file or directory |
| -- rename file |
| SELECT pg_file_rename('test_file1', 'test_file2'); |
| pg_file_rename |
| ---------------- |
| t |
| (1 row) |
| |
| SELECT pg_read_file('test_file1'); -- not there |
| ERROR: could not open file "test_file1" for reading: No such file or directory |
| SELECT pg_read_file('test_file2'); |
| pg_read_file |
| -------------- |
| test1test1 |
| (1 row) |
| |
| -- error |
| SELECT pg_file_rename('test_file1', 'test_file2'); |
| WARNING: file "test_file1" is not accessible: No such file or directory |
| pg_file_rename |
| ---------------- |
| f |
| (1 row) |
| |
| -- rename file and archive |
| SELECT pg_file_write('test_file3', 'test3', false); |
| pg_file_write |
| --------------- |
| 5 |
| (1 row) |
| |
| SELECT pg_file_rename('test_file2', 'test_file3', 'test_file3_archive'); |
| pg_file_rename |
| ---------------- |
| t |
| (1 row) |
| |
| SELECT pg_read_file('test_file2'); -- not there |
| ERROR: could not open file "test_file2" for reading: No such file or directory |
| SELECT pg_read_file('test_file3'); |
| pg_read_file |
| -------------- |
| test1test1 |
| (1 row) |
| |
| SELECT pg_read_file('test_file3_archive'); |
| pg_read_file |
| -------------- |
| test3 |
| (1 row) |
| |
| -- unlink |
| SELECT pg_file_unlink('test_file1'); -- does not exist |
| pg_file_unlink |
| ---------------- |
| f |
| (1 row) |
| |
| SELECT pg_file_unlink('test_file2'); -- does not exist |
| pg_file_unlink |
| ---------------- |
| f |
| (1 row) |
| |
| SELECT pg_file_unlink('test_file3'); |
| pg_file_unlink |
| ---------------- |
| t |
| (1 row) |
| |
| SELECT pg_file_unlink('test_file3_archive'); |
| pg_file_unlink |
| ---------------- |
| t |
| (1 row) |
| |
| SELECT pg_file_unlink('test_file4'); |
| pg_file_unlink |
| ---------------- |
| f |
| (1 row) |
| |
| -- superuser checks |
| <<<<<<< HEAD |
| CREATE USER regress_user1; |
| NOTICE: resource queue required -- using default resource queue "pg_default" |
| SET ROLE regress_user1; |
| ======= |
| CREATE USER regress_adminpack_user1; |
| SET ROLE regress_adminpack_user1; |
| >>>>>>> REL_16_9 |
| SELECT pg_file_write('test_file0', 'test0', false); |
| ERROR: permission denied for function pg_file_write |
| SELECT pg_file_sync('test_file0'); |
| ERROR: permission denied for function pg_file_sync |
| SELECT pg_file_rename('test_file0', 'test_file0'); |
| ERROR: permission denied for function pg_file_rename |
| CONTEXT: SQL function "pg_file_rename" statement 1 |
| SELECT pg_file_unlink('test_file0'); |
| ERROR: permission denied for function pg_file_unlink |
| SELECT pg_logdir_ls(); |
| ERROR: permission denied for function pg_logdir_ls |
| RESET ROLE; |
| <<<<<<< HEAD |
| DROP USER regress_user1; |
| -- allowed file paths for superuser test |
| CREATE ROLE regress_superuser1 SUPERUSER; |
| GRANT pg_read_all_settings TO regress_superuser1; |
| GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_superuser1; |
| SET ROLE regress_superuser1; |
| SELECT pg_file_write('../supper_test_file0', 'test0', false); |
| pg_file_write |
| --------------- |
| 5 |
| (1 row) |
| |
| SELECT pg_file_write('/tmp/supper_test_file0', 'test0', false); |
| pg_file_write |
| --------------- |
| 5 |
| (1 row) |
| |
| SELECT pg_file_write(current_setting('data_directory') || '/supper_test_file4', 'test4', false); |
| pg_file_write |
| --------------- |
| 5 |
| (1 row) |
| |
| SELECT pg_file_write(current_setting('data_directory') || '/../supper_test_file4', 'test4', false); |
| pg_file_write |
| --------------- |
| 5 |
| (1 row) |
| |
| SELECT pg_file_unlink('../supper_test_file0'); |
| pg_file_unlink |
| ---------------- |
| t |
| (1 row) |
| |
| SELECT pg_file_unlink('/tmp/supper_test_file0'); |
| pg_file_unlink |
| ---------------- |
| t |
| (1 row) |
| |
| SELECT pg_file_unlink(current_setting('data_directory') || '/supper_test_file4'); |
| pg_file_unlink |
| ---------------- |
| t |
| (1 row) |
| |
| SELECT pg_file_unlink(current_setting('data_directory') || '/../supper_test_file4'); |
| pg_file_unlink |
| ---------------- |
| t |
| (1 row) |
| |
| RESET ROLE; |
| REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_superuser1; |
| REVOKE pg_read_all_settings FROM regress_superuser1; |
| DROP ROLE regress_superuser1; |
| ======= |
| DROP USER regress_adminpack_user1; |
| >>>>>>> REL_16_9 |
| -- no further tests for pg_logdir_ls() because it depends on the |
| -- server's logging setup |