From: Justin Pryzby Date: Sat, 28 Nov 2020 22:29:31 -0600 Subject: [PATCH v24 10/11] Preserve pg_stat_file() isdir.. ..per Tom's suggestion --- src/backend/utils/adt/genfile.c | 15 ++++++++++++--- src/include/catalog/pg_proc.dat | 12 ++++++------ src/test/regress/expected/misc_functions.out | 4 ++-- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index 6e8898029f..5c4a7f748d 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -468,11 +468,12 @@ pg_stat_file(PG_FUNCTION_ARGS) text *filename_t = PG_GETARG_TEXT_PP(0); char *filename; struct stat fst; - Datum values[6]; - bool nulls[6]; + Datum values[7]; + bool nulls[7]; HeapTuple tuple; TupleDesc tupdesc; bool missing_ok = false; + char type; /* check the optional argument */ if (PG_NARGS() == 2) @@ -494,7 +495,7 @@ pg_stat_file(PG_FUNCTION_ARGS) * This record type had better match the output parameters declared for me * in pg_proc.h. */ - tupdesc = CreateTemplateTupleDesc(6); + tupdesc = CreateTemplateTupleDesc(7); TupleDescInitEntry(tupdesc, (AttrNumber) 1, "size", INT8OID, -1, 0); TupleDescInitEntry(tupdesc, (AttrNumber) 2, @@ -506,11 +507,19 @@ pg_stat_file(PG_FUNCTION_ARGS) TupleDescInitEntry(tupdesc, (AttrNumber) 5, "creation", TIMESTAMPTZOID, -1, 0); TupleDescInitEntry(tupdesc, (AttrNumber) 6, + "isdir", BOOLOID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 7, "type", CHAROID, -1, 0); BlessTupleDesc(tupdesc); memset(nulls, false, sizeof(nulls)); tuple_from_stat(&fst, filename, values, nulls); + + /* For pg_stat_file, keep isdir column for backward compatibility */ + type = DatumGetChar(values[5]); + values[5] = BoolGetDatum(type == 'd'); /* isdir */ + values[6] = CharGetDatum(type); /* file type */ + tuple = heap_form_tuple(tupdesc, values, nulls); pfree(filename); diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 12a7391e73..d472afcf71 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6202,16 +6202,16 @@ { oid => '2623', descr => 'get information about file', proname => 'pg_stat_file', provolatile => 'v', prorettype => 'record', proargtypes => 'text', - proallargtypes => '{text,int8,timestamptz,timestamptz,timestamptz,timestamptz,char}', - proargmodes => '{i,o,o,o,o,o,o}', - proargnames => '{filename,size,access,modification,change,creation,type}', + proallargtypes => '{text,int8,timestamptz,timestamptz,timestamptz,timestamptz,bool,char}', + proargmodes => '{i,o,o,o,o,o,o,o}', + proargnames => '{filename,size,access,modification,change,creation,isdir,type}', prosrc => 'pg_stat_file_1arg' }, { oid => '3307', descr => 'get information about file', proname => 'pg_stat_file', provolatile => 'v', prorettype => 'record', proargtypes => 'text bool', - proallargtypes => '{text,bool,int8,timestamptz,timestamptz,timestamptz,timestamptz,char}', - proargmodes => '{i,i,o,o,o,o,o,o}', - proargnames => '{filename,missing_ok,size,access,modification,change,creation,type}', + proallargtypes => '{text,bool,int8,timestamptz,timestamptz,timestamptz,timestamptz,bool,char}', + proargmodes => '{i,i,o,o,o,o,o,o,o}', + proargnames => '{filename,missing_ok,size,access,modification,change,creation,isdir,type}', prosrc => 'pg_stat_file' }, { oid => '2624', descr => 'read text from a file', proname => 'pg_read_file', provolatile => 'v', prorettype => 'text', diff --git a/src/test/regress/expected/misc_functions.out b/src/test/regress/expected/misc_functions.out index 5b87ab4844..e1e9ced303 100644 --- a/src/test/regress/expected/misc_functions.out +++ b/src/test/regress/expected/misc_functions.out @@ -221,8 +221,8 @@ select pg_ls_dir('does not exist'); -- fails with missingok=false ERROR: could not open directory "does not exist": No such file or directory -- Check that expected columns are present select * from pg_stat_file('.') limit 0; - size | access | modification | change | creation | type -------+--------+--------------+--------+----------+------ + size | access | modification | change | creation | isdir | type +------+--------+--------------+--------+----------+-------+------ (0 rows) -- This tests the missing_ok parameter, which causes pg_ls_tmpdir to succeed even if the tmpdir doesn't exist yet -- 2.17.0 --mPTHnM80CEnHQ2WJ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v24-0011-Add-recursion-option-in-pg_ls_dir_files.patch"