diff options
Diffstat (limited to 'src/backend/utils/adt/pg_lsn.c')
-rw-r--r-- | src/backend/utils/adt/pg_lsn.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c index 7242d3cfed4..eb586851529 100644 --- a/src/backend/utils/adt/pg_lsn.c +++ b/src/backend/utils/adt/pg_lsn.c @@ -25,10 +25,9 @@ * Formatting and conversion routines. *---------------------------------------------------------*/ -Datum -pg_lsn_in(PG_FUNCTION_ARGS) +XLogRecPtr +pg_lsn_in_internal(const char *str, bool *have_error) { - char *str = PG_GETARG_CSTRING(0); int len1, len2; uint32 id, @@ -38,16 +37,16 @@ pg_lsn_in(PG_FUNCTION_ARGS) /* Sanity check input format. */ len1 = strspn(str, "0123456789abcdefABCDEF"); if (len1 < 1 || len1 > MAXPG_LSNCOMPONENT || str[len1] != '/') - ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid input syntax for type %s: \"%s\"", - "pg_lsn", str))); + { + *have_error = true; + return InvalidXLogRecPtr; + } len2 = strspn(str + len1 + 1, "0123456789abcdefABCDEF"); if (len2 < 1 || len2 > MAXPG_LSNCOMPONENT || str[len1 + 1 + len2] != '\0') - ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid input syntax for type %s: \"%s\"", - "pg_lsn", str))); + { + *have_error = true; + return InvalidXLogRecPtr; + } /* Decode result. */ id = (uint32) strtoul(str, NULL, 16); @@ -58,6 +57,23 @@ pg_lsn_in(PG_FUNCTION_ARGS) } Datum +pg_lsn_in(PG_FUNCTION_ARGS) +{ + char *str = PG_GETARG_CSTRING(0); + XLogRecPtr result; + bool have_error = false; + + result = pg_lsn_in_internal(str, &have_error); + if (have_error) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid input syntax for type %s: \"%s\"", + "pg_lsn", str))); + + PG_RETURN_LSN(result); +} + +Datum pg_lsn_out(PG_FUNCTION_ARGS) { XLogRecPtr lsn = PG_GETARG_LSN(0); |