]> granicus.if.org Git - postgresql/commitdiff
Fix cash_in() to behave properly in locales where frac_digits is zero,
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 10 Jun 2009 16:31:38 +0000 (16:31 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 10 Jun 2009 16:31:38 +0000 (16:31 +0000)
eg Japan.  Report and fix by Itagaki Takahiro.  Also fix CASHDEBUG printout
format for branches with 64-bit money type, and some minor comment cleanup.

Back-patch to 7.4, because it's broken all the way back.

src/backend/utils/adt/cash.c

index 35ac1210b87e0716386749047fdbdedc8238bdc9..3a12fc457d5128c0693b29d00efd6828e7dc41cc 100644 (file)
@@ -13,7 +13,7 @@
  * this version handles 64 bit numbers and so can hold values up to
  * $92,233,720,368,547,758.07.
  *
- * $PostgreSQL: pgsql/src/backend/utils/adt/cash.c,v 1.77.2.1 2008/06/09 19:58:46 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/cash.c,v 1.77.2.2 2009/06/10 16:31:38 tgl Exp $
  */
 
 #include "postgres.h"
@@ -207,23 +207,21 @@ cash_in(PG_FUNCTION_ARGS)
 
        for (;; s++)
        {
-               /* we look for digits as int8 as we have less */
+               /* we look for digits as long as we have found less */
                /* than the required number of decimal places */
-               if (isdigit((unsigned char) *s) && dec < fpoint)
+               if (isdigit((unsigned char) *s) && (!seen_dot || dec < fpoint))
                {
-                       value = (value * 10) + *s - '0';
+                       value = (value * 10) + (*s - '0');
 
                        if (seen_dot)
                                dec++;
-
                }
                /* decimal point? then start counting fractions... */
                else if (*s == dsymbol && !seen_dot)
                {
                        seen_dot = 1;
-
                }
-               /* not "thousands" separator? */
+               /* ignore if "thousands" separator, else we're done */
                else if (*s != ssymbol)
                {
                        /* round off */
@@ -252,7 +250,7 @@ cash_in(PG_FUNCTION_ARGS)
        result = value * sgn;
 
 #ifdef CASHDEBUG
-       printf("cashin- result is %d\n", result);
+       printf("cashin- result is " INT64_FORMAT "\n", result);
 #endif
 
        PG_RETURN_CASH(result);