mirror of
https://github.com/postgres/postgres.git
synced 2025-04-29 13:56:47 +03:00
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.
This commit is contained in:
parent
b58c25055e
commit
815810ed31
@ -18,6 +18,16 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <ctype.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"
|
#include "utils/builtins.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -136,7 +146,7 @@ pg_ltoa(int32 value, char *a)
|
|||||||
* Avoid problems with the most negative integer not being representable
|
* Avoid problems with the most negative integer not being representable
|
||||||
* as a positive integer.
|
* as a positive integer.
|
||||||
*/
|
*/
|
||||||
if (value == INT32_MIN)
|
if (value == INT_MIN)
|
||||||
{
|
{
|
||||||
memcpy(a, "-2147483648", 12);
|
memcpy(a, "-2147483648", 12);
|
||||||
return;
|
return;
|
||||||
|
@ -243,15 +243,15 @@ SELECT '' AS five, i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i;
|
|||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
-- corner cases
|
-- corner cases
|
||||||
SELECT (1<<15-1)::int2::text;
|
SELECT (-1::int2<<15)::text;
|
||||||
text
|
|
||||||
-------
|
|
||||||
16384
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
SELECT (-1<<15)::int2::text;
|
|
||||||
text
|
text
|
||||||
--------
|
--------
|
||||||
-32768
|
-32768
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT ((-1::int2<<15)+1)::text;
|
||||||
|
text
|
||||||
|
--------
|
||||||
|
-32767
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
@ -329,16 +329,16 @@ SELECT (2 + 2) / 2 AS two;
|
|||||||
2
|
2
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- corner cases
|
-- corner case
|
||||||
SELECT (1<<31-1)::int4::text;
|
SELECT (-1::int4<<31)::text;
|
||||||
text
|
|
||||||
------------
|
|
||||||
1073741824
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
SELECT (1<<31)::int4::text;
|
|
||||||
text
|
text
|
||||||
-------------
|
-------------
|
||||||
-2147483648
|
-2147483648
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT ((-1::int4<<31)+1)::text;
|
||||||
|
text
|
||||||
|
-------------
|
||||||
|
-2147483647
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
@ -802,16 +802,16 @@ SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::in
|
|||||||
4567890123456799
|
4567890123456799
|
||||||
(6 rows)
|
(6 rows)
|
||||||
|
|
||||||
-- corner cases
|
-- corner case
|
||||||
SELECT (1<<63-1)::int8::text;
|
SELECT (-1::int8<<63)::text;
|
||||||
text
|
text
|
||||||
------------
|
----------------------
|
||||||
1073741824
|
-9223372036854775808
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT (1<<63)::int8::text;
|
SELECT ((-1::int8<<63)+1)::text;
|
||||||
text
|
text
|
||||||
-------------
|
----------------------
|
||||||
-2147483648
|
-9223372036854775807
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
@ -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;
|
SELECT '' AS five, i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i;
|
||||||
|
|
||||||
-- corner cases
|
-- corner cases
|
||||||
SELECT (1<<15-1)::int2::text;
|
SELECT (-1::int2<<15)::text;
|
||||||
SELECT (-1<<15)::int2::text;
|
SELECT ((-1::int2<<15)+1)::text;
|
||||||
|
@ -124,6 +124,6 @@ SELECT 2 + 2 / 2 AS three;
|
|||||||
|
|
||||||
SELECT (2 + 2) / 2 AS two;
|
SELECT (2 + 2) / 2 AS two;
|
||||||
|
|
||||||
-- corner cases
|
-- corner case
|
||||||
SELECT (1<<31-1)::int4::text;
|
SELECT (-1::int4<<31)::text;
|
||||||
SELECT (1<<31)::int4::text;
|
SELECT ((-1::int4<<31)+1)::text;
|
||||||
|
@ -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, 0);
|
||||||
SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2);
|
SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2);
|
||||||
|
|
||||||
-- corner cases
|
-- corner case
|
||||||
SELECT (1<<63-1)::int8::text;
|
SELECT (-1::int8<<63)::text;
|
||||||
SELECT (1<<63)::int8::text;
|
SELECT ((-1::int8<<63)+1)::text;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user