Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vfYXV-002mPX-15 for pgsql-hackers@arkaria.postgresql.org; Tue, 13 Jan 2026 07:10:06 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vfYXU-003JMX-1b for pgsql-hackers@arkaria.postgresql.org; Tue, 13 Jan 2026 07:10:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vfYXT-003JMP-1i for pgsql-hackers@lists.postgresql.org; Tue, 13 Jan 2026 07:10:04 +0000 Received: from fout-b6-smtp.messagingengine.com ([202.12.124.149]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vfYXQ-0009kW-2w for pgsql-hackers@postgresql.org; Tue, 13 Jan 2026 07:10:02 +0000 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfout.stl.internal (Postfix) with ESMTP id 1FFA21D00165; Tue, 13 Jan 2026 02:10:00 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-02.internal (MEProxy); Tue, 13 Jan 2026 02:10:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paquier.xyz; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1768288199; x=1768374599; bh=Lnutt2Scaj +vrcXcU4JWHxqRbEN4t7GI968iGq+YxJI=; b=HBbZOc4ngOv+IhLM0jsaBdISDJ X0M4u3MYY1/A8PeZ+iFu7muK4c71GM2mm1mn25pALPGOmuaSTizUa+OYEsDPJWuf KBuoFcRFQ6gj6zvVDQraqrS2QscO3i5v4W7jJETVAT8ArhXQ+OWQ6IOCrpHFosq/ ExtHur6rDyJCogWTdtADPPprWC9WZ3HxRR1cb6fxnjegNTPI1NaBl2HSLT/D7DHe 4PXud5aFM24D97U8u+Urn3kqTtLhmI0TXwY6kvf+uTmcEl/TYp3vJFGEznrmiJ9L pMomUf944XOmv5hRHDze0U2tPv/F8mafyDZUDQK6oX8qkP7tJHOs8dmgBzEw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t= 1768288199; x=1768374599; bh=Lnutt2Scaj+vrcXcU4JWHxqRbEN4t7GI968 iGq+YxJI=; b=mXytdMcB3HsDhDStq3e/No3PG+cm7pB3TSzw7CLJqQ0KT1RQknQ IyMSTZzP8IrtBcJPd8Sxfnj4CmoPkKdEgB/EWe5ipSDAHKLQ9iU10IIwbOpWal7i 3vv4pszljRI6oEgu3/EMOo5olShsvoVEGy1M7+iqQH5s3v/cEXtfs2uFJBpXtoxc d6kClERJcyg+76OzKtAkO9CstNeXjC3w15CCmhtoXR2Ak5t79gcdlKStPIqkZn4s oTJa34uGCFl8DfemFlFiW3BNczY9f5RjnFJsJOUwmYl+DJqmxPkM59UcAT1qc6AS p8ztCYwk78NoYG1aNnQ16uOnt85tUxIt68Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduudelieekucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdlfeehmdenucfjughrpeffhffvve fukfhfgggtuggjsehgtderredttddvnecuhfhrohhmpefoihgthhgrvghlucfrrghquhhi vghruceomhhitghhrggvlhesphgrqhhuihgvrhdrgiihiieqnecuggftrfgrthhtvghrnh epgeffjeevgfevuddvjedtvddtieejheduueelvddufedtgfefjedvkeevkeeivddvnecu ffhomhgrihhnpehpohhsthhgrhgvshhqlhdrohhrghenucevlhhushhtvghrufhiiigvpe dtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehmihgthhgrvghlsehprghquhhivghrrdig hiiipdhnsggprhgtphhtthhopeegpdhmohguvgepshhmthhpohhuthdprhgtphhtthhope hjihgrnhdruhhnihhvvghrshgrlhhithihsehgmhgrihhlrdgtohhmpdhrtghpthhtohep thhglhesshhsshdrphhghhdrphgrrdhushdprhgtphhtthhopehpghhsqhhlqdhhrggtkh gvrhhssehpohhsthhgrhgvshhqlhdrohhrghdprhgtphhtthhopehguhhofhgvnhhglhhi nhhugiesghhmrghilhdrtghomh X-ME-Proxy: Feedback-ID: i0fe9450f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 13 Jan 2026 02:09:58 -0500 (EST) Date: Tue, 13 Jan 2026 16:09:46 +0900 From: Michael Paquier To: jian he Cc: Tom Lane , PostgreSQL-development , Richard Guo Subject: Re: JumbleQuery ma treat different GROUP BY expr as the same Message-ID: References: <2546766.1768063587@sss.pgh.pa.us> <3354376.1768148370@sss.pgh.pa.us> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="GB+So/mvrzbdZUYX" Content-Disposition: inline In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --GB+So/mvrzbdZUYX Content-Type: multipart/mixed; boundary="SH5VMOyW5s+ivLlS" Content-Disposition: inline --SH5VMOyW5s+ivLlS Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Jan 12, 2026 at 04:20:44PM +0800, jian he wrote: > While working on it, I guess I found another bug, below JumbleQuery will= return > the same result: >=20 > SELECT FROM (VALUES (1::INT, 2::INT)) AS t(a, b) ORDER BY a, b; > SELECT a FROM (VALUES (1::INT, 2::INT)) AS t(a, b) ORDER BY a, b; > SELECT a, b FROM (VALUES (1::INT, 2::INT)) AS t(a, b) ORDER BY a, b; >=20 > so I think TargetEntry.resjunk should not be marked as query_jumble_ignor= e. Not sure how to feel about this one, as a primary node. 3db72ebcbe20 has put a query_jumble_ignore to TargetEntry.resjunk which was simply a consistent move with the pre-v15 branches because these columns have always been ignored. I have never heard complaints about that in the field with PGSS, TBH. The original choice comes from this thread, back in 2012 when this was still integrated into PGSS: https://www.postgresql.org/message-id/CAEYLb_WGeFCT7MfJ8FXf-CR6BSE6Lbn%2BO1= VX3%2BOGrc4Bscn4%3DA%40mail.gmail.com Anyway, let's not mix apples and oranges for now. The GROUP BY issue is a bug worth fixing on its own. What you are pointing out with resjunk is the original behavior we have been relying on. If we finish by changing it, this should not and cannot be backpatched. I have expanded a bit the tests, with a couple of extra patterns, giving the attached. The behavior is the same as the pre-v17 branches. -- Michael --SH5VMOyW5s+ivLlS Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0001-Fix-query-jumbling-computations-with-GROUP-BY-cla.patch" Content-Transfer-Encoding: quoted-printable =46rom 0da22db67538f3ead39c4a4fcbe2afc3a513454f Mon Sep 17 00:00:00 2001 =46rom: jian he Date: Mon, 12 Jan 2026 16:17:37 +0800 Subject: [PATCH v2] Fix query jumbling computations with GROUP BY clauses Discussion: https://postgr.es/m/CACJufxEy2W+tCqC7XuJ94r3ivWsM=3DonKJp94kRFx= 3hoARjBeFQ@mail.gmail.com --- src/include/nodes/parsenodes.h | 2 +- .../pg_stat_statements/expected/select.out | 98 ++++++++++++++++++- contrib/pg_stat_statements/sql/select.sql | 16 +++ 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index aac4bfc70d99..646d6ced763c 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1294,7 +1294,7 @@ typedef struct RangeTblEntry * Fields valid for a GROUP RTE (else NIL): */ /* list of grouping expressions */ - List *groupexprs pg_node_attr(query_jumble_ignore); + List *groupexprs; =20 /* * Fields valid in all RTEs: diff --git a/contrib/pg_stat_statements/expected/select.out b/contrib/pg_st= at_statements/expected/select.out index 75c896f38851..a069119c7900 100644 --- a/contrib/pg_stat_statements/expected/select.out +++ b/contrib/pg_stat_statements/expected/select.out @@ -459,6 +459,102 @@ SELECT COUNT(*) FROM pg_stat_statements WHERE query L= IKE '%FETCH FIRST%'; 2 (1 row) =20 +-- GROUP BY, HAVING, GROUPING +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a; + count=20 +------- + 1 +(1 row) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b; + count=20 +------- + 1 +(1 row) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a, b; + count=20 +------- + 1 +(1 row) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b, a; + count=20 +------- + 1 +(1 row) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY GROUPIN= G SETS(a, ()); + count=20 +------- + 1 + 1 +(2 rows) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY GROUPIN= G SETS(b, ()); + count=20 +------- + 1 + 1 +(2 rows) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a HAVIN= G a =3D 1; + count=20 +------- + 1 +(1 row) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a HAVIN= G a =3D 2; + count=20 +------- +(0 rows) + +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b HAVIN= G b =3D 1; + count=20 +------- +(0 rows) + +SELECT GROUPING(a) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a; + grouping=20 +---------- + 0 +(1 row) + +SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b; + grouping=20 +---------- + 0 +(1 row) + +SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a, b; + grouping=20 +---------- + 0 +(1 row) + +SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b, a; + grouping=20 +---------- + 0 +(1 row) + +SELECT calls, query FROM pg_stat_statements WHERE query LIKE '%GROUP BY%' = ORDER BY query COLLATE "C"; + calls | query = =20 +-------+------------------------------------------------------------------= ------------------------- + 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY GROUPING SETS(a, ()) + 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY GROUPING SETS(b, ()) + 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY a + 2 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY a HAVING a =3D $3 + 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY a, b + 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY b + 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY b HAVING b =3D $3 + 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP= BY b, a + 1 | SELECT GROUPING(a) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GR= OUP BY a + 1 | SELECT GROUPING(b) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GR= OUP BY a, b + 1 | SELECT GROUPING(b) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GR= OUP BY b + 1 | SELECT GROUPING(b) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GR= OUP BY b, a +(12 rows) + -- GROUP BY [DISTINCT] SELECT a, b, c FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c) @@ -548,7 +644,7 @@ SELECT ( SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING= %'; count=20 ------- - 2 + 6 (1 row) =20 SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/select.sql b/contrib/pg_stat_st= atements/sql/select.sql index 11662cde08c9..a10d618c034e 100644 --- a/contrib/pg_stat_statements/sql/select.sql +++ b/contrib/pg_stat_statements/sql/select.sql @@ -158,6 +158,22 @@ FETCH FIRST 2 ROW ONLY; =20 SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%FETCH FIRST%'; =20 +-- GROUP BY, HAVING, GROUPING +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a; +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b; +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a, b; +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b, a; +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY GROUPIN= G SETS(a, ()); +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY GROUPIN= G SETS(b, ()); +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a HAVIN= G a =3D 1; +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a HAVIN= G a =3D 2; +SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b HAVIN= G b =3D 1; +SELECT GROUPING(a) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a; +SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b; +SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a, b; +SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b, a; +SELECT calls, query FROM pg_stat_statements WHERE query LIKE '%GROUP BY%' = ORDER BY query COLLATE "C"; + -- GROUP BY [DISTINCT] SELECT a, b, c FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c) --=20 2.51.0 --SH5VMOyW5s+ivLlS-- --GB+So/mvrzbdZUYX Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEG72nH6vTowiyblFKnvQgOdbyQH0FAmll77oACgkQnvQgOdby QH2YBw//cu2hAv6Ux6E9Y9uSURcDjjxHupeH6F03ZQg1bKyrZt3/Cie4Ln/OV/7z cQoXXeLNGBvXxQp+4+Hv3ifu64cX9sG7g/+SuknX8vMqAIDMoiEPReCb/73bBfSK 1OZKxBmCPkPsQbv0NUbQbpp9IDDWynWF7KBXC7AJYb2ztwcB7SLwBNXatV/rfyV0 XOG+akLApd3RuObP8qC3Pg3typDZSpSyWadspMBvjZ1E5RtBywQEP+ECMjnhvrz+ HSgmchSdwyRgcfJMBtKxEcyvBCAUzPQCGZilgL5+TWgAlnN/YxCm5EtoiQlxdtj+ DL1qA98ZOe9IqJSaIaYW31j62AeM8dj2S4WfcXHcl4aUTOa+2fMH+QHUJsClYIuH /sZJaTa3tw5jZUkMXsSd6xn+AJEptBop4Y548r8E6kLVA6btDbhT1gtibrL1bIu3 TqhjBUcqUONUsQcdV2YteEPjPAVHeItazBjrEXdxKiPgYKZgcUKOLaL5SJCYeO1X tJpEsWueHG2otQg4pCAsUVuPk5utHrHud87lstcNelcisLBKcV0WSYcPqVjKxmVt 7P5aE4M4Dy8cOJypUAx9dFt9PTR/0JSwEZnAoZ6e1E6VJG6UcacmZ0DgCikVJ1f/ 9yRbA3VXNNrGvMLhFbec5jJRg+wu+FaIzn7aI4OMuygutLevUZU= =ExTs -----END PGP SIGNATURE----- --GB+So/mvrzbdZUYX--