blob: 30b9b6f61bcd7121a1c7725e388b81dc01ed7352 [file] [log] [blame]
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