From 848076a119c39782ef854ac940f14f5975430b4e Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Wed, 7 Sep 2011 20:12:58 +0300 Subject: [PATCH] Don't truncate integer part in to_char for 'FM99.' When the numeric to_char format used fillmode (FM), didn't contain 0s and had a trailing dot, the integer part of the number was truncated in error. to_char(10, 'FM99.') used to return '1', now it will return '10' --- src/backend/utils/adt/formatting.c | 6 +++++- src/test/regress/expected/numeric.out | 6 ++++++ src/test/regress/sql/numeric.sql | 2 ++ 3 files changed, 13 insertions(+), 1 deletions(-) diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 7efd988..37a819e 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -4460,7 +4460,11 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, if (IS_FILLMODE(Np->Num)) { - if (IS_DECIMAL(Np->Num)) + /* + * Only call get_last_relevant_decnum if the number has fractional + * digits, otherwise the result is bogus. + */ + if (IS_DECIMAL(Np->Num) && Np->Num->post > 0) Np->last_relevant = get_last_relevant_decnum( Np->number + ((Np->Num->zero_end - Np->num_pre > 0) ? diff --git a/src/test/regress/expected/numeric.out b/src/test/regress/expected/numeric.out index d9927b7..e12ab5b 100644 --- a/src/test/regress/expected/numeric.out +++ b/src/test/regress/expected/numeric.out @@ -1154,6 +1154,12 @@ SELECT '' AS to_char_23, to_char(val, '9.999EEEE') FROM num_data; | -2.493e+07 (10 rows) +SELECT '' AS to_char_24, to_char('100'::numeric, 'FM999.'); + to_char_24 | to_char +------------+--------- + | 100 +(1 row) + -- TO_NUMBER() -- SELECT '' AS to_number_1, to_number('-34,338,492', '99G999G999'); diff --git a/src/test/regress/sql/numeric.sql b/src/test/regress/sql/numeric.sql index a1435ec..d552526 100644 --- a/src/test/regress/sql/numeric.sql +++ b/src/test/regress/sql/numeric.sql @@ -764,6 +764,8 @@ SELECT '' AS to_char_21, to_char(val, '999999SG9999999999') FROM num_data; SELECT '' AS to_char_22, to_char(val, 'FM9999999999999999.999999999999999') FROM num_data; SELECT '' AS to_char_23, to_char(val, '9.999EEEE') FROM num_data; +SELECT '' AS to_char_24, to_char('100'::numeric, 'FM999.'); + -- TO_NUMBER() -- SELECT '' AS to_number_1, to_number('-34,338,492', '99G999G999'); -- 1.7.6.1