Tables with columns specified as numeric using a domain type seem to be
capable of containing values with a higher precision than specified, when mixing in operations with float4 (which we use to store percentages).
The following snippet can be used to reproduce the error (run each step sequencially and observe results):
--step 1: direct execution on base type SELECT 92::numeric(15,4) * 0.2::float4;
--step 2: using a function variable and a domain CREATE DOMAIN currency AS numeric(15,4); CREATE TABLE test (id serial, amt currency); CREATE FUNCTION f_test(currency) RETURNS currency AS $$ DECLARE n currency; BEGIN n := $1 * 0.2::float4; INSERT INTO test (amt) VALUES (n); RETURN n; END $$ LANGUAGE PLPGSQL; SELECT f_test(92);
--step 3: wrong precision stored in the table! SELECT id, amt, amt::currency as amt_still_bad, amt::numeric(15,4) as amt_casted_as_base, amt::float::currency as amt_casted_back_n_forth FROM test;
Thanks folks.
Ezequiel Tolnay Good Business Technology Sydney, NSW, Australia
---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faq