Revise overflow test in int84() to avoid codegen bug in some older
authorTom Lane
Fri, 7 Sep 2001 01:33:44 +0000 (01:33 +0000)
committerTom Lane
Fri, 7 Sep 2001 01:33:44 +0000 (01:33 +0000)
versions of gcc.  We don't really need to explicitly test the limits
anyway, just reverse-convert and see if we get the same answer.

src/backend/utils/adt/int8.c

index 7a93d219d700bfd49da68aefdec9c23e9450d988..8d8f9ed64204c492785f9bd892483a06efb69485 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.32 2001/08/24 14:07:49 petere Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.33 2001/09/07 01:33:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -67,7 +67,7 @@ int8in(PG_FUNCTION_ARGS)
     * Do our own scan, rather than relying on sscanf which might be
     * broken for long long.
     */
-   while (*ptr && isspace((unsigned char) *ptr))       /* skip leading spaces */
+   while (*ptr && isspace((unsigned char) *ptr)) /* skip leading spaces */
        ptr++;
    if (*ptr == '-')            /* handle sign */
        sign = -1, ptr++;
@@ -688,11 +688,12 @@ int84(PG_FUNCTION_ARGS)
    int64       val = PG_GETARG_INT64(0);
    int32       result;
 
-   if ((val < INT_MIN) || (val > INT_MAX))
-       elog(ERROR, "int8 conversion to int4 is out of range");
-
    result = (int32) val;
 
+   /* Test for overflow by reverse-conversion. */
+   if ((int64) result != val)
+       elog(ERROR, "int8 conversion to int4 is out of range");
+
    PG_RETURN_INT32(result);
 }