From: | Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com> |
---|---|
To: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Division by zero error in to_char(num, '9.9EEEE') |
Date: | 2021-07-30 07:26:14 |
Message-ID: | CAEZATCWhojfH4whaqgUKBe8D5jNHB8ytzemL-PnRx+KCTyMXmg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
While testing the numeric_power() patch in [1], I found this problem
trying to use to_char() to format very small numbers:
SELECT to_char(1.2e-1001, '9.9EEEE'); -- OK
to_char
------------
1.2e-1001
SELECT to_char(1.2e-1002, '9.9EEEE'); -- fails
ERROR: division by zero
It turns out that the problem is in get_str_from_var_sci() which
attempts to divide the input by 1e-1002 to get the significand.
However, it is using power_var_int() to compute 1e-1002, which has a
maximum rscale of NUMERIC_MAX_DISPLAY_SCALE (1000), so it returns 0,
which is the correct answer to that scale, and then
get_str_from_var_sci() attempts to divide by that.
Rather than messing with power_var_int(), I think the simplest
solution is to just introduce a new local function, as in the attached
patch. This directly constructs 10^n, for integer n, which is pretty
trivial, and doesn't need any numeric multiplication or rounding.
Regards,
Dean
Attachment | Content-Type | Size |
---|---|---|
to_char-div-by-zero.patch | text/x-patch | 5.2 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Geoff Winkless | 2021-07-30 08:05:53 | Re: Replace l337sp34k in comments. |
Previous Message | Michael Paquier | 2021-07-30 07:22:19 | Re: alter table set TABLE ACCESS METHOD |