Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix another problem with rebasing updates against multiple remote changes. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | sessions-rebase |
Files: | files | file ages | folders |
SHA3-256: |
c8e7b5a061a3f2fbd9072530177b80f9 |
User & Date: | dan 2018-03-22 19:52:22.516 |
Context
2018-03-22
| ||
20:11 | Remove some unused code from sqlite3rebaser_rebase(). (Closed-Leaf check-in: 07cc955eab user: dan tags: sessions-rebase) | |
19:52 | Fix another problem with rebasing updates against multiple remote changes. (check-in: c8e7b5a061 user: dan tags: sessions-rebase) | |
14:07 | Add tests to ensure that patchsets are handled correctly by the session rebase APIs. (check-in: 0e45baaec0 user: dan tags: sessions-rebase) | |
Changes
Changes to ext/session/sessionfault2.test.
︙ | ︙ | |||
139 140 141 142 143 144 145 | } } -test { faultsim_test_result {0 {}} {1 SQLITE_NOMEM} faultsim_integrity_check if {$testrc==0} { compare_db db db2 } } | < < | 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | } } -test { faultsim_test_result {0 {}} {1 SQLITE_NOMEM} faultsim_integrity_check if {$testrc==0} { compare_db db db2 } } #------------------------------------------------------------------------- # OOM when collecting and using a rebase changeset. # reset_db do_execsql_test 2.0 { CREATE TABLE t3(a, b, c, PRIMARY KEY(b, c)); CREATE TABLE t4(x PRIMARY KEY, y, z); |
︙ | ︙ | |||
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 | faultsim_restore_and_reopen set ::rebase [sqlite3changeset_apply_v2 db $::C2 [list xConflict OMIT]] } -body { sqlite3rebaser_create R R configure $::rebase R rebase $::C1 set {} {} } -test { catch { R delete } faultsim_test_result {0 {}} {1 SQLITE_NOMEM} } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 | faultsim_restore_and_reopen set ::rebase [sqlite3changeset_apply_v2 db $::C2 [list xConflict OMIT]] } -body { sqlite3rebaser_create R R configure $::rebase R rebase $::C1 set {} {} } -test { catch { R delete } faultsim_test_result {0 {}} {1 SQLITE_NOMEM} } } reset_db do_execsql_test 3.0 { CREATE TABLE t1(x PRIMARY KEY, y, z); INSERT INTO t1 VALUES(3, 1, 4); INSERT INTO t1 VALUES(1, 5, 9); } faultsim_save_and_close proc xConflict {ret args} { return $ret } do_test 3.1 { faultsim_restore_and_reopen execsql { BEGIN; UPDATE t1 SET z=11; } set C1 [changeset_from_sql { UPDATE t1 SET z=10 WHERE x=1; }] execsql { ROLLBACK } execsql { BEGIN; UPDATE t1 SET z=11; } set C2 [changeset_from_sql { UPDATE t1 SET z=55 WHERE x=1; }] execsql { ROLLBACK } set ::rebase1 [sqlite3changeset_apply_v2 db $::C1 [list xConflict OMIT]] set ::rebase2 [sqlite3changeset_apply_v2 db $::C2 [list xConflict OMIT]] set {} {} execsql { SELECT * FROM t1 } } {3 1 4 1 5 9} do_faultsim_test 3.2 -faults oom* -prep { faultsim_restore_and_reopen } -body { sqlite3rebaser_create R R configure $::rebase1 R configure $::rebase2 set {} {} } -test { catch { R delete } faultsim_test_result {0 {}} {1 SQLITE_NOMEM} } finish_test |
Changes to ext/session/sessionrebase.test.
︙ | ︙ | |||
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | set ::lConflict $conflict_handler set rebase [list] if {$i==1} { lappend rebase [sqlite3changeset_apply_v2 db $c2 xConflict] } else { foreach c $c2 { lappend rebase [sqlite3changeset_apply_v2 db $c xConflict] } } #if {$tn=="2.1.4"} { puts [changeset_to_list $rebase] ; breakpoint } #puts [changeset_to_list [lindex $rebase 0]] ; breakpoint #puts [llength $rebase] sqlite3rebaser_create R foreach r $rebase { R configure $r } set c1r [R rebase $c1] R delete #if {$tn=="2.1.4"} { puts [changeset_to_list $c1r] } sqlite3changeset_apply_v2 db2 $c1r xConflictAbort | > > > > | > | 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | set ::lConflict $conflict_handler set rebase [list] if {$i==1} { lappend rebase [sqlite3changeset_apply_v2 db $c2 xConflict] } else { foreach c $c2 { #puts "apply_v2: [changeset_to_list $c]" lappend rebase [sqlite3changeset_apply_v2 db $c xConflict] } #puts "llength: [llength $rebase]" } #if {$tn=="2.1.4"} { puts [changeset_to_list $rebase] ; breakpoint } #puts [changeset_to_list [lindex $rebase 0]] ; breakpoint #puts [llength $rebase] sqlite3rebaser_create R foreach r $rebase { #puts [changeset_to_list $r] R configure $r } set c1r [R rebase $c1] R delete #if {$tn=="2.1.4"} { puts [changeset_to_list $c1r] } sqlite3changeset_apply_v2 db2 $c1r xConflictAbort if {[string range $tn end end]!="*"} { uplevel [list do_test $tn.$i.1 [list compare_db db db2] {}] } db2 close if {$testsql!=""} { uplevel [list do_execsql_test $tn.$i.2 $testsql $testres] } db eval ROLLBACK |
︙ | ︙ | |||
347 348 349 350 351 352 353 354 355 356 357 358 359 360 | INSERT INTO t3 VALUES(7, 2, 9); INSERT INTO abcdefghijkl VALUES('a', 'b', 'c'); INSERT INTO abcdefghijkl VALUES('d', 'e', 'f'); INSERT INTO abcdefghijkl VALUES('g', 'h', 'i'); } foreach {tn p} { 1 OMIT 2 REPLACE } { do_rebase_test 3.1.$tn { INSERT INTO t3 VALUES(1, 1, 1); UPDATE abcdefghijkl SET y=2; } { | > > > > > > > > | 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 | INSERT INTO t3 VALUES(7, 2, 9); INSERT INTO abcdefghijkl VALUES('a', 'b', 'c'); INSERT INTO abcdefghijkl VALUES('d', 'e', 'f'); INSERT INTO abcdefghijkl VALUES('g', 'h', 'i'); } breakpoint # do_rebase_test 3.6.tn { # UPDATE abcdefghijkl SET z='X', y='X' WHERE x='d'; # } { # UPDATE abcdefghijkl SET y=1 WHERE x='d'; # UPDATE abcdefghijkl SET z=1 WHERE x='d'; # } [list REPLACE REPLACE REPLACE] foreach {tn p} { 1 OMIT 2 REPLACE } { do_rebase_test 3.1.$tn { INSERT INTO t3 VALUES(1, 1, 1); UPDATE abcdefghijkl SET y=2; } { |
︙ | ︙ | |||
379 380 381 382 383 384 385 386 387 388 389 390 391 392 | do_rebase_test 3.4.$tn { INSERT INTO abcdefghijkl VALUES(22, 23, 24); } { INSERT INTO abcdefghijkl VALUES(22, 25, 26); UPDATE abcdefghijkl SET y=400 WHERE x=22; } [list REPLACE $p] } #------------------------------------------------------------------------- # Check that apply_v2() does not create a rebase buffer for a patchset. # And that it is not possible to rebase a patchset. # do_execsql_test 4.0 { | > > > > > > > > > > > > > > > > > > > > | 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 | do_rebase_test 3.4.$tn { INSERT INTO abcdefghijkl VALUES(22, 23, 24); } { INSERT INTO abcdefghijkl VALUES(22, 25, 26); UPDATE abcdefghijkl SET y=400 WHERE x=22; } [list REPLACE $p] do_rebase_test 3.5.$tn* { UPDATE abcdefghijkl SET y='X' WHERE x='d'; } { DELETE FROM abcdefghijkl WHERE x='d'; INSERT INTO abcdefghijkl VALUES('d', NULL, NULL); } [list $p $p $p] do_rebase_test 3.5.$tn { UPDATE abcdefghijkl SET y='X' WHERE x='d'; } { DELETE FROM abcdefghijkl WHERE x='d'; INSERT INTO abcdefghijkl VALUES('d', NULL, NULL); } [list REPLACE $p $p] do_rebase_test 3.6.$tn { UPDATE abcdefghijkl SET z='X', y='X' WHERE x='d'; } { UPDATE abcdefghijkl SET y=1 WHERE x='d'; UPDATE abcdefghijkl SET z=1 WHERE x='d'; } [list REPLACE $p $p] } #------------------------------------------------------------------------- # Check that apply_v2() does not create a rebase buffer for a patchset. # And that it is not possible to rebase a patchset. # do_execsql_test 4.0 { |
︙ | ︙ |
Changes to ext/session/sqlite3session.c.
︙ | ︙ | |||
4590 4591 4592 4593 4594 4595 4596 | pNew->bIndirect = bIndirect || pExist->bIndirect; pNew->op = op2; pOut = pNew->aRecord = (u8*)&pNew[1]; for(i=0; i<pTab->nCol; i++){ int n1 = sessionSerialLen(a1); int n2 = sessionSerialLen(a2); | | | 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 | pNew->bIndirect = bIndirect || pExist->bIndirect; pNew->op = op2; pOut = pNew->aRecord = (u8*)&pNew[1]; for(i=0; i<pTab->nCol; i++){ int n1 = sessionSerialLen(a1); int n2 = sessionSerialLen(a2); if( *a1==0xFF || (pTab->abPK[i]==0 && bIndirect) ){ *pOut++ = 0xFF; }else if( *a2==0 ){ memcpy(pOut, a1, n1); pOut += n1; }else{ memcpy(pOut, a2, n2); pOut += n2; |
︙ | ︙ |