My name               :       Mahmoud taghizade
My email address      :       [EMAIL PROTECTED]


System Configuration
---------------------
  Architecture (example: Intel Pentium)         :
Intel Pentium

  Operating System (example: Linux 2.4.18)      :Linux
2.6.5-1.358 (Fedora core 2)

  PostgreSQL version (example: PostgreSQL-7.4.3):  
PostgreSQL-7.4.3

  Compiler used (example:  gcc 2.95.2)          : I
used rpm version


Please enter a FULL description of your problem:
------------------------------------------------
when I set lc_monetary to fa_IR.UTF8 and try to insert
a value for field whose type is money I got
following error:

invalid input syntax for type money: "10"
I study the cash.c and found that the problem exists
for any monetary that has not precision.
fa_IR, tr_TR and ...



Please describe a way to repeat the problem.   Please
try to provide a
concise reproducible example, if at all possible:
----------------------------------------------------------------------

create a table with a money type:

CREATE TABLE test ( m money);

and then set lc_monetary to fa_IR.UTF8
now try to insert a value
 INSERT INTO test VALUES ('10');

you will get the error message.

now if you set lc_monetary to en_UR.UTF8 (or any
monetary that has precision)  you can run the

 INSERT INTO test VALUES ('10');

without any error.

If you know how this problem might be fixed, list the
solution below:
---------------------------------------------------------------------

 I have a dirty method to fix the problem, replace the
line 159 in backend/utils/adt/cash.c
 if (isdigit((unsigned char) *s) && dec < fpoint)

with

 if (isdigit((unsigned char) *s) && (dec < fpoint  ||
fpoint == 0))

because the prolem only exists for monetrat with
fpoint == 0;




apply patch:

cp cash.diff to src/backend/utils/adt/ directory
and then patch -p0 < cash.c
now recompile the postgreSQL, the problem will be
fixed.



                
__________________________________
Do you Yahoo!?
Yahoo! Mail - 50x more storage than other providers!
http://promotions.yahoo.com/new_mail
*** cash.c	2004-08-22 17:42:57.333775440 +0430
--- cash.c	2004-08-22 17:44:45.840279944 +0430
***************
*** 156,162 ****
  	{
  		/* we look for digits as int4 as we have less */
  		/* than the required number of decimal places */
!  		if (isdigit((unsigned char) *s) && dec < fpoint )
  		{
  			value = (value * 10) + *s - '0';
  
--- 156,162 ----
  	{
  		/* we look for digits as int4 as we have less */
  		/* than the required number of decimal places */
!  		if (isdigit((unsigned char) *s) && (dec < fpoint || fpoint == 0))
  		{
  			value = (value * 10) + *s - '0';
  
---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faqs/FAQ.html

Reply via email to