From: | Andres Freund <andres(at)anarazel(dot)de> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | Rushabh Lathia <rushabh(dot)lathia(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Query fails when SRFs are part of FROM clause (Commit id: 69f4b9c85f) |
Date: | 2017-04-11 21:34:01 |
Message-ID: | 20170411213401.mntok2g5nfc4lrxb@alap3.anarazel.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 2017-04-11 17:25:52 -0400, Tom Lane wrote:
> Andres Freund <andres(at)anarazel(dot)de> writes:
> > Tom, do you have any opinion on the volatility stuff?
>
> What was the previous behavior for such cases? If it was reasonably
> sane, we probably have to preserve it. If it was unpredictable or
> completely wacko, maybe we don't.
Previously we'd stash the result in a new tuplestore, because it
happened inside ExecMakeTableFunctionResult()'s fallback path. The
inner tuplestore (from the proper SRF) would get evaluated via the the
isDone mechanism.
That'd imo be a fair amount of work to emulate, because we'd have to
manually go over the tuplesttore.
But given that we do *not* have similar semantics for volatiles in the
targetlist, I'm quite unconvinced that that's necessary. Consider
e.g. my previous example of
SELECT * FROM CAST(srf() * volatile_func() AS whatnot)
rewritten into a saner version as
SELECT srf * volatile_func() FROM srf() AS srf;
here volatile_func() would before and now get re-evaluated if there's a
rewind, and would only be invoked if the row is actually evaluated.
- Andres
From | Date | Subject | |
---|---|---|---|
Next Message | Alexander Korotkov | 2017-04-11 21:40:08 | Re: index-only count(*) for indexes supporting bitmap scans |
Previous Message | Tom Lane | 2017-04-11 21:25:52 | Re: Query fails when SRFs are part of FROM clause (Commit id: 69f4b9c85f) |