Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Data Bases > Pgsql Bugs > Re: BUG #4085: ...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 5 of 5 Topic 3677 of 4088
Post > Topic >>

Re: BUG #4085: No implicit cast after coalesce

by sam@[EMAIL PROTECTED] (Sam Mason) Apr 3, 2008 at 07:57 PM

On Thu, Apr 03, 2008 at 12:24:17AM +0200, Peter Eisentraut wrote:
> Jeff Dwyer wrote:
> > This works fine:
> > select 1 where current_date between '1900-3-3' and '1900-2-2';
> > This doesn't:
> > select 1 where current_date between coalesce(null,current_date)  and
> > coalesce(null, '1900-1-2');
> >
> > This fix works:
> > select 1 where current_date between coalesce(null,current_date)  and
> > coalesce(null, date('1900-1-2'));
> >
> > This seems like a bug to me. Why should an explicit cast be necessary
after
> > a coalesce?
> 
> Because coalesce(null, '1900-1-2') has no other type information
attached, so 
> it would have picked text by default as result type, and that then
clashes 
> with the result type of coalesce(null,current_date), which can be
derived to 
> be date.  This is a robustness improvement: 8.2 and earlier would
silently 
> accept coalesce(null, 'abc') and apply text-semantics comparison.

The types look as though they could be interpreted unambiguously and
correctly very easily.  Parametric polymorphism and some basic type
inference would easily be able to resolve this.  BETWEEN would have
the following type (very informally presented; lower case characters
stand for type variables, Titlecase for type names, UPPERCASE for
identifiers!):

  Boolean (t BETWEEN t AND t)

i.e. when BETWEEN is called all the types must be the same.  COALESCE is
also parametrised over a single type:

  t COALESCE(t,t)

NULLs could be encoded in the type system in many ways as long it had a
polymorphic type.  The type system should realise that "current_date"
is of type Date and because NULL is polymorphic the COALESCEs would
unify, both returning values of type Date, which would in turn unify
with the BETWEEN operator resulting in a value of BOOLEAN type, which is
exactly what the WHERE clause expects.

This sort of type inference has been known (and extensively studied)
for about 50 years now, it always surprises me how little it's known
outside the functional programming community (ML and Haskell being the
old guard).  Apparently, according to the fountain of wisdom that is
Wikipedia, It's finally starting to break into very mainstream languages
like the next versions of VB9 and C#3.

Moving an existing implementation over to a new type system is an
entirely non-trivial matter though!


  Sam

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@[EMAIL PROTECTED]
)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs
 




 5 Posts in Topic:
BUG #4085: No implicit cast after coalesce
jdwyer@[EMAIL PROTECTED]   2008-04-02 21:04:22 
Re: BUG #4085: No implicit cast after coalesce
peter_e@[EMAIL PROTECTED]  2008-04-03 00:24:17 
Re: BUG #4085: No implicit cast after coalesce
tgl@[EMAIL PROTECTED] (T  2008-04-02 19:15:56 
Re: BUG #4085: No implicit cast after coalesce
jdwyer@[EMAIL PROTECTED]   2008-04-03 09:15:17 
Re: BUG #4085: No implicit cast after coalesce
sam@[EMAIL PROTECTED] (S  2008-04-03 19:57:20 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Sat Oct 11 12:43:41 CDT 2008.