1818b11aeSdan# 2015 December 7 2818b11aeSdan# 3818b11aeSdan# The author disclaims copyright to this source code. In place of 4818b11aeSdan# a legal notice, here is a blessing: 5818b11aeSdan# 6818b11aeSdan# May you do good and not evil. 7818b11aeSdan# May you find forgiveness for yourself and forgive others. 8818b11aeSdan# May you share freely, never taking more than you give. 9818b11aeSdan# 10818b11aeSdan#*********************************************************************** 117d159794Sdan# This file implements regression tests for SQLite library. The focus 127d159794Sdan# of this file is the sqlite3_snapshot_xxx() APIs. 13818b11aeSdan# 14818b11aeSdan 15818b11aeSdanset testdir [file dirname $argv0] 16818b11aeSdansource $testdir/tester.tcl 1768d28ea4Sdrhifcapable !snapshot {finish_test; return} 18818b11aeSdanset testprefix snapshot 19818b11aeSdan 20cc47eac0Sdan# This test does not work with the inmemory_journal permutation. The reason 21cc47eac0Sdan# is that each connection opened as part of this permutation executes 22cc47eac0Sdan# "PRAGMA journal_mode=memory", which fails if the database is in wal mode 23cc47eac0Sdan# and there are one or more existing connections. 24cc47eac0Sdanif {[permutation]=="inmemory_journal"} { 25cc47eac0Sdan finish_test 26cc47eac0Sdan return 27cc47eac0Sdan} 28cc47eac0Sdan 2925accbcaSdanforeach {tn tcl} { 3025accbcaSdan 1 { 3125accbcaSdan proc snapshot_get {DB DBNAME} { 3225accbcaSdan uplevel [list sqlite3_snapshot_get $DB $DBNAME] 3325accbcaSdan } 3425accbcaSdan proc snapshot_open {DB DBNAME SNAPSHOT} { 3525accbcaSdan uplevel [list sqlite3_snapshot_open $DB $DBNAME $SNAPSHOT] 3625accbcaSdan } 3725accbcaSdan proc snapshot_free {SNAPSHOT} { 3825accbcaSdan uplevel [list sqlite3_snapshot_free $SNAPSHOT] 3925accbcaSdan } 4025accbcaSdan proc snapshot_cmp {SNAPSHOT1 SNAPSHOT2} { 4125accbcaSdan uplevel [list sqlite3_snapshot_cmp $SNAPSHOT1 $SNAPSHOT2] 4225accbcaSdan } 4325accbcaSdan } 4425accbcaSdan 4525accbcaSdan 2 { 4625accbcaSdan proc snapshot_get {DB DBNAME} { 4725accbcaSdan uplevel [list sqlite3_snapshot_get_blob $DB $DBNAME] 4825accbcaSdan } 4925accbcaSdan proc snapshot_open {DB DBNAME SNAPSHOT} { 5025accbcaSdan uplevel [list sqlite3_snapshot_open_blob $DB $DBNAME $SNAPSHOT] 5125accbcaSdan } 5225accbcaSdan proc snapshot_free {SNAPSHOT} { 5325accbcaSdan } 5425accbcaSdan proc snapshot_cmp {SNAPSHOT1 SNAPSHOT2} { 5525accbcaSdan uplevel [list sqlite3_snapshot_cmp_blob $SNAPSHOT1 $SNAPSHOT2] 5625accbcaSdan } 5725accbcaSdan } 5825accbcaSdan} { 5925accbcaSdan 6025accbcaSdan reset_db 6125accbcaSdan eval $tcl 6225accbcaSdan 63818b11aeSdan #------------------------------------------------------------------------- 64818b11aeSdan # Check some error conditions in snapshot_get(). It is an error if: 65818b11aeSdan # 667116dc60Sdan # 1) snapshot_get() is called on a non-WAL database, or 677116dc60Sdan # 2) there is an open write transaction on the database. 68edace5d4Sdan # 3) the database handle is in auto-commit mode 69818b11aeSdan # 7025accbcaSdan do_execsql_test $tn.1.0 { 71818b11aeSdan CREATE TABLE t1(a, b); 72818b11aeSdan INSERT INTO t1 VALUES(1, 2); 73818b11aeSdan INSERT INTO t1 VALUES(3, 4); 74818b11aeSdan } 75818b11aeSdan 7625accbcaSdan do_test $tn.1.1.1 { 77818b11aeSdan execsql { BEGIN; SELECT * FROM t1; } 7825accbcaSdan list [catch { snapshot_get db main } msg] $msg 79818b11aeSdan } {1 SQLITE_ERROR} 80edace5d4Sdan do_execsql_test $tn.1.1.2 COMMIT 81818b11aeSdan 8225accbcaSdan do_test $tn.1.2.1 { 83818b11aeSdan execsql { 847116dc60Sdan PRAGMA journal_mode = WAL; 85818b11aeSdan BEGIN; 867116dc60Sdan INSERT INTO t1 VALUES(5, 6); 87818b11aeSdan INSERT INTO t1 VALUES(7, 8); 88818b11aeSdan } 8925accbcaSdan list [catch { snapshot_get db main } msg] $msg 90818b11aeSdan } {1 SQLITE_ERROR} 91edace5d4Sdan do_execsql_test $tn.1.2.2 COMMIT 92edace5d4Sdan 93edace5d4Sdan do_test $tn.1.3.1 { 94edace5d4Sdan list [catch { snapshot_get db main } msg] $msg 95edace5d4Sdan } {1 SQLITE_ERROR} 96edace5d4Sdan do_test $tn.1.3.2 { 97edace5d4Sdan db trans { set snap [snapshot_get db main] } 98edace5d4Sdan snapshot_free $snap 99edace5d4Sdan } {} 100818b11aeSdan 101818b11aeSdan #------------------------------------------------------------------------- 102818b11aeSdan # Check that a simple case works. Reuse the database created by the 103818b11aeSdan # block of tests above. 104818b11aeSdan # 10525accbcaSdan do_execsql_test $tn.2.1.0 { 106818b11aeSdan BEGIN; 107818b11aeSdan SELECT * FROM t1; 108818b11aeSdan } {1 2 3 4 5 6 7 8} 109818b11aeSdan 11025accbcaSdan do_test $tn.2.1.1 { 11125accbcaSdan set snapshot [snapshot_get db main] 112818b11aeSdan execsql { 113818b11aeSdan COMMIT; 114818b11aeSdan INSERT INTO t1 VALUES(9, 10); 115818b11aeSdan SELECT * FROM t1; 116818b11aeSdan } 117818b11aeSdan } {1 2 3 4 5 6 7 8 9 10} 118818b11aeSdan 11925accbcaSdan do_test $tn.2.1.2 { 120818b11aeSdan execsql BEGIN 12125accbcaSdan snapshot_open db main $snapshot 1223bf83ccdSdan execsql { 1233bf83ccdSdan SELECT * FROM t1; 1243bf83ccdSdan } 1253bf83ccdSdan } {1 2 3 4 5 6 7 8} 126818b11aeSdan 12725accbcaSdan do_test $tn.2.1.3 { 12825accbcaSdan snapshot_free $snapshot 129818b11aeSdan execsql COMMIT 130818b11aeSdan } {} 131818b11aeSdan 13225accbcaSdan do_test $tn.2.2.0 { 13365127cd5Sdan sqlite3 db2 test.db 13465127cd5Sdan execsql { 13565127cd5Sdan BEGIN; 13665127cd5Sdan SELECT * FROM t1; 13765127cd5Sdan } db2 13865127cd5Sdan } {1 2 3 4 5 6 7 8 9 10} 13965127cd5Sdan 14025accbcaSdan do_test $tn.2.2.1 { 14125accbcaSdan set snapshot [snapshot_get db2 main] 14265127cd5Sdan execsql { 14365127cd5Sdan INSERT INTO t1 VALUES(11, 12); 14465127cd5Sdan SELECT * FROM t1; 14565127cd5Sdan } 14665127cd5Sdan } {1 2 3 4 5 6 7 8 9 10 11 12} 14765127cd5Sdan 14825accbcaSdan do_test $tn.2.2.2 { 14965127cd5Sdan execsql BEGIN 15025accbcaSdan snapshot_open db main $snapshot 15165127cd5Sdan execsql { 15265127cd5Sdan SELECT * FROM t1; 15365127cd5Sdan } 15465127cd5Sdan } {1 2 3 4 5 6 7 8 9 10} 15565127cd5Sdan 15625accbcaSdan do_test $tn.2.2.3 { 15725accbcaSdan snapshot_free $snapshot 15865127cd5Sdan execsql COMMIT 15965127cd5Sdan execsql COMMIT db2 16065127cd5Sdan db2 close 16165127cd5Sdan } {} 16265127cd5Sdan 16325accbcaSdan do_test $tn.2.3.1 { 1647116dc60Sdan execsql { DELETE FROM t1 WHERE a>6 } 165edace5d4Sdan db trans { set snapshot [snapshot_get db main] } 1667116dc60Sdan execsql { 1677116dc60Sdan INSERT INTO t1 VALUES('a', 'b'); 1687116dc60Sdan INSERT INTO t1 VALUES('c', 'd'); 1697116dc60Sdan SELECT * FROM t1; 1707116dc60Sdan } 1717116dc60Sdan } {1 2 3 4 5 6 a b c d} 17225accbcaSdan do_test $tn.2.3.2 { 1737116dc60Sdan execsql BEGIN 17425accbcaSdan snapshot_open db main $snapshot 1757116dc60Sdan execsql { SELECT * FROM t1 } 1767116dc60Sdan } {1 2 3 4 5 6} 1777116dc60Sdan 17825accbcaSdan do_test $tn.2.3.3 { 1797116dc60Sdan catchsql { 1807116dc60Sdan INSERT INTO t1 VALUES('x','y') 1817116dc60Sdan } 1827116dc60Sdan } {1 {database is locked}} 18325accbcaSdan do_test $tn.2.3.4 { 1847116dc60Sdan execsql COMMIT 18525accbcaSdan snapshot_free $snapshot 1867116dc60Sdan } {} 1877116dc60Sdan 188818b11aeSdan #------------------------------------------------------------------------- 18925accbcaSdan # Check some errors in snapshot_open(). It is an error if: 190818b11aeSdan # 191818b11aeSdan # 1) the db is in auto-commit mode, 192818b11aeSdan # 2) the db has an open (read or write) transaction, 193818b11aeSdan # 3) the db is not a wal database, 194818b11aeSdan # 195818b11aeSdan # Reuse the database created by earlier tests. 196818b11aeSdan # 19725accbcaSdan do_execsql_test $tn.3.0.0 { 198818b11aeSdan CREATE TABLE t2(x, y); 199818b11aeSdan INSERT INTO t2 VALUES('a', 'b'); 200818b11aeSdan INSERT INTO t2 VALUES('c', 'd'); 201818b11aeSdan BEGIN; 202818b11aeSdan SELECT * FROM t2; 203818b11aeSdan } {a b c d} 20425accbcaSdan do_test $tn.3.0.1 { 20525accbcaSdan set snapshot [snapshot_get db main] 206818b11aeSdan execsql { COMMIT } 207818b11aeSdan execsql { INSERT INTO t2 VALUES('e', 'f'); } 208818b11aeSdan } {} 209818b11aeSdan 21025accbcaSdan do_test $tn.3.1 { 21125accbcaSdan list [catch {snapshot_open db main $snapshot } msg] $msg 212818b11aeSdan } {1 SQLITE_ERROR} 213818b11aeSdan 21425accbcaSdan do_test $tn.3.2.1 { 215818b11aeSdan execsql { 216818b11aeSdan BEGIN; 217818b11aeSdan SELECT * FROM t2; 218818b11aeSdan } 219818b11aeSdan } {a b c d e f} 220fa3d4c19Sdan 221fa3d4c19Sdan # Update - it is no longer an error to have a read-transaction open, 222fa3d4c19Sdan # provided there are no active SELECT statements. 223fa3d4c19Sdan do_test $tn.3.2.2a { 224fa3d4c19Sdan db eval "SELECT * FROM t2" { 225fa3d4c19Sdan set res [list [catch {snapshot_open db main $snapshot } msg] $msg] 226fa3d4c19Sdan break 227fa3d4c19Sdan } 228fa3d4c19Sdan set res 229818b11aeSdan } {1 SQLITE_ERROR} 230fa3d4c19Sdan do_test $tn.3.2.2b { 231fa3d4c19Sdan snapshot_open db main $snapshot 232fa3d4c19Sdan } {} 233818b11aeSdan 23425accbcaSdan do_test $tn.3.2.3 { 235818b11aeSdan execsql { 236818b11aeSdan COMMIT; 237818b11aeSdan BEGIN; 238818b11aeSdan INSERT INTO t2 VALUES('g', 'h'); 239818b11aeSdan } 24025accbcaSdan list [catch {snapshot_open db main $snapshot } msg] $msg 241818b11aeSdan } {1 SQLITE_ERROR} 242edace5d4Sdan do_execsql_test $tn.3.2.4 COMMIT 243818b11aeSdan 244fa3d4c19Sdan do_test $tn.3.3.1a { 245818b11aeSdan execsql { PRAGMA journal_mode = DELETE } 246818b11aeSdan execsql { BEGIN } 24725accbcaSdan list [catch {snapshot_open db main $snapshot } msg] $msg 248818b11aeSdan } {1 SQLITE_ERROR} 249818b11aeSdan 250fa3d4c19Sdan do_test $tn.3.3.1b { 251fa3d4c19Sdan execsql { COMMIT ; BEGIN ; SELECT * FROM t2 } 252fa3d4c19Sdan list [catch {snapshot_open db main $snapshot } msg] $msg 253fa3d4c19Sdan } {1 SQLITE_ERROR} 254fa3d4c19Sdan 25525accbcaSdan do_test $tn.$tn.3.3.2 { 25625accbcaSdan snapshot_free $snapshot 257818b11aeSdan execsql COMMIT 258818b11aeSdan } {} 259818b11aeSdan 260818b11aeSdan #------------------------------------------------------------------------- 261*8d4b7a3fSdan # Check that SQLITE_ERROR_SNAPSHOT is returned if the specified snapshot 262818b11aeSdan # no longer exists because the wal file has been checkpointed. 263818b11aeSdan # 264818b11aeSdan # 1. Reading a snapshot from the middle of a wal file is not possible 265818b11aeSdan # after the wal file has been checkpointed. 266818b11aeSdan # 267818b11aeSdan # 2. That a snapshot from the end of a wal file can not be read once 268818b11aeSdan # the wal file has been wrapped. 269818b11aeSdan # 27025accbcaSdan do_execsql_test $tn.4.1.0 { 271818b11aeSdan PRAGMA journal_mode = wal; 272818b11aeSdan CREATE TABLE t3(i, j); 273818b11aeSdan INSERT INTO t3 VALUES('o', 't'); 274818b11aeSdan INSERT INTO t3 VALUES('t', 'f'); 275818b11aeSdan BEGIN; 276818b11aeSdan SELECT * FROM t3; 277818b11aeSdan } {wal o t t f} 278818b11aeSdan 27925accbcaSdan do_test $tn.4.1.1 { 28025accbcaSdan set snapshot [snapshot_get db main] 281818b11aeSdan execsql COMMIT 282818b11aeSdan } {} 28325accbcaSdan do_test $tn.4.1.2 { 284818b11aeSdan execsql { 285818b11aeSdan INSERT INTO t3 VALUES('f', 's'); 286818b11aeSdan BEGIN; 287818b11aeSdan } 28825accbcaSdan snapshot_open db main $snapshot 289818b11aeSdan execsql { SELECT * FROM t3 } 290818b11aeSdan } {o t t f} 291818b11aeSdan 29225accbcaSdan do_test $tn.4.1.3 { 293818b11aeSdan execsql { 294818b11aeSdan COMMIT; 295818b11aeSdan PRAGMA wal_checkpoint; 296818b11aeSdan BEGIN; 297818b11aeSdan } 29825accbcaSdan list [catch {snapshot_open db main $snapshot} msg] $msg 299*8d4b7a3fSdan } {1 SQLITE_ERROR_SNAPSHOT} 30025accbcaSdan do_test $tn.4.1.4 { 30125accbcaSdan snapshot_free $snapshot 302818b11aeSdan execsql COMMIT 303818b11aeSdan } {} 304818b11aeSdan 30525accbcaSdan do_test $tn.4.2.1 { 306818b11aeSdan execsql { 307818b11aeSdan INSERT INTO t3 VALUES('s', 'e'); 308818b11aeSdan INSERT INTO t3 VALUES('n', 't'); 309818b11aeSdan BEGIN; 310818b11aeSdan SELECT * FROM t3; 311818b11aeSdan } 312818b11aeSdan } {o t t f f s s e n t} 31325accbcaSdan do_test $tn.4.2.2 { 31425accbcaSdan set snapshot [snapshot_get db main] 315818b11aeSdan execsql { 316818b11aeSdan COMMIT; 317818b11aeSdan PRAGMA wal_checkpoint; 318818b11aeSdan BEGIN; 319818b11aeSdan } 32025accbcaSdan snapshot_open db main $snapshot 321818b11aeSdan execsql { SELECT * FROM t3 } 322818b11aeSdan } {o t t f f s s e n t} 32325accbcaSdan do_test $tn.4.2.3 { 324818b11aeSdan execsql { 325818b11aeSdan COMMIT; 326818b11aeSdan INSERT INTO t3 VALUES('e', 't'); 327818b11aeSdan BEGIN; 328818b11aeSdan } 32925accbcaSdan list [catch {snapshot_open db main $snapshot} msg] $msg 330*8d4b7a3fSdan } {1 SQLITE_ERROR_SNAPSHOT} 33125accbcaSdan do_test $tn.4.2.4 { 33225accbcaSdan snapshot_free $snapshot 333818b11aeSdan } {} 334818b11aeSdan 335a7aeb398Sdan #------------------------------------------------------------------------- 336a7aeb398Sdan # Check that SQLITE_BUSY is returned if a checkpoint is running when 337a7aeb398Sdan # sqlite3_snapshot_open() is called. 338a7aeb398Sdan # 339a7aeb398Sdan reset_db 340a7aeb398Sdan db close 341a7aeb398Sdan testvfs tvfs 342a7aeb398Sdan sqlite3 db test.db -vfs tvfs 343a7aeb398Sdan 34425accbcaSdan do_execsql_test $tn.5.1 { 345a7aeb398Sdan PRAGMA journal_mode = wal; 346a7aeb398Sdan CREATE TABLE x1(x, xx, xxx); 347a7aeb398Sdan INSERT INTO x1 VALUES('z', 'zz', 'zzz'); 348a7aeb398Sdan BEGIN; 349a7aeb398Sdan SELECT * FROM x1; 350a7aeb398Sdan } {wal z zz zzz} 351a7aeb398Sdan 35225accbcaSdan do_test $tn.5.2 { 35325accbcaSdan set ::snapshot [snapshot_get db main] 354a7aeb398Sdan sqlite3 db2 test.db -vfs tvfs 355a7aeb398Sdan execsql { 356a7aeb398Sdan INSERT INTO x1 VALUES('a', 'aa', 'aaa'); 357a7aeb398Sdan COMMIT; 358a7aeb398Sdan } 359a7aeb398Sdan } {} 360a7aeb398Sdan 361a7aeb398Sdan set t53 0 362a7aeb398Sdan proc write_callback {args} { 36325accbcaSdan do_test $tn.5.3.[incr ::t53] { 364a7aeb398Sdan execsql BEGIN 36525accbcaSdan list [catch { snapshot_open db main $::snapshot } msg] $msg 366a7aeb398Sdan } {1 SQLITE_BUSY} 367a7aeb398Sdan catchsql COMMIT 368a7aeb398Sdan } 369a7aeb398Sdan 370a7aeb398Sdan tvfs filter xWrite 371a7aeb398Sdan tvfs script write_callback 372a7aeb398Sdan db2 eval { PRAGMA wal_checkpoint } 373a7aeb398Sdan db close 374a7aeb398Sdan db2 close 375a7aeb398Sdan tvfs delete 37625accbcaSdan snapshot_free $snapshot 377a7aeb398Sdan 378745c14ebSdan #------------------------------------------------------------------------- 379745c14ebSdan # Test that sqlite3_snapshot_get() may be called immediately after 380745c14ebSdan # "BEGIN; PRAGMA user_version;". And that sqlite3_snapshot_open() may 381745c14ebSdan # be called after opening the db handle and running the script 382745c14ebSdan # "PRAGMA user_version; BEGIN". 383745c14ebSdan reset_db 38425accbcaSdan do_execsql_test $tn.6.1 { 385745c14ebSdan PRAGMA journal_mode = wal; 386745c14ebSdan CREATE TABLE x1(x, xx, xxx); 387745c14ebSdan INSERT INTO x1 VALUES('z', 'zz', 'zzz'); 388745c14ebSdan BEGIN; 389745c14ebSdan PRAGMA user_version; 390745c14ebSdan } {wal 0} 39125accbcaSdan do_test $tn.6.2 { 39225accbcaSdan set ::snapshot [snapshot_get db main] 393745c14ebSdan execsql { 394745c14ebSdan INSERT INTO x1 VALUES('a', 'aa', 'aaa'); 395745c14ebSdan COMMIT; 396745c14ebSdan } 397745c14ebSdan } {} 39825accbcaSdan do_test $tn.6.3 { 399745c14ebSdan sqlite3 db2 test.db 400745c14ebSdan db2 eval "PRAGMA user_version ; BEGIN" 40125accbcaSdan snapshot_open db2 main $::snapshot 402745c14ebSdan db2 eval { SELECT * FROM x1 } 403745c14ebSdan } {z zz zzz} 40425accbcaSdan do_test $tn.6.4 { 405d892ac97Sdrh db2 close 406d892ac97Sdrh sqlite3 db2 test.db 407d892ac97Sdrh db2 eval "PRAGMA application_id" 408d892ac97Sdrh db2 eval "BEGIN" 40925accbcaSdan snapshot_open db2 main $::snapshot 410d892ac97Sdrh db2 eval { SELECT * FROM x1 } 411d892ac97Sdrh } {z zz zzz} 412d892ac97Sdrh 41325accbcaSdan do_test $tn.6.5 { 414d892ac97Sdrh db2 close 415d892ac97Sdrh sqlite3 db2 test.db 416d892ac97Sdrh db2 eval "BEGIN" 41725accbcaSdan list [catch {snapshot_open db2 main $::snapshot} msg] $msg 418d892ac97Sdrh } {1 SQLITE_ERROR} 419d892ac97Sdrh 42025accbcaSdan snapshot_free $snapshot 421745c14ebSdan 422ad2d5bafSdan #------------------------------------------------------------------------- 423ad2d5bafSdan # The following tests investigate the sqlite3_snapshot_cmp() API. 424ad2d5bafSdan # 425745be369Sdan 426745be369Sdan # Compare snapshots $p1 and $p2, checking that the result is $r. 427745be369Sdan # 428745be369Sdan proc do_snapshot_cmp_test {tn p1 p2 r} { 42925accbcaSdan uplevel [list do_test $tn.1 [list snapshot_cmp $p1 $p2] $r] 43025accbcaSdan uplevel [list do_test $tn.2 [list snapshot_cmp $p2 $p1] [expr $r*-1]] 43125accbcaSdan uplevel [list do_test $tn.3 [list snapshot_cmp $p1 $p1] 0] 43225accbcaSdan uplevel [list do_test $tn.4 [list snapshot_cmp $p2 $p2] 0] 433745be369Sdan } 434745be369Sdan 435ad2d5bafSdan catch { db2 close } 436ad2d5bafSdan reset_db 437745be369Sdan 43825accbcaSdan do_execsql_test $tn.7.1 { 439ad2d5bafSdan PRAGMA journal_mode = wal; 440ad2d5bafSdan CREATE TABLE t1(x); 441ad2d5bafSdan } wal 442ad2d5bafSdan 44325accbcaSdan do_test $tn.7.1.2 { 444ad2d5bafSdan execsql { BEGIN ; PRAGMA application_id } 44525accbcaSdan set p1 [snapshot_get db main] 446ad2d5bafSdan execsql { 447ad2d5bafSdan INSERT INTO t1 VALUES(10); 448ad2d5bafSdan COMMIT; 449ad2d5bafSdan } 450ad2d5bafSdan execsql { BEGIN ; PRAGMA application_id } 45125accbcaSdan set p2 [snapshot_get db main] 452ad2d5bafSdan execsql COMMIT 453745be369Sdan } {} 454ad2d5bafSdan 45525accbcaSdan do_snapshot_cmp_test $tn.7.1.3 $p1 $p2 -1 45625accbcaSdan snapshot_free $p1 45725accbcaSdan snapshot_free $p2 458ad2d5bafSdan 45925accbcaSdan do_execsql_test $tn.7.2.1 { 460745be369Sdan INSERT INTO t1 VALUES(11); 461745be369Sdan INSERT INTO t1 VALUES(12); 462745be369Sdan INSERT INTO t1 VALUES(13); 463745be369Sdan BEGIN; 464745be369Sdan PRAGMA application_id; 465745be369Sdan } {0} 46625accbcaSdan do_test $tn.7.2.2 { 46725accbcaSdan set p1 [snapshot_get db main] 468745be369Sdan execsql { 469745be369Sdan COMMIT; 470745be369Sdan INSERT INTO t1 VALUES(14); 471745be369Sdan PRAGMA wal_checkpoint; 472745be369Sdan BEGIN; 473745be369Sdan PRAGMA application_id; 474745be369Sdan } 47525accbcaSdan set p2 [snapshot_get db main] 476745be369Sdan execsql COMMIT 477745be369Sdan } {} 478ad2d5bafSdan 47925accbcaSdan do_snapshot_cmp_test $tn.7.2.3 $p1 $p2 -1 48025accbcaSdan snapshot_free $p2 481745be369Sdan 48225accbcaSdan do_test $tn.7.3.1 { 483745be369Sdan execsql { 484745be369Sdan INSERT INTO t1 VALUES(14); 485745be369Sdan BEGIN; 486745be369Sdan PRAGMA application_id; 487745be369Sdan } 48825accbcaSdan set p2 [snapshot_get db main] 489745be369Sdan execsql COMMIT 490745be369Sdan } {} 491745be369Sdan 49225accbcaSdan do_snapshot_cmp_test $tn.7.3.2 $p1 $p2 -1 49325accbcaSdan snapshot_free $p1 49425accbcaSdan snapshot_free $p2 49525accbcaSdan} 496ad2d5bafSdan 497818b11aeSdanfinish_test 498