Обсуждение: Casting from a domain
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?"
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
"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
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?"