Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Chao Li <li.evan.chao@gmail.com>
Дата:
> On Jul 15, 2026, at 01:08, Tom Lane wrote: > > Daniel Gustafsson writes: >> Ack. Another case I am a bit confused by is: > >> postgres=# create table t (a integer); >> CREATE TABLE >> postgres=# select 1 as x from t group by (); >> x >> --- >> 1 >> (1 row) > >> postgres=# select 1 as x from t group by all; >> x >> --- >> (0 rows) > >> Shouldn't those two queries yield the same result, or am I missing something >> obvious? > > I might be undercaffeinated still, but I think those are both correct. > "GROUP BY ()" has similar effects to use of an aggregate or HAVING > clause: it forces the table scan's results to be combined into a > single grouped row. But you get a grouped row even if the table is > empty. The second case is equivalent to "select 1 as x from t group > by x", and this is different because it will produce a grouped row > only if the table isn't empty. (The fact that the grouping expression > is a constant doesn't change the rule.) Not one of SQL's more > consistent behaviors perhaps, but I believe it's all per spec. > > regards, tom lane Thanks for all the comments. I was trying to target the bug fix for v19, so I kept the scope narrow. It looks like I don’t need to revise the current patch for now. I have no objection to reverting GROUP BY ALL from v19. If the original feature author wants to rework the feature following Tom suggested direction, please go ahead. Otherwise, if people think it would be useful, I can try to work on it for v20. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Tom Lane <tgl@sss.pgh.pa.us>
Дата:
Daniel Gustafsson writes: >> On 29 Jun 2026, at 09:20, Chao Li wrote: >> The fix mostly refactors the existing logic so the GROUP BY ALL path also handles the ORDER BY sort clause. See the attached patch for details. > Thanks for the report and the patch, I am going to study it a bit more but I > have a few small comments on the patch. I'd been too busy to look at this right away, but after glancing at it briefly: on the one hand, I'd rather not engage in refactoring as part of a bug fix, but I think I agree that we have to here. On the other hand, the handling of these clauses was already messy, and I now see that the addition of grouping sets made the mess quite a lot worse. The division of labor is confusing and seemingly redundant, the commenting is poor, and there are even visibly-falsified comments such as this one for transformGroupClauseExpr: * Returns the ressortgroupref of the expression. which doesn't mention that oh no, we might just return zero instead (let alone explain why). Chao's patch as proposed doesn't clean any of that up, but just adds another layer of impenetrability to the logic. I don't have a lot of faith that there aren't other comparable bugs lurking. I think we really ought to take a step back and redesign this code, after first figuring out which operations need to happen for which cases (plain GROUP BY, grouping sets, GROUP BY ALL, SQL92 vs SQL99 behavior, etc). Then we need a less-baroque layering, IMO. That is a large change to take on post-beta2, though. Maybe the path of prudence is to revert GROUP BY ALL for v19 and try again for v20. regards, tom lane
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Tom Lane <tgl@sss.pgh.pa.us>
Дата:
Daniel Gustafsson writes: > FWIW, I had a look at what a revert of the commit would look like. The > original commit included some while-in-there docs/comment cleanups which carry > value on their own, so I think we should leave those in. The attached reverts > GROUP BY ALL but retains the cleanups. If we decide to revert, the v19 back > patch would need to remove the entry from the release notes as well, but I only > did a master revert patch for now. Thanks for doing that! I'll wait another day or so to see if anyone wants to push back on reverting this. regards, tom lane
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Tom Lane <tgl@sss.pgh.pa.us>
Дата:
I wrote: > Thanks for doing that! I'll wait another day or so to see if anyone > wants to push back on reverting this. Hearing nothing, pushed. Thanks for doing the legwork on that. regards, tom lane
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Daniel Gustafsson <daniel@yesql.se>
Дата:
> On 29 Jun 2026, at 09:20, Chao Li wrote: > The fix mostly refactors the existing logic so the GROUP BY ALL path also handles the ORDER BY sort clause. See the attached patch for details. Thanks for the report and the patch, I am going to study it a bit more but I have a few small comments on the patch. +/* + * Add a targetlist entry to the GROUP BY list, copying matching ORDER BY + * operator information if available. + */ This comment is a bit light for such an important routine. The foreach has a really great comment, I think we should move some (most?) of it to the function comment. - *flatresult = lappend(*flatresult, grpc); + grouplist = lappend(grouplist, grpc); found = true; break; Now that we are in an external function, we could just return grouplist here instead of breaking with a flag. The code outside the foreach can then call addTargetToGroupList directly since we know that if we reach thus far there was no match. -- Daniel Gustafsson
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Daniel Gustafsson <daniel@yesql.se>
Дата:
> On 14 Jul 2026, at 02:44, Tom Lane wrote: > > Daniel Gustafsson writes: >>> On 29 Jun 2026, at 09:20, Chao Li wrote: >>> The fix mostly refactors the existing logic so the GROUP BY ALL path also handles the ORDER BY sort clause. See the attached patch for details. > >> Thanks for the report and the patch, I am going to study it a bit more but I >> have a few small comments on the patch. > > I'd been too busy to look at this right away, but after glancing at it > briefly: on the one hand, I'd rather not engage in refactoring as part > of a bug fix, but I think I agree that we have to here. On the other > hand, the handling of these clauses was already messy, and I now see > that the addition of grouping sets made the mess quite a lot worse. Ack. Another case I am a bit confused by is: postgres=# create table t (a integer); CREATE TABLE postgres=# select 1 as x from t group by (); x --- 1 (1 row) postgres=# select 1 as x from t group by all; x --- (0 rows) Shouldn't those two queries yield the same result, or am I missing something obvious? > The division of labor is confusing and seemingly redundant, the > commenting is poor, and there are even visibly-falsified comments > such as this one for transformGroupClauseExpr: > > * Returns the ressortgroupref of the expression. > > which doesn't mention that oh no, we might just return zero instead > (let alone explain why). > > Chao's patch as proposed doesn't clean any of that up, but just adds > another layer of impenetrability to the logic. I don't have a lot of > faith that there aren't other comparable bugs lurking. I think we > really ought to take a step back and redesign this code, after first > figuring out which operations need to happen for which cases (plain > GROUP BY, grouping sets, GROUP BY ALL, SQL92 vs SQL99 behavior, etc). > Then we need a less-baroque layering, IMO. As an excercise, I started to pull apart with the GROUP BY ALL feature in mind to see if that isolated part could be refactored out into a neater layering combined with the rest of the code. On a related noted, the GROUP BY ALL code scribbles on the SelectStmt as part of its processing, is that really guaranteed to always be Ok? /* * Otherwise, the SQL standard says to treat it like "GROUP BY ()". * Build a representation of that, and let the rest of this function * handle it. */ grouplist = list_make1(makeGroupingSet(GROUPING_SET_EMPTY, NIL, -1)); > That is a large change to take on post-beta2, though. Maybe the path > of prudence is to revert GROUP BY ALL for v19 and try again for v20. Maybe so, it's a bit of a shame since this is a really neat bit of syntax but fixing incorrect query results post beta2 does carry the smell of most things potentially lurking in the shadows. -- Daniel Gustafsson
Re: RegisterShmemCallbacks() does nothing in single-user mode
От:
Nathan Bossart <nathandbossart@gmail.com>
Дата:
Does this one deserve a mention on the open items wiki [0]? [0] https://wiki.postgresql.org/wiki/PostgreSQL_19_Open_Items -- nathan
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Chao Li <li.evan.chao@gmail.com>
Дата:
> On Jul 18, 2026, at 04:15, Tom Lane wrote: > > I wrote: >> Thanks for doing that! I'll wait another day or so to see if anyone >> wants to push back on reverting this. > > Hearing nothing, pushed. Thanks for doing the legwork on that. > > regards, tom lane We need to notify Bruce to remove this feature from the PG19 release note. If that’s not done yet, I can do it. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/
Re: Fix GROUP BY ALL handling of ORDER BY operator semantics
От:
Daniel Gustafsson <daniel@yesql.se>
Дата:
> On 14 Jul 2026, at 18:08, Tom Lane wrote: > Daniel Gustafsson writes: >> Shouldn't those two queries yield the same result, or am I missing something >> obvious? > > I might be undercaffeinated still, but I think those are both correct. I think you are right, I confused myself on the cases where group by all is rewritten into group by (). FWIW, I had a look at what a revert of the commit would look like. The original commit included some while-in-there docs/comment cleanups which carry value on their own, so I think we should leave those in. The attached reverts GROUP BY ALL but retains the cleanups. If we decide to revert, the v19 back patch would need to remove the entry from the release notes as well, but I only did a master revert patch for now. -- Daniel Gustafsson