Skip to content

PG19: propagate EXPLAIN IO to worker nodes - #8807

Open
ibrahim halatci (ihalatci) wants to merge 1 commit into
ihalatci-pg19-repack-lock-fixfrom
ihalatci-pg19-explain-io-propagation
Open

ibrahim halatci (ihalatci) wants to merge 1 commit into
ihalatci-pg19-repack-lock-fixfrom
ihalatci-pg19-explain-io-propagation

Conversation

@ihalatci

@ihalatci ibrahim halatci (ihalatci) commented Aug 27, 2026 •

Copy link
Copy Markdown
Contributor

Propagate PostgreSQL 19 RC1 EXPLAIN IO to worker nodes.

Stack

Native stack layer 3: #8929 -> #8805 -> #8807

This PR is based on ihalatci-pg19-repack-lock-fix at
805849c8ed7b3fa5e77edf289c5e2b159b4bb529.

Changes

  • Propagate ExplainState.io to worker EXPLAIN commands on PostgreSQL 19+.
  • Preserve INSTRUMENT_IO through the saved-plan EXPLAIN ANALYZE path.
  • Cover both saved-plan and live remote-EXPLAIN paths in pg19 regression tests.
  • Keep PostgreSQL 17/18 behavior unchanged through existing version guards.

The diff relative to #8805 is limited to:

  • src/backend/distributed/planner/multi_explain.c
  • src/test/regress/bin/normalize.sed
  • src/test/regress/sql/pg19.sql
  • src/test/regress/expected/pg19.out

Validation

  • PostgreSQL 19rc1 Citus configure, build, and install: passed.
  • src/test/regress/citus_tests/run_test.py pg19: passed (7/7).
  • src/test/regress/citus_tests/run_test.py multi_explain: passed (16/16).
  • src/test/regress/citus_tests/run_test.py multi_mx_explain: passed (10/10).
  • PostgreSQL 17.10 configure/build: passed.
  • PostgreSQL 18.4 configure/build: passed.
  • citus_indent --check: passed.
  • ci/editorconfig.sh: passed.
  • git diff --check: passed.
  • make check-style: repository-baseline flake8 failures only; reproduced
    unchanged on PG19: use ShareUpdateExclusiveLock for REPACK CONCURRENTLY #8805. The changed C file and editorconfig checks pass.

Fixes #8770

@codecov

codecov Bot commented Aug 27, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.81%. Comparing base (33f3457) to head (a1f6c08).

Additional details and impacted files
@@                        Coverage Diff                        @@
##           ihalatci-pg19-repack-lock-fix    #8807      +/-   ##
=================================================================
- Coverage                          88.81%   88.81%   -0.01%     
=================================================================
  Files                                290      290              
  Lines                              65456    65462       +6     
  Branches                            8255     8256       +1     
=================================================================
  Hits                               58137    58137              
- Misses                              4937     4941       +4     
- Partials                            2382     2384       +2     
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ihalatci

Copy link
Copy Markdown
Contributor Author

Beta 4 disposition: retained. Restack this PR directly onto current main, removing #8805/#8806 ancestry and keeping only the two required EXPLAIN IO propagation sites plus focused Beta 4 tests.

@ihalatci
ibrahim halatci (ihalatci) force-pushed the ihalatci-pg19-explain-io-propagation branch from c2e0c3d to 3483bc2 Compare October 16, 2026 08:50
@ihalatci
ibrahim halatci (ihalatci) changed the base branch from ihalatci-pg19-eager-agg-containment to ihalatci-pg19-repack-lock-fix October 16, 2026 08:50
@ihalatci
ibrahim halatci (ihalatci) added this pull request to stack #8930 October 16, 2026 08:52
ibrahim halatci (ihalatci) added a commit that referenced this pull request Oct 16, 2026
DESCRIPTION: Update PostgreSQL 19 CI and regression coverage to RC1

