diff options
author | Michael Paquier <michael@paquier.xyz> | 2022-12-20 13:36:27 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2022-12-20 13:36:27 +0900 |
commit | cca186348929cd75f23ef1b25922386bf38cf99c (patch) | |
tree | f4b4a6ae944991ef0275fed8eebcd867e40cc0e6 /src/backend/access/transam/xlogfuncs.c | |
parent | b3bb7d12af97f035c3aa3ad8dd41b44d01e2defa (diff) | |
download | postgresql-cca186348929cd75f23ef1b25922386bf38cf99c.tar.gz postgresql-cca186348929cd75f23ef1b25922386bf38cf99c.zip |
Add pg_dissect_walfile_name()
This function takes in input a WAL segment name and returns a tuple made
of the segment sequence number (dependent on the WAL segment size of the
cluster) and its timeline, as of a thin SQL wrapper around the existing
XLogFromFileName().
This function has multiple usages, like being able to compile a LSN from
a file name and an offset, or finding the timeline of a segment without
having to do to some maths based on the first eight characters of the
segment.
Bump catalog version.
Author: Bharath Rupireddy
Reviewed-by: Nathan Bossart, Kyotaro Horiguchi, Maxim Orlov, Michael
Paquier
Discussion: https://postgr.es/m/CALj2ACWV=FCddsxcGbVOA=cvPyMr75YCFbSQT6g4KDj=gcJK4g@mail.gmail.com
Diffstat (limited to 'src/backend/access/transam/xlogfuncs.c')
-rw-r--r-- | src/backend/access/transam/xlogfuncs.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 487d5d9cac7..0a31837ef18 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -433,6 +433,59 @@ pg_walfile_name(PG_FUNCTION_ARGS) } /* + * Extract the sequence number and the timeline ID from given a WAL file + * name. + */ +Datum +pg_dissect_walfile_name(PG_FUNCTION_ARGS) +{ +#define PG_DISSECT_WALFILE_NAME_COLS 2 + char *fname = text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *fname_upper; + char *p; + TimeLineID tli; + XLogSegNo segno; + Datum values[PG_DISSECT_WALFILE_NAME_COLS] = {0}; + bool isnull[PG_DISSECT_WALFILE_NAME_COLS] = {0}; + TupleDesc tupdesc; + HeapTuple tuple; + char buf[256]; + Datum result; + + fname_upper = pstrdup(fname); + + /* Capitalize WAL file name. */ + for (p = fname_upper; *p; p++) + *p = pg_toupper((unsigned char) *p); + + if (!IsXLogFileName(fname_upper)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid WAL file name \"%s\"", fname))); + + XLogFromFileName(fname_upper, &tli, &segno, wal_segment_size); + + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); + + /* Convert to numeric. */ + snprintf(buf, sizeof buf, UINT64_FORMAT, segno); + values[0] = DirectFunctionCall3(numeric_in, + CStringGetDatum(buf), + ObjectIdGetDatum(0), + Int32GetDatum(-1)); + + values[1] = Int64GetDatum(tli); + + tuple = heap_form_tuple(tupdesc, values, isnull); + result = HeapTupleGetDatum(tuple); + + PG_RETURN_DATUM(result); + +#undef PG_DISSECT_WALFILE_NAME_COLS +} + +/* * pg_wal_replay_pause - Request to pause recovery * * Permission checking for this function is managed through the normal |