Re: queryId constant squashing does not support prepared statements
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Sami Imseih <samimseih@gmail.com>
Cc: Dmitry Dolgov <9erthalion6@gmail.com>, Álvaro Herrera <alvherre@kurilemu.de>, Junwang Zhao <zhjwpku@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2025-05-24T01:42:34Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix typo in comment
- a3994ec6acb2 18.0 landed
-
Make query jumbling also squash PARAM_EXTERN params
- c2da1a5d6325 18.0 landed
-
Fix squashing algorithm for query texts
- 0f65f3eec478 18.0 landed
-
pg_stat_statements: Fix parameter number gaps in normalized queries
- 3c03b8cd7979 13.22 landed
- 8a1459f62ad1 14.19 landed
- 130300a15407 15.14 landed
- 7e8b44f4e0e6 16.10 landed
- 290e8ab32ac5 17.6 landed
- 35a428f30b15 18.0 landed
On Fri, May 23, 2025 at 08:05:47PM -0500, Sami Imseih wrote: > Since we assign new parameter symbols based on the highest external param > from the original query, as stated in the docs [0] "The parameter > symbols used to replace > constants in representative query texts start from the next number after the > highest $n parameter in the original query text", we could have gaps > in assigning > symbol values, such as the case below. > > ``` > test=# select where 1 in ($1, $2, $3) and 1 = $4 > test-# \bind 1 2 3 4 > test-# ; > -- > (0 rows) > > test=# select query from pg_stat_statements; > query > ------------------------------------------------ > select where $5 in ($6 /*, ... */) and $7 = $4 > ``` > > I don't think there is much we can do here, without introducing some serious > complexity. I think the docs make this scenario clear. In v17, we are a bit smarter with the numbering, with a normalization giving the following, starting at $1: select where $5 in ($1, $2, $3) and $6 = $4 So your argument about the $n parameters is kind of true, but I think the numbering logic in v17 to start at $1 is a less-confusing result. I would imagine that the squashed logic should give the following result on HEAD in this case if we want a maximum of consistency with the squashing of the IN elements taken into account: select where $3 in ($1 /*, ... */) and $4 = $2 Starting the count of the parameters at $4 would be strange. -- Michael