On Sun, Jan 25, 2026 at 08:00:00AM +0200, Alexander Lakhin wrote: > I can reproduce this locally with no extra tricks. Could you please adjust > the test for this mode?
Reproduced here. That was trickier than it looks. A trick with debug_discard_caches cannot help, because with a CLOBBER_CACHE_ALWAYS build we would still do a GetCachedPlan() -> RevalidateCachedQuery() that goes through the post-parse analyze hook where the query would still be normalized, showing up in the output anyway. So I have come up with a plan B. If we do a DISCARD PLANS before the *first* function call, we can force the test to revalidate the cached query without caring about CLOBBER_CACHE_ALWAYS, meaning that we would always store a normalized version of the inner query. The point of the test is to check after the nesting level calculation in the planner hook, and the test is still able to check that correctly. If I remove the nesting_level bits from the code while the DISCARD is around, the entry is stored as a top level entry incorrectly, but it should be stored as toplevel=false. I'll go apply the attached shortly, after some more checks.. -- Michael
From 2a4dfcc3e47316e3784e959df30a9be251a36b8e Mon Sep 17 00:00:00 2001 From: Michael Paquier <[email protected]> Date: Sun, 25 Jan 2026 16:39:41 +0900 Subject: [PATCH] Fix PGSS test --- contrib/pg_stat_statements/expected/level_tracking.out | 9 ++++++++- contrib/pg_stat_statements/sql/level_tracking.sql | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/contrib/pg_stat_statements/expected/level_tracking.out b/contrib/pg_stat_statements/expected/level_tracking.out index 35e889fabd27..a15d897e59b0 100644 --- a/contrib/pg_stat_statements/expected/level_tracking.out +++ b/contrib/pg_stat_statements/expected/level_tracking.out @@ -1543,6 +1543,13 @@ SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- planner - all-level tracking. SET pg_stat_statements.track_planning = TRUE; +-- Release all cached plans before the first function call. This matters +-- when debug_discard_caches is enabled, which would store a normalized +-- version of the inner query of the function. Forcing a plan rebuild +-- ensures that a normalized version is always stored with the stats entry, +-- while checking that the nesting level is computed correctly in the +-- planner hook. +DISCARD PLANS; SELECT PLUS_THREE(8); plus_three ------------ @@ -1560,7 +1567,7 @@ SELECT toplevel, calls, rows, plans, query FROM pg_stat_statements toplevel | calls | rows | plans | query ----------+-------+------+-------+-------------------------------------------------------------------- t | 2 | 2 | 2 | SELECT PLUS_THREE($1) - f | 2 | 2 | 2 | SELECT i + 3 LIMIT 1 + f | 2 | 2 | 2 | SELECT i + $2 LIMIT $3 t | 1 | 1 | 0 | SELECT pg_stat_statements_reset() IS NOT NULL AS t t | 0 | 0 | 1 | SELECT toplevel, calls, rows, plans, query FROM pg_stat_statements+ | | | | ORDER BY query COLLATE "C" diff --git a/contrib/pg_stat_statements/sql/level_tracking.sql b/contrib/pg_stat_statements/sql/level_tracking.sql index 8dd3fc2df089..003efb8184b1 100644 --- a/contrib/pg_stat_statements/sql/level_tracking.sql +++ b/contrib/pg_stat_statements/sql/level_tracking.sql @@ -435,7 +435,13 @@ SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- planner - all-level tracking. SET pg_stat_statements.track_planning = TRUE; - +-- Release all cached plans before the first function call. This matters +-- when debug_discard_caches is enabled, which would store a normalized +-- version of the inner query of the function. Forcing a plan rebuild +-- ensures that a normalized version is always stored with the stats entry, +-- while checking that the nesting level is computed correctly in the +-- planner hook. +DISCARD PLANS; SELECT PLUS_THREE(8); SELECT PLUS_THREE(10); -- 2.51.0
signature.asc
Description: PGP signature
