Skip to content

fix: allow repeated alter table in explicit transactions - #26610

Merged
XuPeng-SH merged 2 commits into
matrixorigin:mainfrom
gouhongshen:agent/fix-alter-transaction-lineage
Aug 3, 2026
Merged

fix: allow repeated alter table in explicit transactions#26610
XuPeng-SH merged 2 commits into
matrixorigin:mainfrom
gouhongshen:agent/fix-alter-transaction-lineage

Conversation

@gouhongshen

Copy link
Copy Markdown
Contributor

What type of PR is this?

  • API-change
  • BUG
  • Improvement
  • Documentation
  • Feature
  • Test and CI
  • Code Refactoring

Which issue(s) this PR fixes:

Fixes #26549

What this PR does / why we need it:

Root cause

COPY-based ALTER TABLE records level='alter' metadata when a snapshot or PITR must retain an old physical table generation. That metadata is historical ownership, but the explicit-transaction guard treated any lineage participation as a live logical data branch. Consequently, the second ordinary ALTER TABLE in the same transaction was rejected with a data-branch error.

There was a second correctness constraint behind that failure: after advancing a pessimistic transaction snapshot, an explicit {MO_TS} copy cannot see the transaction workspace. Using it for repeated ALTER would lose earlier transaction DML or fail to resolve the physical generation created by an earlier ALTER.

Changes

  • Reuse one connected-component traversal for lineage compaction and ownership classification.
  • Apply the explicit-transaction restriction only when the complete lineage component contains a live logical owner (table or alter:table). Traversing the full component preserves the restriction when a live branch exists through an ancestor or sibling.
  • Copy from the current transaction view after snapshot advancement when the transaction has workspace/DDL history; retain the fixed historical timestamp for autocommit statements without workspace history.
  • Add focused UT coverage for historical-only chains, live owners, inherited ownership, sibling ownership, deleted owners, cycles, transaction-mode truth tables, snapshot hints, and the issue regression.
  • Add a BVT covering table snapshots, PITR, BEGIN, autocommit=0, DML before ALTER, repeated add/modify/rename operations, indexed and base scans, rollback, database snapshots with interleaved tables, and negative controls for real data branches.

Compatibility and safety

The change does not alter metadata or on-disk formats. Explicit-transaction ALTER remains rejected for real data branches, including an altered branch and an altered base table connected to a live sibling branch.

Validation

  • The focused regression UT failed on the pre-fix implementation with ALTER on a data-branch lineage is not supported inside an explicit transaction, then passed with this change.
  • go test passed for the focused regressions and the complete pkg/frontend/databranchutils and pkg/sql/compile packages.
  • go build -mod=readonly ./pkg/frontend/databranchutils ./pkg/sql/compile
  • go vet -mod=readonly ./pkg/frontend/databranchutils ./pkg/sql/compile
  • make build
  • New BVT alter_table_historical_lineage: 3 consecutive runs, each 75/75 passed.
  • Existing BVT diff_schema_evolve: 278/278 passed.

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@XuPeng-SH XuPeng-SH left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the transaction/snapshot lineage change end to end. The fix correctly distinguishes live logical branch ownership from historical ALTER lineage, preserves the fixed snapshot for autocommit, and uses the transaction view when explicit transaction workspace history must remain visible. The DAG traversal is cycle-safe and covers ancestor/descendant ownership. Focused tests for component ownership, fixed-snapshot selection, SQL generation, and historical-only explicit transactions pass; go vet and diff checks pass. The full affected package run has three parquet fanout failures, all reproduced with the same assertions on the clean base commit, so they are pre-existing and unrelated. CI is green at this exact head.

@mergify mergify Bot added the queued label Aug 3, 2026
@mergify

mergify Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • Entered queue2026-08-03 09:27 UTC · Rule: main · triggered by rule Automatic queue on approval for main
  • 🟠 Checks running · in-place
  • 🚫 Left the queue2026-08-03 10:07 UTC · at b4e96249dc57f06ad27c76ff4bb271d713979fcf

This pull request spent 39 minutes 53 seconds in the queue, with no time running CI.

Waiting for
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
    • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
    • check-success = Matrixone CI / UT Test on Ubuntu/x86
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone CI / SCA Test on Linux/arm64
    • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • check-success = Matrixone CI / SCA Test on Linux/arm64
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Utils CI / Coverage
    • check-skipped = Matrixone Utils CI / Coverage
    • check-success = Matrixone Utils CI / Coverage
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-skipped = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-success = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
All conditions
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
    • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
    • check-success = Matrixone CI / UT Test on Ubuntu/x86
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone CI / SCA Test on Linux/arm64
    • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • check-success = Matrixone CI / SCA Test on Linux/arm64
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Utils CI / Coverage
    • check-skipped = Matrixone Utils CI / Coverage
    • check-success = Matrixone Utils CI / Coverage
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-skipped = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-success = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
  • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
  • github-review-approved [🛡 GitHub branch protection]

Reason

Pull request #26610 has been dequeued

Pull request from fork cannot be queued. This pull request comes from a fork, and Mergify needs the author's permission to update its branch.

The author needs to enable "Allow edits from maintainers" on this pull request.

Failing checks:

Hint

You should look at the reason for the failure and decide if the pull request needs to be fixed or if you want to requeue it.
If you do update this pull request, it will automatically be requeued once the queue conditions match again.
If you think this was a flaky issue instead, you can requeue the pull request, without updating it, by posting a @mergifyio queue comment.

Tick the box to put this pull request back in the merge queue (same as @mergifyio queue).

  • Requeue this pull request

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dequeued kind/bug Something isn't working size/L Denotes a PR that changes [500,999] lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: ordinary ALTER TABLE in explicit transaction returns data-branch lineage error

4 participants