Skip to content

Commit f7a97b6

Browse files
committed
Update query_id computation
Properly fix: - the "ONLY" in FROM [ONLY] isn't hashed - the agglevelsup field in GROUPING isn't hashed - WITH TIES not being hashed (new in PG 13) - "DISTINCT" in "GROUP BY [DISTINCT]" isn't hashed (new in PG 14) Reported-by: Julien Rouhaud Discussion: https://postgr.es/m/20210425081119.ulyzxqz23ueh3wuj@nol
1 parent 5df6aea commit f7a97b6

File tree

3 files changed

+207
-0
lines changed

3 files changed

+207
-0
lines changed

contrib/pg_stat_statements/expected/pg_stat_statements.out

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,4 +916,155 @@ SELECT query, toplevel, plans, calls FROM pg_stat_statements WHERE query LIKE '%
916916
$$ LANGUAGE plpgsql | | |
917917
(3 rows)
918918

919+
-- FROM [ONLY]
920+
CREATE TABLE tbl_inh(id integer);
921+
CREATE TABLE tbl_inh_1() INHERITS (tbl_inh);
922+
INSERT INTO tbl_inh_1 SELECT 1;
923+
SELECT * FROM tbl_inh;
924+
id
925+
----
926+
1
927+
(1 row)
928+
929+
SELECT * FROM ONLY tbl_inh;
930+
id
931+
----
932+
(0 rows)
933+
934+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%FROM%tbl_inh%';
935+
count
936+
-------
937+
2
938+
(1 row)
939+
940+
-- WITH TIES
941+
CREATE TABLE limitoption AS SELECT 0 AS val FROM generate_series(1, 10);
942+
SELECT *
943+
FROM limitoption
944+
WHERE val < 2
945+
ORDER BY val
946+
FETCH FIRST 2 ROWS WITH TIES;
947+
val
948+
-----
949+
0
950+
0
951+
0
952+
0
953+
0
954+
0
955+
0
956+
0
957+
0
958+
0
959+
(10 rows)
960+
961+
SELECT *
962+
FROM limitoption
963+
WHERE val < 2
964+
ORDER BY val
965+
FETCH FIRST 2 ROW ONLY;
966+
val
967+
-----
968+
0
969+
0
970+
(2 rows)
971+
972+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%FETCH FIRST%';
973+
count
974+
-------
975+
2
976+
(1 row)
977+
978+
-- GROUP BY [DISTINCT]
979+
SELECT a, b, c
980+
FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c)
981+
GROUP BY ROLLUP(a, b), rollup(a, c)
982+
ORDER BY a, b, c;
983+
a | b | c
984+
---+---+---
985+
1 | 2 | 3
986+
1 | 2 |
987+
1 | 2 |
988+
1 | | 3
989+
1 | | 3
990+
1 | |
991+
1 | |
992+
1 | |
993+
4 | | 6
994+
4 | | 6
995+
4 | | 6
996+
4 | |
997+
4 | |
998+
4 | |
999+
4 | |
1000+
4 | |
1001+
7 | 8 | 9
1002+
7 | 8 |
1003+
7 | 8 |
1004+
7 | | 9
1005+
7 | | 9
1006+
7 | |
1007+
7 | |
1008+
7 | |
1009+
| |
1010+
(25 rows)
1011+
1012+
SELECT a, b, c
1013+
FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c)
1014+
GROUP BY DISTINCT ROLLUP(a, b), rollup(a, c)
1015+
ORDER BY a, b, c;
1016+
a | b | c
1017+
---+---+---
1018+
1 | 2 | 3
1019+
1 | 2 |
1020+
1 | | 3
1021+
1 | |
1022+
4 | | 6
1023+
4 | | 6
1024+
4 | |
1025+
4 | |
1026+
7 | 8 | 9
1027+
7 | 8 |
1028+
7 | | 9
1029+
7 | |
1030+
| |
1031+
(13 rows)
1032+
1033+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%GROUP BY%ROLLUP%';
1034+
count
1035+
-------
1036+
2
1037+
(1 row)
1038+
1039+
-- GROUPING SET agglevelsup
1040+
SELECT (
1041+
SELECT (
1042+
SELECT GROUPING(a,b) FROM (VALUES (1)) v2(c)
1043+
) FROM (VALUES (1,2)) v1(a,b) GROUP BY (a,b)
1044+
) FROM (VALUES(6,7)) v3(e,f) GROUP BY ROLLUP(e,f);
1045+
grouping
1046+
----------
1047+
0
1048+
0
1049+
0
1050+
(3 rows)
1051+
1052+
SELECT (
1053+
SELECT (
1054+
SELECT GROUPING(e,f) FROM (VALUES (1)) v2(c)
1055+
) FROM (VALUES (1,2)) v1(a,b) GROUP BY (a,b)
1056+
) FROM (VALUES(6,7)) v3(e,f) GROUP BY ROLLUP(e,f);
1057+
grouping
1058+
----------
1059+
3
1060+
0
1061+
1
1062+
(3 rows)
1063+
1064+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING%';
1065+
count
1066+
-------
1067+
2
1068+
(1 row)
1069+
9191070
DROP EXTENSION pg_stat_statements;

