Skip to content

Fix delete merges across appended defaults - #2553

Merged
timsehn merged 1 commit into
masterfrom
fix/2537-both-sided-default-delete-merge
Sep 2, 2026
Merged

Fix delete merges across appended defaults#2553
timsehn merged 1 commit into
masterfrom
fix/2537-both-sided-default-delete-merge

Conversation

@timsehn

@timsehn timsehn commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • normalize defaulted appended columns on every schema-relayout path
  • let deletes win over changes confined to newly appended columns while preserving conflicts for ancestor-column edits
  • keep secondary indexes and generated-column record layouts correct in both deletion directions
  • add native and Dolt-oracle coverage for dual defaults, opposite deletes, composite keys, indexes, affinity, and generated columns

Validation

  • make -C build lint
  • bash test/run_doltlite_tests.sh build/doltlite — 125 suites passed
  • bash test/vc_oracle_merge_test.sh build/doltlite dolt — 102 passed
  • DOLTLITE=build/doltlite bash test/vc_oracle_schema_merge_test.sh — 123 passed
  • bash test/oracle_generated_columns_vc_test.sh build/doltlite — 24 passed

Fixes #2537

Co-Authored-By: OpenAI Codex noreply@openai.com

@itoqa

itoqa Bot commented Sep 1, 2026

Copy link
Copy Markdown

Ito QA test results
Commit: 89914b3: 19 test cases ran, 19 passed ✅.

Summary

Coverage spans core branch-merging behavior, including additions, updates, deletions, conflicts, rollback and retry flows, schema and default-value changes, generated fields, secondary indexes, data types, and persistence after reopening. It also exercises failure recovery and boundary conditions across different key shapes and branch orderings, with healthy results throughout.

Safe to merge — the exercised merge, conflict-handling, schema, indexing, recovery, and reopen behaviors show no regressions or PR-attributable failures. No merge blockers were identified.

Tests run by Ito

View full run

Result Severity Type Description
Additions The merge kept the new row, saved the updated value, and removed the deleted row. The same results remained after reopening the database, and the integrity check passed.
General Both the single-column and composite-key tables kept only rows 1 and 3 after the merge. Table scans and forced index scans matched before and after reopening, the updated index value moved to 35, deleted key 2 was absent, and integrity checks passed.
General All 43 checks passed. Normal table reads and forced index reads returned the same surviving rows after updates, deletes, inserts, and reopening the database.
General The merged table kept the virtual-column metadata, stored generated values, and default values in the right columns. The same values remained correct after reopening, indexed reads succeeded, and the integrity check passed.
General After the local build path was corrected, the merge fault sweep completed without publishing partial table or index data. Successful boundary cases also completed cleanly.
General The merged table kept its column metadata and values before and after reopening. Stored and virtual generated columns, branch defaults, indexed reads, and the integrity check all matched the expected results.
General Both branch-order scenarios kept the full set of columns and the correct row values after merging. The same results remained correct after reopening the databases, so the earlier failure was caused by the initial test setup rather than the application.
General The first merge found one conflict, and aborting it cleared the conflict and restored the rows. A retry found one conflict again, resolution cleared it, and the final rows stayed correct without duplicates.
Conflict Changing an original column while another branch deletes the row reports a merge conflict. The receiving rows stay intact after rollback, and no conflict or merge state is published.
Conflict The reverse merge reported a conflict and rolled back. The receiving branch row stayed unchanged, and no delete-wins result or merge state was published.
Defaults Rows with missing trailing fields received the correct default values after the merge. Explicit NULL values stayed in the right columns, and the data remained correct after reopening the database.
Generated The merge kept the stored generated values, recalculated the virtual values, and placed both branch columns correctly. The same values and metadata remained correct after reopening the database.
Indexes The merged table kept the updated row at its new indexed value and removed the deleted row. Table and index scans matched, the result stayed correct after reopening, and the integrity check passed.
Merge The merge completed without conflicts. The deleted rows stayed absent, surviving rows received both branch defaults, the indexed query matched the table, and reopening kept the same data.
Rev The merge kept the row deleted on main out of the final table. Surviving rows kept both branch defaults, indexed reads matched the table, and the database reopened cleanly.
Rev The merge kept the appended-column index usable and returned the right surviving rows. Later writes, reopening the database, and integrity checks also stayed correct.
Rev After the merge, integer, text, and real defaults kept the correct values and types before and after reopening the database.
Rev Stored and virtual generated columns stayed in the correct positions after the merge. Defaults, integrity checks, and reads after reopening also passed.
Rev A merge with changes from both branches was committed successfully. After reopening, the table schema, rows, merge history, and integrity check were still correct.

Tip

Reply with @itoqa to send us feedback on this test run.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

DoltLite performance vs PR base

  • Baseline: 32a9a135c93e3eae9f06dba9d48332d7be29dbb3
  • Candidate: 836b17d72d8c0288f7bfd3e2e03cd6587c149efe
  • Overall ratio: 0.991x
  • Gate result: PASS
  • Gates: individual > 1.50x with more than 10.00ms regression; section, suite, or overall > 1.25x with the same minimum delta
  • vc individual gate: > 2.00x with more than 50.00ms regression
  • Confirmed failed gates: none
  • Automatic retries: blobpk cleared after 2 attempts; no gate failed every time
Suite Workloads Baseline total Candidate total Ratio Result
blobpk 69 11.17s 11.23s 1.005x PASS
compositepk 69 11.34s 11.35s 1.001x PASS
int 69 10.18s 10.00s 0.982x PASS
textpk 69 11.68s 11.38s 0.974x PASS
vc 13 732.58ms 733.53ms 1.001x PASS
blobpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 28.45ms 29.53ms +1.08ms 1.038x PASS
mem_reads oltp_range_select 10.96ms 11.51ms +554us 1.051x PASS
mem_reads oltp_sum_range 10.73ms 10.61ms -122us 0.989x PASS
mem_reads oltp_order_range 2.83ms 2.68ms -149us 0.947x PASS
mem_reads oltp_distinct_range 3.87ms 3.73ms -141us 0.964x PASS
mem_reads oltp_index_scan 4.43ms 4.72ms +287us 1.065x PASS
mem_reads select_random_points 18.07ms 18.50ms +431us 1.024x PASS
mem_reads select_random_ranges 4.03ms 4.07ms +40us 1.010x PASS
mem_reads covering_index_scan 3.40ms 3.35ms -52us 0.985x PASS
mem_reads groupby_scan 32.49ms 30.90ms -1.59ms 0.951x PASS
mem_reads index_join 7.82ms 7.83ms +17us 1.002x PASS
mem_reads index_join_scan 4.71ms 4.77ms +68us 1.014x PASS
mem_reads types_table_scan 1.07s 1.04s -26.29ms 0.975x PASS
mem_reads table_scan 1.18s 1.18s -4.62ms 0.996x PASS
mem_reads oltp_read_only 110.30ms 110.86ms +564us 1.005x PASS
mem_writes oltp_bulk_insert 258.25ms 265.87ms +7.62ms 1.030x PASS
mem_writes oltp_insert 30.38ms 30.38ms -2us 1.000x PASS
mem_writes oltp_update_index 100.47ms 102.13ms +1.66ms 1.017x PASS
mem_writes oltp_update_non_index 56.45ms 58.94ms +2.49ms 1.044x PASS
mem_writes oltp_delete_insert 82.79ms 77.89ms -4.90ms 0.941x PASS
mem_writes oltp_write_only 46.97ms 47.69ms +712us 1.015x PASS
mem_writes types_delete_insert 41.80ms 42.20ms +400us 1.010x PASS
mem_writes oltp_read_write 109.39ms 109.10ms -283us 0.997x PASS
file_reads oltp_point_select 36.71ms 37.32ms +604us 1.016x PASS
file_reads oltp_range_select 12.40ms 12.04ms -360us 0.971x PASS
file_reads oltp_sum_range 12.28ms 12.35ms +72us 1.006x PASS
file_reads oltp_order_range 2.93ms 2.93ms -1us 1.000x PASS
file_reads oltp_distinct_range 4.08ms 4.07ms -1us 1.000x PASS
file_reads oltp_index_scan 5.78ms 5.76ms -26us 0.996x PASS
file_reads select_random_points 19.68ms 18.87ms -806us 0.959x PASS
file_reads select_random_ranges 5.18ms 4.98ms -207us 0.960x PASS
file_reads covering_index_scan 4.49ms 4.30ms -190us 0.958x PASS
file_reads groupby_scan 31.82ms 32.89ms +1.07ms 1.034x PASS
file_reads index_join 8.72ms 9.00ms +283us 1.032x PASS
file_reads index_join_scan 5.04ms 5.06ms +26us 1.005x PASS
file_reads types_table_scan 1.10s 1.09s -11.37ms 0.990x PASS
file_reads table_scan 1.20s 1.18s -22.10ms 0.982x PASS
file_reads oltp_read_only 123.03ms 121.27ms -1.77ms 0.986x PASS
file_writes oltp_bulk_insert 353.25ms 352.47ms -784us 0.998x PASS
file_writes oltp_insert 56.84ms 57.74ms +897us 1.016x PASS
file_writes oltp_update_index 188.58ms 186.89ms -1.70ms 0.991x PASS
file_writes oltp_update_non_index 122.79ms 153.37ms +30.57ms 1.249x PASS
file_writes oltp_delete_insert 182.56ms 159.89ms -22.67ms 0.876x PASS
file_writes oltp_write_only 102.24ms 103.48ms +1.23ms 1.012x PASS
file_writes types_delete_insert 84.59ms 83.85ms -739us 0.991x PASS
file_writes oltp_read_write 166.49ms 169.49ms +3.00ms 1.018x PASS
ac_reads oltp_point_select 37.07ms 36.12ms -951us 0.974x PASS
ac_reads oltp_range_select 12.91ms 12.83ms -76us 0.994x PASS
ac_reads oltp_sum_range 11.90ms 12.25ms +358us 1.030x PASS
ac_reads oltp_order_range 2.93ms 2.92ms -8us 0.997x PASS
ac_reads oltp_distinct_range 3.97ms 4.05ms +73us 1.018x PASS
ac_reads oltp_index_scan 5.64ms 5.98ms +335us 1.059x PASS
ac_reads select_random_points 19.83ms 18.82ms -1.01ms 0.949x PASS
ac_reads select_random_ranges 5.09ms 5.06ms -32us 0.994x PASS
ac_reads covering_index_scan 4.50ms 4.53ms +23us 1.005x PASS
ac_reads groupby_scan 31.88ms 30.98ms -900us 0.972x PASS
ac_reads index_join 9.26ms 8.79ms -469us 0.949x PASS
ac_reads index_join_scan 5.37ms 5.29ms -77us 0.986x PASS
ac_reads types_table_scan 1.06s 1.07s +11.71ms 1.011x PASS
ac_reads table_scan 1.15s 1.17s +19.25ms 1.017x PASS
ac_reads oltp_read_only 121.64ms 126.10ms +4.46ms 1.037x PASS
ac_writes oltp_bulk_insert_ac 155.14ms 174.73ms +19.59ms 1.126x PASS
ac_writes oltp_insert_ac 188.01ms 154.06ms -33.95ms 0.819x PASS
ac_writes oltp_update_index_ac 137.10ms 227.69ms +90.59ms 1.661x TRANSIENT
ac_writes oltp_update_non_index_ac 199.41ms 213.74ms +14.33ms 1.072x PASS
ac_writes oltp_delete_insert_ac 245.13ms 177.81ms -67.33ms 0.725x PASS
ac_writes oltp_write_only_ac 231.25ms 304.54ms +73.30ms 1.317x PASS
ac_writes types_delete_insert_ac 250.58ms 199.83ms -50.75ms 0.797x PASS
ac_writes oltp_read_write_ac 238.09ms 267.53ms +29.44ms 1.124x PASS
compositepk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 36.73ms 36.84ms +110us 1.003x PASS
mem_reads oltp_range_select 20.05ms 19.95ms -94us 0.995x PASS
mem_reads oltp_sum_range 19.08ms 19.17ms +86us 1.005x PASS
mem_reads oltp_order_range 3.77ms 3.79ms +15us 1.004x PASS
mem_reads oltp_distinct_range 4.89ms 4.92ms +32us 1.007x PASS
mem_reads oltp_index_scan 5.40ms 5.45ms +46us 1.009x PASS
mem_reads select_random_points 29.77ms 29.94ms +173us 1.006x PASS
mem_reads select_random_ranges 7.98ms 8.04ms +62us 1.008x PASS
mem_reads covering_index_scan 4.09ms 4.12ms +22us 1.005x PASS
mem_reads groupby_scan 40.80ms 41.04ms +242us 1.006x PASS
mem_reads index_join 9.75ms 9.84ms +87us 1.009x PASS
mem_reads index_join_scan 5.37ms 5.43ms +57us 1.011x PASS
mem_reads types_table_scan 1.22s 1.22s -3.32ms 0.997x PASS
mem_reads table_scan 1.35s 1.35s +2.91ms 1.002x PASS
mem_reads oltp_read_only 161.10ms 160.84ms -267us 0.998x PASS
mem_writes oltp_bulk_insert 333.77ms 336.96ms +3.18ms 1.010x PASS
mem_writes oltp_insert 34.81ms 34.62ms -191us 0.995x PASS
mem_writes oltp_update_index 119.63ms 119.26ms -372us 0.997x PASS
mem_writes oltp_update_non_index 75.41ms 75.14ms -272us 0.996x PASS
mem_writes oltp_delete_insert 94.56ms 94.23ms -336us 0.996x PASS
mem_writes oltp_write_only 57.03ms 57.19ms +163us 1.003x PASS
mem_writes types_delete_insert 51.45ms 51.28ms -165us 0.997x PASS
mem_writes oltp_read_write 150.05ms 150.75ms +700us 1.005x PASS
file_reads oltp_point_select 58.91ms 59.29ms +384us 1.007x PASS
file_reads oltp_range_select 22.40ms 22.76ms +360us 1.016x PASS
file_reads oltp_sum_range 21.45ms 21.63ms +180us 1.008x PASS
file_reads oltp_order_range 4.07ms 4.08ms +9us 1.002x PASS
file_reads oltp_distinct_range 5.22ms 5.19ms -32us 0.994x PASS
file_reads oltp_index_scan 7.88ms 8.02ms +145us 1.018x PASS
file_reads select_random_points 32.42ms 32.59ms +165us 1.005x PASS
file_reads select_random_ranges 10.51ms 10.34ms -170us 0.984x PASS
file_reads covering_index_scan 6.50ms 6.48ms -27us 0.996x PASS
file_reads groupby_scan 41.14ms 41.41ms +269us 1.007x PASS
file_reads index_join 11.61ms 11.62ms +4us 1.000x PASS
file_reads index_join_scan 5.86ms 5.84ms -15us 0.997x PASS
file_reads types_table_scan 1.21s 1.21s -11us 1.000x PASS
file_reads table_scan 1.35s 1.35s -1.04ms 0.999x PASS
file_reads oltp_read_only 192.96ms 192.06ms -903us 0.995x PASS
file_writes oltp_bulk_insert 342.71ms 345.06ms +2.35ms 1.007x PASS
file_writes oltp_insert 40.49ms 40.52ms +32us 1.001x PASS
file_writes oltp_update_index 130.68ms 131.03ms +360us 1.003x PASS
file_writes oltp_update_non_index 88.63ms 88.66ms +36us 1.000x PASS
file_writes oltp_delete_insert 104.92ms 105.72ms +795us 1.008x PASS
file_writes oltp_write_only 66.61ms 66.92ms +313us 1.005x PASS
file_writes types_delete_insert 57.02ms 57.00ms -18us 1.000x PASS
file_writes oltp_read_write 161.09ms 160.75ms -338us 0.998x PASS
ac_reads oltp_point_select 58.89ms 59.00ms +116us 1.002x PASS
ac_reads oltp_range_select 22.27ms 22.75ms +470us 1.021x PASS
ac_reads oltp_sum_range 21.55ms 21.57ms +22us 1.001x PASS
ac_reads oltp_order_range 4.09ms 4.08ms -10us 0.998x PASS
ac_reads oltp_distinct_range 5.18ms 5.22ms +43us 1.008x PASS
ac_reads oltp_index_scan 7.98ms 7.95ms -35us 0.996x PASS
ac_reads select_random_points 32.45ms 32.90ms +454us 1.014x PASS
ac_reads select_random_ranges 10.51ms 10.40ms -110us 0.990x PASS
ac_reads covering_index_scan 6.46ms 6.39ms -70us 0.989x PASS
ac_reads groupby_scan 41.07ms 41.11ms +43us 1.001x PASS
ac_reads index_join 11.72ms 11.56ms -157us 0.987x PASS
ac_reads index_join_scan 5.85ms 5.87ms +23us 1.004x PASS
ac_reads types_table_scan 1.21s 1.22s +5.50ms 1.005x PASS
ac_reads table_scan 1.35s 1.34s -4.01ms 0.997x PASS
ac_reads oltp_read_only 192.13ms 192.02ms -109us 0.999x PASS
ac_writes oltp_bulk_insert_ac 53.67ms 53.77ms +98us 1.002x PASS
ac_writes oltp_insert_ac 69.22ms 69.64ms +422us 1.006x PASS
ac_writes oltp_update_index_ac 80.00ms 80.40ms +406us 1.005x PASS
ac_writes oltp_update_non_index_ac 62.08ms 64.68ms +2.60ms 1.042x PASS
ac_writes oltp_delete_insert_ac 71.71ms 71.92ms +215us 1.003x PASS
ac_writes oltp_write_only_ac 71.69ms 71.31ms -380us 0.995x PASS
ac_writes types_delete_insert_ac 62.06ms 61.12ms -944us 0.985x PASS
ac_writes oltp_read_write_ac 79.48ms 81.62ms +2.15ms 1.027x PASS
int details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 28.89ms 28.93ms +35us 1.001x PASS
mem_reads oltp_range_select 10.80ms 10.73ms -70us 0.994x PASS
mem_reads oltp_sum_range 10.74ms 10.87ms +126us 1.012x PASS
mem_reads oltp_order_range 2.70ms 2.73ms +29us 1.011x PASS
mem_reads oltp_distinct_range 3.86ms 3.85ms -4us 0.999x PASS
mem_reads oltp_index_scan 4.94ms 4.99ms +50us 1.010x PASS
mem_reads select_random_points 10.49ms 10.28ms -203us 0.981x PASS
mem_reads select_random_ranges 3.84ms 3.84ms -6us 0.998x PASS
mem_reads covering_index_scan 4.07ms 4.08ms +8us 1.002x PASS
mem_reads groupby_scan 33.43ms 33.38ms -51us 0.998x PASS
mem_reads index_join 7.61ms 7.72ms +112us 1.015x PASS
mem_reads index_join_scan 4.31ms 4.37ms +60us 1.014x PASS
mem_reads types_table_scan 1.14s 1.10s -42.05ms 0.963x PASS
mem_reads table_scan 1.24s 1.21s -27.53ms 0.978x PASS
mem_reads oltp_read_only 114.39ms 114.33ms -57us 1.000x PASS
mem_writes oltp_bulk_insert 242.74ms 255.91ms +13.17ms 1.054x PASS
mem_writes oltp_insert 26.61ms 27.05ms +435us 1.016x PASS
mem_writes oltp_update_index 86.68ms 87.55ms +872us 1.010x PASS
mem_writes oltp_update_non_index 52.62ms 53.17ms +552us 1.010x PASS
mem_writes oltp_delete_insert 70.23ms 70.37ms +138us 1.002x PASS
mem_writes oltp_write_only 44.04ms 44.33ms +292us 1.007x PASS
mem_writes types_delete_insert 35.67ms 36.28ms +611us 1.017x PASS
mem_writes oltp_read_write 106.67ms 107.22ms +555us 1.005x PASS
file_reads oltp_point_select 47.11ms 47.27ms +166us 1.004x PASS
file_reads oltp_range_select 12.75ms 12.76ms +12us 1.001x PASS
file_reads oltp_sum_range 12.84ms 12.83ms -9us 0.999x PASS
file_reads oltp_order_range 2.98ms 2.97ms -16us 0.995x PASS
file_reads oltp_distinct_range 4.19ms 4.18ms -9us 0.998x PASS
file_reads oltp_index_scan 6.98ms 6.94ms -44us 0.994x PASS
file_reads select_random_points 12.85ms 12.62ms -230us 0.982x PASS
file_reads select_random_ranges 5.77ms 5.77ms -2us 1.000x PASS
file_reads covering_index_scan 5.98ms 6.05ms +71us 1.012x PASS
file_reads groupby_scan 32.57ms 33.62ms +1.06ms 1.032x PASS
file_reads index_join 9.06ms 9.03ms -28us 0.997x PASS
file_reads index_join_scan 4.61ms 4.61ms -2us 1.000x PASS
file_reads types_table_scan 1.15s 1.10s -52.05ms 0.955x PASS
file_reads table_scan 1.24s 1.21s -27.45ms 0.978x PASS
file_reads oltp_read_only 140.85ms 141.30ms +450us 1.003x PASS
file_writes oltp_bulk_insert 250.94ms 262.77ms +11.83ms 1.047x PASS
file_writes oltp_insert 30.19ms 30.65ms +458us 1.015x PASS
file_writes oltp_update_index 96.30ms 96.79ms +495us 1.005x PASS
file_writes oltp_update_non_index 63.98ms 64.76ms +787us 1.012x PASS
file_writes oltp_delete_insert 78.67ms 78.79ms +121us 1.002x PASS
file_writes oltp_write_only 51.03ms 51.82ms +792us 1.016x PASS
file_writes types_delete_insert 41.11ms 41.87ms +754us 1.018x PASS
file_writes oltp_read_write 113.76ms 113.25ms -507us 0.996x PASS
ac_reads oltp_point_select 46.82ms 47.03ms +205us 1.004x PASS
ac_reads oltp_range_select 12.82ms 12.77ms -48us 0.996x PASS
ac_reads oltp_sum_range 12.78ms 12.82ms +45us 1.004x PASS
ac_reads oltp_order_range 3.09ms 2.97ms -119us 0.961x PASS
ac_reads oltp_distinct_range 4.08ms 4.08ms -2us 1.000x PASS
ac_reads oltp_index_scan 7.00ms 7.07ms +70us 1.010x PASS
ac_reads select_random_points 12.76ms 12.62ms -149us 0.988x PASS
ac_reads select_random_ranges 5.68ms 5.76ms +86us 1.015x PASS
ac_reads covering_index_scan 6.03ms 6.10ms +66us 1.011x PASS
ac_reads groupby_scan 32.65ms 32.66ms +3us 1.000x PASS
ac_reads index_join 9.06ms 9.10ms +41us 1.005x PASS
ac_reads index_join_scan 4.61ms 4.61ms -6us 0.999x PASS
ac_reads types_table_scan 1.15s 1.10s -48.66ms 0.958x PASS
ac_reads table_scan 1.24s 1.22s -25.29ms 0.980x PASS
ac_reads oltp_read_only 141.70ms 141.86ms +157us 1.001x PASS
ac_writes oltp_bulk_insert_ac 82.61ms 84.88ms +2.27ms 1.027x PASS
ac_writes oltp_insert_ac 97.07ms 92.54ms -4.52ms 0.953x PASS
ac_writes oltp_update_index_ac 107.05ms 106.91ms -140us 0.999x PASS
ac_writes oltp_update_non_index_ac 87.99ms 93.94ms +5.96ms 1.068x PASS
ac_writes oltp_delete_insert_ac 101.86ms 101.11ms -752us 0.993x PASS
ac_writes oltp_write_only_ac 101.06ms 109.20ms +8.14ms 1.081x PASS
ac_writes types_delete_insert_ac 94.95ms 92.61ms -2.34ms 0.975x PASS
ac_writes oltp_read_write_ac 107.19ms 107.81ms +613us 1.006x PASS
textpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 37.66ms 37.54ms -125us 0.997x PASS
mem_reads oltp_range_select 13.83ms 13.74ms -90us 0.993x PASS
mem_reads oltp_sum_range 13.89ms 13.61ms -281us 0.980x PASS
mem_reads oltp_order_range 3.18ms 3.33ms +154us 1.048x PASS
mem_reads oltp_distinct_range 4.33ms 4.38ms +45us 1.010x PASS
mem_reads oltp_index_scan 6.12ms 6.14ms +17us 1.003x PASS
mem_reads select_random_points 21.18ms 21.25ms +69us 1.003x PASS
mem_reads select_random_ranges 5.29ms 5.26ms -34us 0.994x PASS
mem_reads covering_index_scan 4.71ms 4.72ms +11us 1.002x PASS
mem_reads groupby_scan 35.89ms 35.98ms +93us 1.003x PASS
mem_reads index_join 9.37ms 9.62ms +255us 1.027x PASS
mem_reads index_join_scan 5.51ms 5.44ms -69us 0.987x PASS
mem_reads types_table_scan 1.23s 1.18s -50.45ms 0.959x PASS
mem_reads table_scan 1.34s 1.30s -41.50ms 0.969x PASS
mem_reads oltp_read_only 138.45ms 139.33ms +879us 1.006x PASS
mem_writes oltp_bulk_insert 366.44ms 370.94ms +4.50ms 1.012x PASS
mem_writes oltp_insert 39.25ms 39.54ms +291us 1.007x PASS
mem_writes oltp_update_index 138.44ms 140.56ms +2.12ms 1.015x PASS
mem_writes oltp_update_non_index 80.70ms 80.63ms -69us 0.999x PASS
mem_writes oltp_delete_insert 106.91ms 108.71ms +1.80ms 1.017x PASS
mem_writes oltp_write_only 61.26ms 61.28ms +24us 1.000x PASS
mem_writes types_delete_insert 54.37ms 54.79ms +422us 1.008x PASS
mem_writes oltp_read_write 148.10ms 145.32ms -2.78ms 0.981x PASS
file_reads oltp_point_select 57.23ms 57.83ms +594us 1.010x PASS
file_reads oltp_range_select 16.03ms 16.18ms +149us 1.009x PASS
file_reads oltp_sum_range 16.52ms 16.19ms -331us 0.980x PASS
file_reads oltp_order_range 3.67ms 3.66ms -5us 0.999x PASS
file_reads oltp_distinct_range 4.97ms 4.84ms -130us 0.974x PASS
file_reads oltp_index_scan 8.57ms 8.42ms -142us 0.983x PASS
file_reads select_random_points 24.60ms 24.49ms -105us 0.996x PASS
file_reads select_random_ranges 7.42ms 7.31ms -101us 0.986x PASS
file_reads covering_index_scan 6.92ms 6.97ms +49us 1.007x PASS
file_reads groupby_scan 35.97ms 35.45ms -521us 0.986x PASS
file_reads index_join 11.26ms 11.19ms -68us 0.994x PASS
file_reads index_join_scan 6.03ms 6.10ms +71us 1.012x PASS
file_reads types_table_scan 1.24s 1.17s -64.57ms 0.948x PASS
file_reads table_scan 1.33s 1.29s -38.79ms 0.971x PASS
file_reads oltp_read_only 171.62ms 173.01ms +1.39ms 1.008x PASS
file_writes oltp_bulk_insert 383.78ms 385.56ms +1.78ms 1.005x PASS
file_writes oltp_insert 46.81ms 46.84ms +30us 1.001x PASS
file_writes oltp_update_index 160.73ms 156.83ms -3.90ms 0.976x PASS
file_writes oltp_update_non_index 97.72ms 97.46ms -259us 0.997x PASS
file_writes oltp_delete_insert 122.37ms 120.62ms -1.74ms 0.986x PASS
file_writes oltp_write_only 74.69ms 74.31ms -381us 0.995x PASS
file_writes types_delete_insert 64.54ms 63.98ms -562us 0.991x PASS
file_writes oltp_read_write 159.95ms 160.91ms +963us 1.006x PASS
ac_reads oltp_point_select 58.09ms 57.92ms -161us 0.997x PASS
ac_reads oltp_range_select 16.46ms 16.44ms -18us 0.999x PASS
ac_reads oltp_sum_range 16.52ms 16.26ms -262us 0.984x PASS
ac_reads oltp_order_range 3.90ms 4.04ms +134us 1.034x PASS
ac_reads oltp_distinct_range 5.06ms 5.18ms +118us 1.023x PASS
ac_reads oltp_index_scan 8.59ms 8.62ms +34us 1.004x PASS
ac_reads select_random_points 25.06ms 24.39ms -665us 0.973x PASS
ac_reads select_random_ranges 7.50ms 7.44ms -55us 0.993x PASS
ac_reads covering_index_scan 7.08ms 6.97ms -114us 0.984x PASS
ac_reads groupby_scan 35.56ms 36.75ms +1.19ms 1.034x PASS
ac_reads index_join 11.29ms 11.32ms +37us 1.003x PASS
ac_reads index_join_scan 6.04ms 6.08ms +40us 1.007x PASS
ac_reads types_table_scan 1.25s 1.19s -61.14ms 0.951x PASS
ac_reads table_scan 1.34s 1.30s -39.51ms 0.970x PASS
ac_reads oltp_read_only 171.19ms 170.33ms -855us 0.995x PASS
ac_writes oltp_bulk_insert_ac 86.94ms 81.81ms -5.13ms 0.941x PASS
ac_writes oltp_insert_ac 102.90ms 103.38ms +478us 1.005x PASS
ac_writes oltp_update_index_ac 109.81ms 107.63ms -2.18ms 0.980x PASS
ac_writes oltp_update_non_index_ac 95.12ms 90.45ms -4.67ms 0.951x PASS
ac_writes oltp_delete_insert_ac 99.09ms 101.86ms +2.77ms 1.028x PASS
ac_writes oltp_write_only_ac 110.01ms 103.92ms -6.09ms 0.945x PASS
ac_writes types_delete_insert_ac 95.14ms 98.02ms +2.88ms 1.030x PASS
ac_writes oltp_read_write_ac 113.56ms 113.83ms +277us 1.002x PASS
vc details
Section Test Baseline Candidate Delta Ratio Result
vc status_clean_many_tables 82.12ms 83.10ms +985us 1.012x PASS
vc status_dirty_many_tables 85.13ms 84.93ms -199us 0.998x PASS
vc diff_regular_working_one_table 77.40ms 77.06ms -343us 0.996x PASS
vc diff_regular_working_many_tables 91.33ms 90.86ms -474us 0.995x PASS
vc diff_stat_working_many_tables 91.30ms 91.42ms +115us 1.001x PASS
vc diff_schema_working_many_tables 90.94ms 91.11ms +166us 1.002x PASS
vc branch_list_many_branches 21.86ms 21.63ms -229us 0.990x PASS
vc branch_create_delete 23.98ms 24.93ms +951us 1.040x PASS
vc checkout_branch_clean 55.41ms 55.51ms +100us 1.002x PASS
vc merge_data_no_conflicts 28.36ms 28.15ms -212us 0.993x PASS
vc merge_schema_no_conflicts 21.38ms 21.36ms -28us 0.999x PASS
vc merge_data_conflicts 31.65ms 31.66ms +10us 1.000x PASS
vc merge_data_conflicts_with_resolve 31.71ms 31.82ms +112us 1.004x PASS

All relative performance gates passed.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

DoltLite source coverage

Metric Covered Total Coverage
Lines 53808 63210 85.13%
Branches 24929 36740 67.85%
Functions 2515 2726 92.26%

Merged 200 pooled raw profiles from the distributed Linux correctness jobs.

Per-file coverage (98 files)
File Lines Branches Functions
src/btree_orig_api.c 87.91% 77.27% 89.53%
src/chunk_file.c 100.00% 100.00% 100.00%
src/chunk_index.c 84.27% 66.78% 100.00%
src/chunk_refs.c 84.99% 69.17% 79.37%
src/chunk_staging.c 93.75% 81.15% 100.00%
src/chunk_store.c 91.11% 75.34% 100.00%
src/chunk_store_commit.c 86.75% 67.23% 100.00%
src/chunk_store_lock.c 88.69% 71.00% 100.00%
src/chunk_store_refs_api.c 91.17% 76.75% 100.00%
src/chunk_wal.c 82.48% 58.70% 87.50%
src/doltlite.c 100.00% 100.00% 100.00%
src/doltlite_add.c 86.85% 69.76% 100.00%
src/doltlite_ancestor.c 89.19% 68.92% 100.00%
src/doltlite_at.c 83.39% 64.20% 100.00%
src/doltlite_blame.c 80.86% 61.14% 96.43%
src/doltlite_branch.c 88.30% 80.66% 100.00%
src/doltlite_branches.c 93.75% 75.93% 93.75%
src/doltlite_checkout.c 77.57% 63.06% 96.43%
src/doltlite_cherry_pick.c 79.00% 59.57% 71.43%
src/doltlite_chunk_walk.c 92.23% 66.22% 100.00%
src/doltlite_clean.c 93.33% 67.19% 100.00%
src/doltlite_cmd.c 81.09% 75.19% 100.00%
src/doltlite_commit.c 94.41% 76.87% 100.00%
src/doltlite_commit_ancestors.c 92.09% 72.83% 92.31%
src/doltlite_commit_cmd.c 78.08% 67.50% 100.00%
src/doltlite_config.c 80.47% 71.74% 100.00%
src/doltlite_conflicts.c 84.27% 62.50% 93.75%
src/doltlite_constraint_violations.c 82.46% 57.54% 91.11%
src/doltlite_core.c 91.34% 70.81% 100.00%
src/doltlite_creds.c 84.09% 53.78% 92.00%
src/doltlite_dbpage.c 93.45% 78.33% 91.67%
src/doltlite_diff.c 88.56% 68.99% 96.55%
src/doltlite_diff_stat.c 94.17% 76.01% 95.65%
src/doltlite_diff_table.c 94.09% 70.60% 97.06%
src/doltlite_docs.c 83.94% 71.43% 94.74%
src/doltlite_gc.c 78.48% 58.10% 96.55%
src/doltlite_hashof.c 79.79% 70.05% 100.00%
src/doltlite_history.c 86.93% 76.40% 100.00%
src/doltlite_http_remote.c 82.22% 57.34% 92.31%
src/doltlite_ignore.c 77.57% 62.25% 82.14%
src/doltlite_log.c 96.81% 73.24% 92.86%
src/doltlite_merge.c 95.93% 70.46% 100.00%
src/doltlite_merge_cmd.c 87.39% 72.36% 100.00%
src/doltlite_merge_constraints.c 86.15% 63.64% 95.00%
src/doltlite_merge_constraints_check.c 86.81% 67.79% 100.00%
src/doltlite_merge_constraints_fk.c 78.00% 56.64% 100.00%
src/doltlite_merge_constraints_notnull.c 80.45% 67.92% 100.00%
src/doltlite_merge_constraints_strict.c 77.35% 63.04% 100.00%
src/doltlite_merge_constraints_unique.c 85.99% 62.82% 100.00%
src/doltlite_merge_pass1.c 93.16% 74.60% 100.00%
src/doltlite_merge_pass2.c 83.59% 67.46% 100.00%
src/doltlite_merge_predetect.c 86.38% 71.15% 95.45%
src/doltlite_merge_rebuild.c 99.15% 78.91% 100.00%
src/doltlite_merge_rows.c 83.48% 65.40% 100.00%
src/doltlite_merge_schema.c 91.09% 72.82% 100.00%
src/doltlite_merge_status.c 91.98% 73.53% 92.31%
src/doltlite_patch.c 94.36% 70.71% 98.15%
src/doltlite_rebase.c 85.42% 59.55% 100.00%
src/doltlite_record.c 78.67% 59.36% 95.24%
src/doltlite_ref.c 95.52% 75.36% 100.00%
src/doltlite_remote.c 85.61% 66.89% 96.00%
src/doltlite_remote_sql.c 66.60% 60.73% 93.55%
src/doltlite_remotesrv.c 75.76% 63.77% 90.77%
src/doltlite_reset.c 87.48% 72.76% 100.00%
src/doltlite_revert.c 80.51% 69.44% 100.00%
src/doltlite_schema_diff.c 94.42% 71.13% 96.97%
src/doltlite_schemas.c 70.86% 48.75% 90.91%
src/doltlite_status.c 91.49% 72.78% 97.56%
src/doltlite_tag.c 86.84% 70.31% 94.12%
src/doltlite_tests.c 84.22% 69.61% 91.11%
src/doltlite_tls.c 85.04% 63.64% 92.31%
src/doltlite_verify_constraints.c 79.15% 66.44% 100.00%
src/doltlite_workspace.c 91.84% 70.27% 100.00%
src/pager_shim.c 58.87% 67.46% 34.29%
src/prolly_btree.c 86.00% 66.45% 90.70%
src/prolly_btree_catalog.c 83.10% 69.04% 97.22%
src/prolly_btree_cursor.c 84.15% 62.09% 96.00%
src/prolly_btree_cursor_count.c 80.05% 56.74% 100.00%
src/prolly_btree_cursor_payload.c 75.69% 54.48% 95.65%
src/prolly_btree_cursor_seek.c 76.68% 66.20% 82.35%
src/prolly_btree_mutation.c 88.02% 68.30% 97.83%
src/prolly_btree_orig.c 93.75% 71.43% 93.15%
src/prolly_btree_state.c 93.51% 66.38% 100.00%
src/prolly_btree_txn.c 81.84% 69.30% 98.08%
src/prolly_cache.c 93.27% 69.12% 100.00%
src/prolly_check.c 60.36% 62.96% 100.00%
src/prolly_chunker.c 94.04% 78.38% 100.00%
src/prolly_cursor.c 89.67% 80.47% 100.00%
src/prolly_diff.c 59.59% 46.05% 71.43%
src/prolly_hash.c 93.33% 80.00% 100.00%
src/prolly_hashset.c 90.48% 80.56% 100.00%
src/prolly_mutate.c 80.78% 69.11% 100.00%
src/prolly_mutmap.c 93.87% 80.34% 100.00%
src/prolly_node.c 88.91% 73.81% 100.00%
src/prolly_three_way_diff.c 95.79% 85.37% 100.00%
src/prolly_three_way_merge.c 82.47% 67.78% 91.67%
src/prolly_xxhash.c 100.00% 100.00% 100.00%
src/sortkey.c 93.16% 81.51% 100.00%

