Re: Possible improvement - Mailing list pgsql-general

From Paul van der Linden
Subject Re: Possible improvement
Date
Msg-id CAEC-EqA6Pfo3_iZSDBtbLHBPDv4vC0kY2nPBaHV3qWegTLuPbQ@mail.gmail.com
Whole thread Raw
In response to Re: Possible improvement  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
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 <tgl@sss.pgh.pa.us> wrote:
Paul van der Linden <paul.doskabouter@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

pgsql-general by date:

Previous
From: Michael Lewis
Date:
Subject: Re: Index no longer being used, destroying and recreating it restores use.
Next
From: Martín Fernández
Date:
Subject: Logical Replication and table bloat