Re: JOIN performance - Mailing list pgsql-sql
From | Tom Lane |
---|---|
Subject | Re: JOIN performance |
Date | |
Msg-id | 25393.1095739813@sss.pgh.pa.us Whole thread Raw |
In response to | Re: JOIN performance ("Dean Gibson (DB Administrator)" <postgresql3@ultimeth.com>) |
Responses |
Re: JOIN performance
Is NULLIF nullable? |
List | pgsql-sql |
"Dean Gibson (DB Administrator)" <postgresql3@ultimeth.com> writes: > I could ask why a CASE statement is always non-nullable, but I don't think > the answer would help be solve my problem. <grin> I suppose it's that even > though my particular CASE statement has WHEN/ELSE values that come from the > nullable side of the JOIN, in general that's not true ... Right, the code just sees CASE and barfs. A finer grain of analysis could conclude that this CASE is actually safe, but I'm unconvinced that it's worth doing. (Feel free to pursue this on -hackers if you care.) > Okay, now for my big question: I searched high and low for a function that > would return the minimum of two dates, and found none. Now you come up > with "date_smaller", which works fine (as does "date_larger"), but where > are those documented? They aren't; they are actually only intended as support functions for MIN (resp. MAX) on dates. But they're there, and there's nothing to stop you using 'em. (You do of course realize that you could have implemented these functions for yourself in a one-liner sql or plpgsql function. Finding the function in the system saves you a few minutes at most.) > ps: Who dreamt up the names "date_smaller" and "date_larger" ??? [ shrug... ] Some now-forgotten grad student at Berkeley. All the support functions for MIN and MAX are named 'foosmaller' and 'foolarger'. Try select aggtransfn from pg_aggregate, pg_proc where pg_proc.oid = aggfnoid and proname = 'min'; > pps: I realize that "date_smaller" isn't exactly equivalent to my CASE > statement; a NULL value for one of the CASE operands causes the result of > the ELSE clause to be returned, whereas "date_smaller" just returns NULL in > that case. In my data, that's significant. Well, in that case you may have a problem here. The point of the test in question is that the expression has to return NULL if *either* input is null. Now it's true that the LEFT JOIN only cares that it goes to NULL when *both* inputs are NULL, but we don't have any way to declare that particular property of a function. To make the planner happy you will have to declare the function as STRICT, which will force it to behave in the first fashion. > I suppose that COALESCE has the same problem as CASE ... Yup, of course. regards, tom lane