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 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 -- 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 stat file "test_file1": 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 stat file "test_file2": 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: only superuser may access generic file functions SELECT pg_file_rename('test_file0', 'test_file0'); ERROR: only superuser may access generic file functions CONTEXT: SQL function "pg_file_rename" statement 1 SELECT pg_file_unlink('test_file0'); ERROR: only superuser may access generic file functions SELECT pg_logdir_ls(); ERROR: only superuser can list the log directory RESET ROLE; DROP USER regress_user1; -- no further tests for pg_logdir_ls() because it depends on the -- server's logging setup