> On Jun 4, 2017, at 12:35 PM, Andres Freund <and...@anarazel.de> wrote: > > Hi Mark, > > On 2017-06-04 11:55:03 -0700, Mark Dilger wrote: >>> Yea, I'm not a big fan of the either the pre v10 or the v10 behaviour of >>> SRFs inside coalesce/case. Neither is really resonable imo - I'm not >>> sure a reasonable behaviour even exists. IIRC I'd argued in the >>> original SRF thread that we should just throw an error, and I think we'd >>> concluded that we'd not do so for now. >> >> I am trying to get my head around the type of query you and Tom >> are discussing. When you say you are unsure a reasonable behavior >> even exists, are you saying such queries have no intuitive meaning? > > I'm not saying that there aren't some cases where it's intuitive, but > there's definitely lots that don't have intuitive meaning. Especially > when there are multiple SRFs in the same targetlist. > > Do I understand correctly that you're essentially advocating for the < > v10 behaviour?
No, I'm not advocating either way. I merely wanted to know which queries you and Tom were talking about. > It'd be nontrivial to implement that, without loosing > the significant benefits (Significantly slower, higher code complexity, > weird behaviour around multiple SRFs) gained by removing the previous > implementation. I'd really like to see some examples of when all of > this is useful - I've yet to see a realistic one that's not just as > easily written differently > > >> Can you give an example of such a query which has no intuitive >> meaning? Perhaps I am not thinking about the right kind of queries. >> I have been thinking about examples like: >> >> SELECT x, CASE WHEN y THEN generate_series(1,z) ELSE 5 END >> FROM table_with_columns_x_and_y_and_z; >> >> Which to me gives 'z' output rows per table row where y is true, and >> one output row per table row where y is false. > > Try any query that has one SRF outside of the CASE, and one inside. In > the old behaviour that'll make the total number of rows returned nearly > undeterministic because of the least-common-multiple behaviour. > >> That could be changed with an aggregate function such as: >> SELECT x, CASE WHEN y THEN SUM(generate_series(1,z)) ELSE 5 END >> FROM table_with_columns_x_and_y; > > That query doesn't work. First off, aggregates don't take set arguments > (neither in old nor new releases), secondly aggregates are evaluated > independently of CASE/COALESCE statements, thirdly you're missing group > bys. Those all are independent of the v10 changes. Sorry, I was not clear. What I meant to get at was that if you remove from the executor all support for SRFs inside case statements, you might foreclose the option of extending the syntax at some later date to allow aggregates over SRFs. I'm not saying that this works currently, but in principle if you allowed that SUM() that I put up there, you'd get back exactly one row from it, same as you get from the ELSE clause. That would seem to solve the problem without going so far as completely disallowing the SRF altogether. The reasons for not putting a GROUP BY clause in the example are (a) I don't know where it would go, syntactically, and (b) it would defeat the purpose, because once you are grouping, you again have the possibility of getting more than one row. I'm not advocating implementing this; I'm just speculating about possible future features in which SRFs inside a case statement might be allowed. > >> Thanks, and my apologies if I am merely lacking sufficient imagination to >> think of a proper example. > > Might be worthwhile to reread the thread about the SRF reimplementation. > > https://www.postgresql.org/message-id/20160822214023.aaxz5l4igypow...@alap3.anarazel.de This helps, thanks! Mark Dilger -- Sent via pgsql-hackers mailing list (email@example.com) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers