From: | "Akira Kurosawa" <kurosawa-akira(at)mxc(dot)nes(dot)nec(dot)co(dot)jp> |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | BUG #6096: ECPG set precision of double value to 14 digits |
Date: | 2011-07-08 03:17:56 |
Message-ID: | 201107080317.p683HuSl058678@wwwmaster.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
The following bug has been logged online:
Bug reference: 6096
Logged by: Akira Kurosawa
Email address: kurosawa-akira(at)mxc(dot)nes(dot)nec(dot)co(dot)jp
PostgreSQL version: 8.4.5
Operating system: Red Hat Enterprise Linux 5.5
Description: ECPG set precision of double value to 14 digits
Details:
When I used host variable of double type in ECPG code,
the precision of the data was treated as 14 digits.
I executed following command.
--------------------------------------------------
EXEC SQL BEGIN DECLARE SECTION;
double dbl;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO testdb(at)localhost:5432 USER postgres;
dbl = 12345678901234; -- 14 digits
EXEC SQL INSERT INTO double_table (c1) VALUES (:dbl);
dbl = 1234567890.1234; -- 14 digits
EXEC SQL INSERT INTO double_table (c1) VALUES (:dbl);
dbl = 0.12345678901234; -- 14 digits
EXEC SQL INSERT INTO double_table (c1) VALUES (:dbl);
dbl = 123456789012345; -- 15 digits
EXEC SQL INSERT INTO double_table (c1) VALUES (:dbl);
dbl = 1234567890.12345; -- 15 digits
EXEC SQL INSERT INTO double_table (c1) VALUES (:dbl);
dbl = 0.123456789012345; -- 15 digits
EXEC SQL INSERT INTO double_table (c1) VALUES (:dbl);
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
--------------------------------------------------
Then I checked inserted data, but all data was stored by 14 digits
precision.
--------------------------------------------------
testdb=# \d double_table
Table "public.double_table"
Column | Type | Modifiers
--------+------------------+-----------
c1 | double precision |
testdb=# SELECT * FROM double_table;
c1
------------------
12345678901234
1234567890.1234
0.12345678901234
123456789012340
1234567890.1235
0.12345678901234
(6 rows)
--------------------------------------------------
The precision of double type should be 15 digits,
and I think this result is wrong.
PostgreSQL 9.0.4 also shows the same result.
In function "ecpg_store_input:execute.c",
the value of double type is changed by sprintf to a character string
at 14 digits precision. I'm thinking this point is a problem.
sprintf(mallocedval, "%.14g", *((double *) var->value));
Following log is result of executing same query by psql.
--------------------------------------------------
testdb=# INSERT INTO double_table VALUES ('12345678901234');
INSERT 0 1
testdb=# INSERT INTO double_table VALUES ('1234567890.1234');
INSERT 0 1
testdb=# INSERT INTO double_table VALUES ('0.12345678901234');
INSERT 0 1
testdb=# INSERT INTO double_table VALUES ('123456789012345');
INSERT 0 1
testdb=# INSERT INTO double_table VALUES ('1234567890.12345');
INSERT 0 1
testdb=# INSERT INTO double_table VALUES ('0.123456789012345');
INSERT 0 1
testdb=# SELECT * FROM double_table;
c1
-------------------
12345678901234
1234567890.1234
0.12345678901234
123456789012345
1234567890.12345
0.123456789012345
(6 rows)
--------------------------------------------------
From | Date | Subject | |
---|---|---|---|
Next Message | Maxim Boguk | 2011-07-08 06:46:29 | BUG #6097: Server crash when enabling custom_variable_classes |
Previous Message | Tom Lane | 2011-07-08 01:00:56 | Re: BUG #6095: Misleading error message: INSERT has more expressions than target columns |