=== Applying patches on top of PostgreSQL commit ID 66ad764c8d517f59577d41ac3dad786729c9e10e === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Tue Apr 14 18:01:34 UTC 2026 On branch cf/6342 nothing to commit, working tree clean === using 'git am' to apply patch ./v3-0001-pg_stat_statements-Fix-nested-tracking-for-implic.patch === Applying: pg_stat_statements: Fix nested tracking for implicitly closed cursors Using index info to reconstruct a base tree... M contrib/pg_stat_statements/expected/level_tracking.out M contrib/pg_stat_statements/pg_stat_statements.c M contrib/pg_stat_statements/sql/level_tracking.sql Falling back to patching base and 3-way merge... Auto-merging contrib/pg_stat_statements/sql/level_tracking.sql Auto-merging contrib/pg_stat_statements/pg_stat_statements.c CONFLICT (content): Merge conflict in contrib/pg_stat_statements/pg_stat_statements.c Auto-merging contrib/pg_stat_statements/expected/level_tracking.out error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 pg_stat_statements: Fix nested tracking for implicitly closed cursors When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". === using patch(1) to apply patch ./v3-0001-pg_stat_statements-Fix-nested-tracking-for-implic.patch === patching file contrib/pg_stat_statements/expected/level_tracking.out Hunk #3 FAILED at 1687. 1 out of 3 hunks FAILED -- saving rejects to file contrib/pg_stat_statements/expected/level_tracking.out.rej patching file contrib/pg_stat_statements/pg_stat_statements.c Hunk #1 succeeded at 274 with fuzz 2 (offset 11 lines). Hunk #2 succeeded at 847 with fuzz 2 (offset -8 lines). Hunk #3 succeeded at 908 (offset -8 lines). Hunk #4 FAILED at 1019. Hunk #5 succeeded at 1034 (offset -19 lines). Hunk #6 FAILED at 1099. Hunk #7 succeeded at 1121 (offset -25 lines). Hunk #8 succeeded at 1233 (offset -25 lines). 2 out of 8 hunks FAILED -- saving rejects to file contrib/pg_stat_statements/pg_stat_statements.c.rej patching file contrib/pg_stat_statements/sql/level_tracking.sql Hunk #3 succeeded at 529 with fuzz 2 (offset 44 lines). Unstaged changes after reset: M contrib/pg_stat_statements/expected/level_tracking.out M contrib/pg_stat_statements/pg_stat_statements.c M contrib/pg_stat_statements/sql/level_tracking.sql Removing contrib/pg_stat_statements/expected/level_tracking.out.rej Removing contrib/pg_stat_statements/pg_stat_statements.c.rej === using 'git apply' to apply patch ./v3-0001-pg_stat_statements-Fix-nested-tracking-for-implic.patch === Applied patch to 'contrib/pg_stat_statements/expected/level_tracking.out' cleanly. Applied patch to 'contrib/pg_stat_statements/pg_stat_statements.c' with conflicts. Applied patch to 'contrib/pg_stat_statements/sql/level_tracking.sql' cleanly. U contrib/pg_stat_statements/pg_stat_statements.c diff --cc contrib/pg_stat_statements/pg_stat_statements.c index 95a5411a39d,cd3b7532665..00000000000 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@@ -274,7 -263,23 +274,21 @@@ static const ShmemCallbacks pgss_shmem_ /* Current nesting depth of planner/ExecutorRun/ProcessUtility calls */ static int nesting_level = 0; + /* + * Flag to handle nesting_level adjustment when pgss_ExecutorEnd is called + * during PortalCleanup after COMMIT (e.g., for DECLARE CURSOR statements). + * + * Set to true in pgss_ProcessUtility when processing COMMIT. When true, + * pgss_ExecutorEnd increments nesting_level to ensure proper tracking. + * + * Reset at command entry points (pgss_post_parse_analyze, pgss_planner, + * pgss_ExecutorStart, pgss_ProcessUtility, pgss_ExecutorRun) and + * unconditionally in pgss_ExecutorEnd to prevent persisting across + * statements. + */ + static bool is_txn_end = false; + /* Saved hook values */ -static shmem_request_hook_type prev_shmem_request_hook = NULL; -static shmem_startup_hook_type prev_shmem_startup_hook = NULL; static post_parse_analyze_hook_type prev_post_parse_analyze_hook = NULL; static planner_hook_type prev_planner_hook = NULL; static ExecutorStart_hook_type prev_ExecutorStart = NULL; @@@ -831,8 -853,10 +845,10 @@@ error * Post-parse-analysis hook: mark query with a queryId */ static void -pgss_post_parse_analyze(ParseState *pstate, Query *query, JumbleState *jstate) +pgss_post_parse_analyze(ParseState *pstate, Query *query, const JumbleState *jstate) { + is_txn_end = false; + if (prev_post_parse_analyze_hook) prev_post_parse_analyze_hook(pstate, query, jstate); @@@ -993,6 -1019,13 +1011,16 @@@ pgss_planner(Query *parse static void pgss_ExecutorStart(QueryDesc *queryDesc, int eflags) { ++<<<<<<< ours ++======= + is_txn_end = false; + + if (prev_ExecutorStart) + prev_ExecutorStart(queryDesc, eflags); + else + standard_ExecutorStart(queryDesc, eflags); + ++>>>>>>> theirs /* * If query has queryId zero, don't track it. This prevents double * counting of optimizable statements that are directly contained in @@@ -1060,29 -1101,48 +1090,68 @@@ pgss_ExecutorEnd(QueryDesc *queryDesc { int64 queryId = queryDesc->plannedstmt->queryId; ++<<<<<<< ours + if (queryId != INT64CONST(0) && queryDesc->query_instr && + pgss_enabled(nesting_level)) + { + pgss_store(queryDesc->sourceText, + queryId, + queryDesc->plannedstmt->stmt_location, + queryDesc->plannedstmt->stmt_len, + PGSS_EXEC, + INSTR_TIME_GET_MILLISEC(queryDesc->query_instr->total), + queryDesc->estate->es_total_processed, + &queryDesc->query_instr->bufusage, + &queryDesc->query_instr->walusage, + queryDesc->estate->es_jit ? &queryDesc->estate->es_jit->instr : NULL, + NULL, + queryDesc->estate->es_parallel_workers_to_launch, + queryDesc->estate->es_parallel_workers_launched, + queryDesc->plannedstmt->planOrigin); - } ++======= + if (is_txn_end) + nesting_level++; - if (prev_ExecutorEnd) - prev_ExecutorEnd(queryDesc); - else - standard_ExecutorEnd(queryDesc); + PG_TRY(); + { + if (queryId != INT64CONST(0) && queryDesc->totaltime && + pgss_enabled(nesting_level)) + { + /* + * Make sure stats accumulation is done. (Note: it's okay if + * several levels of hook all do this.) + */ + InstrEndLoop(queryDesc->totaltime); + + pgss_store(queryDesc->sourceText, + queryId, + queryDesc->plannedstmt->stmt_location, + queryDesc->plannedstmt->stmt_len, + PGSS_EXEC, + INSTR_TIME_GET_MILLISEC(queryDesc->totaltime->total), + queryDesc->estate->es_total_processed, + &queryDesc->totaltime->bufusage, + &queryDesc->totaltime->walusage, + queryDesc->estate->es_jit ? &queryDesc->estate->es_jit->instr : NULL, + NULL, + queryDesc->estate->es_parallel_workers_to_launch, + queryDesc->estate->es_parallel_workers_launched, + queryDesc->plannedstmt->planOrigin); + } + + if (prev_ExecutorEnd) + prev_ExecutorEnd(queryDesc); + else + standard_ExecutorEnd(queryDesc); ++>>>>>>> theirs + } + PG_FINALLY(); + { + if (is_txn_end) + nesting_level--; + is_txn_end = false; + } + PG_END_TRY(); } /*