diff --git a/contrib/test_decoding/expected/slot.out b/contrib/test_decoding/expected/slot.out index 2737a8a..bf2bd0c 100644 --- a/contrib/test_decoding/expected/slot.out +++ b/contrib/test_decoding/expected/slot.out @@ -46,6 +46,11 @@ SELECT pg_drop_replication_slot('regression_slot_t'); ERROR: replication slot "regression_slot_t" does not exist SELECT pg_drop_replication_slot('regression_slot_t2'); ERROR: replication slot "regression_slot_t2" does not exist +-- error +SELECT data FROM pg_logical_slot_get_changes('regression_slot_p', '0/0', NULL); -- invalid upto_lsn +ERROR: invalid upper limit wal lsn +SELECT data FROM pg_logical_slot_get_changes('regression_slot_p', NULL, 0); -- invalid upto_nchanges +ERROR: argument of upto_nchanges must be greater than zero -- permanent slot has survived SELECT pg_drop_replication_slot('regression_slot_p'); pg_drop_replication_slot diff --git a/contrib/test_decoding/sql/slot.sql b/contrib/test_decoding/sql/slot.sql index 24cdf71..ba5c9a2 100644 --- a/contrib/test_decoding/sql/slot.sql +++ b/contrib/test_decoding/sql/slot.sql @@ -26,6 +26,10 @@ end'; SELECT pg_drop_replication_slot('regression_slot_t'); SELECT pg_drop_replication_slot('regression_slot_t2'); +-- error +SELECT data FROM pg_logical_slot_get_changes('regression_slot_p', '0/0', NULL); -- invalid upto_lsn +SELECT data FROM pg_logical_slot_get_changes('regression_slot_p', NULL, 0); -- invalid upto_nchanges + -- permanent slot has survived SELECT pg_drop_replication_slot('regression_slot_p'); diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 54c25f1..0e457ec 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -154,14 +154,26 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin name = PG_GETARG_NAME(0); if (PG_ARGISNULL(1)) - upto_lsn = InvalidXLogRecPtr; + upto_lsn = InvalidXLogRecPtr; /* unlimited */ else + { upto_lsn = PG_GETARG_LSN(1); + if (XLogRecPtrIsInvalid(upto_lsn)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid upper limit wal lsn"))); + } if (PG_ARGISNULL(2)) - upto_nchanges = InvalidXLogRecPtr; + upto_nchanges = 0; /* unlimited */ else + { upto_nchanges = PG_GETARG_INT32(2); + if (upto_nchanges <= 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("argument of upto_nchanges must be greater than zero"))); + } if (PG_ARGISNULL(3)) ereport(ERROR,