postgresql/contrib/pg_stat_statements
Michael Paquier 8a1459f62a pg_stat_statements: Fix parameter number gaps in normalized queries
pg_stat_statements anticipates that certain constant locations may be
recorded multiple times and attempts to avoid calculating a length for
these locations in fill_in_constant_lengths().

However, during generate_normalized_query() where normalized query
strings are generated, these locations are not excluded from
consideration.  This could increment the parameter number counter for
every recorded occurrence at such a location, leading to an incorrect
normalization in certain cases with gaps in the numbers reported.

For example, take this query:
SELECT WHERE '1' IN ('2'::int, '3'::int::text)
Before this commit, it would be normalized like that, with gaps in the
parameter numbers:
SELECT WHERE $1 IN ($3::int, $4::int::text)
However the correct, less confusing one should be like that:
SELECT WHERE $1 IN ($2::int, $3::int::text)

This commit fixes the computation of the parameter numbers to track the
number of constants replaced with an $n by a separate counter instead of
the iterator used to loop through the list of locations.

The underlying query IDs are not changed, neither are the normalized
strings for existing PGSS hash entries.  New entries with fresh
normalized queries would automatically get reshaped based on the new
parameter numbering.

Issue discovered while discussing a separate problem for HEAD, but this
affects all the stable branches.

Author: Sami Imseih <samimseih@gmail.com>
Discussion: https://postgr.es/m/CAA5RZ0tzxvWXsacGyxrixdhy3tTTDfJQqxyFBRFh31nNHBQ5qA@mail.gmail.com
Backpatch-through: 13
2025-05-29 11:26:31 +09:00
..
expected pg_stat_statements: Fix parameter number gaps in normalized queries 2025-05-29 11:26:31 +09:00
sql pg_stat_statements: Fix parameter number gaps in normalized queries 2025-05-29 11:26:31 +09:00
.gitignore pg_stat_statements: Add .gitignore file for tests 2016-11-13 08:24:43 -05:00
Makefile Merge v1.10 of pg_stat_statements into v1.9 2021-04-08 15:15:17 +02:00
pg_stat_statements--1.0--1.1.sql Fix typo in update scripts for some contrib modules. 2013-07-19 04:13:01 +09:00
pg_stat_statements--1.1--1.2.sql Keep pg_stat_statements' query texts in a file, not in shared memory. 2014-01-27 15:37:54 -05:00
pg_stat_statements--1.2--1.3.sql Add stats for min, max, mean, stddev times to pg_stat_statements. 2015-03-27 15:43:22 -04:00
pg_stat_statements--1.3--1.4.sql Update pg_stat_statements extension for parallel query. 2016-06-10 10:42:01 -04:00
pg_stat_statements--1.4--1.5.sql Default monitoring roles 2017-03-30 14:18:53 -04:00
pg_stat_statements--1.4.sql Update pg_stat_statements extension for parallel query. 2016-06-10 10:42:01 -04:00
pg_stat_statements--1.5--1.6.sql Revoke pg_stat_statements_reset() permissions 2018-09-25 09:55:44 +09:00
pg_stat_statements--1.6--1.7.sql Extend pg_stat_statements_reset to reset statistics specific to a 2019-01-11 08:50:09 +05:30
pg_stat_statements--1.7--1.8.sql Change the display of WAL usage statistics in Explain. 2020-05-05 08:00:53 +05:30
pg_stat_statements--1.8--1.9.sql Merge v1.10 of pg_stat_statements into v1.9 2021-04-08 15:15:17 +02:00
pg_stat_statements.c pg_stat_statements: Fix parameter number gaps in normalized queries 2025-05-29 11:26:31 +09:00
pg_stat_statements.conf Allow compute_query_id to be set to 'auto' and make it default 2021-05-15 14:13:09 -04:00
pg_stat_statements.control Merge v1.10 of pg_stat_statements into v1.9 2021-04-08 15:15:17 +02:00