aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/adt/formatting.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index db5dfca51d4..81e3329ef60 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -4131,7 +4131,7 @@ NUM_numpart_from_char(NUMProc *Np, int id, int plen)
#endif
/*
- * read digit
+ * read digit or decimal point
*/
if (isdigit((unsigned char) *Np->inout_p))
{
@@ -4151,40 +4151,28 @@ NUM_numpart_from_char(NUMProc *Np, int id, int plen)
#ifdef DEBUG_TO_FROM_CHAR
elog(DEBUG_elog_output, "Read digit (%c)", *Np->inout_p);
#endif
-
- /*
- * read decimal point
- */
}
else if (IS_DECIMAL(Np->Num) && Np->read_dec == FALSE)
{
+ /*
+ * We need not test IS_LDECIMAL(Np->Num) explicitly here, because
+ * Np->decimal is always just "." if we don't have a D format token.
+ * So we just unconditionally match to Np->decimal.
+ */
+ int x = strlen(Np->decimal);
+
#ifdef DEBUG_TO_FROM_CHAR
- elog(DEBUG_elog_output, "Try read decimal point (%c)", *Np->inout_p);
+ elog(DEBUG_elog_output, "Try read decimal point (%c)",
+ *Np->inout_p);
#endif
- if (*Np->inout_p == '.')
+ if (x && AMOUNT_TEST(x) && strncmp(Np->inout_p, Np->decimal, x) == 0)
{
+ Np->inout_p += x - 1;
*Np->number_p = '.';
Np->number_p++;
Np->read_dec = TRUE;
isread = TRUE;
}
- else
- {
- int x = strlen(Np->decimal);
-
-#ifdef DEBUG_TO_FROM_CHAR
- elog(DEBUG_elog_output, "Try read locale point (%c)",
- *Np->inout_p);
-#endif
- if (x && AMOUNT_TEST(x) && strncmp(Np->inout_p, Np->decimal, x) == 0)
- {
- Np->inout_p += x - 1;
- *Np->number_p = '.';
- Np->number_p++;
- Np->read_dec = TRUE;
- isread = TRUE;
- }
- }
}
if (OVERLOAD_TEST)