/ Hex Artifact Content
Login

Artifact a19465046168b4420b5afeed37c3214e42a49f4a:


0000: 23 20 32 30 31 35 20 44 65 63 65 6d 62 65 72 20  # 2015 December 
0010: 37 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  7.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 54 68 65 20 66 6f 63 75 73 0a 23 20  ry. The focus.# 
01b0: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20  of this file is 
01c0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  the sqlite3_snap
01d0: 73 68 6f 74 5f 78 78 78 28 29 20 41 50 49 73 2e  shot_xxx() APIs.
01e0: 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20  .#..set testdir 
01f0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
0200: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
0210: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
0220: 0a 69 66 63 61 70 61 62 6c 65 20 21 73 6e 61 70  .ifcapable !snap
0230: 73 68 6f 74 20 7b 66 69 6e 69 73 68 5f 74 65 73  shot {finish_tes
0240: 74 3b 20 72 65 74 75 72 6e 7d 0a 73 65 74 20 74  t; return}.set t
0250: 65 73 74 70 72 65 66 69 78 20 73 6e 61 70 73 68  estprefix snapsh
0260: 6f 74 0a 0a 23 20 54 68 69 73 20 74 65 73 74 20  ot..# This test 
0270: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 77 69  does not work wi
0280: 74 68 20 74 68 65 20 69 6e 6d 65 6d 6f 72 79 5f  th the inmemory_
0290: 6a 6f 75 72 6e 61 6c 20 70 65 72 6d 75 74 61 74  journal permutat
02a0: 69 6f 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e 0a  ion. The reason.
02b0: 23 20 69 73 20 74 68 61 74 20 65 61 63 68 20 63  # is that each c
02c0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 65 64  onnection opened
02d0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
02e0: 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 65 78 65   permutation exe
02f0: 63 75 74 65 73 0a 23 20 22 50 52 41 47 4d 41 20  cutes.# "PRAGMA 
0300: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d  journal_mode=mem
0310: 6f 72 79 22 2c 20 77 68 69 63 68 20 66 61 69 6c  ory", which fail
0320: 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
0330: 65 20 69 73 20 69 6e 20 77 61 6c 20 6d 6f 64 65  e is in wal mode
0340: 0a 23 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  .# and there are
0350: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 65 78 69   one or more exi
0360: 73 74 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  sting connection
0370: 73 2e 0a 69 66 20 7b 5b 70 65 72 6d 75 74 61 74  s..if {[permutat
0380: 69 6f 6e 5d 3d 3d 22 69 6e 6d 65 6d 6f 72 79 5f  ion]=="inmemory_
0390: 6a 6f 75 72 6e 61 6c 22 7d 20 7b 0a 20 20 66 69  journal"} {.  fi
03a0: 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75  nish_test.  retu
03b0: 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  rn.}..#---------
03c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 0a 23 20 43 68 65 63 6b 20 73 6f 6d 65 20 65 72  .# Check some er
0410: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69  ror conditions i
0420: 6e 20 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29  n snapshot_get()
0430: 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  . It is an error
0440: 20 69 66 3a 0a 23 0a 23 20 20 31 29 20 73 6e 61   if:.#.#  1) sna
0450: 70 73 68 6f 74 5f 67 65 74 28 29 20 69 73 20 63  pshot_get() is c
0460: 61 6c 6c 65 64 20 6f 6e 20 61 20 6e 6f 6e 2d 57  alled on a non-W
0470: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 6f 72 0a  AL database, or.
0480: 23 20 20 32 29 20 74 68 65 72 65 20 69 73 20 61  #  2) there is a
0490: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
04a0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
04b0: 64 61 74 61 62 61 73 65 2e 0a 23 0a 64 6f 5f 65  database..#.do_e
04c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 30 20  xecsql_test 1.0 
04d0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
04e0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53   t1(a, b);.  INS
04f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0500: 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45  ES(1, 2);.  INSE
0510: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0520: 53 28 33 2c 20 34 29 3b 0a 7d 0a 0a 64 6f 5f 74  S(3, 4);.}..do_t
0530: 65 73 74 20 31 2e 31 2e 31 20 7b 0a 20 20 65 78  est 1.1.1 {.  ex
0540: 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b 20 53  ecsql { BEGIN; S
0550: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
0560: 20 7d 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68   }.  list [catch
0570: 20 7b 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73   { sqlite3_snaps
0580: 68 6f 74 5f 67 65 74 20 64 62 20 6d 61 69 6e 20  hot_get db main 
0590: 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31  } msg] $msg.} {1
05a0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64   SQLITE_ERROR}.d
05b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
05c0: 2e 31 2e 32 20 43 4f 4d 4d 49 54 0a 0a 64 6f 5f  .1.2 COMMIT..do_
05d0: 74 65 73 74 20 31 2e 32 2e 31 20 7b 0a 20 20 65  test 1.2.1 {.  e
05e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
05f0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
0600: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 42 45 47 49   = WAL;.    BEGI
0610: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
0620: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
0630: 2c 20 36 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , 6);.      INSE
0640: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0650: 53 28 37 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 6c  S(7, 8);.  }.  l
0660: 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c  ist [catch { sql
0670: 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
0680: 74 20 64 62 20 6d 61 69 6e 20 7d 20 6d 73 67 5d  t db main } msg]
0690: 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54   $msg.} {1 SQLIT
06a0: 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 65 78 65 63  E_ERROR}.do_exec
06b0: 73 71 6c 5f 74 65 73 74 20 31 2e 33 2e 32 20 43  sql_test 1.3.2 C
06c0: 4f 4d 4d 49 54 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  OMMIT..#--------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 61  -.# Check that a
0720: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 77 6f 72   simple case wor
0730: 6b 73 2e 20 52 65 75 73 65 20 74 68 65 20 64 61  ks. Reuse the da
0740: 74 61 62 61 73 65 20 63 72 65 61 74 65 64 20 62  tabase created b
0750: 79 20 74 68 65 0a 23 20 62 6c 6f 63 6b 20 6f 66  y the.# block of
0760: 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 23 0a   tests above..#.
0770: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0780: 32 2e 31 2e 30 20 7b 0a 20 20 42 45 47 49 4e 3b  2.1.0 {.  BEGIN;
0790: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
07a0: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 33 20  OM t1;.} {1 2 3 
07b0: 34 20 35 20 36 20 37 20 38 7d 0a 0a 64 6f 5f 74  4 5 6 7 8}..do_t
07c0: 65 73 74 20 32 2e 31 2e 31 20 7b 0a 20 20 73 65  est 2.1.1 {.  se
07d0: 74 20 73 6e 61 70 73 68 6f 74 20 5b 73 71 6c 69  t snapshot [sqli
07e0: 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74  te3_snapshot_get
07f0: 20 64 62 20 6d 61 69 6e 5d 0a 20 20 65 78 65 63   db main].  exec
0800: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
0810: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0820: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
0830: 30 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  0);.    SELECT *
0840: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
0850: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0860: 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20   9 10}..do_test 
0870: 32 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  2.1.2 {.  execsq
0880: 6c 20 42 45 47 49 4e 0a 20 20 73 71 6c 69 74 65  l BEGIN.  sqlite
0890: 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 20  3_snapshot_open 
08a0: 64 62 20 6d 61 69 6e 20 24 73 6e 61 70 73 68 6f  db main $snapsho
08b0: 74 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  t.  execsql {.  
08c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
08d0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  t1;.  }.} {1 2 3
08e0: 20 34 20 35 20 36 20 37 20 38 7d 0a 0a 64 6f 5f   4 5 6 7 8}..do_
08f0: 74 65 73 74 20 32 2e 31 2e 33 20 7b 0a 20 20 73  test 2.1.3 {.  s
0900: 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
0910: 66 72 65 65 20 24 73 6e 61 70 73 68 6f 74 0a 20  free $snapshot. 
0920: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
0930: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e  } {}..do_test 2.
0940: 32 2e 30 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  2.0 {.  sqlite3 
0950: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
0960: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
0970: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
0980: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 64  * FROM t1;.  } d
0990: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
09a0: 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f  6 7 8 9 10}..do_
09b0: 74 65 73 74 20 32 2e 32 2e 31 20 7b 0a 20 20 73  test 2.2.1 {.  s
09c0: 65 74 20 73 6e 61 70 73 68 6f 74 20 5b 73 71 6c  et snapshot [sql
09d0: 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
09e0: 74 20 64 62 32 20 6d 61 69 6e 5d 0a 20 20 65 78  t db2 main].  ex
09f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
0a00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0a10: 53 28 31 31 2c 20 31 32 29 3b 0a 20 20 20 20 53  S(11, 12);.    S
0a20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
0a30: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  .  }.} {1 2 3 4 
0a40: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0a50: 31 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 32  12}..do_test 2.2
0a60: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42  .2 {.  execsql B
0a70: 45 47 49 4e 0a 20 20 73 71 6c 69 74 65 33 5f 73  EGIN.  sqlite3_s
0a80: 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 20 64 62 20  napshot_open db 
0a90: 6d 61 69 6e 20 24 73 6e 61 70 73 68 6f 74 0a 20  main $snapshot. 
0aa0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0ab0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
0ac0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  .  }.} {1 2 3 4 
0ad0: 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64  5 6 7 8 9 10}..d
0ae0: 6f 5f 74 65 73 74 20 32 2e 32 2e 33 20 7b 0a 20  o_test 2.2.3 {. 
0af0: 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
0b00: 74 5f 66 72 65 65 20 24 73 6e 61 70 73 68 6f 74  t_free $snapshot
0b10: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
0b20: 54 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  T.  execsql COMM
0b30: 49 54 20 64 62 32 0a 20 20 64 62 32 20 63 6c 6f  IT db2.  db2 clo
0b40: 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  se.} {}..do_test
0b50: 20 32 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73   2.3.1 {.  execs
0b60: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
0b70: 20 74 31 20 57 48 45 52 45 20 61 3e 36 20 7d 0a   t1 WHERE a>6 }.
0b80: 20 20 73 65 74 20 73 6e 61 70 73 68 6f 74 20 5b    set snapshot [
0b90: 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
0ba0: 5f 67 65 74 20 64 62 20 6d 61 69 6e 5d 0a 20 20  _get db main].  
0bb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
0bc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0bd0: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
0be0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0bf0: 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  1 VALUES('c', 'd
0c00: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  ');.    SELECT *
0c10: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
0c20: 7b 31 20 32 20 33 20 34 20 35 20 36 20 61 20 62  {1 2 3 4 5 6 a b
0c30: 20 63 20 64 7d 0a 64 6f 5f 74 65 73 74 20 32 2e   c d}.do_test 2.
0c40: 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.2 {.  execsql 
0c50: 42 45 47 49 4e 0a 20 20 73 71 6c 69 74 65 33 5f  BEGIN.  sqlite3_
0c60: 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 20 64 62  snapshot_open db
0c70: 20 6d 61 69 6e 20 24 73 6e 61 70 73 68 6f 74 0a   main $snapshot.
0c80: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0c90: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
0ca0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a   {1 2 3 4 5 6}..
0cb0: 64 6f 5f 74 65 73 74 20 32 2e 33 2e 33 20 7b 0a  do_test 2.3.3 {.
0cc0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0cd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0ce0: 56 41 4c 55 45 53 28 27 78 27 2c 27 79 27 29 0a  VALUES('x','y').
0cf0: 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61    }.} {1 {databa
0d00: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64  se is locked}}.d
0d10: 6f 5f 74 65 73 74 20 32 2e 33 2e 34 20 7b 0a 20  o_test 2.3.4 {. 
0d20: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
0d30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
0d40: 6f 74 5f 66 72 65 65 20 24 73 6e 61 70 73 68 6f  ot_free $snapsho
0d50: 74 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  t.} {}..#-------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 0a 23 20 43 68 65 63 6b 20 73 6f 6d 65 20  --.# Check some 
0db0: 65 72 72 6f 72 73 20 69 6e 20 73 71 6c 69 74 65  errors in sqlite
0dc0: 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28  3_snapshot_open(
0dd0: 29 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  ). It is an erro
0de0: 72 20 69 66 3a 0a 23 0a 23 20 20 20 31 29 20 74  r if:.#.#   1) t
0df0: 68 65 20 64 62 20 69 73 20 69 6e 20 61 75 74 6f  he db is in auto
0e00: 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 0a 23 20  -commit mode,.# 
0e10: 20 20 32 29 20 74 68 65 20 64 62 20 68 61 73 20    2) the db has 
0e20: 61 6e 20 6f 70 65 6e 20 28 72 65 61 64 20 6f 72  an open (read or
0e30: 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
0e40: 69 6f 6e 2c 0a 23 20 20 20 33 29 20 74 68 65 20  ion,.#   3) the 
0e50: 64 62 20 69 73 20 6e 6f 74 20 61 20 77 61 6c 20  db is not a wal 
0e60: 64 61 74 61 62 61 73 65 2c 0a 23 0a 23 20 52 65  database,.#.# Re
0e70: 75 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  use the database
0e80: 20 63 72 65 61 74 65 64 20 62 79 20 65 61 72 6c   created by earl
0e90: 69 65 72 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f  ier tests..#.do_
0ea0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 30  execsql_test 3.0
0eb0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
0ec0: 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a 20 20  BLE t2(x, y);.  
0ed0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0ee0: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
0ef0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0f00: 32 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  2 VALUES('c', 'd
0f10: 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  ');.  BEGIN;.   
0f20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0f30: 32 3b 0a 7d 20 7b 61 20 62 20 63 20 64 7d 0a 64  2;.} {a b c d}.d
0f40: 6f 5f 74 65 73 74 20 33 2e 30 2e 31 20 7b 0a 20  o_test 3.0.1 {. 
0f50: 20 73 65 74 20 73 6e 61 70 73 68 6f 74 20 5b 73   set snapshot [s
0f60: 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
0f70: 67 65 74 20 64 62 20 6d 61 69 6e 5d 0a 20 20 65  get db main].  e
0f80: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  xecsql { COMMIT 
0f90: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
0fa0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0fb0: 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d  UES('e', 'f'); }
0fc0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 33  .} {}..do_test 3
0fd0: 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74  .1 {.  list [cat
0fe0: 63 68 20 7b 73 71 6c 69 74 65 33 5f 73 6e 61 70  ch {sqlite3_snap
0ff0: 73 68 6f 74 5f 6f 70 65 6e 20 64 62 20 6d 61 69  shot_open db mai
1000: 6e 20 24 73 6e 61 70 73 68 6f 74 20 7d 20 6d 73  n $snapshot } ms
1010: 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c  g] $msg.} {1 SQL
1020: 49 54 45 5f 45 52 52 4f 52 7d 0a 0a 64 6f 5f 74  ITE_ERROR}..do_t
1030: 65 73 74 20 33 2e 32 2e 31 20 7b 0a 20 20 65 78  est 3.2.1 {.  ex
1040: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1050: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
1060: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
1070: 20 7b 61 20 62 20 63 20 64 20 65 20 66 7d 0a 64   {a b c d e f}.d
1080: 6f 5f 74 65 73 74 20 33 2e 32 2e 32 20 7b 0a 20  o_test 3.2.2 {. 
1090: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73 71   list [catch {sq
10a0: 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
10b0: 70 65 6e 20 64 62 20 6d 61 69 6e 20 24 73 6e 61  pen db main $sna
10c0: 70 73 68 6f 74 20 7d 20 6d 73 67 5d 20 24 6d 73  pshot } msg] $ms
10d0: 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 45 52  g.} {1 SQLITE_ER
10e0: 52 4f 52 7d 0a 0a 64 6f 5f 74 65 73 74 20 33 2e  ROR}..do_test 3.
10f0: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
1100: 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  {.    COMMIT;.  
1110: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
1120: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1130: 4c 55 45 53 28 27 67 27 2c 20 27 68 27 29 3b 0a  LUES('g', 'h');.
1140: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 63 61 74 63    }.  list [catc
1150: 68 20 7b 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  h {sqlite3_snaps
1160: 68 6f 74 5f 6f 70 65 6e 20 64 62 20 6d 61 69 6e  hot_open db main
1170: 20 24 73 6e 61 70 73 68 6f 74 20 7d 20 6d 73 67   $snapshot } msg
1180: 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49  ] $msg.} {1 SQLI
1190: 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 65 78 65  TE_ERROR}.do_exe
11a0: 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 2e 34 20  csql_test 3.2.4 
11b0: 43 4f 4d 4d 49 54 0a 0a 64 6f 5f 74 65 73 74 20  COMMIT..do_test 
11c0: 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.3.1 {.  execsq
11d0: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
11e0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
11f0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42   }.  execsql { B
1200: 45 47 49 4e 20 7d 0a 20 20 6c 69 73 74 20 5b 63  EGIN }.  list [c
1210: 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 73 6e  atch {sqlite3_sn
1220: 61 70 73 68 6f 74 5f 6f 70 65 6e 20 64 62 20 6d  apshot_open db m
1230: 61 69 6e 20 24 73 6e 61 70 73 68 6f 74 20 7d 20  ain $snapshot } 
1240: 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 53  msg] $msg.} {1 S
1250: 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 0a 64 6f  QLITE_ERROR}..do
1260: 5f 74 65 73 74 20 33 2e 33 2e 32 20 7b 0a 20 20  _test 3.3.2 {.  
1270: 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
1280: 5f 66 72 65 65 20 24 73 6e 61 70 73 68 6f 74 0a  _free $snapshot.
1290: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
12a0: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 53  -.# Check that S
1300: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
1310: 48 4f 54 20 69 73 20 72 65 74 75 72 6e 65 64 20  HOT is returned 
1320: 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
1330: 20 73 6e 61 70 73 68 6f 74 0a 23 20 6e 6f 20 6c   snapshot.# no l
1340: 6f 6e 67 65 72 20 65 78 69 73 74 73 20 62 65 63  onger exists bec
1350: 61 75 73 65 20 74 68 65 20 77 61 6c 20 66 69 6c  ause the wal fil
1360: 65 20 68 61 73 20 62 65 65 6e 20 63 68 65 63 6b  e has been check
1370: 70 6f 69 6e 74 65 64 2e 0a 23 0a 23 20 20 20 31  pointed..#.#   1
1380: 2e 20 52 65 61 64 69 6e 67 20 61 20 73 6e 61 70  . Reading a snap
1390: 73 68 6f 74 20 66 72 6f 6d 20 74 68 65 20 6d 69  shot from the mi
13a0: 64 64 6c 65 20 6f 66 20 61 20 77 61 6c 20 66 69  ddle of a wal fi
13b0: 6c 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  le is not possib
13c0: 6c 65 0a 23 20 20 20 20 20 20 61 66 74 65 72 20  le.#      after 
13d0: 74 68 65 20 77 61 6c 20 66 69 6c 65 20 68 61 73  the wal file has
13e0: 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74   been checkpoint
13f0: 65 64 2e 0a 23 0a 23 20 20 20 32 2e 20 54 68 61  ed..#.#   2. Tha
1400: 74 20 61 20 73 6e 61 70 73 68 6f 74 20 66 72 6f  t a snapshot fro
1410: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 77  m the end of a w
1420: 61 6c 20 66 69 6c 65 20 63 61 6e 20 6e 6f 74 20  al file can not 
1430: 62 65 20 72 65 61 64 20 6f 6e 63 65 0a 23 20 20  be read once.#  
1440: 20 20 20 20 74 68 65 20 77 61 6c 20 66 69 6c 65      the wal file
1450: 20 68 61 73 20 62 65 65 6e 20 77 72 61 70 70 65   has been wrappe
1460: 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d..#.do_execsql_
1470: 74 65 73 74 20 34 2e 31 2e 30 20 7b 0a 20 20 50  test 4.1.0 {.  P
1480: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
1490: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 43 52 45 41  de = wal;.  CREA
14a0: 54 45 20 54 41 42 4c 45 20 74 33 28 69 2c 20 6a  TE TABLE t3(i, j
14b0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
14c0: 20 74 33 20 56 41 4c 55 45 53 28 27 6f 27 2c 20   t3 VALUES('o', 
14d0: 27 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  't');.  INSERT I
14e0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 74  NTO t3 VALUES('t
14f0: 27 2c 20 27 66 27 29 3b 0a 20 20 42 45 47 49 4e  ', 'f');.  BEGIN
1500: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1510: 52 4f 4d 20 74 33 3b 0a 7d 20 7b 77 61 6c 20 6f  ROM t3;.} {wal o
1520: 20 74 20 74 20 66 7d 0a 0a 64 6f 5f 74 65 73 74   t t f}..do_test
1530: 20 34 2e 31 2e 31 20 7b 0a 20 20 73 65 74 20 73   4.1.1 {.  set s
1540: 6e 61 70 73 68 6f 74 20 5b 73 71 6c 69 74 65 33  napshot [sqlite3
1550: 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 64 62  _snapshot_get db
1560: 20 6d 61 69 6e 5d 0a 20 20 65 78 65 63 73 71 6c   main].  execsql
1570: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 64 6f 5f   COMMIT.} {}.do_
1580: 74 65 73 74 20 34 2e 31 2e 32 20 7b 0a 20 20 65  test 4.1.2 {.  e
1590: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 49 4e  xecsql { .    IN
15a0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
15b0: 55 45 53 28 27 66 27 2c 20 27 73 27 29 3b 20 0a  UES('f', 's'); .
15c0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 20      BEGIN;.  }. 
15d0: 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
15e0: 74 5f 6f 70 65 6e 20 64 62 20 6d 61 69 6e 20 24  t_open db main $
15f0: 73 6e 61 70 73 68 6f 74 0a 20 20 65 78 65 63 73  snapshot.  execs
1600: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
1610: 4f 4d 20 74 33 20 7d 0a 7d 20 7b 6f 20 74 20 74  OM t3 }.} {o t t
1620: 20 66 7d 0a 0a 64 6f 5f 74 65 73 74 20 34 2e 31   f}..do_test 4.1
1630: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1640: 20 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20   .    COMMIT;.  
1650: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
1660: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47  ckpoint;.    BEG
1670: 49 4e 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  IN;.  }.  list [
1680: 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 73  catch {sqlite3_s
1690: 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 20 64 62 20  napshot_open db 
16a0: 6d 61 69 6e 20 24 73 6e 61 70 73 68 6f 74 7d 20  main $snapshot} 
16b0: 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 53  msg] $msg.} {1 S
16c0: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
16d0: 48 4f 54 7d 0a 64 6f 5f 74 65 73 74 20 34 2e 31  HOT}.do_test 4.1
16e0: 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  .4 {.  sqlite3_s
16f0: 6e 61 70 73 68 6f 74 5f 66 72 65 65 20 24 73 6e  napshot_free $sn
1700: 61 70 73 68 6f 74 0a 20 20 65 78 65 63 73 71 6c  apshot.  execsql
1710: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
1720: 5f 74 65 73 74 20 34 2e 32 2e 31 20 7b 0a 20 20  _test 4.2.1 {.  
1730: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
1740: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
1750: 55 45 53 28 27 73 27 2c 20 27 65 27 29 3b 0a 20  UES('s', 'e');. 
1760: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1770: 33 20 56 41 4c 55 45 53 28 27 6e 27 2c 20 27 74  3 VALUES('n', 't
1780: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ');.    BEGIN;. 
1790: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
17a0: 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 6f 20  OM t3;.  }.} {o 
17b0: 74 20 74 20 66 20 66 20 73 20 73 20 65 20 6e 20  t t f f s s e n 
17c0: 74 7d 0a 64 6f 5f 74 65 73 74 20 34 2e 32 2e 32  t}.do_test 4.2.2
17d0: 20 7b 0a 20 20 73 65 74 20 73 6e 61 70 73 68 6f   {.  set snapsho
17e0: 74 20 5b 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  t [sqlite3_snaps
17f0: 68 6f 74 5f 67 65 74 20 64 62 20 6d 61 69 6e 5d  hot_get db main]
1800: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1810: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41   COMMIT;.    PRA
1820: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
1830: 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  nt;.    BEGIN;. 
1840: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61   }.  sqlite3_sna
1850: 70 73 68 6f 74 5f 6f 70 65 6e 20 64 62 20 6d 61  pshot_open db ma
1860: 69 6e 20 24 73 6e 61 70 73 68 6f 74 0a 20 20 65  in $snapshot.  e
1870: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
1880: 2a 20 46 52 4f 4d 20 74 33 20 7d 0a 7d 20 7b 6f  * FROM t3 }.} {o
1890: 20 74 20 74 20 66 20 66 20 73 20 73 20 65 20 6e   t t f f s s e n
18a0: 20 74 7d 0a 64 6f 5f 74 65 73 74 20 34 2e 32 2e   t}.do_test 4.2.
18b0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
18c0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
18d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
18e0: 41 4c 55 45 53 28 27 65 27 2c 20 27 74 27 29 3b  ALUES('e', 't');
18f0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a  .    BEGIN;.  }.
1900: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73    list [catch {s
1910: 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
1920: 6f 70 65 6e 20 64 62 20 6d 61 69 6e 20 24 73 6e  open db main $sn
1930: 61 70 73 68 6f 74 7d 20 6d 73 67 5d 20 24 6d 73  apshot} msg] $ms
1940: 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 42 55  g.} {1 SQLITE_BU
1950: 53 59 5f 53 4e 41 50 53 48 4f 54 7d 0a 64 6f 5f  SY_SNAPSHOT}.do_
1960: 74 65 73 74 20 34 2e 32 2e 34 20 7b 0a 20 20 73  test 4.2.4 {.  s
1970: 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
1980: 66 72 65 65 20 24 73 6e 61 70 73 68 6f 74 0a 7d  free $snapshot.}
1990: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
19e0: 23 20 43 68 65 63 6b 20 74 68 61 74 20 53 51 4c  # Check that SQL
19f0: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1a00: 72 6e 65 64 20 69 66 20 61 20 63 68 65 63 6b 70  rned if a checkp
1a10: 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 20  oint is running 
1a20: 77 68 65 6e 0a 23 20 73 71 6c 69 74 65 33 5f 73  when.# sqlite3_s
1a30: 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 29 20 69  napshot_open() i
1a40: 73 20 63 61 6c 6c 65 64 2e 0a 23 0a 72 65 73 65  s called..#.rese
1a50: 74 5f 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 65  t_db.db close.te
1a60: 73 74 76 66 73 20 74 76 66 73 0a 73 71 6c 69 74  stvfs tvfs.sqlit
1a70: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76  e3 db test.db -v
1a80: 66 73 20 74 76 66 73 0a 0a 64 6f 5f 65 78 65 63  fs tvfs..do_exec
1a90: 73 71 6c 5f 74 65 73 74 20 35 2e 31 20 7b 0a 20  sql_test 5.1 {. 
1aa0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
1ab0: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 43 52  mode = wal;.  CR
1ac0: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 2c  EATE TABLE x1(x,
1ad0: 20 78 78 2c 20 78 78 78 29 3b 0a 20 20 49 4e 53   xx, xxx);.  INS
1ae0: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
1af0: 45 53 28 27 7a 27 2c 20 27 7a 7a 27 2c 20 27 7a  ES('z', 'zz', 'z
1b00: 7a 7a 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  zz');.  BEGIN;. 
1b10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1b20: 20 78 31 3b 0a 7d 20 7b 77 61 6c 20 7a 20 7a 7a   x1;.} {wal z zz
1b30: 20 7a 7a 7a 7d 0a 0a 64 6f 5f 74 65 73 74 20 35   zzz}..do_test 5
1b40: 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 73 6e 61  .2 {.  set ::sna
1b50: 70 73 68 6f 74 20 5b 73 71 6c 69 74 65 33 5f 73  pshot [sqlite3_s
1b60: 6e 61 70 73 68 6f 74 5f 67 65 74 20 64 62 20 6d  napshot_get db m
1b70: 61 69 6e 5d 0a 20 20 73 71 6c 69 74 65 33 20 64  ain].  sqlite3 d
1b80: 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20  b2 test.db -vfs 
1b90: 74 76 66 73 0a 20 20 65 78 65 63 73 71 6c 20 7b  tvfs.  execsql {
1ba0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1bb0: 20 78 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20   x1 VALUES('a', 
1bc0: 27 61 61 27 2c 20 27 61 61 61 27 29 3b 0a 20 20  'aa', 'aaa');.  
1bd0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
1be0: 7b 7d 0a 0a 73 65 74 20 74 35 33 20 30 0a 70 72  {}..set t53 0.pr
1bf0: 6f 63 20 77 72 69 74 65 5f 63 61 6c 6c 62 61 63  oc write_callbac
1c00: 6b 20 7b 61 72 67 73 7d 20 7b 0a 20 20 64 6f 5f  k {args} {.  do_
1c10: 74 65 73 74 20 35 2e 33 2e 5b 69 6e 63 72 20 3a  test 5.3.[incr :
1c20: 3a 74 35 33 5d 20 7b 0a 20 20 20 20 65 78 65 63  :t53] {.    exec
1c30: 73 71 6c 20 42 45 47 49 4e 0a 20 20 20 20 6c 69  sql BEGIN.    li
1c40: 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69  st [catch { sqli
1c50: 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  te3_snapshot_ope
1c60: 6e 20 64 62 20 6d 61 69 6e 20 24 3a 3a 73 6e 61  n db main $::sna
1c70: 70 73 68 6f 74 20 7d 20 6d 73 67 5d 20 24 6d 73  pshot } msg] $ms
1c80: 67 0a 20 20 7d 20 7b 31 20 53 51 4c 49 54 45 5f  g.  } {1 SQLITE_
1c90: 42 55 53 59 7d 0a 20 20 63 61 74 63 68 73 71 6c  BUSY}.  catchsql
1ca0: 20 43 4f 4d 4d 49 54 0a 7d 0a 0a 74 76 66 73 20   COMMIT.}..tvfs 
1cb0: 66 69 6c 74 65 72 20 78 57 72 69 74 65 0a 74 76  filter xWrite.tv
1cc0: 66 73 20 73 63 72 69 70 74 20 77 72 69 74 65 5f  fs script write_
1cd0: 63 61 6c 6c 62 61 63 6b 0a 64 62 32 20 65 76 61  callback.db2 eva
1ce0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
1cf0: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 64 62 20 63  heckpoint }.db c
1d00: 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 74  lose.db2 close.t
1d10: 76 66 73 20 64 65 6c 65 74 65 0a 73 71 6c 69 74  vfs delete.sqlit
1d20: 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  e3_snapshot_free
1d30: 20 24 73 6e 61 70 73 68 6f 74 0a 0a 23 2d 2d 2d   $snapshot..#---
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
1d90: 61 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  at sqlite3_snaps
1da0: 68 6f 74 5f 67 65 74 28 29 20 6d 61 79 20 62 65  hot_get() may be
1db0: 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
1dc0: 65 6c 79 20 61 66 74 65 72 0a 23 20 22 42 45 47  ely after.# "BEG
1dd0: 49 4e 3b 20 50 52 41 47 4d 41 20 75 73 65 72 5f  IN; PRAGMA user_
1de0: 76 65 72 73 69 6f 6e 3b 22 2e 20 41 6e 64 20 74  version;". And t
1df0: 68 61 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  hat sqlite3_snap
1e00: 73 68 6f 74 5f 6f 70 65 6e 28 29 20 6d 61 79 0a  shot_open() may.
1e10: 23 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  # be called afte
1e20: 72 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 62  r opening the db
1e30: 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 75 6e 6e   handle and runn
1e40: 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 0a 23  ing the script.#
1e50: 20 22 50 52 41 47 4d 41 20 75 73 65 72 5f 76 65   "PRAGMA user_ve
1e60: 72 73 69 6f 6e 3b 20 42 45 47 49 4e 22 2e 0a 72  rsion; BEGIN"..r
1e70: 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73  eset_db.do_execs
1e80: 71 6c 5f 74 65 73 74 20 36 2e 31 20 7b 0a 20 20  ql_test 6.1 {.  
1e90: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
1ea0: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 43 52 45  ode = wal;.  CRE
1eb0: 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 2c 20  ATE TABLE x1(x, 
1ec0: 78 78 2c 20 78 78 78 29 3b 0a 20 20 49 4e 53 45  xx, xxx);.  INSE
1ed0: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
1ee0: 53 28 27 7a 27 2c 20 27 7a 7a 27 2c 20 27 7a 7a  S('z', 'zz', 'zz
1ef0: 7a 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  z');.  BEGIN;.  
1f00: 20 20 50 52 41 47 4d 41 20 75 73 65 72 5f 76 65    PRAGMA user_ve
1f10: 72 73 69 6f 6e 3b 0a 7d 20 7b 77 61 6c 20 30 7d  rsion;.} {wal 0}
1f20: 0a 64 6f 5f 74 65 73 74 20 36 2e 32 20 7b 0a 20  .do_test 6.2 {. 
1f30: 20 73 65 74 20 3a 3a 73 6e 61 70 73 68 6f 74 20   set ::snapshot 
1f40: 5b 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  [sqlite3_snapsho
1f50: 74 5f 67 65 74 20 64 62 20 6d 61 69 6e 5d 0a 20  t_get db main]. 
1f60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
1f70: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
1f80: 4c 55 45 53 28 27 61 27 2c 20 27 61 61 27 2c 20  LUES('a', 'aa', 
1f90: 27 61 61 61 27 29 3b 0a 20 20 20 20 43 4f 4d 4d  'aaa');.    COMM
1fa0: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  IT;.  }.} {}.do_
1fb0: 74 65 73 74 20 36 2e 33 20 7b 0a 20 20 73 71 6c  test 6.3 {.  sql
1fc0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
1fd0: 20 0a 20 20 64 62 32 20 65 76 61 6c 20 22 50 52   .  db2 eval "PR
1fe0: 41 47 4d 41 20 75 73 65 72 5f 76 65 72 73 69 6f  AGMA user_versio
1ff0: 6e 20 3b 20 42 45 47 49 4e 22 0a 20 20 73 71 6c  n ; BEGIN".  sql
2000: 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
2010: 65 6e 20 64 62 32 20 6d 61 69 6e 20 24 3a 3a 73  en db2 main $::s
2020: 6e 61 70 73 68 6f 74 0a 20 20 64 62 32 20 65 76  napshot.  db2 ev
2030: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
2040: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 7a 20 7a 7a 20  OM x1 }.} {z zz 
2050: 7a 7a 7a 7d 0a 64 6f 5f 74 65 73 74 20 36 2e 34  zzz}.do_test 6.4
2060: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
2070: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
2080: 74 2e 64 62 20 0a 20 20 64 62 32 20 65 76 61 6c  t.db .  db2 eval
2090: 20 22 50 52 41 47 4d 41 20 61 70 70 6c 69 63 61   "PRAGMA applica
20a0: 74 69 6f 6e 5f 69 64 22 0a 20 20 64 62 32 20 65  tion_id".  db2 e
20b0: 76 61 6c 20 22 42 45 47 49 4e 22 0a 20 20 73 71  val "BEGIN".  sq
20c0: 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
20d0: 70 65 6e 20 64 62 32 20 6d 61 69 6e 20 24 3a 3a  pen db2 main $::
20e0: 73 6e 61 70 73 68 6f 74 0a 20 20 64 62 32 20 65  snapshot.  db2 e
20f0: 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  val { SELECT * F
2100: 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 7a 20 7a 7a  ROM x1 }.} {z zz
2110: 20 7a 7a 7a 7d 0a 0a 64 6f 5f 74 65 73 74 20 36   zzz}..do_test 6
2120: 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65  .5 {.  db2 close
2130: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
2140: 65 73 74 2e 64 62 20 0a 20 20 64 62 32 20 65 76  est.db .  db2 ev
2150: 61 6c 20 22 42 45 47 49 4e 22 0a 20 20 6c 69 73  al "BEGIN".  lis
2160: 74 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65  t [catch {sqlite
2170: 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 20  3_snapshot_open 
2180: 64 62 32 20 6d 61 69 6e 20 24 3a 3a 73 6e 61 70  db2 main $::snap
2190: 73 68 6f 74 7d 20 6d 73 67 5d 20 24 6d 73 67 0a  shot} msg] $msg.
21a0: 7d 20 7b 31 20 53 51 4c 49 54 45 5f 45 52 52 4f  } {1 SQLITE_ERRO
21b0: 52 7d 0a 0a 73 71 6c 69 74 65 33 5f 73 6e 61 70  R}..sqlite3_snap
21c0: 73 68 6f 74 5f 66 72 65 65 20 24 73 6e 61 70 73  shot_free $snaps
21d0: 68 6f 74 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  hot..#----------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2220: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
2230: 74 65 73 74 73 20 69 6e 76 65 73 74 69 67 61 74  tests investigat
2240: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 6e  e the sqlite3_sn
2250: 61 70 73 68 6f 74 5f 63 6d 70 28 29 20 41 50 49  apshot_cmp() API
2260: 2e 0a 23 0a 0a 23 20 43 6f 6d 70 61 72 65 20 73  ..#..# Compare s
2270: 6e 61 70 73 68 6f 74 73 20 24 70 31 20 61 6e 64  napshots $p1 and
2280: 20 24 70 32 2c 20 63 68 65 63 6b 69 6e 67 20 74   $p2, checking t
2290: 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69  hat the result i
22a0: 73 20 24 72 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f  s $r..#.proc do_
22b0: 73 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 74 65 73  snapshot_cmp_tes
22c0: 74 20 7b 74 6e 20 70 31 20 70 32 20 72 7d 20 7b  t {tn p1 p2 r} {
22d0: 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74  .  uplevel [list
22e0: 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 20 5b   do_test $tn.1 [
22f0: 6c 69 73 74 20 73 71 6c 69 74 65 33 5f 73 6e 61  list sqlite3_sna
2300: 70 73 68 6f 74 5f 63 6d 70 20 24 70 31 20 24 70  pshot_cmp $p1 $p
2310: 32 5d 20 24 72 5d 0a 20 20 75 70 6c 65 76 65 6c  2] $r].  uplevel
2320: 20 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74 20 24   [list do_test $
2330: 74 6e 2e 32 20 5b 6c 69 73 74 20 73 71 6c 69 74  tn.2 [list sqlit
2340: 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 20  e3_snapshot_cmp 
2350: 24 70 32 20 24 70 31 5d 20 5b 65 78 70 72 20 24  $p2 $p1] [expr $
2360: 72 2a 2d 31 5d 5d 0a 20 20 75 70 6c 65 76 65 6c  r*-1]].  uplevel
2370: 20 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74 20 24   [list do_test $
2380: 74 6e 2e 33 20 5b 6c 69 73 74 20 73 71 6c 69 74  tn.3 [list sqlit
2390: 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 20  e3_snapshot_cmp 
23a0: 24 70 31 20 24 70 31 5d 20 30 5d 0a 20 20 75 70  $p1 $p1] 0].  up
23b0: 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 74  level [list do_t
23c0: 65 73 74 20 24 74 6e 2e 34 20 5b 6c 69 73 74 20  est $tn.4 [list 
23d0: 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
23e0: 5f 63 6d 70 20 24 70 32 20 24 70 32 5d 20 30 5d  _cmp $p2 $p2] 0]
23f0: 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 32 20  .}..catch { db2 
2400: 63 6c 6f 73 65 20 7d 0a 72 65 73 65 74 5f 64 62  close }.reset_db
2410: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
2420: 74 20 37 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  t 7.1 {.  PRAGMA
2430: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
2440: 77 61 6c 3b 0a 20 20 43 52 45 41 54 45 20 54 41  wal;.  CREATE TA
2450: 42 4c 45 20 74 31 28 78 29 3b 0a 7d 20 77 61 6c  BLE t1(x);.} wal
2460: 0a 0a 64 6f 5f 74 65 73 74 20 37 2e 31 2e 32 20  ..do_test 7.1.2 
2470: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45  {.  execsql { BE
2480: 47 49 4e 20 3b 20 50 52 41 47 4d 41 20 61 70 70  GIN ; PRAGMA app
2490: 6c 69 63 61 74 69 6f 6e 5f 69 64 20 7d 0a 20 20  lication_id }.  
24a0: 73 65 74 20 70 31 20 5b 73 71 6c 69 74 65 33 5f  set p1 [sqlite3_
24b0: 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 64 62 20  snapshot_get db 
24c0: 6d 61 69 6e 5d 0a 20 20 65 78 65 63 73 71 6c 20  main].  execsql 
24d0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
24e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30 29 3b  O t1 VALUES(10);
24f0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
2500: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47  .  execsql { BEG
2510: 49 4e 20 3b 20 50 52 41 47 4d 41 20 61 70 70 6c  IN ; PRAGMA appl
2520: 69 63 61 74 69 6f 6e 5f 69 64 20 7d 0a 20 20 73  ication_id }.  s
2530: 65 74 20 70 32 20 5b 73 71 6c 69 74 65 33 5f 73  et p2 [sqlite3_s
2540: 6e 61 70 73 68 6f 74 5f 67 65 74 20 64 62 20 6d  napshot_get db m
2550: 61 69 6e 5d 0a 20 20 65 78 65 63 73 71 6c 20 43  ain].  execsql C
2560: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 73  OMMIT.} {}..do_s
2570: 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 74 65 73 74  napshot_cmp_test
2580: 20 37 2e 31 2e 33 20 24 70 31 20 24 70 32 20 2d   7.1.3 $p1 $p2 -
2590: 31 0a 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  1.sqlite3_snapsh
25a0: 6f 74 5f 66 72 65 65 20 24 70 31 0a 73 71 6c 69  ot_free $p1.sqli
25b0: 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65  te3_snapshot_fre
25c0: 65 20 24 70 32 0a 0a 64 6f 5f 65 78 65 63 73 71  e $p2..do_execsq
25d0: 6c 5f 74 65 73 74 20 37 2e 32 2e 31 20 7b 0a 20  l_test 7.2.1 {. 
25e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
25f0: 56 41 4c 55 45 53 28 31 31 29 3b 0a 20 20 49 4e  VALUES(11);.  IN
2600: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2610: 55 45 53 28 31 32 29 3b 0a 20 20 49 4e 53 45 52  UES(12);.  INSER
2620: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2630: 28 31 33 29 3b 0a 20 20 42 45 47 49 4e 3b 20 0a  (13);.  BEGIN; .
2640: 20 20 20 20 50 52 41 47 4d 41 20 61 70 70 6c 69      PRAGMA appli
2650: 63 61 74 69 6f 6e 5f 69 64 3b 0a 7d 20 7b 30 7d  cation_id;.} {0}
2660: 0a 64 6f 5f 74 65 73 74 20 37 2e 32 2e 32 20 7b  .do_test 7.2.2 {
2670: 0a 20 20 73 65 74 20 70 31 20 5b 73 71 6c 69 74  .  set p1 [sqlit
2680: 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 20  e3_snapshot_get 
2690: 64 62 20 6d 61 69 6e 5d 0a 20 20 65 78 65 63 73  db main].  execs
26a0: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
26b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
26c0: 20 74 31 20 56 41 4c 55 45 53 28 31 34 29 3b 0a   t1 VALUES(14);.
26d0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
26e0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42  heckpoint;.    B
26f0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41 47  EGIN;.      PRAG
2700: 4d 41 20 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69  MA application_i
2710: 64 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70 32 20  d;.  }.  set p2 
2720: 5b 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  [sqlite3_snapsho
2730: 74 5f 67 65 74 20 64 62 20 6d 61 69 6e 5d 0a 20  t_get db main]. 
2740: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
2750: 7d 20 7b 7d 0a 0a 64 6f 5f 73 6e 61 70 73 68 6f  } {}..do_snapsho
2760: 74 5f 63 6d 70 5f 74 65 73 74 20 37 2e 32 2e 33  t_cmp_test 7.2.3
2770: 20 24 70 31 20 24 70 32 20 2d 31 0a 73 71 6c 69   $p1 $p2 -1.sqli
2780: 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65  te3_snapshot_fre
2790: 65 20 24 70 32 0a 0a 64 6f 5f 74 65 73 74 20 37  e $p2..do_test 7
27a0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
27b0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
27c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 34 29  TO t1 VALUES(14)
27d0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
27e0: 20 20 20 50 52 41 47 4d 41 20 61 70 70 6c 69 63     PRAGMA applic
27f0: 61 74 69 6f 6e 5f 69 64 3b 0a 20 20 7d 0a 20 20  ation_id;.  }.  
2800: 73 65 74 20 70 32 20 5b 73 71 6c 69 74 65 33 5f  set p2 [sqlite3_
2810: 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 64 62 20  snapshot_get db 
2820: 6d 61 69 6e 5d 0a 20 20 65 78 65 63 73 71 6c 20  main].  execsql 
2830: 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT.} {}..do_
2840: 73 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 74 65 73  snapshot_cmp_tes
2850: 74 20 37 2e 33 2e 32 20 24 70 31 20 24 70 32 20  t 7.3.2 $p1 $p2 
2860: 2d 31 0a 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  -1.sqlite3_snaps
2870: 68 6f 74 5f 66 72 65 65 20 24 70 31 0a 73 71 6c  hot_free $p1.sql
2880: 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
2890: 65 65 20 24 70 32 0a 0a 66 69 6e 69 73 68 5f 74  ee $p2..finish_t
28a0: 65 73 74 0a                                      est.