Update build, nightly cassert, and pg_upgrade image pins to the
published PostgreSQL 19 RC1 release images from merged
citusdata/the-process#253 (image suffix `-va0a5582`). The stable image
publication succeeded for merge commit
`a0a5582b39e72cec476f7b6ba37a2cf97572b930` in [the-process
build-test-images
run](https://github.com/citusdata/the-process/actions/runs/38888435235).
Preserve the existing exclusion of PG19 from Citus upgrade coverage.

Add a distributed `ON CONFLICT` regression for PostgreSQL's fix to
inference when an index expression on a NOT NULL column simplifies to a
Var ([upstream
commit](postgres/postgres@f9ccc5e)).
No Citus source change was indicated: the regression fails on PostgreSQL
19 Beta 4 and passes on RC1.

## RC1 feature audit

The audited upstream range is `REL_19_BETA4`
(`b73d13c32c834a2c8e1c60cb92f79530376cedf1`) through `REL_19_RC1`
(`0b8bff042a997fe50fcd1c4c83b9ef1cc9ed8a89`): 132 commits and 300
changed paths, with no feature-revert commit.

The Citus umbrella features remain present in RC1:

- REPACK / REPACK CONCURRENTLY: #8756 / #8805 remain relevant.
- EXPLAIN IO: #8770 / #8807 remain relevant.
- Constraint enforceability: #8758 / #8808 remain relevant.
- JSON COPY: merged #8760 / #8765 remains compatible with RC1.
- Distributed REPACK CONCURRENTLY support: #8772 remains a design-only
exception without an implementation PR.

The approved dependent topology is:

- native stack `#8929 -> #8805 -> #8807`;
- #8808 as an independent sibling based directly on this branch after
removing unrelated DETACH changes.

Version-neutral #8759 and #8762 are no longer subissues of #8782.

PostgreSQL RC2 is scheduled for 2026-11-12 and GA for 2026-11-19. RC2
must be rechecked for the open upstream eager-aggregation and
CHECK-enforcement items before final PG19 feature completion.

## Validation

Local validation on PostgreSQL 19 RC1: `pg19` (7/7), `multi_upsert`
(7/7), `multi_insert_select_conflict` (7/7), `multi_copy` (15/15),
`multi_outer_join` (7/7), `multi_deparse_shard_query` (7/7),
`multi_deparse_function` (7/7), and `multi_join_order_additional`
(16/16, with base schedule and whole schedule line). `merge` also passed
on Beta 4 after installing the missing `postgres_fdw` test dependency.

The repartition planning/pruning/task-assignment debug task-ID output
differences reproduce on both Beta 4 and RC1; no expected output was
changed for them.

The prior Citus head `7259ac9c94e9a6595eac092b18afc47b69197d4a` passed
all automatic checks. This suffix-only update switches CI to the
successfully published stable RC1 images; checks for the current head
will run after this update.

---------

Co-authored-by: Ibrahim Halatci <ihalatci@microsoft.com>
Copilot-Session: f2aeb1f7-5872-4dc8-a288-2bdafcf80c04
PG19 adds an IO option to EXPLAIN. Citus forwards a fixed set of options
to the worker nodes, so IO was silently dropped: EXPLAIN (ANALYZE, IO) on a
distributed table succeeded but the worker plans contained no IO information.

Because IO requires ANALYZE, the option travels over the saved-plan path
(WrapQueryForExplainAnalyze -> worker_save_query_explain_analyze ->
ExplainWorkerPlan), not over BuildRemoteExplainQuery. The decisive gap was
ExplainWorkerPlan(), which rebuilds instrument_option from scratch and did not
set INSTRUMENT_IO, so forwarding the option alone would have had no effect.

Forwards es->io through the option struct, the remote EXPLAIN query, the JSONB
options blob and back into instrument_option, mirroring the existing PG17
MEMORY/SERIALIZE handling.

Fixes #8770

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6481a75c-8b50-4476-832e-fbe9e4fb1196
@ihalatci
ibrahim halatci (ihalatci) force-pushed the ihalatci-pg19-explain-io-propagation branch from 3483bc2 to a1f6c08 Compare October 16, 2026 11:15
@ihalatci
ibrahim halatci (ihalatci) marked this pull request as ready for review October 16, 2026 11:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PG19: propagate the EXPLAIN IO option to worker nodes

2 participants