aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/pg_lsn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/pg_lsn.c')
-rw-r--r--src/backend/utils/adt/pg_lsn.c38
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);