Thread
Commits
-
Fix corner-case 64-bit integer subtraction bug on some platforms.
- b17a02be27e0 12.18 landed
- 4f4a0010a3a1 13.14 landed
- dea12b40d521 14.11 landed
- 308a69a98782 15.6 landed
- c396aca2b712 16.2 landed
- 0e3e8fbd3a8b 17.0 landed
-
64-bit integer subtraction bug on some platforms
Dean Rasheed <dean.a.rasheed@gmail.com> — 2023-11-08T11:58:18Z
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 -
Re: 64-bit integer subtraction bug on some platforms
Laurenz Albe <laurenz.albe@cybertec.at> — 2023-11-08T12:15:35Z
On Wed, 2023-11-08 at 11:58 +0000, Dean Rasheed wrote: > 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. The patch looks good to me. Yours, Laurenz Albe -
Re: 64-bit integer subtraction bug on some platforms
Tom Lane <tgl@sss.pgh.pa.us> — 2023-11-08T16:08:05Z
Laurenz Albe <laurenz.albe@cybertec.at> writes: > On Wed, 2023-11-08 at 11:58 +0000, Dean Rasheed wrote: >> 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: >> ... >> 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. > The patch looks good to me. +1: good catch, fix looks correct. regards, tom lane