diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c index b4c6c23..d755da3 100644 --- a/src/backend/utils/adt/pg_lsn.c +++ b/src/backend/utils/adt/pg_lsn.c @@ -53,6 +53,9 @@ pg_lsn_in_internal(const char *str, bool *have_error) off = (uint32) strtoul(str + len1 + 1, NULL, 16); result = ((uint64) id << 32) | off; + if (XLogRecPtrIsInvalid(result)) + *have_error = true; + return result; } diff --git a/src/test/regress/expected/pg_lsn.out b/src/test/regress/expected/pg_lsn.out index 64d41df..d0ef436 100644 --- a/src/test/regress/expected/pg_lsn.out +++ b/src/test/regress/expected/pg_lsn.out @@ -4,6 +4,10 @@ CREATE TABLE PG_LSN_TBL (f1 pg_lsn); -- Largest and smallest input INSERT INTO PG_LSN_TBL VALUES ('0/0'); +ERROR: invalid input syntax for type pg_lsn: "0/0" +LINE 1: INSERT INTO PG_LSN_TBL VALUES ('0/0'); + ^ +INSERT INTO PG_LSN_TBL VALUES ('ABC/DEF'); INSERT INTO PG_LSN_TBL VALUES ('FFFFFFFF/FFFFFFFF'); -- Incorrect input INSERT INTO PG_LSN_TBL VALUES ('G/0'); @@ -28,9 +32,9 @@ LINE 1: INSERT INTO PG_LSN_TBL VALUES ('/ABCD'); ^ -- Min/Max aggregation SELECT MIN(f1), MAX(f1) FROM PG_LSN_TBL; - min | max ------+------------------- - 0/0 | FFFFFFFF/FFFFFFFF + min | max +---------+------------------- + ABC/DEF | FFFFFFFF/FFFFFFFF (1 row) DROP TABLE PG_LSN_TBL; diff --git a/src/test/regress/sql/pg_lsn.sql b/src/test/regress/sql/pg_lsn.sql index 2c143c8..391d0b8 100644 --- a/src/test/regress/sql/pg_lsn.sql +++ b/src/test/regress/sql/pg_lsn.sql @@ -6,6 +6,7 @@ CREATE TABLE PG_LSN_TBL (f1 pg_lsn); -- Largest and smallest input INSERT INTO PG_LSN_TBL VALUES ('0/0'); +INSERT INTO PG_LSN_TBL VALUES ('ABC/DEF'); INSERT INTO PG_LSN_TBL VALUES ('FFFFFFFF/FFFFFFFF'); -- Incorrect input