Thread: Casting from a domain

Casting from a domain

From
"Jim C. Nasby"
Date:
I'm trying to create a seconds domain that is an interval 'mashed to
seconds' as I once saw Tom describe it.

decibel=# create domain rrs.seconds as double precision;
CREATE DOMAIN
decibel=# create cast (double precision as rrs.seconds) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST
decibel=# create function rrs.interval_to_seconds(interval) returns seconds as 'SELECT extract( EPOCH FROM $1 );'
LANGUAGESQL; 
CREATE FUNCTION
decibel=# create cast (interval as rrs.seconds) WITH FUNCTION rrs.interval_to_seconds(interval)  AS IMPLICIT;
CREATE CAST
decibel=# select cast('1 month'::interval AS seconds);
ERROR:  cannot cast type interval to seconds

\dC shows that the cast is there, and rrs.interval_to_seconds works as
expected, and according to \df does return seconds.

Version is 7.4.5.
--
Jim C. Nasby, Database Consultant               decibel@decibel.org
Give your computer some brain candy! www.distributed.net Team #1828

Windows: "Where do you want to go today?"
Linux: "Where do you want to go tomorrow?"
FreeBSD: "Are you guys coming, or what?"

Re: Casting from a domain

From
Richard Huxton
Date:
Jim C. Nasby wrote:
> decibel=# create cast (interval as rrs.seconds) WITH FUNCTION rrs.interval_to_seconds(interval)  AS IMPLICIT;
                                      ^^^
> decibel=# select cast('1 month'::interval AS seconds);
> ERROR:  cannot cast type interval to seconds

It's not a schema issue is it? I.E. the lack of "rrs."?

--
   Richard Huxton
   Archonet Ltd

Re: Casting from a domain

From
Tom Lane
Date:
"Jim C. Nasby" <decibel@decibel.org> writes:
> decibel=# create cast (interval as rrs.seconds) WITH FUNCTION rrs.interval_to_seconds(interval)  AS IMPLICIT;
> CREATE CAST
> decibel=# select cast('1 month'::interval AS seconds);
> ERROR:  cannot cast type interval to seconds

Given the current coercion rules, we should probably disallow attempts
to define casts that involve domains.  Casts are on base types.  The
down-cast from a domain to its base type is hardwired, and the up-cast
from base type to domain is too (with invocation of any constraints
that may apply).  Adding random user-defined casts to this would
probably just create confusion and ambiguity.  In particular, this
was already meaningless:

decibel=# create domain rrs.seconds as double precision;
CREATE DOMAIN
decibel=# create cast (double precision as rrs.seconds) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST

since the presence of the cast might be thought to justify coercing
floats to "seconds" without invoking domain constraints.

            regards, tom lane

Re: Casting from a domain

From
"Jim C. Nasby"
Date:
On Fri, Mar 04, 2005 at 03:40:17PM -0500, Tom Lane wrote:
> "Jim C. Nasby" <decibel@decibel.org> writes:
> > decibel=# create cast (interval as rrs.seconds) WITH FUNCTION rrs.interval_to_seconds(interval)  AS IMPLICIT;
> > CREATE CAST
> > decibel=# select cast('1 month'::interval AS seconds);
> > ERROR:  cannot cast type interval to seconds
>
> Given the current coercion rules, we should probably disallow attempts
> to define casts that involve domains.  Casts are on base types.  The
> down-cast from a domain to its base type is hardwired, and the up-cast
> from base type to domain is too (with invocation of any constraints
> that may apply).  Adding random user-defined casts to this would
> probably just create confusion and ambiguity.  In particular, this
> was already meaningless:
>
> decibel=# create domain rrs.seconds as double precision;
> CREATE DOMAIN
> decibel=# create cast (double precision as rrs.seconds) WITHOUT FUNCTION AS IMPLICIT;
> CREATE CAST
>
> since the presence of the cast might be thought to justify coercing
> floats to "seconds" without invoking domain constraints.

Yeah, I figured it was probably an issue with it being a domain. I was
looking for a way to do this without the extra work involved in defining
a full-blown type. I guess the good news is I should be able to re-use
all the double-precision functions and what-not for 'seconds'.

BTW, is there a reason 'double' isn't an alias for 'double precision'?
I'm pretty sure every other database I've used (other than oracle of
course) supports 'double'. " precision" is just too much extra typing
after all... :P
--
Jim C. Nasby, Database Consultant               decibel@decibel.org
Give your computer some brain candy! www.distributed.net Team #1828

Windows: "Where do you want to go today?"
Linux: "Where do you want to go tomorrow?"
FreeBSD: "Are you guys coming, or what?"