From 815810ed315a6d21203ec75a11f742f5ed655418 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Sat, 20 Nov 2010 01:07:04 -0500 Subject: [PATCH] Attempt to fix breakage caused by signed integer conversion patch. 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 | 12 +++++++++++- src/test/regress/expected/int2.out | 12 ++++++------ src/test/regress/expected/int4.out | 14 +++++++------- src/test/regress/expected/int8.out | 18 +++++++++--------- src/test/regress/sql/int2.sql | 4 ++-- src/test/regress/sql/int4.sql | 6 +++--- src/test/regress/sql/int8.sql | 6 +++--- 7 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index 22bcaf7839..635c6ac4e2 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -18,6 +18,16 @@ #include #include +/* + * 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; diff --git a/src/test/regress/expected/int2.out b/src/test/regress/expected/int2.out index 3bb26b3f48..d29c2b96d7 100644 --- a/src/test/regress/expected/int2.out +++ b/src/test/regress/expected/int2.out @@ -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) diff --git a/src/test/regress/expected/int4.out b/src/test/regress/expected/int4.out index 42095c7844..8f780240ae 100644 --- a/src/test/regress/expected/int4.out +++ b/src/test/regress/expected/int4.out @@ -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) diff --git a/src/test/regress/expected/int8.out b/src/test/regress/expected/int8.out index e156067e88..9272dd645f 100644 --- a/src/test/regress/expected/int8.out +++ b/src/test/regress/expected/int8.out @@ -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) diff --git a/src/test/regress/sql/int2.sql b/src/test/regress/sql/int2.sql index 8bffe53b03..f5d911241e 100644 --- a/src/test/regress/sql/int2.sql +++ b/src/test/regress/sql/int2.sql @@ -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; diff --git a/src/test/regress/sql/int4.sql b/src/test/regress/sql/int4.sql index 39bfec1b0d..ffae7ce4cb 100644 --- a/src/test/regress/sql/int4.sql +++ b/src/test/regress/sql/int4.sql @@ -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; diff --git a/src/test/regress/sql/int8.sql b/src/test/regress/sql/int8.sql index 7fff03cd66..597a9a2deb 100644 --- a/src/test/regress/sql/int8.sql +++ b/src/test/regress/sql/int8.sql @@ -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; -- 2.40.0