diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-07-29 15:38:49 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-07-29 15:38:49 -0400 |
commit | 283129e325b721a5a62227f20d7e3d149b379c73 (patch) | |
tree | a77377711f7fa536929419cead77d7dcc18f1485 /src/test | |
parent | fd96d14d950f2b1d19b5cb3b8e5a7d4d2b3fa161 (diff) | |
download | postgresql-283129e325b721a5a62227f20d7e3d149b379c73.tar.gz |
Support pg_read_[binary_]file (filename, missing_ok).
There wasn't an especially nice way to read all of a file while
passing missing_ok = true. Add an additional overloaded variant
to support that use-case.
While here, refactor the C code to avoid a rats-nest of PG_NARGS
checks, instead handling the argument collection in the outer
wrapper functions. It's a bit longer this way, but far more
straightforward.
(Upon looking at the code coverage report for genfile.c, I was
impelled to also add a test case for pg_stat_file() -- tgl)
Kyotaro Horiguchi
Discussion: https://postgr.es/m/20220607.160520.1984541900138970018.horikyota.ntt@gmail.com
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/regress/expected/misc_functions.out | 64 | ||||
-rw-r--r-- | src/test/regress/sql/misc_functions.sql | 26 |
2 files changed, 90 insertions, 0 deletions
diff --git a/src/test/regress/expected/misc_functions.out b/src/test/regress/expected/misc_functions.out index 01d1ad0b9a..ca82d91f1a 100644 --- a/src/test/regress/expected/misc_functions.out +++ b/src/test/regress/expected/misc_functions.out @@ -372,6 +372,68 @@ select count(*) >= 0 as ok from pg_ls_archive_statusdir(); t (1 row) +-- pg_read_file() +select length(pg_read_file('postgresql.auto.conf')) > 30; + ?column? +---------- + t +(1 row) + +select length(pg_read_file('postgresql.auto.conf', 1, 30)); + length +-------- + 30 +(1 row) + +-- Test missing_ok +select pg_read_file('does not exist'); -- error +ERROR: could not open file "does not exist" for reading: No such file or directory +select pg_read_file('does not exist', true) IS NULL; -- ok + ?column? +---------- + t +(1 row) + +-- Test invalid argument +select pg_read_file('does not exist', 0, -1); -- error +ERROR: requested length cannot be negative +select pg_read_file('does not exist', 0, -1, true); -- error +ERROR: requested length cannot be negative +-- pg_read_binary_file() +select length(pg_read_binary_file('postgresql.auto.conf')) > 30; + ?column? +---------- + t +(1 row) + +select length(pg_read_binary_file('postgresql.auto.conf', 1, 30)); + length +-------- + 30 +(1 row) + +-- Test missing_ok +select pg_read_binary_file('does not exist'); -- error +ERROR: could not open file "does not exist" for reading: No such file or directory +select pg_read_binary_file('does not exist', true) IS NULL; -- ok + ?column? +---------- + t +(1 row) + +-- Test invalid argument +select pg_read_binary_file('does not exist', 0, -1); -- error +ERROR: requested length cannot be negative +select pg_read_binary_file('does not exist', 0, -1, true); -- error +ERROR: requested length cannot be negative +-- pg_stat_file() +select size > 30, isdir from pg_stat_file('postgresql.auto.conf'); + ?column? | isdir +----------+------- + t | f +(1 row) + +-- pg_ls_dir() select * from (select pg_ls_dir('.') a) a where a = 'base' limit 1; a ------ @@ -401,12 +463,14 @@ select count(*) = 1 as dot_found f (1 row) +-- pg_timezone_names() select * from (select (pg_timezone_names()).name) ptn where name='UTC' limit 1; name ------ UTC (1 row) +-- pg_tablespace_databases() select count(*) > 0 from (select pg_tablespace_databases(oid) as pts from pg_tablespace where spcname = 'pg_default') pts diff --git a/src/test/regress/sql/misc_functions.sql b/src/test/regress/sql/misc_functions.sql index 072fc36a1f..30212103ca 100644 --- a/src/test/regress/sql/misc_functions.sql +++ b/src/test/regress/sql/misc_functions.sql @@ -123,6 +123,30 @@ from (select pg_ls_waldir() w) ss where length((w).name) = 24 limit 1; select count(*) >= 0 as ok from pg_ls_archive_statusdir(); +-- pg_read_file() +select length(pg_read_file('postgresql.auto.conf')) > 30; +select length(pg_read_file('postgresql.auto.conf', 1, 30)); +-- Test missing_ok +select pg_read_file('does not exist'); -- error +select pg_read_file('does not exist', true) IS NULL; -- ok +-- Test invalid argument +select pg_read_file('does not exist', 0, -1); -- error +select pg_read_file('does not exist', 0, -1, true); -- error + +-- pg_read_binary_file() +select length(pg_read_binary_file('postgresql.auto.conf')) > 30; +select length(pg_read_binary_file('postgresql.auto.conf', 1, 30)); +-- Test missing_ok +select pg_read_binary_file('does not exist'); -- error +select pg_read_binary_file('does not exist', true) IS NULL; -- ok +-- Test invalid argument +select pg_read_binary_file('does not exist', 0, -1); -- error +select pg_read_binary_file('does not exist', 0, -1, true); -- error + +-- pg_stat_file() +select size > 30, isdir from pg_stat_file('postgresql.auto.conf'); + +-- pg_ls_dir() select * from (select pg_ls_dir('.') a) a where a = 'base' limit 1; -- Test missing_ok (second argument) select pg_ls_dir('does not exist', false, false); -- error @@ -133,8 +157,10 @@ select count(*) = 1 as dot_found select count(*) = 1 as dot_found from pg_ls_dir('.', false, false) as ls where ls = '.'; +-- pg_timezone_names() select * from (select (pg_timezone_names()).name) ptn where name='UTC' limit 1; +-- pg_tablespace_databases() select count(*) > 0 from (select pg_tablespace_databases(oid) as pts from pg_tablespace where spcname = 'pg_default') pts |