I can confirm that this is a bug.  The attached SQL shows that creating
a CAST _to_ a domain type doesn't work, though the cast can be created. 
The attached SQL provided by Fabien shows the failure.

The error is coming from parse_expr.c::typecast_expression, and its call
to typenameTypeId().  I wish I understood how we do domains better to
fix this properly.  Anyone?

---------------------------------------------------------------------------

Fabien COELHO wrote:
> 
> Dear PostgreSQL developer.
> 
> Although it is allowed to create a cast for a domain, it seems that there 
> is no way to trigger it. You can find attached an sql script to illustrate 
> the issue with postgresql 8.1.3. The create cast and create domain 
> documentations do not seem to discuss this point.
> 
> ISTM that it is a pg bug. Indeed, either
> 
> (1) the create cast should be rejected if it is not allowed for domains.
> 
> or
> 
> (2) the function should be triggered by explicit casts to the domain.

-- 
  Bruce Momjian   http://candle.pha.pa.us
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
DROP DOMAIN a_year CASCADE;

-- a simple domain
CREATE DOMAIN a_year AS INTEGER
CHECK (VALUE BETWEEN 1 AND 3000);

-- ok
SELECT 1::a_year;
SELECT CAST('2000' AS a_year);

-- fails as expected
SELECT 0::a_year; 

CREATE FUNCTION date2year(DATE)
RETURNS a_year IMMUTABLE STRICT AS $$
SELECT EXTRACT(YEAR FROM $1)::a_year;
$$ LANGUAGE sql;

-- ok
SELECT date2year(CURRENT_DATE);

-- fails as expected
SELECT date2year(DATE '3001-01-01');

CREATE CAST (DATE AS a_year) 
WITH FUNCTION date2year(DATE);

-- fails, I would expect 1970
SELECT (DATE '1970-03-20')::a_year;

-- fails, I would expect the current year
SELECT CURRENT_DATE::a_year;
SELECT CAST(CURRENT_DATE AS a_year);
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to