You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
branch-1.0 was cut at af534e0f (2026-08-03). Since then, 192 commits have landed on main and only three
backport batches have gone to branch-1.0 (#5261, #5321, #5480). I went through every one of those 192
commits to work out which are genuine backport candidates for a 1.0.x patch release — pure bug fixes and
performance improvements that neither add features nor change intended behaviour — and which are not, and why.
This issue is the resulting list. It is a triage record, not a decision: the recommendations still need
someone to agree with them and open the backport PRs.
Prefixes are not trustworthy on their own in either direction, so every candidate was checked against the
label on the issue it closes. Five fix:-prefixed PRs close enhancement issues and are excluded below.
Applicability was checked mechanically: each commit was cherry-picked onto a pristine branch-1.0 worktree,
and every conflicting path was tested for existence on branch-1.0. A conflict in a file that does not
exist on branch-1.0 means the PR fixes code that only exists on main — not a candidate. A conflict in a
file that does exist is ordinary context drift and still a candidate.
Applying the recommended set as a stack in merge order, 27 of 37 commits cherry-pick clean and 10 need small
manual resolution. Cherry-picking clean is not the same as compiling — #5461 is a known example — so each
backport PR still needs cargo check --workspace --all-targets plus ./mvnw test-compile before it goes up.
Tier 1 — correctness, crashes and hangs
These change observable results, fail tasks, leak, or hang. I would take all of these.
Task-shared memory pool as a ref-counted RAII guard
A stranded entry holds a JNI global ref to CometTaskMemoryManager, pinning TaskMemoryManager and TaskContext for the executor's lifetime. Nothing prunes the map
Iceberg reflection lookups cached on the planning path — currently O(files) Class.getMethod per scan, and on the Spark 3.4 profile (Iceberg < 1.7) every call constructs a NoSuchMethodException
Arrow IPC compression context reused across shuffle blocks
clean
Two caveats in this tier. #5038's measured benefit is narrower than it looks: the follow-up measurement in #5727 shows 2.0–16.8% faster block encoding for 128-row batches and approximately no change for full-size
compressed batches. And #5368 (serialize Python input directly from Comet Arrow vectors) is the largest win
available here, but it is 10 files, it regressed timezone aliases, and the fix for that (#5556) is a separate
PR — take both or neither.
Tier 3 — needs a decision before it can be classified
fix: match Spark's null short-circuiting in array_join and enable it natively #5558 (array_join null short-circuiting) is a real correctness fix — Spark returns NULL whenever nullReplacement is NULL, Comet returned the joined string — but it is bundled with flipping array_join
from Incompatible to natively enabled. Backporting as-is changes a compatibility flag in a patch release.
Worth splitting.
fix: make CometExplodeExec respect batch size #5362 ("make CometExplodeExec respect batch size") is a real bug — UnnestExec never consults datafusion.execution.batch_size, so an 8192-row batch of 100-element arrays comes back as one
819,200-row batch and peak memory scales with it. But the fix lands a new 1,491-line native ExplodeExec.
That is feature-sized for a patch release.
fix: distinguish "nothing spilled" from a spill backend with no local path #5726 (pathless spill backend writes an index claiming bytes that never landed) would be a corrupt
shuffle file. On branch-1.0 the only spill backend is local and always has a path, so as far as I can
tell the bug is latent there. Backport only if we want the invariant rather than the fix.
fix: RAII for memory pool registration #5464 (RAII for tracing memory pool registration) is a real leak, but only reachable with native tracing
enabled. Low value for a patch release.
Blocked on the dependency upgrade.#5041 (enable FIRST/LAST partial merge) depends on the root fix in
DataFusion 55.0.0, which reached main via #5262. branch-1.0 is on 54.1.0.
Test, benchmark or CI only:#5388, #5439, #5718, #5727, plus every test:, chore:, chore(deps), docs: and ci: commit in the range.
Previously decided.#5369 (preserve Catalyst nullability and field IDs in native Parquet writes) is a real
bug, but spark.comet.parquet.write.enabled defaults to false and is documented as experimental on branch-1.0.
Related open 1.0.1 items with no fix on main to backport: #5366 (to_time / try_to_time still rejects 'T12' and '12:30:45.'; #5364 fixed only the whitespace half) and #4412 (CometHashAggregateExec and AQEPropagateEmptyRelation).
Optional companion: #5769 refactors #5754 and #5757 into a shared helper. Not required, but it keeps branch-1.0 closer to main's shape if we want that.
Describe the problem
branch-1.0was cut ataf534e0f(2026-08-03). Since then, 192 commits have landed onmainand only threebackport batches have gone to
branch-1.0(#5261, #5321, #5480). I went through every one of those 192commits to work out which are genuine backport candidates for a 1.0.x patch release — pure bug fixes and
performance improvements that neither add features nor change intended behaviour — and which are not, and why.
This issue is the resulting list. It is a triage record, not a decision: the recommendations still need
someone to agree with them and open the backport PRs.
How the list was produced
git log af534e0f..main, 192 commits.fix:orperf:prefix. I also checked all 47feat:/refactor:/deps:commits for onesthat close a
bug-labelled issue, which is how feat: support unicode case sensitive field names for reading parquet #5602 ended up in tier 1 despite itsfeat:prefix.label on the issue it closes. Five
fix:-prefixed PRs closeenhancementissues and are excluded below.branch-1.0worktree,and every conflicting path was tested for existence on
branch-1.0. A conflict in a file that does notexist on
branch-1.0means the PR fixes code that only exists onmain— not a candidate. A conflict in afile that does exist is ordinary context drift and still a candidate.
branch-1.0is on DataFusion 54.1.0 / Arrow 58.4.0;mainis on 55.0.0 / 59.2.0 since deps: bump DataFusion 55.0 and Arrow/Parquet 59.2 #5262. That rulesout at least one otherwise-attractive fix.
Applying the recommended set as a stack in merge order, 27 of 37 commits cherry-pick clean and 10 need small
manual resolution. Cherry-picking clean is not the same as compiling — #5461 is a known example — so each
backport PR still needs
cargo check --workspace --all-targetsplus./mvnw test-compilebefore it goes up.Tier 1 — correctness, crashes and hangs
These change observable results, fail tasks, leak, or hang. I would take all of these.
bug,correctness,priority:critical, and already in the 1.0.1 milestone. Non-ASCII case pairs silently read as NULLbug,correctness,priority:high. Swallows ANSI errorscollect_list/collect_setargument coercion made a normalization barrierbug,priority:high. Grouped aggregate fails validating its own output batchhash/xxhash64on a null struct; the same decision feeds shuffle partitioningDECIMAL(38,18)value above 0.01CAST_OVERFLOWfor exactly representableInt.MaxValue/Long.MaxValueTIMESTAMP_NTZcastsbug,correctness. Returns NULL where Spark raisesCAST_INVALID_INPUTTIMESTAMP_MILLISconversion in Parquet readsparquet_support.rs)TIMESTAMP_MILLISin unfiltered scansparquet_support.rs)rpad/lpadreturn NULL for a NULL length instead of panickingCometNativeExceptionmapsortconcat_wswith array arguments falls back instead of failing nativelyabsoverflow errorsInt64 overflowwhere Spark reportslong overflowcopy_arraypropagates offset-overflow errors instead of panickingbug. Panic instead of a clean errorcopy.rs)bug,correctness,priority:medium. Leaks native buffers, adding allocator pressure while the query is already failingmainwithout callingspark.stop(). #4734, which is onbranch-1.0, does not cover this casebranch-1.0ships aspark-4.2profile and writesworkerConfinsidewriteCommand, so acceleratedmapInArrow/mapInPandasfails outright on 4.2Invalid Iceberg scan task; this is Iceberg's forward-compatibility contract, and it is what turned Iceberg CI red onmainCometDiskBlockWriterspill registry made per-taskstatic, so task A force-spills task B's buffered bytes from A's thread and charges them to ACometTaskMemoryManager, pinningTaskMemoryManagerandTaskContextfor the executor's lifetime. Nothing prunes the mapjni_api.rs)Tier 2 — performance, no behaviour change
spark_base64: 11–21% faster, bit-identical outputspark_floor: up to 4x faster on decimalsCargo.toml)spark_sizelist lengths via Arrow'slengthkernelspark_sizeMap via the offset buffer; follow-up to #5233, take them togetherArrowWriterpreallocates fixed-width vectors from the known batch sizeArrowWriterbulk-copies fixed-width columns; follow-up to #5046, take them togetherTIMESTAMP_NTZtemporal.rs)posexplodearray expression evaluated once per batch instead of twiceClass.getMethodper scan, and on the Spark 3.4 profile (Iceberg < 1.7) every call constructs aNoSuchMethodExceptionTwo caveats in this tier. #5038's measured benefit is narrower than it looks: the follow-up measurement in
#5727 shows 2.0–16.8% faster block encoding for 128-row batches and approximately no change for full-size
compressed batches. And #5368 (serialize Python input directly from Comet Arrow vectors) is the largest win
available here, but it is 10 files, it regressed timezone aliases, and the fix for that (#5556) is a separate
PR — take both or neither.
Tier 3 — needs a decision before it can be classified
array_joinnull short-circuiting) is a real correctness fix — Spark returns NULL whenevernullReplacementis NULL, Comet returned the joined string — but it is bundled with flippingarray_joinfrom
Incompatibleto natively enabled. Backporting as-is changes a compatibility flag in a patch release.Worth splitting.
for signed zeros and NaN is a genuine correctness fix that applies to
branch-1.0; the window-rank halffollows
WindowGroupLimitExec(feat: supportWindowGroupLimitExec#4870), which ismain-only. Needs splitting.CometExplodeExecrespect batch size") is a real bug —UnnestExecnever consultsdatafusion.execution.batch_size, so an 8192-row batch of 100-element arrays comes back as one819,200-row batch and peak memory scales with it. But the fix lands a new 1,491-line native
ExplodeExec.That is feature-sized for a patch release.
shuffle file. On
branch-1.0the only spill backend is local and always has a path, so as far as I cantell the bug is latent there. Backport only if we want the invariant rather than the fix.
Configuration#getexpands
${...}references andConfiguration.Entry#getValuedoes not, so an object store option composedfrom another property reached native unexpanded. Extract that hunk rather than cherry-picking the PR.
enabled. Low value for a patch release.
Fieldmetadata across C Data exports) closes anenhancement([Variant] Export complete Arrow Fields through the native FFI boundary #5547) and ispart one of the Variant series. Nothing on
branch-1.0consumesFieldmetadata, so there is noobservable effect there.
Excluded, with reasons
Recording these so they do not get re-litigated for the next patch release.
Fixes code that only exists on
main. The feature landed after the branch cut, so the fix has nothing toapply to:
fix: scope Celeborn bootstrap hooks to Comet clients #5627, fix: accept dictionary encodings in remote shuffle #5650, fix(celeborn): reject unsafe native push completion tracking #5665, fix: recover native Celeborn shuffle from oversized rows #5668, perf: cache expected schemas for remote shuffle decoding #5722, perf: validate shuffle IPC context reuse savings #5727
fix: restore columnar transitions under the native Iceberg write #5696, fix: native Iceberg write panics on an evolved partition spec and on a timestamptz partition path #5729, fix: match iceberg-java's exception for unclustered input to a clustered Iceberg write #5779
ExplodeExec(fix: make CometExplodeExec respect batch size #5362): fix perf: slice the child instead of gathering it when unnesting #5667CreateArraymap literal (feat: support Map forCreateArrayliteral #5452): fix feat: address remaining issues forCreateArray#5766 — Fix remaining reported issues for arrays of map #5544 only becomes reachable once a folded map literal isadmitted natively
Blocked on the dependency upgrade. #5041 (enable FIRST/LAST partial merge) depends on the root fix in
DataFusion 55.0.0, which reached
mainvia #5262.branch-1.0is on 54.1.0.Spark UI metrics accuracy only — same call as for 1.0.1, these do not change query results or stability:
#5370, #5398, #5408, #5445, #5463, #5497, #5516, #5554, #5628.
fix:prefix but closes anenhancementissue: #5045 (#3389), #5225 (#5190), #5234 (#5096), #5359(#5074), #5412 (#5258).
Test, benchmark or CI only: #5388, #5439, #5718, #5727, plus every
test:,chore:,chore(deps),docs:andci:commit in the range.Previously decided. #5369 (preserve Catalyst nullability and field IDs in native Parquet writes) is a real
bug, but
spark.comet.parquet.write.enableddefaults tofalseand is documented as experimental onbranch-1.0.Already on
branch-1.0via #5261, #5321 and #5480: #5138, #5162, #5167, #5185, #5192, #5282, #5315,#5364, #5376, #5392, #5400, #5443.
Additional context
Related open 1.0.1 items with no fix on
mainto backport: #5366 (to_time/try_to_timestill rejects'T12'and'12:30:45.'; #5364 fixed only the whitespace half) and #4412 (CometHashAggregateExecandAQEPropagateEmptyRelation).Optional companion: #5769 refactors #5754 and #5757 into a shared helper. Not required, but it keeps
branch-1.0closer tomain's shape if we want that.