Ok, as always there's a lot more to take into account then when just superficially looking at it. And indeed your counterexample shows that you'd have to include all the previous when-conditions too as false WHERE x=0 IS DISTINCT FROM true AND 1/x > 100, which could become quite messy (especially with nested cases....)
On Fri, Jun 5, 2020 at 9:02 PM Tom Lane <t...@sss.pgh.pa.us> wrote: > Paul van der Linden <paul.doskabou...@gmail.com> writes: > > For the case where it isn't known if the case expression itself is > indexed, > > technically that should be added as a decision-node in the query planner. > > That'd be fairly hard to do, if we're regarding this as an expression > simplification step, since expression simplification is run long before > any consideration is given to indexes. (Even if we were willing to > contemplate reversing that ordering, it'd be hard to do, because we > need the simplified expressions to compare to index expressions --- > else we'd get fooled by irrelevant discrepancies that simplification > is supposed to remove.) > > The alternative is to try to wire this into index path generation instead > of treating it as a general-purpose expression simplification ... but that > likewise seems pretty undesirable. If you've got a case like this, you'd > like it to be simplified whether it ends up as an indexqual or not. > > So, as I said, I'm inclined to dismiss David's complaint as an > impracticable requirement. The other issues I raised are far more > significant. > > BTW, speaking of correctness, this seems like a pretty dire > counterexample: > > SELECT ... FROM > (SELECT CASE WHEN x = 0 THEN 'zero' > WHEN 1/x > 100 THEN 'tiny' > ELSE 'whatever' END AS class, > ... > ) ss > WHERE ss.class = 'tiny'; > > Naive application of this transformation would convert the WHERE to > > WHERE 1/x > 100 > > creating divide-by-zero failures where there should be none. > I'm not sure how we get around that; in general the planner > has little clue which operations can throw what errors. > > regards, tom lane >