Hi, I reproduced #19877 and attached a candidate fix for review.
auto_explain currently checks its backend-global sampling flag again at ExecutorEnd. A statement executed while a cursor remains open can replace that flag, so a sampled cursor loses its plan. With pg_stat_statements requesting instrumentation, the reverse also happens: an unsampled cursor can be logged after another statement enables sampling. The patch records selection and nesting depth in auto_explain's own QueryDesc extension state, following the existing pg_stat_statements pattern. ExecutorEnd uses that state rather than the latest global flag. It also adds cursor tests for explicit CLOSE and implicit COMMIT, with pg_stat_statements preloaded. Tested in WSL on Ubuntu, against 70c4a57b64d39c526eb4c44a925eb92a6e56f3c5, with --enable-cassert: - Unpatched: 4 failures out of 18 sampling assertions. - Patched: all 18 sampling assertions pass. - Full auto_explain and pg_stat_statements check targets pass. - PostgreSQL core make check passes. Meson registration was reviewed, but I have not run a Meson build. This is a master-only candidate using the QueryDesc extension-state API, not a backpatch for released branches. It does not change sampling inheritance when nested queries start during cursor execution. I used Codex to assist with the patch and test preparation, and ran the Linux validation locally. Report: https://www.postgresql.org/message-id/[email protected] Feedback on the approach is welcome. The change adds a small state allocation for selected queries; I have not benchmarked its overhead. I'm sending this for review for the next CommitFest. Thanks, Hristos Nenkov
v1-0001-auto-explain-preserve-query-sampling.patch
Description: Binary data
