While triaging backports for the 12.1.14 patch release, I found the same four bug fixes missing from release-14.0 that were missing from release-12.1 (shipped in 12.1.14 via #8703–#8706) and from release-13.2 (#8707, PRs #8709–#8712). A fifth, #8465, is missing from all three lines.
Raising this separately because it looks like a cross-branch miss rather than a deliberate 14.x exclusion — and because two of these were explicitly labeled cherry-pick-14, closed, and then never shipped.
Missing commits
| Fix |
main commit |
Merged to main |
On main |
On release-14.0 |
#8465 — CREATE EXTENSION IF NOT EXISTS fails for non-owner users (fixes #7091) |
fde8ceace |
2026-02-10 |
✅ |
❌ |
| #8561 — crash on writable standby coordinator writing to a coordinator-local shard (fixes #8426) |
8b99e078b |
2026-05-06 |
✅ |
❌ |
#8556 — segfault in EXPLAIN with LEFT JOIN + correlated subqueries (fixes #8548) |
a3d5708a6 |
2026-05-07 |
✅ |
❌ |
#8498 — type mismatch when COLLATE is used with a type cast (fixes #8469) |
810e7fbb9 |
2026-05-22 |
✅ |
❌ |
#8594 — CleanupRecordExists uses a stale snapshot (shard-cleanup race) |
c41586cc8 |
2026-06-03 |
✅ |
❌ |
Why this looks unintentional
release-14.0 branched from main at 803f0ac57 (2026-01-18); all five fixes landed after that point and need explicit backporting.
- The branch is actively maintained — head
8cdb17e25 (2026-07-31), about two months after the newest of these landed on main. It is receiving backports; these five just were not picked up.
- Verified per fix with
git merge-base --is-ancestor, a PR-number set-difference over the branch history, and a direct code gate confirming the vulnerable code is still present:
Note on methodology: a naive #\d+ grep over commit subjects gives false positives here, because Citus backport subjects use three different forms ((#8700), (Backport PR8692), (Backport PR#8651)). Matching on (?:#|PR#?)(\d{4,5}) and then confirming with a content diff is what produced the list above.
Severity
Four of the five are crash / wrong-result class:
The label queue already flagged two of these for 14.x
| Issue |
State |
Fixed on main by |
On release-14.0 |
#8548 — segfault on EXPLAIN, reported against released Citus 14.0.0 / PG18.1 |
CLOSED |
#8556 |
❌ not delivered |
| #8426 — error on insert on secondary worker node |
CLOSED |
#8561 |
❌ not delivered |
Both carry cherry-pick-14 and can have the label cleared once the backports land. (#8470 also carries it, but its fix #8535 is still unmerged upstream, so it stays deferred.)
Backport complexity: lower than 12.1 or 13.2
release-14.0 shares main's PG16/17/18 support range and its pseudoconstant-quals error string byte-for-byte (recursive_planning.c:531-534). So neither of the adaptations the other two lines needed applies here:
- the 12.1
foreach_declared_ptr → foreach_ptr rename — not needed, foreach_declared_ptr exists on 14.0
- the 13.2 five-line rewrite of
subquery_in_where_0.out — not needed, the strings already match
All five cherry-pick cleanly with zero conflicts and zero adaptation; git patch-id --stable is identical to upstream for every one. release-14.0 also has no _N numbered expected-output variants at all, so the PG-version-variant trap that bit the 13.2 backport of #8556 cannot occur here.
Suggested action
Cherry-pick all five onto release-14.0, one PR each. Note that release-14.0 is the 14.x line itself (configure.ac = 14.2.0, default_version = 14.2-1; there is no release-14.1/release-14.2 branch), so these would ship in 14.2.0.
While triaging backports for the 12.1.14 patch release, I found the same four bug fixes missing from
release-14.0that were missing fromrelease-12.1(shipped in 12.1.14 via #8703–#8706) and fromrelease-13.2(#8707, PRs #8709–#8712). A fifth, #8465, is missing from all three lines.Raising this separately because it looks like a cross-branch miss rather than a deliberate 14.x exclusion — and because two of these were explicitly labeled
cherry-pick-14, closed, and then never shipped.Missing commits
mainrelease-14.0CREATE EXTENSION IF NOT EXISTSfails for non-owner users (fixes #7091)fde8ceace8b99e078bEXPLAINwithLEFT JOIN+ correlated subqueries (fixes #8548)a3d5708a6COLLATEis used with a type cast (fixes #8469)810e7fbb9CleanupRecordExistsuses a stale snapshot (shard-cleanup race)c41586cc8Why this looks unintentional
release-14.0branched frommainat803f0ac57(2026-01-18); all five fixes landed after that point and need explicit backporting.8cdb17e25(2026-07-31), about two months after the newest of these landed onmain. It is receiving backports; these five just were not picked up.git merge-base --is-ancestor, a PR-number set-difference over the branch history, and a direct code gate confirming the vulnerable code is still present:shard_cleaner.c:1183 CleanupRecordExists(uint64 recordId), the old signature with no snapshot argumentmulti_physical_planner.c:2882still returns a bareCollateExpr, dropping the castdistributed_planner.c:449 PlanContainsDistributedSubPlanRTE(List *), no NULL guardRecoveryInProgress()anywhere inlocal_executor.cextension.c:185,1146,1318never setif_not_existsNote on methodology: a naive
#\d+grep over commit subjects gives false positives here, because Citus backport subjects use three different forms ((#8700),(Backport PR8692),(Backport PR#8651)). Matching on(?:#|PR#?)(\d{4,5})and then confirming with a content diff is what produced the list above.Severity
Four of the five are crash / wrong-result class:
attribute of type record has wrong typeon otherwise valid queries.CREATE EXTENSION IF NOT EXISTSon an already-installed extension.The label queue already flagged two of these for 14.x
release-14.0EXPLAIN, reported against released Citus 14.0.0 / PG18.1Both carry
cherry-pick-14and can have the label cleared once the backports land. (#8470 also carries it, but its fix #8535 is still unmerged upstream, so it stays deferred.)Backport complexity: lower than 12.1 or 13.2
release-14.0shares main's PG16/17/18 support range and its pseudoconstant-quals error string byte-for-byte (recursive_planning.c:531-534). So neither of the adaptations the other two lines needed applies here:foreach_declared_ptr→foreach_ptrrename — not needed,foreach_declared_ptrexists on 14.0subquery_in_where_0.out— not needed, the strings already matchAll five cherry-pick cleanly with zero conflicts and zero adaptation;
git patch-id --stableis identical to upstream for every one.release-14.0also has no_Nnumbered expected-output variants at all, so the PG-version-variant trap that bit the 13.2 backport of #8556 cannot occur here.Suggested action
Cherry-pick all five onto
release-14.0, one PR each. Note thatrelease-14.0is the 14.x line itself (configure.ac= 14.2.0,default_version = 14.2-1; there is norelease-14.1/release-14.2branch), so these would ship in 14.2.0.