Download HTML and LCOV artifacts from this workflow run.

Fixes #2537

Co-Authored-By: OpenAI Codex <noreply@openai.com>
@timsehn
timsehn force-pushed the fix/2537-both-sided-default-delete-merge branch from 89914b3 to 96015f1 Compare September 2, 2026 00:33
@itoqa

itoqa Bot commented Sep 2, 2026

Copy link
Copy Markdown

Ito QA test results

History reset (rebase or force-push detected). Starting test narrative over.

Commit: 96015f1: 19 test cases ran, 19 passed ✅.

Summary

Coverage spans core data-merging behavior across schema changes, defaults, deleted and edited rows, generated fields, indexes, reopening, empty tables, and concurrent operations. It includes normal workflows plus boundary and conflict-handling cases, with results showing consistent values, clean rollback, aligned indexes, and valid database integrity.

Safe to merge — the exercised merge, schema, indexing, generated-value, rollback, and concurrency behaviors showed no PR-attributable regressions or failures. The targeted fault-injection scenario was unavailable in this build, but source review found the failure path safely blocks catalog publication, making it a flag for later rather than a merge blocker.

Tests run by Ito

View full run

Result Severity Type Description
General The merge kept the shared row edit, removed the deleted row, and filled each surviving row with the correct values from its branch. The same values were present after reopening the database, and the integrity check passed.
General Stored generated values remained in the right physical fields, while virtual generated columns used no stored slot. All 24 boundary checks passed across merges, reopen, and version-control operations.
General Both near-compatible schema cases kept the delete/edit conflict, preserved the edited row after rollback, and reopened without saved conflict data.
General After columns were added and rows changed on separate branches, the indexed query returned the same rows as a full table scan. The results stayed correct after reopening the database, and the integrity check passed.
General The merge removed row 2 from the table and its secondary index. The result stayed correct after reopening, with no conflicts and a clean integrity check.
General Stored and virtual generated values matched their source expressions after branch merges, reopen, and consistency checks.
General The normal indexed merge checks passed, and source review shows an index flush error is returned before the merged catalog can be published. The targeted fault could not be injected in this build, so the earlier blockage was a test setup limitation rather than a product failure.
General Two merge sessions were started at the same time. One committed, while the other stopped safely with a database lock; the final table and indexed scans matched, and the integrity check passed.
Conflict The merge reported the expected conflict, kept the edited row with value 20, and left no conflict records after reopening the database.
Defaults Merging the two branches kept the edited values and filled omitted fields with the expected typed defaults. The same values remained after reopening the database, and the integrity check passed.
Delete The merge removed the row deleted on one branch even though the other branch changed only a newly added column. The other rows kept their values, no conflicts were recorded, and the database passed its integrity check.
Generated Stored and virtual generated columns kept the right values after branch merges, reopening the database, and other version-control changes. All 24 checks passed.
Index Indexed scans returned the same merged rows as full table scans before and after reopening, and the database integrity check passed.
Rev The merge kept both composite-key rows, filled both new columns with their declared values, and passed the integrity check after reopening.
Rev The merge kept omitted nullable fields as NULL and preserved the edited row after the expected delete/edit conflict. The failed merge rolled back cleanly, with no durable conflict rows and a passing integrity check.
Rev After the merged database was reopened, the calculated value was 6, the stored value was 10, the two new fields were 9 and 5, and the integrity check passed.
Rev Merging a delete with a change to only a new column removed the row in both branch directions. No merge conflicts were reported.
Rev The merge kept text and numeric defaults in the right types and values. The same results remained correct after reopening the database, and the indexed lookup found the expected row.
Rev Merging schema changes into an empty table kept the table and secondary index metadata valid. After reopening, a new row received both declared defaults, the indexed read returned it, and the integrity check passed.

Tip

Reply with @itoqa to send us feedback on this test run.

@timsehn
timsehn merged commit 739ba34 into master Sep 2, 2026
68 checks passed
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.

delete x ADD COLUMN DEFAULT merge still false-conflicts when both sides add different defaulted columns

1 participant