On Wed, 2024-07-03 at 11:00 +0200, Peter Eisentraut wrote:
> On 02.07.24 12:45, Navrátil, Ondřej wrote:
> > as per documentation 
> > <https://www.postgresql.org/docs/current/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL>
> >  > The |COALESCE| function returns the first of its arguments that is 
> > not null. Null is returned only if all arguments are null.
> > 
> > This is not exactly true. In fact:
> > The |COALESCE| function returns the first of its arguments that *is 
> > distinct* *from *null. Null is returned only if all arguments *are not 
> > distinct from* null.
> > 
> > See my stack overflow question here 
> > <https://stackoverflow.com/questions/78691097/postgres-null-on-composite-types>.
> > 
> > Long story short
> > 
> > > select coalesce((null, null), (10, 20)) as magic; |
> > 
> > returns
> > 
> > > magic ------- (,) (1 row)|
> > 
> > However, this is true:
> > 
> > > select (null, null) is null;|
> 
> I think this is actually a bug in the implementation, not in the 
> documentation.  That is, the implementation should behave like the 
> documentation suggests.

You are right.  I find this in the standard:

COALESCE (V1, V2) is equivalent to the following <case specification>:

CASE WHEN V1
IS NOT NULL THEN
V1 ELSE
V2 END

That would mean that coalesce(ROW(1,NULL), ROW(2,1)) should return
the second argument.  Blech.  I am worried about the compatibility pain
such a bugfix would cause...

Yours,
Laurenz Albe


Reply via email to