diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-11-24 19:57:06 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-11-24 19:57:06 +0000 |
commit | 2ec958721d6b13061c1778ca9cbdc41f8cd4d7a1 (patch) | |
tree | f3e0dd9584309bded3f99690449ac5a972f0ce9a | |
parent | 215f0964313eb0615188be9ecd24cca7f4f2401c (diff) | |
download | postgresql-2ec958721d6b13061c1778ca9cbdc41f8cd4d7a1.tar.gz postgresql-2ec958721d6b13061c1778ca9cbdc41f8cd4d7a1.zip |
Tweak int8in to accept -9223372036854775808, per recent discussion in
pgsql-patches.
-rw-r--r-- | doc/src/sgml/datatype.sgml | 4 | ||||
-rw-r--r-- | src/backend/utils/adt/int8.c | 27 |
2 files changed, 26 insertions, 5 deletions
diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index c7c0d740a94..52ff88ed9d7 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/datatype.sgml,v 1.75 2001/11/21 21:12:34 tgl Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/datatype.sgml,v 1.76 2001/11/24 19:57:06 tgl Exp $ --> <chapter id="datatype"> @@ -385,7 +385,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/datatype.sgml,v 1.75 2001/11/21 21:12:34 tg <entry><type>bigint</></entry> <entry>8 bytes</entry> <entry>Very large range fixed-precision</entry> - <entry>-9223372036854775807 to 9223372036854775807</entry> + <entry>-9223372036854775808 to 9223372036854775807</entry> </row> <row> diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c index b689cb764a4..380e0238238 100644 --- a/src/backend/utils/adt/int8.c +++ b/src/backend/utils/adt/int8.c @@ -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.35 2001/10/25 14:10:06 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.36 2001/11/24 19:57:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -26,6 +26,12 @@ #define INT64_FORMAT "%ld" #endif +#ifdef HAVE_LL_CONSTANTS +#define INT64CONST(x) ((int64) x##LL) +#else +#define INT64CONST(x) ((int64) x) +#endif + #define MAXINT8LEN 25 #ifndef INT_MAX @@ -69,8 +75,23 @@ int8in(PG_FUNCTION_ARGS) */ while (*ptr && isspace((unsigned char) *ptr)) /* skip leading spaces */ ptr++; - if (*ptr == '-') /* handle sign */ - sign = -1, ptr++; + /* handle sign */ + if (*ptr == '-') + { + ptr++; + sign = -1; + /* + * Do an explicit check for INT64_MIN. Ugly though this is, it's + * cleaner than trying to get the loop below to handle it portably. + */ +#ifndef INT64_IS_BUSTED + if (strcmp(ptr, "9223372036854775808") == 0) + { + result = - INT64CONST(0x7fffffffffffffff) - 1; + PG_RETURN_INT64(result); + } +#endif + } else if (*ptr == '+') ptr++; if (!isdigit((unsigned char) *ptr)) /* require at least one digit */ |