From 7a1e2cd321ce9e5393a96e6bf4ff0267efea0e25 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 12 Sep 2018 20:09:37 +0000 Subject: [PATCH 1/1] Add pg_ls_tmpdir() function. --- doc/src/sgml/func.sgml | 27 +++++++++++++++++++++++++++ src/backend/catalog/system_views.sql | 4 ++++ src/backend/utils/adt/genfile.c | 33 +++++++++++++++++++++++++++++++++ src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 10 ++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 4331bebc96..83f8e39f5a 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -20220,6 +20220,20 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup()); role and may be granted to other non-superuser roles. + + + pg_ls_tmpdir(tablespace oid) + + setof record + + List the name, size, and last modification time of files in the + temporary directory for tablespace. If + tablespace is not provided, the + pg_default tablespace is used. Access is granted to + members of the pg_monitor role and may be granted to + other non-superuser roles. + + pg_read_file(filename text [, offset bigint, length bigint [, missing_ok boolean] ]) @@ -20293,6 +20307,19 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup()); GRANT. + + pg_ls_tmpdir + + + pg_ls_tmpdir returns the name, size, and last modified + time (mtime) of each file in the temporary file directory for the specified + tablespace. If tablespace is + not provided, the pg_default tablespace is used. By + default only superusers and members of the pg_monitor + role can use this function. Access may be granted to others using + GRANT. + + pg_read_file diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 7251552419..020f28cbf6 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1150,6 +1150,8 @@ REVOKE EXECUTE ON FUNCTION lo_export(oid, text) FROM public; REVOKE EXECUTE ON FUNCTION pg_ls_logdir() FROM public; REVOKE EXECUTE ON FUNCTION pg_ls_waldir() FROM public; +REVOKE EXECUTE ON FUNCTION pg_ls_tmpdir() FROM public; +REVOKE EXECUTE ON FUNCTION pg_ls_tmpdir(oid) FROM public; REVOKE EXECUTE ON FUNCTION pg_read_file(text) FROM public; REVOKE EXECUTE ON FUNCTION pg_read_file(text,bigint,bigint) FROM public; @@ -1170,6 +1172,8 @@ REVOKE EXECUTE ON FUNCTION pg_ls_dir(text,boolean,boolean) FROM public; -- GRANT EXECUTE ON FUNCTION pg_ls_logdir() TO pg_monitor; GRANT EXECUTE ON FUNCTION pg_ls_waldir() TO pg_monitor; +GRANT EXECUTE ON FUNCTION pg_ls_tmpdir() TO pg_monitor; +GRANT EXECUTE ON FUNCTION pg_ls_tmpdir(oid) TO pg_monitor; GRANT pg_read_all_settings TO pg_monitor; GRANT pg_read_all_stats TO pg_monitor; diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index a97cbea248..686207417a 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -23,6 +23,7 @@ #include "access/htup_details.h" #include "access/xlog_internal.h" #include "catalog/pg_authid.h" +#include "catalog/pg_tablespace_d.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "mb/pg_wchar.h" @@ -610,3 +611,35 @@ pg_ls_waldir(PG_FUNCTION_ARGS) { return pg_ls_dir_files(fcinfo, XLOGDIR); } + +/* + * Generic function to return the list of files in pgsql_tmp + */ +static Datum +pg_ls_tmpdir(FunctionCallInfo fcinfo, Oid tblspc) +{ + char path[MAXPGPATH]; + + TempTablespacePath(path, tblspc); + return pg_ls_dir_files(fcinfo, path); +} + +/* + * Function to return the list of temporary files in the pg_default tablespace's + * pgsql_tmp directory + */ +Datum +pg_ls_tmpdir_noargs(PG_FUNCTION_ARGS) +{ + return pg_ls_tmpdir(fcinfo, DEFAULTTABLESPACE_OID); +} + +/* + * Function to return the list of temporary files in the specified tablespace's + * pgsql_tmp directory + */ +Datum +pg_ls_tmpdir_1arg(PG_FUNCTION_ARGS) +{ + return pg_ls_tmpdir(fcinfo, PG_GETARG_OID(0)); +} diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index f898a2225f..595921d672 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 201809052 +#define CATALOG_VERSION_NO 201809121 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 860571440a..279c8236bd 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -10199,6 +10199,16 @@ provolatile => 'v', prorettype => 'record', proargtypes => '', proallargtypes => '{text,int8,timestamptz}', proargmodes => '{o,o,o}', proargnames => '{name,size,modification}', prosrc => 'pg_ls_waldir' }, +{ oid => '5029', descr => 'list files in the pgsql_tmp directory', + proname => 'pg_ls_tmpdir', procost => '10', prorows => '20', proretset => 't', + provolatile => 'v', prorettype => 'record', proargtypes => '', + proallargtypes => '{text,int8,timestamptz}', proargmodes => '{o,o,o}', + proargnames => '{name,size,modification}', prosrc => 'pg_ls_tmpdir_noargs' }, +{ oid => '5030', descr => 'list files in the pgsql_tmp directory', + proname => 'pg_ls_tmpdir', procost => '10', prorows => '20', proretset => 't', + provolatile => 'v', prorettype => 'record', proargtypes => 'oid', + proallargtypes => '{oid,text,int8,timestamptz}', proargmodes => '{i,o,o,o}', + proargnames => '{tablespace,name,size,modification}', prosrc => 'pg_ls_tmpdir_1arg' }, # hash partitioning constraint function { oid => '5028', descr => 'hash partition CHECK constraint', -- 2.16.2