aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-11-24 19:57:06 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-11-24 19:57:06 +0000
commit2ec958721d6b13061c1778ca9cbdc41f8cd4d7a1 (patch)
treef3e0dd9584309bded3f99690449ac5a972f0ce9a
parent215f0964313eb0615188be9ecd24cca7f4f2401c (diff)
downloadpostgresql-2ec958721d6b13061c1778ca9cbdc41f8cd4d7a1.tar.gz
postgresql-2ec958721d6b13061c1778ca9cbdc41f8cd4d7a1.zip
Tweak int8in to accept -9223372036854775808, per recent discussion in
pgsql-patches.
-rw-r--r--doc/src/sgml/datatype.sgml4
-rw-r--r--src/backend/utils/adt/int8.c27
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 */