From: Tom Lane <tgl@sss.pgh.pa.us>
To: Chris Rohlfs <seeken@gmail.com>
Cc: pgsql-bugs@lists.postgresql.org
Subject: Re: Sort Order inconsistent when using Grouping Sets Rollup
Date: Tue, 22 Nov 2022 10:41:06 -0500
Message-ID: <3455209.1669131666@sss.pgh.pa.us> (raw)
In-Reply-To: <CAL48EtKDHCKnOkLdSgOmgBZBcahU2zpBqyzeET_ZM74uNZBFHg@mail.gmail.com>
References: <CAL48EtKDHCKnOkLdSgOmgBZBcahU2zpBqyzeET_ZM74uNZBFHg@mail.gmail.com>
Chris Rohlfs <seeken@gmail.com> writes:
> The attached file will create a table and run 2 queries, the first of which
> is not honoring the requested sort order. I expect the Nulls first.
Yeah, this is a known issue that's a bit difficult to fix. Because
you've constrained both the first_name and last_name columns to have
unique values:
> where (( "actor_id" >= 1 ) and ( "last_name" = 'GUINESS' ) and (
> "first_name" = 'PENELOPE' ))
the planner is of the opinion that sorting on those columns is a no-op,
so it doesn't bother to emit a sort step after the aggregation. We
need to teach it that the output of GROUP BY, when there are grouping
sets, is not identical to the input because of possible injection of
null values. I'm working on some patches that should lead to that result,
but they won't appear till v16 at the earliest.
As a grotty workaround, you could do the ordering in a different
query level:
=# explain select * from (
select "last_name", "first_name", count("actor_id")
from actor
where (( "actor_id" >= 1 ) and ( "last_name" = 'GUINESS' ) and ( "first_name" = 'PENELOPE' ))
group by rollup( 1, 2 )
) ss
order by 2 asc nulls first, 1 asc nulls first;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Sort (cost=23.71..23.72 rows=3 width=72)
Sort Key: actor.first_name NULLS FIRST, actor.last_name NULLS FIRST
-> GroupAggregate (cost=0.00..23.69 rows=3 width=72)
Group Key: actor.last_name, actor.first_name
Group Key: actor.last_name
Group Key: ()
-> Seq Scan on actor (cost=0.00..23.65 rows=1 width=68)
Filter: ((actor_id >= 1) AND (last_name = 'GUINESS'::text) AND (first_name = 'PENELOPE'::text))
(8 rows)
regards, tom lane
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: tgl@sss.pgh.pa.us, seeken@gmail.com, pgsql-bugs@lists.postgresql.org
Subject: Re: Sort Order inconsistent when using Grouping Sets Rollup
In-Reply-To: <3455209.1669131666@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox