From: | Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com> |
---|---|
To: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | 64-bit integer subtraction bug on some platforms |
Date: | 2023-11-08 11:58:18 |
Message-ID: | CAEZATCUNK-AZSD0jVdgkk0N=NcAXBWeAEX-QU9AnJPensikmdQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
One of the new tests in the infinite interval patch has revealed a bug
in our 64-bit integer subtraction code. Consider the following:
select 0::int8 - '-9223372036854775808'::int8;
This should overflow, since the correct result (+9223372036854775808)
is out of range. However, on platforms without integer overflow
builtins or 128-bit integers, pg_sub_s64_overflow() does the
following:
if ((a < 0 && b > 0 && a < PG_INT64_MIN + b) ||
(a > 0 && b < 0 && a > PG_INT64_MAX + b))
{
*result = 0x5EED; /* to avoid spurious warnings */
return true;
}
*result = a - b;
return false;
which fails to spot the fact that overflow is also possible when a ==
0. So on such platforms, it returns the wrong result.
Patch attached.
Regards,
Dean
Attachment | Content-Type | Size |
---|---|---|
fix-64-bit-integer-subtraction.patch | text/x-patch | 1.7 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Dean Rasheed | 2023-11-08 12:02:22 | Re: Infinite Interval |
Previous Message | shveta malik | 2023-11-08 11:50:56 | Re: Synchronizing slots from primary to standby |