]> granicus.if.org Git - postgresql/commitdiff
Attempt to fix breakage caused by signed integer conversion patch.
authorRobert Haas <rhaas@postgresql.org>
Sat, 20 Nov 2010 06:07:04 +0000 (01:07 -0500)
committerRobert Haas <rhaas@postgresql.org>
Sat, 20 Nov 2010 06:09:26 +0000 (01:09 -0500)
Use INT_MIN rather than INT32_MIN as we do elsewhere in the code, and
try to work around nonexistence of INT64_MIN if necessary.  Adjust the
new regression tests to something hopefully saner, per observation by
Tom Lane.

src/backend/utils/adt/numutils.c
src/test/regress/expected/int2.out
src/test/regress/expected/int4.out
src/test/regress/expected/int8.out
src/test/regress/sql/int2.sql
src/test/regress/sql/int4.sql
src/test/regress/sql/int8.sql

index 22bcaf78399e06c374353316f0eb8bad152cf1e0..635c6ac4e2f5ef21b1eeaf271d3c38be1c9595aa 100644 (file)
 #include <limits.h>
 #include <ctype.h>
 
+/*
+ * Defining INT64_MIN as -9223372036854775808LL may not work; the compiler's
+ * tokenizer may see - as a separate token and then be unable to view
+ * 9223372036854775808 as a number.  This is the standard workaround for that
+ * problem.
+ */
+#ifndef INT64_MIN
+#define INT64_MIN (-9223372036854775807LL - 1)
+#endif
+
 #include "utils/builtins.h"
 
 /*
@@ -136,7 +146,7 @@ pg_ltoa(int32 value, char *a)
         * Avoid problems with the most negative integer not being representable
         * as a positive integer.
         */
-       if (value == INT32_MIN)
+       if (value == INT_MIN)
        {
                memcpy(a, "-2147483648", 12);
                return;
index 3bb26b3f485461a6fde513ae33e432829664c570..d29c2b96d784ff297e61001a781b362d79b64da5 100644 (file)
@@ -243,15 +243,15 @@ SELECT '' AS five, i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i;
 (5 rows)
 
 -- corner cases
-SELECT (1<<15-1)::int2::text;
- text  
--------
- 16384
+SELECT (-1::int2<<15)::text;
 text  
+--------
+ -32768
 (1 row)
 
-SELECT (-1<<15)::int2::text;
+SELECT ((-1::int2<<15)+1)::text;
   text  
 --------
- -32768
+ -32767
 (1 row)
 
index 42095c784411db40ed99f3adb9b192e189f99b0f..8f780240ae781108c715e4936bb65a1e1db08595 100644 (file)
@@ -329,16 +329,16 @@ SELECT (2 + 2) / 2 AS two;
    2
 (1 row)
 
--- corner cases
-SELECT (1<<31-1)::int4::text;
-    text    
-------------
- 1073741824
+-- corner case
+SELECT (-1::int4<<31)::text;
+    text     
+-------------
+ -2147483648
 (1 row)
 
-SELECT (1<<31)::int4::text;
+SELECT ((-1::int4<<31)+1)::text;
     text     
 -------------
- -2147483648
+ -2147483647
 (1 row)
 
index e156067e88e2c1310103a35e353755f1f891ca51..9272dd645f581613fdc5f9cc5adbf136b8c7ab5f 100644 (file)
@@ -802,16 +802,16 @@ SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::in
  4567890123456799
 (6 rows)
 
--- corner cases
-SELECT (1<<63-1)::int8::text;
-    text    
-------------
- 1073741824
+-- corner case
+SELECT (-1::int8<<63)::text;
+         text         
+----------------------
+ -9223372036854775808
 (1 row)
 
-SELECT (1<<63)::int8::text;
-    text     
--------------
- -2147483648
+SELECT ((-1::int8<<63)+1)::text;
+         text         
+----------------------
+ -9223372036854775807
 (1 row)
 
index 8bffe53b033733f984ef0631b8a419aca9ccdb2d..f5d911241e2cfb558d25af7c5e83708d871d0ba3 100644 (file)
@@ -85,5 +85,5 @@ SELECT '' AS five, i.f1, i.f1 / int2 '2' AS x FROM INT2_TBL i;
 SELECT '' AS five, i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i;
 
 -- corner cases
-SELECT (1<<15-1)::int2::text;
-SELECT (-1<<15)::int2::text;
+SELECT (-1::int2<<15)::text;
+SELECT ((-1::int2<<15)+1)::text;
index 39bfec1b0d833d6c40f5967104d523f5bd95d945..ffae7ce4cb470f89265e368877acd70b33b6fd5e 100644 (file)
@@ -124,6 +124,6 @@ SELECT 2 + 2 / 2 AS three;
 
 SELECT (2 + 2) / 2 AS two;
 
--- corner cases
-SELECT (1<<31-1)::int4::text;
-SELECT (1<<31)::int4::text;
+-- corner case
+SELECT (-1::int4<<31)::text;
+SELECT ((-1::int4<<31)+1)::text;
index 7fff03cd668d95c0ddac6e5940aa17e6e77051b4..597a9a2debbc24f0ee4674a0643a6271713fc150 100644 (file)
@@ -191,6 +191,6 @@ SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::in
 SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0);
 SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2);
 
--- corner cases
-SELECT (1<<63-1)::int8::text;
-SELECT (1<<63)::int8::text;
+-- corner case
+SELECT (-1::int8<<63)::text;
+SELECT ((-1::int8<<63)+1)::text;