/ Hex Artifact Content
Login

Artifact ec94f0556b6488d97f71c79f9061ae08d9ab8f12:


0000: 23 20 32 30 31 30 20 4e 6f 76 65 6d 62 65 72 20  # 2010 November 
0010: 31 39 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  19.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 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 2a 0a 23 0a 0a 73 65 74 20  ********.#..set 
0170: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0180: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0190: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
01a0: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
01b0: 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f  $testdir/lock_co
01c0: 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 74 65  mmon.tcl..set te
01d0: 73 74 70 72 65 66 69 78 20 73 75 70 65 72 6c 6f  stprefix superlo
01e0: 63 6b 0a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f  ck.do_not_use_co
01f0: 64 65 63 0a 0a 23 20 54 65 73 74 20 6f 72 67 61  dec..# Test orga
0200: 6e 69 7a 61 74 69 6f 6e 3a 0a 23 0a 23 20 20 20  nization:.#.#   
0210: 31 2e 2a 3a 20 54 65 73 74 20 73 75 70 65 72 6c  1.*: Test superl
0220: 6f 63 6b 20 6f 6e 20 61 20 72 6f 6c 6c 62 61 63  ock on a rollbac
0230: 6b 20 64 61 74 61 62 61 73 65 2e 20 54 65 73 74  k database. Test
0240: 20 74 68 61 74 20 6f 6e 63 65 20 74 68 65 20 64   that once the d
0250: 62 20 69 73 0a 23 20 20 20 20 20 20 20 20 73 75  b is.#        su
0260: 70 65 72 6c 6f 63 6b 65 64 2c 20 69 74 20 69 73  perlocked, it is
0270: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
0280: 72 20 61 20 73 65 63 6f 6e 64 20 63 6c 69 65 6e  r a second clien
0290: 74 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a 23  t to read from.#
02a0: 20 20 20 20 20 20 20 20 69 74 2e 0a 23 0a 23 20          it..#.# 
02b0: 20 20 32 2e 2a 3a 20 54 65 73 74 20 73 75 70 65    2.*: Test supe
02c0: 72 6c 6f 63 6b 20 6f 6e 20 61 20 57 41 4c 20 64  rlock on a WAL d
02d0: 61 74 61 62 61 73 65 20 77 69 74 68 20 7a 65 72  atabase with zer
02e0: 6f 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  o frames in the 
02f0: 57 41 4c 20 66 69 6c 65 2e 0a 23 20 20 20 20 20  WAL file..#     
0300: 20 20 20 54 65 73 74 20 74 68 61 74 20 6f 6e 63     Test that onc
0310: 65 20 74 68 65 20 64 62 20 69 73 20 73 75 70 65  e the db is supe
0320: 72 6c 6f 63 6b 65 64 2c 20 69 74 20 69 73 20 6e  rlocked, it is n
0330: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  ot possible to r
0340: 65 61 64 2c 0a 23 20 20 20 20 20 20 20 20 77 72  ead,.#        wr
0350: 69 74 65 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ite or checkpoin
0360: 74 20 74 68 65 20 64 62 2e 0a 23 0a 23 20 20 20  t the db..#.#   
0370: 33 2e 2a 3a 20 41 73 20 32 2e 2a 2c 20 66 6f 72  3.*: As 2.*, for
0380: 20 57 41 4c 20 64 61 74 61 62 61 73 65 73 20 77   WAL databases w
0390: 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ith one or more 
03a0: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 57 41  frames in the WA
03b0: 4c 2e 0a 23 0a 23 20 20 20 34 2e 2a 3a 20 41 73  L..#.#   4.*: As
03c0: 20 32 2e 2a 2c 20 66 6f 72 20 57 41 4c 20 64 61   2.*, for WAL da
03d0: 74 61 62 61 73 65 73 20 77 69 74 68 20 6f 6e 65  tabases with one
03e0: 20 6f 72 20 6d 6f 72 65 20 63 68 65 63 6b 70 6f   or more checkpo
03f0: 69 6e 74 65 64 20 66 72 61 6d 65 73 20 0a 23 20  inted frames .# 
0400: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 57 41         in the WA
0410: 4c 2e 0a 23 0a 23 20 20 20 35 2e 2a 3a 20 54 65  L..#.#   5.*: Te
0420: 73 74 20 74 68 61 74 20 61 20 63 61 6c 6c 20 74  st that a call t
0430: 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  o sqlite3demo_su
0440: 70 65 72 6c 6f 63 6b 28 29 20 75 73 65 73 20 74  perlock() uses t
0450: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
0460: 23 20 20 20 20 20 20 20 20 63 6f 72 72 65 63 74  #        correct
0470: 6c 79 20 74 6f 20 77 61 69 74 20 66 6f 72 20 65  ly to wait for e
0480: 78 69 73 74 69 6e 67 20 63 6c 69 65 6e 74 73 20  xisting clients 
0490: 74 6f 20 63 6c 65 61 72 20 6f 6e 20 61 20 57 41  to clear on a WA
04a0: 4c 20 64 61 74 61 62 61 73 65 2e 0a 23 20 20 20  L database..#   
04b0: 20 20 20 20 20 41 6e 64 20 72 65 74 75 72 6e 73       And returns
04c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
04d0: 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  no busy handler 
04e0: 69 73 20 64 65 66 69 6e 65 64 20 6f 72 20 74 68  is defined or th
04f0: 65 20 62 75 73 79 0a 23 20 20 20 20 20 20 20 20  e busy.#        
0500: 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20  handler returns 
0510: 30 20 62 65 66 6f 72 65 20 73 61 69 64 20 63 6c  0 before said cl
0520: 69 65 6e 74 73 20 72 65 6c 69 6e 71 75 69 73 68  ients relinquish
0530: 20 74 68 65 69 72 20 6c 6f 63 6b 73 2e 0a 23 0a   their locks..#.
0540: 23 20 20 20 36 2e 2a 3a 20 54 65 73 74 20 74 68  #   6.*: Test th
0550: 61 74 20 69 66 20 61 20 73 75 70 65 72 6c 6f 63  at if a superloc
0560: 6b 65 64 20 57 41 4c 20 64 61 74 61 62 61 73 65  ked WAL database
0570: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2c   is overwritten,
0580: 20 65 78 69 73 74 69 6e 67 0a 23 20 20 20 20 20   existing.#     
0590: 20 20 20 63 6c 69 65 6e 74 73 20 72 75 6e 20 74     clients run t
05a0: 68 65 20 72 65 63 6f 76 65 72 79 20 74 6f 20 62  he recovery to b
05b0: 75 69 6c 64 20 74 68 65 20 6e 65 77 20 77 61 6c  uild the new wal
05c0: 2d 69 6e 64 65 78 20 61 66 74 65 72 20 74 68 65  -index after the
05d0: 20 0a 23 20 20 20 20 20 20 20 20 73 75 70 65 72   .#        super
05e0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
05f0: 2e 0a 23 20 20 20 20 20 20 20 20 0a 23 0a 0a 64  ..#        .#..d
0600: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0610: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
0620: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
0630: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0640: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 50  ALUES(1, 2);.  P
0650: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
0660: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 7d 20 7b  de = DELETE;.} {
0670: 64 65 6c 65 74 65 7d 0a 0a 69 66 63 61 70 61 62  delete}..ifcapab
0680: 6c 65 20 21 77 61 6c 20 7b 0a 20 20 66 69 6e 69  le !wal {.  fini
0690: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
06a0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 2e 32 20  .}..do_test 1.2 
06b0: 7b 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  { sqlite3demo_su
06c0: 70 65 72 6c 6f 63 6b 20 75 6e 6c 6f 63 6b 20 74  perlock unlock t
06d0: 65 73 74 2e 64 62 20 7d 20 7b 75 6e 6c 6f 63 6b  est.db } {unlock
06e0: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
06f0: 73 74 20 31 2e 33 20 7b 20 53 45 4c 45 43 54 20  st 1.3 { SELECT 
0700: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 7b  * FROM t1 } {1 {
0710: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0720: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 34  ed}}.do_test 1.4
0730: 20 7b 20 75 6e 6c 6f 63 6b 20 7d 20 7b 7d 0a 0a   { unlock } {}..
0740: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0750: 32 2e 31 20 7b 20 0a 20 20 49 4e 53 45 52 54 20  2.1 { .  INSERT 
0760: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0770: 2c 20 34 29 3b 0a 20 20 50 52 41 47 4d 41 20 6a  , 4);.  PRAGMA j
0780: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
0790: 4c 3b 0a 7d 20 7b 77 61 6c 7d 0a 0a 64 6f 5f 74  L;.} {wal}..do_t
07a0: 65 73 74 20 32 2e 32 20 7b 20 73 71 6c 69 74 65  est 2.2 { sqlite
07b0: 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 20  3demo_superlock 
07c0: 75 6e 6c 6f 63 6b 20 74 65 73 74 2e 64 62 20 7d  unlock test.db }
07d0: 20 7b 75 6e 6c 6f 63 6b 7d 0a 64 6f 5f 63 61 74   {unlock}.do_cat
07e0: 63 68 73 71 6c 5f 74 65 73 74 20 32 2e 33 20 7b  chsql_test 2.3 {
07f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0800: 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 7b 31  1 }           {1
0810: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
0820: 63 6b 65 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  cked}}.do_catchs
0830: 71 6c 5f 74 65 73 74 20 32 2e 34 20 7b 20 49 4e  ql_test 2.4 { IN
0840: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0850: 55 45 53 28 35 2c 20 36 29 7d 20 7b 31 20 7b 64  UES(5, 6)} {1 {d
0860: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
0870: 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  d}}.do_catchsql_
0880: 74 65 73 74 20 32 2e 35 20 7b 20 50 52 41 47 4d  test 2.5 { PRAGM
0890: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
08a0: 20 7d 20 20 20 20 20 20 7b 30 20 7b 31 20 2d 31   }      {0 {1 -1
08b0: 20 2d 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 32 2e   -1}}.do_test 2.
08c0: 36 20 7b 20 75 6e 6c 6f 63 6b 20 7d 20 7b 7d 0a  6 { unlock } {}.
08d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
08e0: 20 33 2e 31 20 7b 20 49 4e 53 45 52 54 20 49 4e   3.1 { INSERT IN
08f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
0900: 34 29 20 7d 20 0a 0a 64 6f 5f 74 65 73 74 20 33  4) } ..do_test 3
0910: 2e 32 20 7b 20 73 71 6c 69 74 65 33 64 65 6d 6f  .2 { sqlite3demo
0920: 5f 73 75 70 65 72 6c 6f 63 6b 20 75 6e 6c 6f 63  _superlock unloc
0930: 6b 20 74 65 73 74 2e 64 62 20 7d 20 7b 75 6e 6c  k test.db } {unl
0940: 6f 63 6b 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ock}.do_catchsql
0950: 5f 74 65 73 74 20 33 2e 33 20 7b 20 53 45 4c 45  _test 3.3 { SELE
0960: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20  CT * FROM t1 }  
0970: 20 20 20 20 20 20 20 20 20 7b 31 20 7b 64 61 74           {1 {dat
0980: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
0990: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
09a0: 73 74 20 33 2e 34 20 7b 20 49 4e 53 45 52 54 20  st 3.4 { INSERT 
09b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
09c0: 2c 20 36 29 7d 20 7b 31 20 7b 64 61 74 61 62 61  , 6)} {1 {databa
09d0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64  se is locked}}.d
09e0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
09f0: 33 2e 35 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  3.5 { PRAGMA wal
0a00: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 20 20  _checkpoint }   
0a10: 20 20 20 7b 30 20 7b 31 20 2d 31 20 2d 31 7d 7d     {0 {1 -1 -1}}
0a20: 0a 64 6f 5f 74 65 73 74 20 33 2e 36 20 7b 20 75  .do_test 3.6 { u
0a30: 6e 6c 6f 63 6b 20 7d 20 7b 7d 0a 0a 23 20 41 74  nlock } {}..# At
0a40: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
0a50: 57 41 4c 20 66 69 6c 65 20 63 6f 6e 73 69 73 74  WAL file consist
0a60: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 72  s of a single fr
0a70: 61 6d 65 20 6f 6e 6c 79 20 2d 20 77 72 69 74 74  ame only - writt
0a80: 65 6e 0a 23 20 62 79 20 74 65 73 74 20 63 61 73  en.# by test cas
0a90: 65 20 33 2e 31 2e 20 49 66 20 74 68 65 20 5a 45  e 3.1. If the ZE
0aa0: 52 4f 5f 44 41 4d 41 47 45 20 66 6c 61 67 20 77  RO_DAMAGE flag w
0ab0: 65 72 65 20 6e 6f 74 20 73 65 74 2c 20 69 74 20  ere not set, it 
0ac0: 77 6f 75 6c 64 20 63 6f 6e 73 69 73 74 0a 23 20  would consist.# 
0ad0: 6f 66 20 74 77 6f 20 66 72 61 6d 65 73 20 2d 20  of two frames - 
0ae0: 74 68 65 20 66 72 61 6d 65 20 77 72 69 74 74 65  the frame writte
0af0: 6e 20 62 79 20 33 2e 31 20 61 6e 64 20 61 20 70  n by 3.1 and a p
0b00: 61 64 64 69 6e 67 20 66 72 61 6d 65 2e 0a 64 6f  adding frame..do
0b10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
0b20: 31 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  1 { PRAGMA wal_c
0b30: 68 65 63 6b 70 6f 69 6e 74 20 7d 20 7b 30 20 31  heckpoint } {0 1
0b40: 20 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 34 2e 32   1}..do_test 4.2
0b50: 20 7b 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   { sqlite3demo_s
0b60: 75 70 65 72 6c 6f 63 6b 20 75 6e 6c 6f 63 6b 20  uperlock unlock 
0b70: 74 65 73 74 2e 64 62 20 7d 20 7b 75 6e 6c 6f 63  test.db } {unloc
0b80: 6b 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  k}.do_catchsql_t
0b90: 65 73 74 20 34 2e 33 20 7b 20 53 45 4c 45 43 54  est 4.3 { SELECT
0ba0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20   * FROM t1 }    
0bb0: 20 20 20 20 20 20 20 7b 31 20 7b 64 61 74 61 62         {1 {datab
0bc0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
0bd0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
0be0: 20 34 2e 34 20 7b 20 49 4e 53 45 52 54 20 49 4e   4.4 { INSERT IN
0bf0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
0c00: 36 29 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  6)} {1 {database
0c10: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
0c20: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34 2e  catchsql_test 4.
0c30: 35 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  5 { PRAGMA wal_c
0c40: 68 65 63 6b 70 6f 69 6e 74 20 7d 20 20 20 20 20  heckpoint }     
0c50: 20 7b 30 20 7b 31 20 2d 31 20 2d 31 7d 7d 0a 64   {0 {1 -1 -1}}.d
0c60: 6f 5f 74 65 73 74 20 34 2e 36 20 7b 20 75 6e 6c  o_test 4.6 { unl
0c70: 6f 63 6b 20 7d 20 7b 7d 0a 0a 64 6f 5f 6d 75 6c  ock } {}..do_mul
0c80: 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
0c90: 20 7b 0a 0a 20 20 70 72 6f 63 20 62 75 73 79 68   {..  proc busyh
0ca0: 61 6e 64 6c 65 72 20 7b 78 7d 20 7b 0a 20 20 20  andler {x} {.   
0cb0: 20 73 77 69 74 63 68 20 2d 2d 20 24 78 20 7b 0a   switch -- $x {.
0cc0: 20 20 20 20 20 20 31 20 7b 20 73 71 6c 31 20 22        1 { sql1 "
0cd0: 43 4f 4d 4d 49 54 22 20 7d 0a 20 20 20 20 20 20  COMMIT" }.      
0ce0: 32 20 7b 20 73 71 6c 32 20 22 43 4f 4d 4d 49 54  2 { sql2 "COMMIT
0cf0: 22 20 7d 0a 20 20 20 20 20 20 33 20 7b 20 73 71  " }.      3 { sq
0d00: 6c 33 20 22 43 4f 4d 4d 49 54 22 20 7d 0a 20 20  l3 "COMMIT" }.  
0d10: 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20    }.    lappend 
0d20: 3a 3a 62 75 73 79 6c 69 73 74 20 24 78 0a 20 20  ::busylist $x.  
0d30: 20 20 72 65 74 75 72 6e 20 31 0a 20 20 7d 0a 20    return 1.  }. 
0d40: 20 73 65 74 20 3a 3a 62 75 73 79 6c 69 73 74 20   set ::busylist 
0d50: 5b 6c 69 73 74 5d 0a 0a 20 20 64 6f 5f 74 65 73  [list]..  do_tes
0d60: 74 20 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  t 5.$tn.1 {.    
0d70: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 43 52 45  sql1 {.      CRE
0d80: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
0d90: 62 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  b);.      PRAGMA
0da0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
0db0: 57 41 4c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  WAL;.      INSER
0dc0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0dd0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20  (1, 2);.    }.  
0de0: 7d 20 7b 77 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65  } {wal}..  do_te
0df0: 73 74 20 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  st 5.$tn.2 {.   
0e00: 20 73 71 6c 31 20 7b 20 42 45 47 49 4e 20 3b 20   sql1 { BEGIN ; 
0e10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0e20: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45   }.    sql2 { BE
0e30: 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49 4e 54  GIN ; INSERT INT
0e40: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
0e50: 29 20 7d 0a 20 20 20 20 73 71 6c 33 20 7b 20 42  ) }.    sql3 { B
0e60: 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20  EGIN ; SELECT * 
0e70: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
0e80: 20 32 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 35   2}..  do_test 5
0e90: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73 65 74  .$tn.3 {.    set
0ea0: 20 3a 3a 62 75 73 79 6c 69 73 74 20 5b 6c 69 73   ::busylist [lis
0eb0: 74 5d 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65  t].    sqlite3de
0ec0: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 20 75 6e 6c  mo_superlock unl
0ed0: 6f 63 6b 20 74 65 73 74 2e 64 62 20 22 22 20 62  ock test.db "" b
0ee0: 75 73 79 68 61 6e 64 6c 65 72 0a 20 20 20 20 73  usyhandler.    s
0ef0: 65 74 20 3a 3a 62 75 73 79 6c 69 73 74 0a 20 20  et ::busylist.  
0f00: 7d 20 7b 30 20 31 20 32 20 33 7d 0a 0a 20 20 64  } {0 1 2 3}..  d
0f10: 6f 5f 74 65 73 74 20 35 2e 24 74 6e 2e 34 20 7b  o_test 5.$tn.4 {
0f20: 20 63 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20   csql2 { SELECT 
0f30: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0f40: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
0f50: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
0f60: 20 35 2e 24 74 6e 2e 35 20 7b 20 0a 20 20 20 20   5.$tn.5 { .    
0f70: 63 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20 49  csql3 { INSERT I
0f80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
0f90: 20 36 29 20 7d 20 0a 20 20 7d 20 7b 31 20 7b 64   6) } .  } {1 {d
0fa0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
0fb0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 35 2e  d}}.  do_test 5.
0fc0: 24 74 6e 2e 36 20 7b 20 63 73 71 6c 31 20 22 50  $tn.6 { csql1 "P
0fd0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
0fe0: 6f 69 6e 74 22 20 7d 20 7b 30 20 7b 31 20 2d 31  oint" } {0 {1 -1
0ff0: 20 2d 31 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   -1}}..  do_test
1000: 20 35 2e 24 74 6e 2e 37 20 7b 20 75 6e 6c 6f 63   5.$tn.7 { unloc
1010: 6b 20 7d 20 7b 7d 0a 0a 20 20 0a 20 20 64 6f 5f  k } {}..  .  do_
1020: 74 65 73 74 20 35 2e 24 74 6e 2e 38 20 7b 0a 20  test 5.$tn.8 {. 
1030: 20 20 20 73 71 6c 31 20 7b 20 42 45 47 49 4e 20     sql1 { BEGIN 
1040: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1050: 74 31 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20  t1 }.    sql2 { 
1060: 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49  BEGIN ; INSERT I
1070: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
1080: 20 36 29 20 7d 0a 20 20 20 20 73 71 6c 33 20 7b   6) }.    sql3 {
1090: 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20   BEGIN ; SELECT 
10a0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
10b0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 64 6f 5f  {1 2 3 4}..  do_
10c0: 74 65 73 74 20 35 2e 24 74 6e 2e 39 20 7b 20 0a  test 5.$tn.9 { .
10d0: 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
10e0: 7b 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70  {sqlite3demo_sup
10f0: 65 72 6c 6f 63 6b 20 75 6e 6c 6f 63 6b 20 74 65  erlock unlock te
1100: 73 74 2e 64 62 7d 20 6d 73 67 5d 20 24 6d 73 67  st.db} msg] $msg
1110: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
1120: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
1130: 64 6f 5f 74 65 73 74 20 35 2e 24 74 6e 2e 31 30  do_test 5.$tn.10
1140: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 43 4f 4d   { .    sql1 COM
1150: 4d 49 54 0a 20 20 20 20 6c 69 73 74 20 5b 63 61  MIT.    list [ca
1160: 74 63 68 20 7b 73 71 6c 69 74 65 33 64 65 6d 6f  tch {sqlite3demo
1170: 5f 73 75 70 65 72 6c 6f 63 6b 20 75 6e 6c 6f 63  _superlock unloc
1180: 6b 20 74 65 73 74 2e 64 62 7d 20 6d 73 67 5d 20  k test.db} msg] 
1190: 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74  $msg.  } {1 {dat
11a0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
11b0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 35 2e 24 74  }.  do_test 5.$t
11c0: 6e 2e 31 31 20 7b 20 0a 20 20 20 20 73 71 6c 32  n.11 { .    sql2
11d0: 20 43 4f 4d 4d 49 54 0a 20 20 20 20 6c 69 73 74   COMMIT.    list
11e0: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
11f0: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 20 75  demo_superlock u
1200: 6e 6c 6f 63 6b 20 74 65 73 74 2e 64 62 7d 20 6d  nlock test.db} m
1210: 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20  sg] $msg.  } {1 
1220: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1230: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
1240: 35 2e 24 74 6e 2e 31 32 20 7b 20 0a 20 20 20 20  5.$tn.12 { .    
1250: 73 71 6c 33 20 43 4f 4d 4d 49 54 0a 20 20 20 20  sql3 COMMIT.    
1260: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73 71 6c  list [catch {sql
1270: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
1280: 63 6b 20 75 6e 6c 6f 63 6b 20 74 65 73 74 2e 64  ck unlock test.d
1290: 62 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d  b} msg] $msg.  }
12a0: 20 7b 30 20 75 6e 6c 6f 63 6b 7d 0a 20 20 75 6e   {0 unlock}.  un
12b0: 6c 6f 63 6b 0a 0a 0a 20 20 64 6f 5f 74 65 73 74  lock...  do_test
12c0: 20 35 2e 24 74 6e 2e 31 33 20 7b 20 73 71 6c 31   5.$tn.13 { sql1
12d0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
12e0: 20 74 31 20 7d 20 7d 20 7b 31 20 32 20 33 20 34   t1 } } {1 2 3 4
12f0: 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20   5 6}.  do_test 
1300: 35 2e 24 74 6e 2e 31 34 20 7b 20 73 71 6c 32 20  5.$tn.14 { sql2 
1310: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1320: 74 31 20 7d 20 7d 20 7b 31 20 32 20 33 20 34 20  t1 } } {1 2 3 4 
1330: 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 35  5 6}.  do_test 5
1340: 2e 24 74 6e 2e 31 35 20 7b 20 73 71 6c 69 74 65  .$tn.15 { sqlite
1350: 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 20  3demo_superlock 
1360: 75 6e 6c 6f 63 6b 20 74 65 73 74 2e 64 62 20 7d  unlock test.db }
1370: 20 7b 75 6e 6c 6f 63 6b 7d 0a 20 20 64 6f 5f 74   {unlock}.  do_t
1380: 65 73 74 20 35 2e 24 74 6e 2e 31 36 20 7b 20 75  est 5.$tn.16 { u
1390: 6e 6c 6f 63 6b 20 7d 20 7b 7d 0a 20 20 64 6f 5f  nlock } {}.  do_
13a0: 74 65 73 74 20 35 2e 24 74 6e 2e 31 37 20 7b 20  test 5.$tn.17 { 
13b0: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
13c0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 32  FROM t1 } } {1 2
13d0: 20 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74   3 4 5 6}.  do_t
13e0: 65 73 74 20 35 2e 24 74 6e 2e 31 38 20 7b 20 73  est 5.$tn.18 { s
13f0: 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql1 { SELECT * F
1400: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 32 20  ROM t1 } } {1 2 
1410: 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65  3 4 5 6}.  do_te
1420: 73 74 20 35 2e 24 74 6e 2e 31 39 20 7b 20 73 71  st 5.$tn.19 { sq
1430: 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
1440: 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 32 20 33  OM t1 } } {1 2 3
1450: 20 34 20 35 20 36 7d 0a 7d 0a 0a 70 72 6f 63 20   4 5 6}.}..proc 
1460: 72 65 61 64 5f 63 6f 6e 74 65 6e 74 20 7b 66 69  read_content {fi
1470: 6c 65 7d 20 7b 0a 20 20 69 66 20 7b 5b 66 69 6c  le} {.  if {[fil
1480: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 5d 3d  e exists $file]=
1490: 3d 30 7d 20 7b 72 65 74 75 72 6e 20 22 22 7d 0a  =0} {return ""}.
14a0: 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24    set fd [open $
14b0: 66 69 6c 65 5d 0a 20 20 66 63 6f 6e 66 69 67 75  file].  fconfigu
14c0: 72 65 20 24 66 64 20 2d 65 6e 63 6f 64 69 6e 67  re $fd -encoding
14d0: 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61   binary -transla
14e0: 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 73 65  tion binary.  se
14f0: 74 20 63 6f 6e 74 65 6e 74 20 5b 72 65 61 64 20  t content [read 
1500: 24 66 64 5d 0a 20 20 63 6c 6f 73 65 20 24 66 64  $fd].  close $fd
1510: 0a 20 20 72 65 74 75 72 6e 20 24 63 6f 6e 74 65  .  return $conte
1520: 6e 74 0a 7d 0a 0a 70 72 6f 63 20 77 72 69 74 65  nt.}..proc write
1530: 5f 63 6f 6e 74 65 6e 74 20 7b 66 69 6c 65 20 63  _content {file c
1540: 6f 6e 74 65 6e 74 7d 20 7b 0a 20 20 73 65 74 20  ontent} {.  set 
1550: 66 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 20 77  fd [open $file w
1560: 2b 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20  +].  fconfigure 
1570: 24 66 64 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69  $fd -encoding bi
1580: 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f  nary -translatio
1590: 6e 20 62 69 6e 61 72 79 0a 20 20 70 75 74 73 20  n binary.  puts 
15a0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24  -nonewline $fd $
15b0: 63 6f 6e 74 65 6e 74 0a 20 20 63 6c 6f 73 65 20  content.  close 
15c0: 24 66 64 0a 7d 0a 0a 23 20 42 6f 74 68 20 24 66  $fd.}..# Both $f
15d0: 69 6c 65 31 20 61 6e 64 20 24 66 69 6c 65 32 20  ile1 and $file2 
15e0: 61 72 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  are database fil
15f0: 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  es. This functio
1600: 6e 20 74 61 6b 65 73 20 61 20 0a 23 20 73 75 70  n takes a .# sup
1610: 65 72 6c 6f 63 6b 20 6f 6e 20 65 61 63 68 2c 20  erlock on each, 
1620: 74 68 65 6e 20 65 78 63 68 61 6e 67 65 73 20 74  then exchanges t
1630: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1640: 65 20 74 77 6f 20 66 69 6c 65 73 20 28 69 2e 65  e two files (i.e
1650: 2e 0a 23 20 6f 76 65 72 77 72 69 74 65 73 20 24  ..# overwrites $
1660: 66 69 6c 65 31 20 77 69 74 68 20 74 68 65 20 69  file1 with the i
1670: 6e 69 74 69 61 6c 20 63 6f 6e 74 65 6e 74 73 20  nitial contents 
1680: 6f 66 20 24 66 69 6c 65 32 2c 20 61 6e 64 20 6f  of $file2, and o
1690: 76 65 72 77 72 69 74 65 73 0a 23 20 24 66 69 6c  verwrites.# $fil
16a0: 65 32 20 77 69 74 68 20 74 68 65 20 69 6e 69 74  e2 with the init
16b0: 69 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ial contents of 
16c0: 24 66 69 6c 65 31 29 2e 20 54 68 65 20 63 6f 6e  $file1). The con
16d0: 74 65 6e 74 73 20 6f 66 20 61 6e 79 20 57 41 4c  tents of any WAL
16e0: 20 0a 23 20 66 69 6c 65 20 69 73 20 61 6c 73 6f   .# file is also
16f0: 20 65 78 63 68 61 6e 67 65 64 2e 0a 23 0a 70 72   exchanged..#.pr
1700: 6f 63 20 64 62 5f 73 77 61 70 20 7b 66 69 6c 65  oc db_swap {file
1710: 31 20 66 69 6c 65 32 7d 20 7b 0a 20 20 73 71 6c  1 file2} {.  sql
1720: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
1730: 63 6b 20 75 6e 6c 6f 63 6b 31 20 24 66 69 6c 65  ck unlock1 $file
1740: 31 0a 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  1.  sqlite3demo_
1750: 73 75 70 65 72 6c 6f 63 6b 20 75 6e 6c 6f 63 6b  superlock unlock
1760: 32 20 24 66 69 6c 65 32 0a 0a 20 20 73 65 74 20  2 $file2..  set 
1770: 64 62 31 20 5b 72 65 61 64 5f 63 6f 6e 74 65 6e  db1 [read_conten
1780: 74 20 24 66 69 6c 65 31 5d 0a 20 20 73 65 74 20  t $file1].  set 
1790: 64 62 32 20 5b 72 65 61 64 5f 63 6f 6e 74 65 6e  db2 [read_conten
17a0: 74 20 24 66 69 6c 65 32 5d 0a 20 20 77 72 69 74  t $file2].  writ
17b0: 65 5f 63 6f 6e 74 65 6e 74 20 24 66 69 6c 65 31  e_content $file1
17c0: 20 24 64 62 32 0a 20 20 77 72 69 74 65 5f 63 6f   $db2.  write_co
17d0: 6e 74 65 6e 74 20 24 66 69 6c 65 32 20 24 64 62  ntent $file2 $db
17e0: 31 0a 0a 20 20 73 65 74 20 77 61 6c 31 20 5b 72  1..  set wal1 [r
17f0: 65 61 64 5f 63 6f 6e 74 65 6e 74 20 24 7b 66 69  ead_content ${fi
1800: 6c 65 31 7d 2d 77 61 6c 5d 0a 20 20 73 65 74 20  le1}-wal].  set 
1810: 77 61 6c 32 20 5b 72 65 61 64 5f 63 6f 6e 74 65  wal2 [read_conte
1820: 6e 74 20 24 7b 66 69 6c 65 32 7d 2d 77 61 6c 5d  nt ${file2}-wal]
1830: 0a 20 20 77 72 69 74 65 5f 63 6f 6e 74 65 6e 74  .  write_content
1840: 20 24 7b 66 69 6c 65 31 7d 2d 77 61 6c 20 24 77   ${file1}-wal $w
1850: 61 6c 32 0a 20 20 77 72 69 74 65 5f 63 6f 6e 74  al2.  write_cont
1860: 65 6e 74 20 24 7b 66 69 6c 65 32 7d 2d 77 61 6c  ent ${file2}-wal
1870: 20 24 77 61 6c 31 0a 0a 20 20 75 6e 6c 6f 63 6b   $wal1..  unlock
1880: 31 0a 20 20 75 6e 6c 6f 63 6b 32 0a 7d 0a 0a 66  1.  unlock2.}..f
1890: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
18a0: 64 62 0a 73 71 6c 69 74 65 33 20 64 62 20 20 74  db.sqlite3 db  t
18b0: 65 73 74 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71  est.db.do_execsq
18c0: 6c 5f 74 65 73 74 20 36 2e 31 20 7b 0a 20 20 41  l_test 6.1 {.  A
18d0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
18e0: 20 41 53 20 61 75 78 3b 0a 20 20 50 52 41 47 4d   AS aux;.  PRAGM
18f0: 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f  A aux.journal_mo
1900: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 43 52 45 41  de = wal;.  CREA
1910: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28  TE TABLE aux.t2(
1920: 78 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20  x, y);.  INSERT 
1930: 49 4e 54 4f 20 61 75 78 2e 74 32 20 56 41 4c 55  INTO aux.t2 VALU
1940: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
1950: 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
1960: 72 73 69 6f 6e 20 3d 20 34 35 30 3b 0a 20 20 44  rsion = 450;.  D
1970: 45 54 41 43 48 20 61 75 78 3b 0a 0a 20 20 50 52  ETACH aux;..  PR
1980: 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61  AGMA main.journa
1990: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
19a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
19b0: 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  a, b);.  INSERT 
19c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
19d0: 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 2);.  INSERT I
19e0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
19f0: 20 34 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   4);.  SELECT * 
1a00: 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 77 61 6c 20  FROM t1;.} {wal 
1a10: 77 61 6c 20 31 20 32 20 33 20 34 7d 0a 0a 0a 64  wal 1 2 3 4}...d
1a20: 62 5f 73 77 61 70 20 74 65 73 74 2e 64 62 32 20  b_swap test.db2 
1a30: 74 65 73 74 2e 64 62 0a 64 6f 5f 63 61 74 63 68  test.db.do_catch
1a40: 73 71 6c 5f 74 65 73 74 20 36 2e 32 20 7b 20 53  sql_test 6.2 { S
1a50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1a60: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61  } {1 {no such ta
1a70: 62 6c 65 3a 20 74 31 7d 7d 0a 64 6f 5f 63 61 74  ble: t1}}.do_cat
1a80: 63 68 73 71 6c 5f 74 65 73 74 20 36 2e 33 20 7b  chsql_test 6.3 {
1a90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1aa0: 32 20 7d 20 7b 30 20 7b 61 20 62 7d 7d 0a 0a 64  2 } {0 {a b}}..d
1ab0: 62 5f 73 77 61 70 20 74 65 73 74 2e 64 62 32 20  b_swap test.db2 
1ac0: 74 65 73 74 2e 64 62 0a 64 6f 5f 63 61 74 63 68  test.db.do_catch
1ad0: 73 71 6c 5f 74 65 73 74 20 36 2e 34 20 7b 20 53  sql_test 6.4 { S
1ae0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1af0: 7d 20 7b 30 20 7b 31 20 32 20 33 20 34 7d 7d 0a  } {0 {1 2 3 4}}.
1b00: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
1b10: 20 36 2e 35 20 7b 20 53 45 4c 45 43 54 20 2a 20   6.5 { SELECT * 
1b20: 46 52 4f 4d 20 74 32 20 7d 20 7b 31 20 7b 6e 6f  FROM t2 } {1 {no
1b30: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 74 32 7d   such table: t2}
1b40: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
1b50: 73 74 20 20 36 2e 36 20 7b 20 50 52 41 47 4d 41  st  6.6 { PRAGMA
1b60: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
1b70: 7d 20 7b 30 20 30 20 30 7d 0a 0a 64 62 5f 73 77  } {0 0 0}..db_sw
1b80: 61 70 20 74 65 73 74 2e 64 62 32 20 74 65 73 74  ap test.db2 test
1b90: 2e 64 62 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  .db.do_catchsql_
1ba0: 74 65 73 74 20 36 2e 37 20 7b 20 53 45 4c 45 43  test 6.7 { SELEC
1bb0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31  T * FROM t1 } {1
1bc0: 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   {no such table:
1bd0: 20 74 31 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71   t1}}.do_catchsq
1be0: 6c 5f 74 65 73 74 20 36 2e 38 20 7b 20 53 45 4c  l_test 6.8 { SEL
1bf0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20  ECT * FROM t2 } 
1c00: 7b 30 20 7b 61 20 62 7d 7d 0a 0a 64 62 5f 73 77  {0 {a b}}..db_sw
1c10: 61 70 20 74 65 73 74 2e 64 62 32 20 74 65 73 74  ap test.db2 test
1c20: 2e 64 62 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  .db.do_catchsql_
1c30: 74 65 73 74 20 36 2e 39 20 7b 20 53 45 4c 45 43  test 6.9 { SELEC
1c40: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 30  T * FROM t1 } {0
1c50: 20 7b 31 20 32 20 33 20 34 7d 7d 0a 64 6f 5f 63   {1 2 3 4}}.do_c
1c60: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 36 2e 31  atchsql_test 6.1
1c70: 30 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  0 { SELECT * FRO
1c80: 4d 20 74 32 20 7d 20 7b 31 20 7b 6e 6f 20 73 75  M t2 } {1 {no su
1c90: 63 68 20 74 61 62 6c 65 3a 20 74 32 7d 7d 0a 0a  ch table: t2}}..
1ca0: 69 66 20 7b 5b 6e 6f 6e 7a 65 72 6f 5f 72 65 73  if {[nonzero_res
1cb0: 65 72 76 65 64 5f 62 79 74 65 73 5d 7d 20 7b 0a  erved_bytes]} {.
1cc0: 20 20 23 20 56 61 63 75 75 6d 20 77 69 74 68 20    # Vacuum with 
1cd0: 61 20 73 69 7a 65 20 63 68 61 6e 67 65 20 69 73  a size change is
1ce0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 69 74   not allowed wit
1cf0: 68 20 74 68 65 20 63 6f 64 65 63 0a 20 20 64 6f  h the codec.  do
1d00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 20 36  _execsql_test  6
1d10: 2e 31 31 63 6f 64 65 63 20 7b 20 0a 20 20 20 20  .11codec { .    
1d20: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
1d30: 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20  ode = delete;.  
1d40: 20 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 50 52    VACUUM;.    PR
1d50: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
1d60: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53  e = wal;.    INS
1d70: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1d80: 45 53 28 35 2c 20 36 29 3b 0a 20 20 7d 20 7b 64  ES(5, 6);.  } {d
1d90: 65 6c 65 74 65 20 77 61 6c 7d 0a 7d 20 65 6c 73  elete wal}.} els
1da0: 65 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  e {.  do_execsql
1db0: 5f 74 65 73 74 20 20 36 2e 31 31 20 7b 20 0a 20  _test  6.11 { . 
1dc0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
1dd0: 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b  l_mode = delete;
1de0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
1df0: 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20  _size = 512;.   
1e00: 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 50 52 41   VACUUM;.    PRA
1e10: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
1e20: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53 45   = wal;.    INSE
1e30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1e40: 53 28 35 2c 20 36 29 3b 0a 20 20 7d 20 7b 64 65  S(5, 6);.  } {de
1e50: 6c 65 74 65 20 77 61 6c 7d 0a 7d 0a 0a 64 62 5f  lete wal}.}..db_
1e60: 73 77 61 70 20 74 65 73 74 2e 64 62 32 20 74 65  swap test.db2 te
1e70: 73 74 2e 64 62 0a 64 6f 5f 63 61 74 63 68 73 71  st.db.do_catchsq
1e80: 6c 5f 74 65 73 74 20 36 2e 31 32 20 7b 20 53 45  l_test 6.12 { SE
1e90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1ea0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62   {1 {no such tab
1eb0: 6c 65 3a 20 74 31 7d 7d 0a 64 6f 5f 63 61 74 63  le: t1}}.do_catc
1ec0: 68 73 71 6c 5f 74 65 73 74 20 36 2e 31 33 20 7b  hsql_test 6.13 {
1ed0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1ee0: 32 20 7d 20 7b 30 20 7b 61 20 62 7d 7d 0a 0a 64  2 } {0 {a b}}..d
1ef0: 62 5f 73 77 61 70 20 74 65 73 74 2e 64 62 32 20  b_swap test.db2 
1f00: 74 65 73 74 2e 64 62 0a 64 6f 5f 63 61 74 63 68  test.db.do_catch
1f10: 73 71 6c 5f 74 65 73 74 20 36 2e 31 34 20 7b 20  sql_test 6.14 { 
1f20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1f30: 20 7d 20 7b 30 20 7b 31 20 32 20 33 20 34 20 35   } {0 {1 2 3 4 5
1f40: 20 36 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c   6}}.do_catchsql
1f50: 5f 74 65 73 74 20 36 2e 31 35 20 7b 20 53 45 4c  _test 6.15 { SEL
1f60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20  ECT * FROM t2 } 
1f70: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
1f80: 65 3a 20 74 32 7d 7d 0a 0a 66 69 6e 69 73 68 5f  e: t2}}..finish_
1f90: 74 65 73 74 0a                                   test.