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,