contrib/pg_stat_statements/sql/pg_stat_statements.sql

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,4 +385,56 @@ END;
385385
$$ LANGUAGE plpgsql;
386386
SELECT query, toplevel, plans, calls FROM pg_stat_statements WHERE query LIKE '%DELETE%' ORDER BY query COLLATE "C", toplevel;
387387

388+
-- FROM [ONLY]
389+
CREATE TABLE tbl_inh(id integer);
390+
CREATE TABLE tbl_inh_1() INHERITS (tbl_inh);
391+
INSERT INTO tbl_inh_1 SELECT 1;
392+
393+
SELECT * FROM tbl_inh;
394+
SELECT * FROM ONLY tbl_inh;
395+
396+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%FROM%tbl_inh%';
397+
398+
-- WITH TIES
399+
CREATE TABLE limitoption AS SELECT 0 AS val FROM generate_series(1, 10);
400+
SELECT *
401+
FROM limitoption
402+
WHERE val < 2
403+
ORDER BY val
404+
FETCH FIRST 2 ROWS WITH TIES;
405+
406+
SELECT *
407+
FROM limitoption
408+
WHERE val < 2
409+
ORDER BY val
410+
FETCH FIRST 2 ROW ONLY;
411+
412+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%FETCH FIRST%';
413+
414+
-- GROUP BY [DISTINCT]
415+
SELECT a, b, c
416+
FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c)
417+
GROUP BY ROLLUP(a, b), rollup(a, c)
418+
ORDER BY a, b, c;
419+
SELECT a, b, c
420+
FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c)
421+
GROUP BY DISTINCT ROLLUP(a, b), rollup(a, c)
422+
ORDER BY a, b, c;
423+
424+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%GROUP BY%ROLLUP%';
425+
426+
-- GROUPING SET agglevelsup
427+
SELECT (
428+
SELECT (
429+
SELECT GROUPING(a,b) FROM (VALUES (1)) v2(c)
430+
) FROM (VALUES (1,2)) v1(a,b) GROUP BY (a,b)
431+
) FROM (VALUES(6,7)) v3(e,f) GROUP BY ROLLUP(e,f);
432+
SELECT (
433+
SELECT (
434+
SELECT GROUPING(e,f) FROM (VALUES (1)) v2(c)
435+
) FROM (VALUES (1,2)) v1(a,b) GROUP BY (a,b)
436+
) FROM (VALUES(6,7)) v3(e,f) GROUP BY ROLLUP(e,f);
437+
438+
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING%';
439+
388440
DROP EXTENSION pg_stat_statements;

src/backend/utils/misc/queryjumble.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,13 +230,15 @@ JumbleQueryInternal(JumbleState *jstate, Query *query)
230230
JumbleExpr(jstate, (Node *) query->onConflict);
231231
JumbleExpr(jstate, (Node *) query->returningList);
232232
JumbleExpr(jstate, (Node *) query->groupClause);
233+
APP_JUMB(query->groupDistinct);
233234
JumbleExpr(jstate, (Node *) query->groupingSets);
234235
JumbleExpr(jstate, query->havingQual);
235236
JumbleExpr(jstate, (Node *) query->windowClause);
236237
JumbleExpr(jstate, (Node *) query->distinctClause);
237238
JumbleExpr(jstate, (Node *) query->sortClause);
238239
JumbleExpr(jstate, query->limitOffset);
239240
JumbleExpr(jstate, query->limitCount);
241+
APP_JUMB(query->limitOption);
240242
JumbleRowMarks(jstate, query->rowMarks);
241243
JumbleExpr(jstate, query->setOperations);
242244
}
@@ -259,6 +261,7 @@ JumbleRangeTable(JumbleState *jstate, List *rtable)
259261
case RTE_RELATION:
260262
APP_JUMB(rte->relid);
261263
JumbleExpr(jstate, (Node *) rte->tablesample);
264+
APP_JUMB(rte->inh);
262265
break;
263266
case RTE_SUBQUERY:
264267
JumbleQueryInternal(jstate, rte->subquery);
@@ -399,6 +402,7 @@ JumbleExpr(JumbleState *jstate, Node *node)
399402
GroupingFunc *grpnode = (GroupingFunc *) node;
400403

401404
JumbleExpr(jstate, (Node *) grpnode->refs);
405+
APP_JUMB(grpnode->agglevelsup);
402406
}
403407
break;
404408
case T_WindowFunc:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy