BUG #3040: Domain type handling change in 8.2.2 breaks declarations - Mailing list pgsql-bugs

From Dreas Nielsen
Subject BUG #3040: Domain type handling change in 8.2.2 breaks declarations
Date
Msg-id 200702201839.l1KIdtLC062964@wwwmaster.postgresql.org
Whole thread Raw
Responses Re: BUG #3040: Domain type handling change in 8.2.2 breaks declarations  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
The following bug has been logged online:

Bug reference:      3040
Logged by:          Dreas Nielsen
Email address:      dreas.nielsen@gmail.com
PostgreSQL version: 8.2.3
Operating system:   FreeBSD
Description:        Domain type handling change in 8.2.2 breaks declarations
Details:

If a domain type is declared NOT NULL,
and that domain type is used in a composite data type,
then declarations of that composite data type in a plpgsql function raise an
error because the custom domain value is NULL--and the composite data type
cannot be initialized so that it is non-null.

Example:
CREATE DOMAIN real_value
  AS double precision
  NOT NULL;

CREATE DOMAIN significant_digits
  AS integer
  DEFAULT 2
  NOT NULL;

CREATE TYPE measurement_result AS
   (value real_value,
    sig_figs significant_digits,
    std_dev double precision,
    undetected measurement_qualifier,
    estimated measurement_qualifier,
    rejected measurement_qualifier,
    greater_than measurement_qualifier);

CREATE OR REPLACE FUNCTION avg_mv_half(currstate measval_accum)
  RETURNS measurement_result AS
$BODY$
DECLARE
    rv measurement_result;
BEGIN
    rv := avg_mv_fact( currstate, 0.5 );
    RETURN rv;
END;
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE;


The declaration of the variable rv in function avg_mv_half() fails.  This
behavior appeared with version 8.2.2, and appears to be related to the item
in the release notes that says "Improve PL/pgSQL handling of domain types
(Sergiy Vyshnevetskiy, Tom)".  I suggest that restrictions on domain types
be enforced in the RETURN statement of a plpgsql function rather than in the
DECLARE statement.

The only workaround that I have found so far is to ALTER DOMAIN ... DROP NOT
NULL, but the whole point of defining those domains in the first place was
to enforce a NOT NULL constraint in the composite data type.

pgsql-bugs by date:

Previous
From: "Dmitry Koterov"
Date:
Subject: BUG #3048: pg_dump dumps intarray metadata incorrectly
Next
From: "Pavel Stehule"
Date:
Subject: BUG #3037: strange behave of CHECK constraint