Index: src/backend/utils/adt/int8.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/int8.c,v retrieving revision 1.35 diff -u -3 -p -r1.35 int8.c --- src/backend/utils/adt/int8.c 2001/10/25 14:10:06 1.35 +++ src/backend/utils/adt/int8.c 2001/11/21 05:35:25 @@ -28,6 +28,12 @@ #define MAXINT8LEN 25 +#ifndef INT64_MAX +#define INT64_MAX (0x7FFFFFFFFFFFFFFFLL) +#endif +#ifndef INT64_MIN +#define INT64_MIN (-INT64_MAX-1) +#endif #ifndef INT_MAX #define INT_MAX (0x7FFFFFFFL) #endif @@ -77,7 +83,7 @@ int8in(PG_FUNCTION_ARGS) elog(ERROR, "Bad int8 external representation \"%s\"", str); while (*ptr && isdigit((unsigned char) *ptr)) /* process digits */ { - int64 newtmp = tmp * 10 + (*ptr++ - '0'); + int64 newtmp = tmp * 10 - (*ptr++ - '0'); if ((newtmp / 10) != tmp) /* overflow? */ elog(ERROR, "int8 value out of range: \"%s\"", str); @@ -86,7 +92,13 @@ int8in(PG_FUNCTION_ARGS) if (*ptr) /* trailing junk? */ elog(ERROR, "Bad int8 external representation \"%s\"", str); - result = (sign < 0) ? -tmp : tmp; + if (sign < 0) { + result = tmp; + } else { + if (tmp == INT64_MIN) + elog(ERROR, "int8 value out of range: \"%s\"", str); + result = -tmp; + } PG_RETURN_INT64(result); }