In a machine where INT64_IS_BUSTED, we can only support 32-bit values
authorTom Lane <[email protected]>
Sat, 24 Sep 2005 15:34:07 +0000 (15:34 +0000)
committerTom Lane <[email protected]>
Sat, 24 Sep 2005 15:34:07 +0000 (15:34 +0000)
for int8 and related types.  However we might be talking to a client
that has working int64; so pq_getmsgint64 really needs to check the
incoming value and throw an overflow error if we can't represent it
accurately.

src/backend/libpq/pqformat.c

index 9db0b2d9275664fcfa1a65b481de1b4e26d552f7..fb9db13ef95ae01a2a4c0bbad63b033b1e88153b 100644 (file)
@@ -501,8 +501,12 @@ pq_getmsgint64(StringInfo msg)
        l32 = ntohl(l32);
 
 #ifdef INT64_IS_BUSTED
-       /* just lose the high half */
+       /* error out if incoming value is wider than 32 bits */
        result = l32;
+       if ((result < 0) ? (h32 != -1) : (h32 != 0))
+               ereport(ERROR,
+                               (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+                                errmsg("binary value is out of range for type bigint")));
 #else
        result = h32;
        result <<= 32;