Skip to content

Commit d40a9d9

Browse files
authored
Merge pull request #571 from dolthub/fix/autocommit-conflict-summary
Clear autocommit conflict summary from working set
2 parents 9a5fe2a + 14e0659 commit d40a9d9

14 files changed

Lines changed: 159 additions & 68 deletions

src/doltlite.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,9 @@ static int doltliteRollbackAutocommitConflict(
491491
sqlite3_context *ctx,
492492
DoltliteTxnState *pSaved
493493
){
494-
int rc = doltliteRestoreTxnState(db, pSaved);
494+
int rc;
495+
sqlite3RollbackAll(db, SQLITE_OK);
496+
rc = doltliteRestoreTxnState(db, pSaved);
495497
doltliteTxnStateClear(pSaved);
496498
if( rc==SQLITE_OK ){
497499
doltliteReportAutocommitConflictRollback(ctx);

src/prolly_btree.c

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6322,7 +6322,38 @@ void doltliteClearSessionRebaseState(sqlite3 *db){
63226322
}
63236323

63246324
void doltliteGetSessionConflictsCatalog(sqlite3 *db, ProllyHash *pHash){
6325-
doltliteGetSessionMergeState(db, 0, 0, pHash);
6325+
u8 isMerging = 0;
6326+
if( pHash ) memset(pHash, 0, sizeof(*pHash));
6327+
if( !db || db->nDb<=0 || !db->aDb[0].pBt || !pHash ) return;
6328+
if( db->autoCommit && sqlite3_txn_state(db, "main")==SQLITE_TXN_NONE ){
6329+
sqlite3 *db2 = 0;
6330+
const char *zFilename = sqlite3_db_filename(db, "main");
6331+
if( zFilename && sqlite3_open_v2(zFilename, &db2, SQLITE_OPEN_READONLY, 0)==SQLITE_OK
6332+
&& db2 && db2->nDb>0 && db2->aDb[0].pBt ){
6333+
Btree *p2 = db2->aDb[0].pBt;
6334+
Btree *p = db->aDb[0].pBt;
6335+
const char *zBr = p->zBranch ? p->zBranch : "main";
6336+
int rc = btreeLoadWorkingSetBlob(&p2->pBt->store, zBr,
6337+
0, 0, 0, &isMerging,
6338+
0, pHash, 0, 0, 0, 0, 0);
6339+
sqlite3_close(db2);
6340+
if( rc!=SQLITE_OK || !isMerging ){
6341+
memset(pHash, 0, sizeof(*pHash));
6342+
}
6343+
return;
6344+
}
6345+
if( db2 ) sqlite3_close(db2);
6346+
}
6347+
{
6348+
Btree *p = db->aDb[0].pBt;
6349+
const char *zBr = p->zBranch ? p->zBranch : "main";
6350+
int rc = btreeLoadWorkingSetBlob(&p->pBt->store, zBr,
6351+
0, 0, 0, &isMerging,
6352+
0, pHash, 0, 0, 0, 0, 0);
6353+
if( rc!=SQLITE_OK || !isMerging ){
6354+
memset(pHash, 0, sizeof(*pHash));
6355+
}
6356+
}
63266357
}
63276358

63286359
void doltliteSetSessionConflictsCatalog(sqlite3 *db, const ProllyHash *pHash){

test/crash_recovery_test.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,12 @@ static void test_10_very_early_kill(void){
748748
check("test_10: commit count non-negative", nLog>=0);
749749
if( nLog>0 ){
750750
int nRows = exec_int(db, "SELECT count(*) FROM t", -1);
751-
check("test_10: row count matches commits", nRows==nLog);
751+
/* The INSERT for the next would-be commit may already have
752+
** autocommitted before the process is killed inside
753+
** dolt_commit(). In that case recovery can legitimately see one
754+
** extra row beyond the durable Dolt commit count. */
755+
check("test_10: row count matches commits or next insert",
756+
nRows==nLog || nRows==nLog+1);
752757
}
753758
}else{
754759
/* If we killed before the file was created, that's OK. */

test/doltlite_cherry_pick.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,31 @@ run_test_match "cp_conflict_msg" \
9191
run_test "cp_conflict_resolved" "SELECT count(*) FROM dolt_conflicts;" "0" "$DB"
9292
run_test "cp_conflict_ours" "SELECT v FROM t WHERE id=1;" "main_val" "$DB"
9393

94+
DB=/tmp/test_cp_conflict_same_session_$$.db; rm -f "$DB"
95+
TX_OUT=$({
96+
cat <<'SQL'
97+
CREATE TABLE t(id INTEGER PRIMARY KEY, v TEXT);
98+
INSERT INTO t VALUES(1,'orig');
99+
SELECT dolt_commit('-A','-m','c1');
100+
SELECT dolt_branch('feat');
101+
SELECT dolt_checkout('feat');
102+
UPDATE t SET v='feat_val' WHERE id=1;
103+
SELECT dolt_commit('-A','-m','feat modifies row 1');
104+
SELECT dolt_checkout('main');
105+
UPDATE t SET v='main_val' WHERE id=1;
106+
SELECT dolt_commit('-A','-m','main modifies row 1');
107+
SELECT dolt_cherry_pick((SELECT hash FROM dolt_branches WHERE name='feat'));
108+
SELECT 'TX|' || (SELECT count(*) FROM dolt_conflicts) || '|' ||
109+
(SELECT v FROM t WHERE id=1);
110+
SQL
111+
} | $DOLTLITE "$DB" 2>&1 | grep '^TX|')
112+
if [ "$TX_OUT" = "TX|0|main_val" ]; then
113+
PASS=$((PASS+1))
114+
else
115+
FAIL=$((FAIL+1))
116+
ERRORS="$ERRORS\nFAIL: cp_conflict_same_session_summary_cleared\n expected: TX|0|main_val\n got: $TX_OUT"
117+
fi
118+
94119
rm -f "$DB"
95120

96121
# ============================================================

test/doltlite_conflict_rows.sh

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,28 +81,28 @@ SELECT dolt_commit('-A','-m','main');" | $DOLTLITE "$DB" > /dev/null 2>&1
8181
# View individual conflict rows
8282
DB=/tmp/test_cfrow_view_$$.db
8383
setup_row_conflict_repo "$DB"
84-
run_test_match "view_count" "SELECT dolt_merge('hf'); SELECT 'VC|' || count(*) FROM dolt_conflicts_t;" "^VC\\|1$" "$DB"
85-
run_test_match "view_base_id" "SELECT dolt_merge('hf'); SELECT 'VB|' || base_id FROM dolt_conflicts_t;" "^VB\\|1$" "$DB"
86-
run_test_match "view_our_id" "SELECT dolt_merge('hf'); SELECT 'VO|' || our_id FROM dolt_conflicts_t;" "^VO\\|1$" "$DB"
87-
run_test_match "view_their_id" "SELECT dolt_merge('hf'); SELECT 'VT|' || their_id FROM dolt_conflicts_t;" "^VT\\|1$" "$DB"
88-
run_test_match "view_base_val" "SELECT dolt_merge('hf'); SELECT 'VBT|' || typeof(base_v) FROM dolt_conflicts_t;" "^VBT\\|(text|null)$" "$DB"
89-
run_test_match "view_their_val" "SELECT dolt_merge('hf'); SELECT 'VTT|' || typeof(their_v) FROM dolt_conflicts_t;" "^VTT\\|text$" "$DB"
84+
run_test_match "view_count" "BEGIN; SELECT dolt_merge('hf'); SELECT 'VC|' || count(*) FROM dolt_conflicts_t; ROLLBACK;" "^VC\\|1$" "$DB"
85+
run_test_match "view_base_id" "BEGIN; SELECT dolt_merge('hf'); SELECT 'VB|' || base_id FROM dolt_conflicts_t; ROLLBACK;" "^VB\\|1$" "$DB"
86+
run_test_match "view_our_id" "BEGIN; SELECT dolt_merge('hf'); SELECT 'VO|' || our_id FROM dolt_conflicts_t; ROLLBACK;" "^VO\\|1$" "$DB"
87+
run_test_match "view_their_id" "BEGIN; SELECT dolt_merge('hf'); SELECT 'VT|' || their_id FROM dolt_conflicts_t; ROLLBACK;" "^VT\\|1$" "$DB"
88+
run_test_match "view_base_val" "BEGIN; SELECT dolt_merge('hf'); SELECT 'VBT|' || typeof(base_v) FROM dolt_conflicts_t; ROLLBACK;" "^VBT\\|(text|null)$" "$DB"
89+
run_test_match "view_their_val" "BEGIN; SELECT dolt_merge('hf'); SELECT 'VTT|' || typeof(their_v) FROM dolt_conflicts_t; ROLLBACK;" "^VTT\\|text$" "$DB"
9090
rm -f "$DB"
9191

9292
# DELETE resolves individual conflict (keeps ours)
9393
DB=/tmp/test_cfrow_del_$$.db
9494
setup_row_conflict_repo "$DB"
95-
run_test_match "del_summary_cleared" "SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DC|' || count(*) FROM dolt_conflicts;" "^DC\\|0$" "$DB"
96-
run_test_match "del_ours_kept" "SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DV|' || v FROM t WHERE id=1;" "^DV\\|main_val$" "$DB"
97-
run_test_match "del_other_ok" "SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DK|' || v FROM t WHERE id=2;" "^DK\\|keep$" "$DB"
98-
run_test_match "del_clean" "SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DS|' || count(*) FROM dolt_status;" "^DS\\|0$" "$DB"
95+
run_test_match "del_summary_cleared" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DC|' || count(*) FROM dolt_conflicts; ROLLBACK;" "^DC\\|0$" "$DB"
96+
run_test_match "del_ours_kept" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DV|' || v FROM t WHERE id=1; ROLLBACK;" "^DV\\|main_val$" "$DB"
97+
run_test_match "del_other_ok" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DK|' || v FROM t WHERE id=2; ROLLBACK;" "^DK\\|keep$" "$DB"
98+
run_test_match "del_clean" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id=1; SELECT 'DS|' || count(*) FROM dolt_status; ROLLBACK;" "^DS\\|0$" "$DB"
9999
rm -f "$DB"
100100

101101
# --ours resolution clears per-table
102102
DB=/tmp/test_cfrow_ours_$$.db
103103
setup_row_conflict_repo "$DB"
104-
run_test_match "ours_cleared" "SELECT dolt_merge('hf'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'OC|' || count(*) FROM dolt_conflicts;" "^OC\\|0$" "$DB"
105-
run_test_match "ours_val" "SELECT dolt_merge('hf'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'OV|' || v FROM t WHERE id=1;" "^OV\\|main_val$" "$DB"
104+
run_test_match "ours_cleared" "BEGIN; SELECT dolt_merge('hf'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'OC|' || count(*) FROM dolt_conflicts; ROLLBACK;" "^OC\\|0$" "$DB"
105+
run_test_match "ours_val" "BEGIN; SELECT dolt_merge('hf'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'OV|' || v FROM t WHERE id=1; ROLLBACK;" "^OV\\|main_val$" "$DB"
106106
rm -f "$DB"
107107

108108
# No conflict table when no conflicts
@@ -140,7 +140,7 @@ rm -f "$DB"
140140
# Text PK conflicts delete by synthetic rowid
141141
DB=/tmp/test_cfrow_textpk_$$.db
142142
setup_text_pk_conflict_repo "$DB"
143-
run_test_match "textpk_conflict_count" "SELECT dolt_merge('hf'); SELECT 'TC|' || count(*) FROM dolt_conflicts_t;" "^TC\\|2$" "$DB"
143+
run_test_match "textpk_conflict_count" "BEGIN; SELECT dolt_merge('hf'); SELECT 'TC|' || count(*) FROM dolt_conflicts_t; ROLLBACK;" "^TC\\|2$" "$DB"
144144
run_test_match "textpk_target_delete_leaves_one" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id='a'; SELECT 'TL|' || count(*) FROM dolt_conflicts_t; ROLLBACK;" "^TL\\|1$" "$DB"
145145
run_test_match "textpk_target_delete_keeps_b" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_id='a'; SELECT 'TK|' || base_id FROM dolt_conflicts_t; ROLLBACK;" "^TK\\|b$" "$DB"
146146
run_test_match "textpk_full_delete_clears" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t; SELECT 'TF|' || count(*) FROM dolt_conflicts; ROLLBACK;" "^TF\\|0$" "$DB"
@@ -149,7 +149,7 @@ rm -f "$DB"
149149
# Composite PK conflicts delete by synthetic rowid
150150
DB=/tmp/test_cfrow_compositepk_$$.db
151151
setup_composite_pk_conflict_repo "$DB"
152-
run_test_match "compositepk_conflict_count" "SELECT dolt_merge('hf'); SELECT 'CC|' || count(*) FROM dolt_conflicts_t;" "^CC\\|2$" "$DB"
152+
run_test_match "compositepk_conflict_count" "BEGIN; SELECT dolt_merge('hf'); SELECT 'CC|' || count(*) FROM dolt_conflicts_t; ROLLBACK;" "^CC\\|2$" "$DB"
153153
run_test_match "compositepk_target_delete_leaves_one" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_a=1 AND base_b=1; SELECT 'CL|' || count(*) FROM dolt_conflicts_t; ROLLBACK;" "^CL\\|1$" "$DB"
154154
run_test_match "compositepk_target_delete_keeps_other" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t WHERE base_a=1 AND base_b=1; SELECT 'CK|' || base_a || ',' || base_b FROM dolt_conflicts_t; ROLLBACK;" "^CK\\|2,2$" "$DB"
155155
run_test_match "compositepk_full_delete_clears" "BEGIN; SELECT dolt_merge('hf'); DELETE FROM dolt_conflicts_t; SELECT 'CF|' || count(*) FROM dolt_conflicts; ROLLBACK;" "^CF\\|0$" "$DB"

test/doltlite_conflicts.sh

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ echo "SELECT dolt_checkout('feature');" | $DOLTLITE "$DB" > /dev/null 2>&1
1616
echo "UPDATE t SET v='feat'; SELECT dolt_commit('-A','-m','feat');" | $DOLTLITE "$DB" > /dev/null 2>&1
1717
echo "SELECT dolt_checkout('main');" | $DOLTLITE "$DB" > /dev/null 2>&1
1818
run_test_match "conflicts_table" \
19-
"SELECT dolt_merge('feature'); SELECT 'CT|' || \"table\" FROM dolt_conflicts;" \
19+
"BEGIN; SELECT dolt_merge('feature'); SELECT 'CT|' || \"table\" FROM dolt_conflicts; ROLLBACK;" \
2020
"^CT\\|t$" "$DB"
2121
run_test_match "conflicts_count" \
22-
"SELECT dolt_merge('feature'); SELECT 'CC|' || num_conflicts FROM dolt_conflicts;" \
22+
"BEGIN; SELECT dolt_merge('feature'); SELECT 'CC|' || num_conflicts FROM dolt_conflicts; ROLLBACK;" \
2323
"^CC\\|1$" "$DB"
2424

2525
# Test 2: Commit blocked with conflicts in the same SQL session
2626
run_test_match "commit_blocked" \
27-
"SELECT dolt_merge('feature'); SELECT dolt_commit('-A','-m','fail');" \
27+
"BEGIN; SELECT dolt_merge('feature'); SELECT dolt_commit('-A','-m','fail');" \
2828
"unresolved merge conflicts" "$DB"
2929

3030
# Test 3: Resolve --ours keeps our value in-session
3131
run_test_match "resolved_no_conflicts" \
32-
"SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'RC|' || count(*) FROM dolt_conflicts; SELECT 'RV|' || v FROM t;" \
32+
"BEGIN; SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'RC|' || count(*) FROM dolt_conflicts; SELECT 'RV|' || v FROM t; ROLLBACK;" \
3333
"^RC\\|0$" "$DB"
3434
run_test_match "ours_value_kept" \
35-
"SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'RV|' || v FROM t;" \
35+
"BEGIN; SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--ours','t'); SELECT 'RV|' || v FROM t; ROLLBACK;" \
3636
"^RV\\|main$" "$DB"
3737

3838
# Test 4: Resolve --theirs (new scenario)
@@ -44,10 +44,10 @@ echo "SELECT dolt_checkout('feature');" | $DOLTLITE "$DB2" > /dev/null 2>&1
4444
echo "UPDATE t SET v='feat2'; SELECT dolt_commit('-A','-m','feat');" | $DOLTLITE "$DB2" > /dev/null 2>&1
4545
echo "SELECT dolt_checkout('main');" | $DOLTLITE "$DB2" > /dev/null 2>&1
4646
run_test_match "theirs_has_conflict" \
47-
"SELECT dolt_merge('feature'); SELECT 'TC|' || num_conflicts FROM dolt_conflicts;" \
47+
"BEGIN; SELECT dolt_merge('feature'); SELECT 'TC|' || num_conflicts FROM dolt_conflicts; ROLLBACK;" \
4848
"^TC\\|1$" "$DB2"
4949
run_test_match "theirs_resolved" \
50-
"SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TR|' || count(*) FROM dolt_conflicts;" \
50+
"BEGIN; SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TR|' || count(*) FROM dolt_conflicts; ROLLBACK;" \
5151
"^TR\\|0$" "$DB2"
5252

5353
# Test 5: No conflict when different rows modified
@@ -73,14 +73,14 @@ echo "UPDATE t SET v='feat1' WHERE id=1; INSERT INTO t VALUES(4,'feat4'); SELECT
7373
echo "SELECT dolt_checkout('main');" | $DOLTLITE "$DB4" > /dev/null 2>&1
7474
run_test_match "mixed_conflict" "SELECT dolt_merge('feature');" "conflict" "$DB4"
7575
run_test_match "mixed_conflict_count" \
76-
"SELECT dolt_merge('feature'); SELECT 'MC|' || num_conflicts FROM dolt_conflicts;" \
76+
"BEGIN; SELECT dolt_merge('feature'); SELECT 'MC|' || num_conflicts FROM dolt_conflicts; ROLLBACK;" \
7777
"^MC\\|1$" "$DB4"
7878
run_test_match "mixed_auto_row3" \
79-
"SELECT dolt_merge('feature'); SELECT 'MR3|' || v FROM t WHERE id=3;" \
79+
"BEGIN; SELECT dolt_merge('feature'); SELECT 'MR3|' || v FROM t WHERE id=3; ROLLBACK;" \
8080
"^MR3\\|main3$" "$DB4"
8181
run_test_match "mixed_auto_row4" \
82-
"SELECT dolt_merge('feature'); SELECT 'MR4|' || count(*) FROM t WHERE id=4;" \
83-
"^MR4\\|0$" "$DB4"
82+
"BEGIN; SELECT dolt_merge('feature'); SELECT 'MR4|' || count(*) FROM t WHERE id=4; ROLLBACK;" \
83+
"^MR4\\|1$" "$DB4"
8484

8585
# --- Cell-level merge: non-overlapping column changes auto-merge ---
8686
DB5=/tmp/test_conflicts5_$$.db; rm -f "$DB5"
@@ -113,30 +113,30 @@ echo "SELECT dolt_checkout('main'); UPDATE t SET name='CHARLIE' WHERE id=1; SELE
113113

114114
run_test_match "real_conflict" "SELECT dolt_merge('c');" "conflict" "$DB7"
115115
run_test_match "real_conflict_count" \
116-
"SELECT dolt_merge('c'); SELECT 'RC|' || num_conflicts FROM dolt_conflicts;" \
116+
"BEGIN; SELECT dolt_merge('c'); SELECT 'RC|' || num_conflicts FROM dolt_conflicts; ROLLBACK;" \
117117
"^RC\\|1$" "$DB7"
118118

119119
# User columns are now projected individually (Dolt-compatible schema).
120120
run_test_match "conflict_base_decoded" \
121-
"SELECT dolt_merge('c'); SELECT 'BASE|' || base_name FROM dolt_conflicts_t;" \
121+
"BEGIN; SELECT dolt_merge('c'); SELECT 'BASE|' || base_name FROM dolt_conflicts_t; ROLLBACK;" \
122122
"^BASE\\|alice$" "$DB7"
123123
run_test_match "conflict_our_decoded" \
124-
"SELECT dolt_merge('c'); SELECT 'OUR|' || our_name FROM dolt_conflicts_t;" \
124+
"BEGIN; SELECT dolt_merge('c'); SELECT 'OUR|' || our_name FROM dolt_conflicts_t; ROLLBACK;" \
125125
"^OUR\\|CHARLIE$" "$DB7"
126126
run_test_match "conflict_their_decoded" \
127-
"SELECT dolt_merge('c'); SELECT 'THEIR|' || their_name FROM dolt_conflicts_t;" \
127+
"BEGIN; SELECT dolt_merge('c'); SELECT 'THEIR|' || their_name FROM dolt_conflicts_t; ROLLBACK;" \
128128
"^THEIR\\|BOB$" "$DB7"
129129

130130
# Temp table shadowing the user table must not affect dolt_conflicts_<table>
131131
# projection. The conflict view should derive its schema from main.t.
132132
run_test_match "conflict_temp_shadow_base_ignored" \
133-
"SELECT dolt_merge('c'); CREATE TEMP TABLE t(fake TEXT PRIMARY KEY); SELECT 'TSB|' || base_name FROM dolt_conflicts_t;" \
133+
"BEGIN; SELECT dolt_merge('c'); CREATE TEMP TABLE t(fake TEXT PRIMARY KEY); SELECT 'TSB|' || base_name FROM dolt_conflicts_t; ROLLBACK;" \
134134
"^TSB\\|alice$" "$DB7"
135135
run_test_match "conflict_temp_shadow_our_ignored" \
136-
"SELECT dolt_merge('c'); CREATE TEMP TABLE t(fake TEXT PRIMARY KEY); SELECT 'TSO|' || our_name FROM dolt_conflicts_t;" \
136+
"BEGIN; SELECT dolt_merge('c'); CREATE TEMP TABLE t(fake TEXT PRIMARY KEY); SELECT 'TSO|' || our_name FROM dolt_conflicts_t; ROLLBACK;" \
137137
"^TSO\\|CHARLIE$" "$DB7"
138138
run_test_match "conflict_temp_shadow_their_ignored" \
139-
"SELECT dolt_merge('c'); CREATE TEMP TABLE t(fake TEXT PRIMARY KEY); SELECT 'TST|' || their_name FROM dolt_conflicts_t;" \
139+
"BEGIN; SELECT dolt_merge('c'); CREATE TEMP TABLE t(fake TEXT PRIMARY KEY); SELECT 'TST|' || their_name FROM dolt_conflicts_t; ROLLBACK;" \
140140
"^TST\\|BOB$" "$DB7"
141141

142142
# --- Multiple conflicting rows in one table ---
@@ -147,19 +147,19 @@ echo "SELECT dolt_checkout('main'); UPDATE t SET name='a2' WHERE id=1; UPDATE t
147147

148148
run_test_match "multi_row_conflict" "SELECT dolt_merge('other');" "Merge conflict detected" "$DB8"
149149
run_test_match "multi_row_conflict_count" \
150-
"SELECT dolt_merge('other'); SELECT 'MRC|' || num_conflicts FROM dolt_conflicts;" \
150+
"BEGIN; SELECT dolt_merge('other'); SELECT 'MRC|' || num_conflicts FROM dolt_conflicts; ROLLBACK;" \
151151
"^MRC\\|3$" "$DB8"
152152
run_test_match "multi_row_all_rows" \
153-
"SELECT dolt_merge('other'); SELECT 'MRA|' || count(*) FROM dolt_conflicts_t;" \
153+
"BEGIN; SELECT dolt_merge('other'); SELECT 'MRA|' || count(*) FROM dolt_conflicts_t; ROLLBACK;" \
154154
"^MRA\\|3$" "$DB8"
155155
run_test_match "multi_row_has_row1" \
156-
"SELECT dolt_merge('other'); SELECT 'MR1|' || their_name FROM dolt_conflicts_t WHERE base_id=1;" \
156+
"BEGIN; SELECT dolt_merge('other'); SELECT 'MR1|' || their_name FROM dolt_conflicts_t WHERE base_id=1; ROLLBACK;" \
157157
"^MR1\\|A$" "$DB8"
158158
run_test_match "multi_row_has_row2" \
159-
"SELECT dolt_merge('other'); SELECT 'MR2|' || their_name FROM dolt_conflicts_t WHERE base_id=2;" \
159+
"BEGIN; SELECT dolt_merge('other'); SELECT 'MR2|' || their_name FROM dolt_conflicts_t WHERE base_id=2; ROLLBACK;" \
160160
"^MR2\\|B$" "$DB8"
161161
run_test_match "multi_row_has_row3" \
162-
"SELECT dolt_merge('other'); SELECT 'MR3|' || their_name FROM dolt_conflicts_t WHERE base_id=3;" \
162+
"BEGIN; SELECT dolt_merge('other'); SELECT 'MR3|' || their_name FROM dolt_conflicts_t WHERE base_id=3; ROLLBACK;" \
163163
"^MR3\\|C$" "$DB8"
164164

165165
# Test 9: triggers on the target table do NOT fire during conflict
@@ -182,16 +182,16 @@ SELECT dolt_checkout('main');
182182
UPDATE t SET v='main' WHERE id=1;
183183
SELECT dolt_commit('-A','-m','main update');" | $DOLTLITE "$DB9" > /dev/null 2>&1
184184
run_test_match "theirs_delete_conflict_present" \
185-
"SELECT dolt_merge('feature'); SELECT 'TDC|' || count(*) FROM dolt_conflicts;" \
185+
"BEGIN; SELECT dolt_merge('feature'); SELECT 'TDC|' || count(*) FROM dolt_conflicts; ROLLBACK;" \
186186
"^TDC\\|1$" "$DB9"
187187
run_test_match "theirs_delete_clears_conflict" \
188-
"SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TDR|' || count(*) FROM dolt_conflicts;" \
188+
"BEGIN; SELECT dolt_merge('feature'); SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TDR|' || count(*) FROM dolt_conflicts; ROLLBACK;" \
189189
"^TDR\\|0$" "$DB9"
190190
run_test_match "theirs_delete_removes_row" \
191-
"SELECT dolt_merge('feature'); DROP TRIGGER IF EXISTS audit_delete; CREATE TRIGGER audit_delete BEFORE DELETE ON t BEGIN INSERT INTO trig_log VALUES('fired'); END; SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TDD|' || count(*) FROM t WHERE id=1;" \
191+
"BEGIN; SELECT dolt_merge('feature'); DROP TRIGGER IF EXISTS audit_delete; CREATE TRIGGER audit_delete BEFORE DELETE ON t BEGIN INSERT INTO trig_log VALUES('fired'); END; SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TDD|' || count(*) FROM t WHERE id=1; ROLLBACK;" \
192192
"^TDD\\|0$" "$DB9"
193193
run_test_match "theirs_delete_trigger_skipped" \
194-
"SELECT dolt_merge('feature'); DROP TRIGGER IF EXISTS audit_delete; CREATE TRIGGER audit_delete BEFORE DELETE ON t BEGIN INSERT INTO trig_log VALUES('fired'); END; SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TDT|' || count(*) FROM trig_log;" \
194+
"BEGIN; SELECT dolt_merge('feature'); DROP TRIGGER IF EXISTS audit_delete; CREATE TRIGGER audit_delete BEFORE DELETE ON t BEGIN INSERT INTO trig_log VALUES('fired'); END; SELECT dolt_conflicts_resolve('--theirs','t'); SELECT 'TDT|' || count(*) FROM trig_log; ROLLBACK;" \
195195
"^TDT\\|0$" "$DB9"
196196

197197
rm -f "$DB" "$DB2" "$DB3" "$DB4" "$DB5" "$DB6" "$DB7" "$DB8" "$DB9"

0 commit comments

Comments
 (0)