From c996c7f5739863332baceafb48d9514fad60aa46 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 28 Dec 2000 01:51:15 +0000
Subject: [PATCH] Let's try this again on accepting the correct range of Oid
 input values for 64-bit platforms ...

---
 src/backend/utils/adt/oid.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c
index 6becfd0dbc7..f7ed19f69b9 100644
--- a/src/backend/utils/adt/oid.c
+++ b/src/backend/utils/adt/oid.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.42 2000/12/22 21:36:09 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.43 2000/12/28 01:51:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -67,14 +67,21 @@ oidin_subr(const char *funcname, const char *s, char **endloc)
 	result = (Oid) cvt;
 
 	/*
-	 * Cope with possibility that unsigned long is wider than Oid.
+	 * Cope with possibility that unsigned long is wider than Oid,
+	 * in which case strtoul will not raise an error for some values
+	 * that are out of the range of Oid.
+	 *
+	 * For backwards compatibility, we want to accept inputs that
+	 * are given with a minus sign, so allow the input value if it
+	 * matches after either signed or unsigned extension to long.
 	 *
 	 * To ensure consistent results on 32-bit and 64-bit platforms,
 	 * make sure the error message is the same as if strtoul() had
 	 * returned ERANGE.
 	 */
-#if OID_MAX < ULONG_MAX
-	if (cvt > (unsigned long) OID_MAX)
+#if OID_MAX != ULONG_MAX
+	if (cvt != (unsigned long) result &&
+	    cvt != (unsigned long) ((int) result))
 		elog(ERROR, "%s: error reading \"%s\": %s",
 			 funcname, s, strerror(ERANGE));
 #endif
-- 
GitLab