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 CREATE ROLE regress_user1; 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: path must be in or below the current directory SELECT pg_file_write('/tmp/test_file0', 'test0', false); ERROR: absolute path not allowed SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4', false); pg_file_write --------------- 5 (1 row) SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false); ERROR: reference to parent directory ("..") not allowed RESET ROLE; REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_user1; REVOKE pg_read_all_settings FROM regress_user1; DROP ROLE regress_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 ---------------- t (1 row) -- superuser checks CREATE USER regress_user1; SET ROLE regress_user1; 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; DROP USER regress_user1; -- no further tests for pg_logdir_ls() because it depends on the -- server's logging setup