| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> | 
|---|---|
| To: | Zhihong Yu <zyu(at)yugabyte(dot)com> | 
| Cc: | PostgreSQL Developers <pgsql-hackers(at)lists(dot)postgresql(dot)org> | 
| Subject: | Re: avoid negating LONG_MIN in cash_out() | 
| Date: | 2022-08-11 17:40:13 | 
| Message-ID: | 23291.1660239613@sss.pgh.pa.us | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
Zhihong Yu <zyu(at)yugabyte(dot)com> writes:
> In cash_out(), we have the following code:
>     if (value < 0)
>     {
>         /* make the amount positive for digit-reconstruction loop */
>         value = -value;
> The negation cannot be represented in type long when the value is LONG_MIN.
Possibly not good, but it seems like the subsequent loop works anyway:
regression=# select '-92233720368547758.08'::money;
            money            
-----------------------------
 -$92,233,720,368,547,758.08
(1 row)
Note that this exact test case appears in money.sql, so we know that
it works everywhere, not only my machine.
> It seems we can error out when LONG_MIN is detected instead of continuing
> with computation.
How could you think that that's an acceptable solution?  Once the
value is stored, we'd better be able to print it.
regards, tom lane
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Zhihong Yu | 2022-08-11 17:55:48 | Re: avoid negating LONG_MIN in cash_out() | 
| Previous Message | Zhihong Yu | 2022-08-11 17:30:07 | avoid negating LONG_MIN in cash_out() |