/ Hex Artifact Content
Login

Artifact 53e1841b422e554cecf0160f937c473d6d0e3062:


0000: 23 20 32 30 30 37 20 4d 61 72 63 68 20 32 34 0a  # 2007 March 24.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   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 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 20 54 68 65 20 66 6f 63 75 73 0a 23 20 6f 66  . The focus.# of
01b0: 20 74 68 65 73 65 20 74 65 73 74 73 20 69 73 20   these tests is 
01c0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
01d0: 20 6d 6f 64 65 20 28 69 2e 65 2e 20 74 68 65 20   mode (i.e. the 
01e0: 74 68 69 6e 67 20 61 63 74 69 76 61 74 65 64 20  thing activated 
01f0: 62 79 20 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f  by .# "PRAGMA lo
0200: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43  cking_mode = EXC
0210: 4c 55 53 49 56 45 22 29 2e 0a 23 0a 23 20 24 49  LUSIVE")..#.# $I
0220: 64 3a 20 65 78 63 6c 75 73 69 76 65 2e 74 65 73  d: exclusive.tes
0230: 74 2c 76 20 31 2e 31 35 20 32 30 30 39 2f 30 36  t,v 1.15 2009/06
0240: 2f 32 36 20 31 32 3a 33 30 3a 34 30 20 64 61 6e  /26 12:30:40 dan
0250: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 0a  ielk1977 Exp $..
0260: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
0270: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
0280: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0290: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 69 66  r/tester.tcl..if
02a0: 63 61 70 61 62 6c 65 20 7b 21 70 61 67 65 72 5f  capable {!pager_
02b0: 70 72 61 67 6d 61 73 7d 20 7b 0a 20 20 66 69 6e  pragmas} {.  fin
02c0: 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72  ish_test.  retur
02d0: 6e 0a 7d 0a 0a 66 69 6c 65 20 64 65 6c 65 74 65  n.}..file delete
02e0: 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62   -force test2.db
02f0: 2d 6a 6f 75 72 6e 61 6c 0a 66 69 6c 65 20 64 65  -journal.file de
0300: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
0310: 32 2e 64 62 0a 66 69 6c 65 20 64 65 6c 65 74 65  2.db.file delete
0320: 20 2d 66 6f 72 63 65 20 74 65 73 74 33 2e 64 62   -force test3.db
0330: 2d 6a 6f 75 72 6e 61 6c 0a 66 69 6c 65 20 64 65  -journal.file de
0340: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
0350: 33 2e 64 62 0a 66 69 6c 65 20 64 65 6c 65 74 65  3.db.file delete
0360: 20 2d 66 6f 72 63 65 20 74 65 73 74 34 2e 64 62   -force test4.db
0370: 2d 6a 6f 75 72 6e 61 6c 0a 66 69 6c 65 20 64 65  -journal.file de
0380: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
0390: 34 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  4.db..#---------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20  -------------.# 
03e0: 54 65 73 74 20 63 61 73 65 73 20 65 78 63 6c 75  Test cases exclu
03f0: 73 69 76 65 2d 31 2e 58 20 74 65 73 74 20 74 68  sive-1.X test th
0400: 65 20 50 52 41 47 4d 41 20 6c 6f 67 69 63 2e 0a  e PRAGMA logic..
0410: 23 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73  #.do_test exclus
0420: 69 76 65 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63  ive-1.0 {.  exec
0430: 73 71 6c 20 7b 0a 20 20 20 20 70 72 61 67 6d 61  sql {.    pragma
0440: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 0a 20   locking_mode;. 
0450: 20 20 20 70 72 61 67 6d 61 20 6d 61 69 6e 2e 6c     pragma main.l
0460: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 0a 20 20 20  ocking_mode;.   
0470: 20 70 72 61 67 6d 61 20 74 65 6d 70 2e 6c 6f 63   pragma temp.loc
0480: 6b 69 6e 67 5f 6d 6f 64 65 3b 0a 20 20 7d 20 0a  king_mode;.  } .
0490: 7d 20 5b 6c 69 73 74 20 6e 6f 72 6d 61 6c 20 6e  } [list normal n
04a0: 6f 72 6d 61 6c 20 65 78 63 6c 75 73 69 76 65 5d  ormal exclusive]
04b0: 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69  .do_test exclusi
04c0: 76 65 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  ve-1.1 {.  execs
04d0: 71 6c 20 7b 0a 20 20 20 20 70 72 61 67 6d 61 20  ql {.    pragma 
04e0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65  locking_mode = e
04f0: 78 63 6c 75 73 69 76 65 3b 0a 20 20 7d 20 0a 7d  xclusive;.  } .}
0500: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
0510: 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 31  test exclusive-1
0520: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0530: 0a 20 20 20 20 70 72 61 67 6d 61 20 6c 6f 63 6b  .    pragma lock
0540: 69 6e 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 70 72  ing_mode;.    pr
0550: 61 67 6d 61 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e  agma main.lockin
0560: 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 70 72 61 67  g_mode;.    prag
0570: 6d 61 20 74 65 6d 70 2e 6c 6f 63 6b 69 6e 67 5f  ma temp.locking_
0580: 6d 6f 64 65 3b 0a 20 20 7d 20 0a 7d 20 5b 6c 69  mode;.  } .} [li
0590: 73 74 20 65 78 63 6c 75 73 69 76 65 20 65 78 63  st exclusive exc
05a0: 6c 75 73 69 76 65 20 65 78 63 6c 75 73 69 76 65  lusive exclusive
05b0: 5d 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73  ].do_test exclus
05c0: 69 76 65 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63  ive-1.3 {.  exec
05d0: 73 71 6c 20 7b 0a 20 20 20 20 70 72 61 67 6d 61  sql {.    pragma
05e0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
05f0: 6e 6f 72 6d 61 6c 3b 0a 20 20 7d 20 0a 7d 20 7b  normal;.  } .} {
0600: 6e 6f 72 6d 61 6c 7d 0a 64 6f 5f 74 65 73 74 20  normal}.do_test 
0610: 65 78 63 6c 75 73 69 76 65 2d 31 2e 34 20 7b 0a  exclusive-1.4 {.
0620: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0630: 70 72 61 67 6d 61 20 6c 6f 63 6b 69 6e 67 5f 6d  pragma locking_m
0640: 6f 64 65 3b 0a 20 20 20 20 70 72 61 67 6d 61 20  ode;.    pragma 
0650: 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  main.locking_mod
0660: 65 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 74 65  e;.    pragma te
0670: 6d 70 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  mp.locking_mode;
0680: 0a 20 20 7d 20 0a 7d 20 5b 6c 69 73 74 20 6e 6f  .  } .} [list no
0690: 72 6d 61 6c 20 6e 6f 72 6d 61 6c 20 65 78 63 6c  rmal normal excl
06a0: 75 73 69 76 65 5d 0a 64 6f 5f 74 65 73 74 20 65  usive].do_test e
06b0: 78 63 6c 75 73 69 76 65 2d 31 2e 35 20 7b 0a 20  xclusive-1.5 {. 
06c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 70   execsql {.    p
06d0: 72 61 67 6d 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ragma locking_mo
06e0: 64 65 20 3d 20 69 6e 76 61 6c 69 64 3b 0a 20 20  de = invalid;.  
06f0: 7d 20 0a 7d 20 7b 6e 6f 72 6d 61 6c 7d 0a 64 6f  } .} {normal}.do
0700: 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d  _test exclusive-
0710: 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.6 {.  execsql 
0720: 7b 0a 20 20 20 20 70 72 61 67 6d 61 20 6c 6f 63  {.    pragma loc
0730: 6b 69 6e 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 70  king_mode;.    p
0740: 72 61 67 6d 61 20 6d 61 69 6e 2e 6c 6f 63 6b 69  ragma main.locki
0750: 6e 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 70 72 61  ng_mode;.    pra
0760: 67 6d 61 20 74 65 6d 70 2e 6c 6f 63 6b 69 6e 67  gma temp.locking
0770: 5f 6d 6f 64 65 3b 0a 20 20 7d 20 0a 7d 20 5b 6c  _mode;.  } .} [l
0780: 69 73 74 20 6e 6f 72 6d 61 6c 20 6e 6f 72 6d 61  ist normal norma
0790: 6c 20 65 78 63 6c 75 73 69 76 65 5d 0a 69 66 63  l exclusive].ifc
07a0: 61 70 61 62 6c 65 20 61 74 74 61 63 68 20 7b 0a  apable attach {.
07b0: 20 20 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73    do_test exclus
07c0: 69 76 65 2d 31 2e 37 20 7b 0a 20 20 20 20 65 78  ive-1.7 {.    ex
07d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 70 72  ecsql {.      pr
07e0: 61 67 6d 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  agma locking_mod
07f0: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
0800: 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73       ATTACH 'tes
0810: 74 32 2e 64 62 27 20 61 73 20 61 75 78 3b 0a 20  t2.db' as aux;. 
0820: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
0830: 20 7b 0a 20 20 20 20 20 20 70 72 61 67 6d 61 20   {.      pragma 
0840: 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  main.locking_mod
0850: 65 3b 0a 20 20 20 20 20 20 70 72 61 67 6d 61 20  e;.      pragma 
0860: 61 75 78 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  aux.locking_mode
0870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 65 78 63  ;.    }.  } {exc
0880: 6c 75 73 69 76 65 20 65 78 63 6c 75 73 69 76 65  lusive exclusive
0890: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78 63 6c  }.  do_test excl
08a0: 75 73 69 76 65 2d 31 2e 38 20 7b 0a 20 20 20 20  usive-1.8 {.    
08b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
08c0: 70 72 61 67 6d 61 20 6d 61 69 6e 2e 6c 6f 63 6b  pragma main.lock
08d0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61  ing_mode = norma
08e0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  l;.    }.    exe
08f0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 70 72 61  csql {.      pra
0900: 67 6d 61 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67  gma main.locking
0910: 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 72 61  _mode;.      pra
0920: 67 6d 61 20 74 65 6d 70 2e 6c 6f 63 6b 69 6e 67  gma temp.locking
0930: 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 72 61  _mode;.      pra
0940: 67 6d 61 20 61 75 78 2e 6c 6f 63 6b 69 6e 67 5f  gma aux.locking_
0950: 6d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  mode;.    }.  } 
0960: 5b 6c 69 73 74 20 6e 6f 72 6d 61 6c 20 65 78 63  [list normal exc
0970: 6c 75 73 69 76 65 20 65 78 63 6c 75 73 69 76 65  lusive exclusive
0980: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78 63 6c  ].  do_test excl
0990: 75 73 69 76 65 2d 31 2e 39 20 7b 0a 20 20 20 20  usive-1.9 {.    
09a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
09b0: 70 72 61 67 6d 61 20 6c 6f 63 6b 69 6e 67 5f 6d  pragma locking_m
09c0: 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ode;.    }.  } {
09d0: 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 64 6f 5f  exclusive}.  do_
09e0: 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 31  test exclusive-1
09f0: 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .10 {.    execsq
0a00: 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48  l {.      ATTACH
0a10: 20 27 74 65 73 74 33 2e 64 62 27 20 61 73 20 61   'test3.db' as a
0a20: 75 78 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ux2;.    }.    e
0a30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 70  xecsql {.      p
0a40: 72 61 67 6d 61 20 6d 61 69 6e 2e 6c 6f 63 6b 69  ragma main.locki
0a50: 6e 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70  ng_mode;.      p
0a60: 72 61 67 6d 61 20 61 75 78 2e 6c 6f 63 6b 69 6e  ragma aux.lockin
0a70: 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 72  g_mode;.      pr
0a80: 61 67 6d 61 20 61 75 78 32 2e 6c 6f 63 6b 69 6e  agma aux2.lockin
0a90: 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20  g_mode;.    }.  
0aa0: 7d 20 7b 6e 6f 72 6d 61 6c 20 65 78 63 6c 75 73  } {normal exclus
0ab0: 69 76 65 20 65 78 63 6c 75 73 69 76 65 7d 0a 20  ive exclusive}. 
0ac0: 20 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69   do_test exclusi
0ad0: 76 65 2d 31 2e 31 31 20 7b 0a 20 20 20 20 65 78  ve-1.11 {.    ex
0ae0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 70 72  ecsql {.      pr
0af0: 61 67 6d 61 20 61 75 78 2e 6c 6f 63 6b 69 6e 67  agma aux.locking
0b00: 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a  _mode = normal;.
0b10: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
0b20: 6c 20 7b 0a 20 20 20 20 20 20 70 72 61 67 6d 61  l {.      pragma
0b30: 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f   main.locking_mo
0b40: 64 65 3b 0a 20 20 20 20 20 20 70 72 61 67 6d 61  de;.      pragma
0b50: 20 61 75 78 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   aux.locking_mod
0b60: 65 3b 0a 20 20 20 20 20 20 70 72 61 67 6d 61 20  e;.      pragma 
0b70: 61 75 78 32 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  aux2.locking_mod
0b80: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6e 6f  e;.    }.  } {no
0b90: 72 6d 61 6c 20 6e 6f 72 6d 61 6c 20 65 78 63 6c  rmal normal excl
0ba0: 75 73 69 76 65 7d 0a 20 20 64 6f 5f 74 65 73 74  usive}.  do_test
0bb0: 20 65 78 63 6c 75 73 69 76 65 2d 31 2e 31 32 20   exclusive-1.12 
0bc0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
0bd0: 20 20 20 20 20 20 70 72 61 67 6d 61 20 6c 6f 63        pragma loc
0be0: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d  king_mode = norm
0bf0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  al;.    }.    ex
0c00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 70 72  ecsql {.      pr
0c10: 61 67 6d 61 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e  agma main.lockin
0c20: 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 72  g_mode;.      pr
0c30: 61 67 6d 61 20 74 65 6d 70 2e 6c 6f 63 6b 69 6e  agma temp.lockin
0c40: 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 72  g_mode;.      pr
0c50: 61 67 6d 61 20 61 75 78 2e 6c 6f 63 6b 69 6e 67  agma aux.locking
0c60: 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 72 61  _mode;.      pra
0c70: 67 6d 61 20 61 75 78 32 2e 6c 6f 63 6b 69 6e 67  gma aux2.locking
0c80: 5f 6d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _mode;.    }.  }
0c90: 20 5b 6c 69 73 74 20 6e 6f 72 6d 61 6c 20 65 78   [list normal ex
0ca0: 63 6c 75 73 69 76 65 20 6e 6f 72 6d 61 6c 20 6e  clusive normal n
0cb0: 6f 72 6d 61 6c 5d 0a 20 20 64 6f 5f 74 65 73 74  ormal].  do_test
0cc0: 20 65 78 63 6c 75 73 69 76 65 2d 31 2e 31 33 20   exclusive-1.13 
0cd0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
0ce0: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
0cf0: 73 74 34 2e 64 62 27 20 61 73 20 61 75 78 33 3b  st4.db' as aux3;
0d00: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
0d10: 71 6c 20 7b 0a 20 20 20 20 20 20 70 72 61 67 6d  ql {.      pragm
0d20: 61 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d  a main.locking_m
0d30: 6f 64 65 3b 0a 20 20 20 20 20 20 70 72 61 67 6d  ode;.      pragm
0d40: 61 20 74 65 6d 70 2e 6c 6f 63 6b 69 6e 67 5f 6d  a temp.locking_m
0d50: 6f 64 65 3b 0a 20 20 20 20 20 20 70 72 61 67 6d  ode;.      pragm
0d60: 61 20 61 75 78 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f  a aux.locking_mo
0d70: 64 65 3b 0a 20 20 20 20 20 20 70 72 61 67 6d 61  de;.      pragma
0d80: 20 61 75 78 32 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f   aux2.locking_mo
0d90: 64 65 3b 0a 20 20 20 20 20 20 70 72 61 67 6d 61  de;.      pragma
0da0: 20 61 75 78 33 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f   aux3.locking_mo
0db0: 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c  de;.    }.  } [l
0dc0: 69 73 74 20 6e 6f 72 6d 61 6c 20 65 78 63 6c 75  ist normal exclu
0dd0: 73 69 76 65 20 6e 6f 72 6d 61 6c 20 6e 6f 72 6d  sive normal norm
0de0: 61 6c 20 6e 6f 72 6d 61 6c 5d 0a 20 20 0a 20 20  al normal].  .  
0df0: 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76  do_test exclusiv
0e00: 65 2d 31 2e 39 39 20 7b 0a 20 20 20 20 65 78 65  e-1.99 {.    exe
0e10: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 54  csql {.      DET
0e20: 41 43 48 20 61 75 78 3b 0a 20 20 20 20 20 20 44  ACH aux;.      D
0e30: 45 54 41 43 48 20 61 75 78 32 3b 0a 20 20 20 20  ETACH aux2;.    
0e40: 20 20 44 45 54 41 43 48 20 61 75 78 33 3b 0a 20    DETACH aux3;. 
0e50: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23     }.  } {}.}..#
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61  ------.# Test ca
0eb0: 73 65 73 20 65 78 63 6c 75 73 69 76 65 2d 32 2e  ses exclusive-2.
0ec0: 58 20 76 65 72 69 66 79 20 74 68 61 74 20 63 6f  X verify that co
0ed0: 6e 6e 65 63 74 69 6f 6e 73 20 69 6e 20 65 78 63  nnections in exc
0ee0: 6c 75 73 69 76 65 20 0a 23 20 6c 6f 63 6b 69 6e  lusive .# lockin
0ef0: 67 5f 6d 6f 64 65 20 64 6f 20 6e 6f 74 20 72 65  g_mode do not re
0f00: 6c 69 6e 71 75 69 73 68 20 6c 6f 63 6b 73 2e 0a  linquish locks..
0f10: 23 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73  #.do_test exclus
0f20: 69 76 65 2d 32 2e 30 20 7b 0a 20 20 65 78 65 63  ive-2.0 {.  exec
0f30: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0f40: 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c   TABLE abc(a, b,
0f50: 20 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   c);.    INSERT 
0f60: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
0f70: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 50 52  1, 2, 3);.    PR
0f80: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
0f90: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
0fa0: 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d   }.} {exclusive}
0fb0: 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69  .do_test exclusi
0fc0: 76 65 2d 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74  ve-2.1 {.  sqlit
0fd0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
0fe0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
0ff0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
1000: 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a  ALUES(4, 5, 6);.
1010: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1020: 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62 32 0a 7d  M abc;.  } db2.}
1030: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64   {1 2 3 4 5 6}.d
1040: 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76 65  o_test exclusive
1050: 2d 32 2e 32 20 7b 0a 20 20 23 20 54 68 69 73 20  -2.2 {.  # This 
1060: 63 61 75 73 65 73 20 63 6f 6e 6e 65 63 74 69 6f  causes connectio
1070: 6e 20 27 64 62 27 20 28 69 6e 20 65 78 63 6c 75  n 'db' (in exclu
1080: 73 69 76 65 20 6d 6f 64 65 29 20 74 6f 20 65 73  sive mode) to es
1090: 74 61 62 6c 69 73 68 20 0a 20 20 23 20 61 20 73  tablish .  # a s
10a0: 68 61 72 65 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68  hared-lock on th
10b0: 65 20 64 62 2e 20 54 68 65 20 6f 74 68 65 72 20  e db. The other 
10c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c  connection shoul
10d0: 64 20 6e 6f 77 20 62 65 0a 20 20 23 20 6c 6f 63  d now be.  # loc
10e0: 6b 65 64 20 6f 75 74 20 61 73 20 61 20 77 72 69  ked out as a wri
10f0: 74 65 72 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b  ter..  execsql {
1100: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1110: 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62 0a 7d  OM abc;.  } db.}
1120: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64   {1 2 3 4 5 6}.d
1130: 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76 65  o_test exclusive
1140: 2d 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.4 {.  execsql
1150: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
1160: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62  FROM abc;.  } db
1170: 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  2.} {1 2 3 4 5 6
1180: 7d 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73  }.do_test exclus
1190: 69 76 65 2d 32 2e 35 20 7b 0a 20 20 63 61 74 63  ive-2.5 {.  catc
11a0: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
11b0: 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45  T INTO abc VALUE
11c0: 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 7d 20  S(7, 8, 9);.  } 
11d0: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
11e0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 73  se is locked}}.s
11f0: 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
1200: 5f 6c 69 6d 69 74 20 30 0a 64 6f 5f 74 65 73 74  _limit 0.do_test
1210: 20 65 78 63 6c 75 73 69 76 65 2d 32 2e 36 20 7b   exclusive-2.6 {
1220: 0a 20 20 23 20 42 65 63 61 75 73 65 20 63 6f 6e  .  # Because con
1230: 6e 65 63 74 69 6f 6e 20 27 64 62 27 20 6f 6e 6c  nection 'db' onl
1240: 79 20 68 61 73 20 61 20 73 68 61 72 65 64 2d 6c  y has a shared-l
1250: 6f 63 6b 2c 20 74 68 65 20 6f 74 68 65 72 20 63  ock, the other c
1260: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 23 20 77 69  onnection.  # wi
1270: 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 67 65  ll be able to ge
1280: 74 20 61 20 52 45 53 45 52 56 45 44 2c 20 62 75  t a RESERVED, bu
1290: 74 20 77 69 6c 6c 20 66 61 69 6c 20 74 6f 20 75  t will fail to u
12a0: 70 67 72 61 64 65 20 74 6f 20 45 58 43 4c 55 53  pgrade to EXCLUS
12b0: 49 56 45 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b  IVE..  execsql {
12c0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
12d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
12e0: 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b  VALUES(7, 8, 9);
12f0: 0a 20 20 7d 20 64 62 32 0a 20 20 63 61 74 63 68  .  } db2.  catch
1300: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
1310: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  .  } db2.} {1 {d
1320: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
1330: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c  d}}.do_test excl
1340: 75 73 69 76 65 2d 32 2e 37 20 7b 0a 20 20 63 61  usive-2.7 {.  ca
1350: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  tchsql {.    COM
1360: 4d 49 54 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31  MIT.  } db2.} {1
1370: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
1380: 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  cked}}.do_test e
1390: 78 63 6c 75 73 69 76 65 2d 32 2e 38 20 7b 0a 20  xclusive-2.8 {. 
13a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52   execsql {.    R
13b0: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 64 62 32  OLLBACK;.  } db2
13c0: 0a 7d 20 7b 7d 0a 73 71 6c 69 74 65 33 5f 73 6f  .} {}.sqlite3_so
13d0: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 24 63  ft_heap_limit $c
13e0: 6d 64 6c 69 6e 65 61 72 67 28 73 6f 66 74 2d 68  mdlinearg(soft-h
13f0: 65 61 70 2d 6c 69 6d 69 74 29 0a 0a 64 6f 5f 74  eap-limit)..do_t
1400: 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 32 2e  est exclusive-2.
1410: 39 20 7b 0a 20 20 23 20 57 72 69 74 65 20 74 68  9 {.  # Write th
1420: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 73  e database to es
1430: 74 61 62 6c 69 73 68 20 74 68 65 20 65 78 63 6c  tablish the excl
1440: 75 73 69 76 65 20 6c 6f 63 6b 20 77 69 74 68 20  usive lock with 
1450: 63 6f 6e 6e 65 63 74 69 6f 6e 20 27 64 62 2e 0a  connection 'db..
1460: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
1480: 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b  VALUES(7, 8, 9);
1490: 0a 20 20 7d 20 64 62 0a 20 20 63 61 74 63 68 73  .  } db.  catchs
14a0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
14b0: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20  * FROM abc;.  } 
14c0: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
14d0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64  se is locked}}.d
14e0: 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76 65  o_test exclusive
14f0: 2d 32 2e 31 30 20 7b 0a 20 20 23 20 43 68 61 6e  -2.10 {.  # Chan
1500: 67 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ging the locking
1510: 2d 6d 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 72  -mode does not r
1520: 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73  elease any locks
1530: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
1540: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
1550: 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a  _mode = normal;.
1560: 20 20 7d 20 64 62 0a 20 20 63 61 74 63 68 73 71    } db.  catchsq
1570: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
1580: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64   FROM abc;.  } d
1590: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
15a0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f  e is locked}}.do
15b0: 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d  _test exclusive-
15c0: 32 2e 31 31 20 7b 0a 20 20 23 20 41 66 74 65 72  2.11 {.  # After
15d0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6c 6f   changing the lo
15e0: 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 63 63 65  cking mode, acce
15f0: 73 73 69 6e 67 20 74 68 65 20 64 62 20 72 65 6c  ssing the db rel
1600: 65 61 73 65 73 20 6c 6f 63 6b 73 2e 0a 20 20 65  eases locks..  e
1610: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1620: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
1630: 20 20 7d 20 64 62 0a 20 20 65 78 65 63 73 71 6c    } db.  execsql
1640: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
1650: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62  FROM abc;.  } db
1660: 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  2.} {1 2 3 4 5 6
1670: 20 37 20 38 20 39 7d 0a 64 62 32 20 63 6c 6f 73   7 8 9}.db2 clos
1680: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
16d0: 74 73 20 65 78 63 6c 75 73 69 76 65 2d 33 2e 58  ts exclusive-3.X
16e0: 20 2d 20 74 65 73 74 20 74 68 61 74 20 61 20 63   - test that a c
16f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 65 78 63  onnection in exc
1700: 6c 75 73 69 76 65 20 6d 6f 64 65 20 0a 23 20 74  lusive mode .# t
1710: 72 75 6e 63 61 74 65 73 20 69 6e 73 74 65 61 64  runcates instead
1720: 20 6f 66 20 64 65 6c 65 74 65 73 20 74 68 65 20   of deletes the 
1730: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
1740: 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20  n committing .# 
1750: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23  a transaction..#
1760: 0a 23 20 54 68 65 73 65 20 74 65 73 74 73 20 61  .# These tests a
1770: 72 65 20 6e 6f 74 20 72 75 6e 20 6f 6e 20 77 69  re not run on wi
1780: 6e 64 6f 77 73 20 62 65 63 61 75 73 65 20 74 68  ndows because th
1790: 65 20 77 69 6e 64 6f 77 73 20 62 61 63 6b 65 6e  e windows backen
17a0: 64 0a 23 20 6f 70 65 6e 73 20 74 68 65 20 6a 6f  d.# opens the jo
17b0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 65  urnal file for e
17c0: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c  xclusive access,
17d0: 20 70 72 65 76 65 6e 74 69 6e 67 20 69 74 73 20   preventing its 
17e0: 63 6f 6e 74 65 6e 74 73 20 0a 23 20 66 72 6f 6d  contents .# from
17f0: 20 62 65 69 6e 67 20 69 6e 73 70 65 63 74 65 64   being inspected
1800: 20 65 78 74 65 72 6e 61 6c 6c 79 2e 0a 23 0a 69   externally..#.i
1810: 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  f {$tcl_platform
1820: 28 70 6c 61 74 66 6f 72 6d 29 20 21 3d 20 22 77  (platform) != "w
1830: 69 6e 64 6f 77 73 22 7d 20 7b 0a 0a 20 20 23 20  indows"} {..  # 
1840: 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
1850: 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 73 20 28 65   two booleans (e
1860: 69 74 68 65 72 20 30 20 6f 72 20 31 29 2e 20 54  ither 0 or 1). T
1870: 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75 65  he first is true
1880: 0a 20 20 23 20 69 66 20 74 68 65 20 6e 61 6d 65  .  # if the name
1890: 64 20 66 69 6c 65 20 65 78 69 73 74 73 2e 20 54  d file exists. T
18a0: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72 75  he second is tru
18b0: 65 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 66 69  e only if the fi
18c0: 6c 65 0a 20 20 23 20 65 78 69 73 74 73 20 61 6e  le.  # exists an
18d0: 64 20 74 68 65 20 66 69 72 73 74 20 32 38 20 62  d the first 28 b
18e0: 79 74 65 73 20 63 6f 6e 74 61 69 6e 20 61 74 20  ytes contain at 
18f0: 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
1900: 72 6f 20 62 79 74 65 2e 0a 20 20 23 0a 20 20 70  ro byte..  #.  p
1910: 72 6f 63 20 66 69 6c 65 73 74 61 74 65 20 7b 66  roc filestate {f
1920: 6e 61 6d 65 7d 20 7b 0a 20 20 20 20 73 65 74 20  name} {.    set 
1930: 65 78 69 73 74 73 20 30 0a 20 20 20 20 73 65 74  exists 0.    set
1940: 20 63 6f 6e 74 65 6e 74 20 30 0a 20 20 20 20 69   content 0.    i
1950: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
1960: 24 66 6e 61 6d 65 5d 7d 20 7b 0a 20 20 20 20 20  $fname]} {.     
1970: 20 73 65 74 20 65 78 69 73 74 73 20 31 0a 20 20   set exists 1.  
1980: 20 20 20 20 73 65 74 20 68 64 72 20 5b 68 65 78      set hdr [hex
1990: 69 6f 5f 72 65 61 64 20 24 66 6e 61 6d 65 20 30  io_read $fname 0
19a0: 20 32 38 5d 0a 20 20 20 20 20 20 73 65 74 20 63   28].      set c
19b0: 6f 6e 74 65 6e 74 20 5b 65 78 70 72 20 7b 30 3d  ontent [expr {0=
19c0: 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 24  =[string match $
19d0: 68 64 72 20 5b 73 74 72 69 6e 67 20 72 65 70 65  hdr [string repe
19e0: 61 74 20 30 20 35 36 5d 5d 7d 5d 0a 20 20 20 20  at 0 56]]}].    
19f0: 7d 0a 20 20 20 20 6c 69 73 74 20 24 65 78 69 73  }.    list $exis
1a00: 74 73 20 24 63 6f 6e 74 65 6e 74 0a 20 20 7d 0a  ts $content.  }.
1a10: 0a 20 20 64 6f 5f 74 65 73 74 20 65 78 63 6c 75  .  do_test exclu
1a20: 73 69 76 65 2d 33 2e 30 20 7b 0a 20 20 20 20 66  sive-3.0 {.    f
1a30: 69 6c 65 73 74 61 74 65 20 74 65 73 74 2e 64 62  ilestate test.db
1a40: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 7b 30 20  -journal.  } {0 
1a50: 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78 63  0}.  do_test exc
1a60: 6c 75 73 69 76 65 2d 33 2e 31 20 7b 0a 20 20 20  lusive-3.1 {.   
1a70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
1a80: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
1a90: 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65  mode = exclusive
1aa0: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
1ab0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
1ac0: 20 61 62 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20   abc;.    }.    
1ad0: 66 69 6c 65 73 74 61 74 65 20 74 65 73 74 2e 64  filestate test.d
1ae0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 7b 31  b-journal.  } {1
1af0: 20 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78   1}.  do_test ex
1b00: 63 6c 75 73 69 76 65 2d 33 2e 32 20 7b 0a 20 20  clusive-3.2 {.  
1b10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1b20: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
1b30: 20 20 20 20 66 69 6c 65 73 74 61 74 65 20 74 65      filestate te
1b40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
1b50: 7d 20 7b 31 20 30 7d 0a 20 20 64 6f 5f 74 65 73  } {1 0}.  do_tes
1b60: 74 20 65 78 63 6c 75 73 69 76 65 2d 33 2e 33 20  t exclusive-3.3 
1b70: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
1b80: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1b90: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27 41 27  O abc VALUES('A'
1ba0: 2c 20 27 42 27 2c 20 27 43 27 29 3b 0a 20 20 20  , 'B', 'C');.   
1bb0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1bc0: 20 61 62 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   abc;.    }.  } 
1bd0: 7b 41 20 42 20 43 7d 0a 20 20 64 6f 5f 74 65 73  {A B C}.  do_tes
1be0: 74 20 65 78 63 6c 75 73 69 76 65 2d 33 2e 34 20  t exclusive-3.4 
1bf0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
1c00: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
1c10: 20 20 20 55 50 44 41 54 45 20 61 62 63 20 53 45     UPDATE abc SE
1c20: 54 20 61 20 3d 20 31 2c 20 62 20 3d 20 32 2c 20  T a = 1, b = 2, 
1c30: 63 20 3d 20 33 3b 0a 20 20 20 20 20 20 52 4f 4c  c = 3;.      ROL
1c40: 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 53 45 4c  LBACK;.      SEL
1c50: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
1c60: 20 20 20 20 7d 0a 20 20 7d 20 7b 41 20 42 20 43      }.  } {A B C
1c70: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78 63 6c  }.  do_test excl
1c80: 75 73 69 76 65 2d 33 2e 35 20 7b 0a 20 20 20 20  usive-3.5 {.    
1c90: 66 69 6c 65 73 74 61 74 65 20 74 65 73 74 2e 64  filestate test.d
1ca0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 7b 31  b-journal.  } {1
1cb0: 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78   0}.  do_test ex
1cc0: 63 6c 75 73 69 76 65 2d 33 2e 36 20 7b 0a 20 20  clusive-3.6 {.  
1cd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1ce0: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
1cf0: 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a  _mode = normal;.
1d00: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1d10: 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 7d 0a 20  ROM abc;.    }. 
1d20: 20 20 20 66 69 6c 65 73 74 61 74 65 20 74 65 73     filestate tes
1d30: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d  t.db-journal.  }
1d40: 20 7b 30 20 30 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d   {0 0}.}..#-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 0a 23 20 54 65 73 74 73 20 65 78 63 6c 75 73  -.# Tests exclus
1da0: 69 76 65 2d 34 2e 58 20 2d 20 74 65 73 74 20 74  ive-4.X - test t
1db0: 68 61 74 20 72 6f 6c 6c 62 61 63 6b 20 77 6f 72  hat rollback wor
1dc0: 6b 73 20 63 6f 72 72 65 63 74 6c 79 20 77 68 65  ks correctly whe
1dd0: 6e 0a 23 20 69 6e 20 65 78 63 6c 75 73 69 76 65  n.# in exclusive
1de0: 2d 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 23 0a  -access mode..#.
1df0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1e00: 20 70 72 6f 63 65 64 75 72 65 20 63 6f 6d 70 75   procedure compu
1e10: 74 65 73 20 61 20 22 73 69 67 6e 61 74 75 72 65  tes a "signature
1e20: 22 20 66 6f 72 20 74 61 62 6c 65 20 22 74 33 22  " for table "t3"
1e30: 2e 20 20 49 66 0a 23 20 54 33 20 63 68 61 6e 67  .  If.# T3 chang
1e40: 65 73 20 69 6e 20 61 6e 79 20 77 61 79 2c 20 74  es in any way, t
1e50: 68 65 20 73 69 67 6e 61 74 75 72 65 20 73 68 6f  he signature sho
1e60: 75 6c 64 20 63 68 61 6e 67 65 2e 20 20 0a 23 0a  uld change.  .#.
1e70: 23 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  # This is used t
1e80: 6f 20 74 65 73 74 20 52 4f 4c 4c 42 41 43 4b 2e  o test ROLLBACK.
1e90: 20 20 57 65 20 67 61 74 68 65 72 20 61 20 73 69    We gather a si
1ea0: 67 6e 61 74 75 72 65 20 66 6f 72 20 74 33 2c 20  gnature for t3, 
1eb0: 74 68 65 6e 0a 23 20 6d 61 6b 65 20 6c 6f 74 73  then.# make lots
1ec0: 20 6f 66 20 63 68 61 6e 67 65 73 20 74 6f 20 74   of changes to t
1ed0: 33 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b  3, then rollback
1ee0: 20 61 6e 64 20 74 61 6b 65 20 61 6e 6f 74 68 65   and take anothe
1ef0: 72 20 73 69 67 6e 61 74 75 72 65 2e 0a 23 20 54  r signature..# T
1f00: 68 65 20 74 77 6f 20 73 69 67 6e 61 74 75 72 65  he two signature
1f10: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
1f20: 73 61 6d 65 2e 0a 23 0a 70 72 6f 63 20 73 69 67  same..#.proc sig
1f30: 6e 61 74 75 72 65 20 7b 7d 20 7b 0a 20 20 72 65  nature {} {.  re
1f40: 74 75 72 6e 20 5b 64 62 20 65 76 61 6c 20 7b 53  turn [db eval {S
1f50: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
1f60: 6d 64 35 73 75 6d 28 78 29 20 46 52 4f 4d 20 74  md5sum(x) FROM t
1f70: 33 7d 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  3}].}..do_test e
1f80: 78 63 6c 75 73 69 76 65 2d 34 2e 30 20 7b 0a 20  xclusive-4.0 {. 
1f90: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
1fa0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
1fb0: 20 65 78 63 6c 75 73 69 76 65 3b 20 7d 0a 20 20   exclusive; }.  
1fc0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1fd0: 20 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73   default_cache_s
1fe0: 69 7a 65 20 3d 20 31 30 3b 20 7d 0a 20 20 65 78  ize = 10; }.  ex
1ff0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
2000: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
2010: 42 4c 45 20 74 33 28 78 20 54 45 58 54 29 3b 0a  BLE t3(x TEXT);.
2020: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2030: 74 33 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74  t3 VALUES(randst
2040: 72 28 31 30 2c 34 30 30 29 29 3b 0a 20 20 20 20  r(10,400));.    
2050: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2060: 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 31 30  ALUES(randstr(10
2070: 2c 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  ,400));.    INSE
2080: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
2090: 54 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30  T randstr(10,400
20a0: 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 49  ) FROM t3;.    I
20b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
20c0: 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31 30 2c  LECT randstr(10,
20d0: 34 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20  400) FROM t3;.  
20e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
20f0: 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28   SELECT randstr(
2100: 31 30 2c 34 30 30 29 20 46 52 4f 4d 20 74 33 3b  10,400) FROM t3;
2110: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2120: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 73   t3 SELECT rands
2130: 74 72 28 31 30 2c 34 30 30 29 20 46 52 4f 4d 20  tr(10,400) FROM 
2140: 74 33 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  t3;.    COMMIT;.
2150: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53    }.  execsql {S
2160: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2170: 52 4f 4d 20 74 33 3b 7d 0a 7d 20 7b 33 32 7d 0a  ROM t3;}.} {32}.
2180: 0a 73 65 74 20 3a 3a 58 20 5b 73 69 67 6e 61 74  .set ::X [signat
2190: 75 72 65 5d 0a 64 6f 5f 74 65 73 74 20 65 78 63  ure].do_test exc
21a0: 6c 75 73 69 76 65 2d 34 2e 31 20 7b 0a 20 20 65  lusive-4.1 {.  e
21b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
21c0: 49 4e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  IN;.    DELETE F
21d0: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 72 61 6e  ROM t3 WHERE ran
21e0: 64 6f 6d 28 29 25 31 30 21 3d 30 3b 0a 20 20 20  dom()%10!=0;.   
21f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
2200: 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31  SELECT randstr(1
2210: 30 2c 31 30 29 7c 7c 78 20 46 52 4f 4d 20 74 33  0,10)||x FROM t3
2220: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2230: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
2240: 73 74 72 28 31 30 2c 31 30 29 7c 7c 78 20 46 52  str(10,10)||x FR
2250: 4f 4d 20 74 33 3b 0a 20 20 20 20 53 45 4c 45 43  OM t3;.    SELEC
2260: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2270: 74 33 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  t3;.    ROLLBACK
2280: 3b 0a 20 20 7d 0a 20 20 73 69 67 6e 61 74 75 72  ;.  }.  signatur
2290: 65 0a 7d 20 24 3a 3a 58 0a 0a 64 6f 5f 74 65 73  e.} $::X..do_tes
22a0: 74 20 65 78 63 6c 75 73 69 76 65 2d 34 2e 32 20  t exclusive-4.2 
22b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
22c0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 44 45 4c    BEGIN;.    DEL
22d0: 45 54 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52  ETE FROM t3 WHER
22e0: 45 20 72 61 6e 64 6f 6d 28 29 25 31 30 21 3d 30  E random()%10!=0
22f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2300: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
2310: 73 74 72 28 31 30 2c 31 30 29 7c 7c 78 20 46 52  str(10,10)||x FR
2320: 4f 4d 20 74 33 3b 0a 20 20 20 20 44 45 4c 45 54  OM t3;.    DELET
2330: 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20  E FROM t3 WHERE 
2340: 72 61 6e 64 6f 6d 28 29 25 31 30 21 3d 30 3b 0a  random()%10!=0;.
2350: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2360: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74  t3 SELECT randst
2370: 72 28 31 30 2c 31 30 29 7c 7c 78 20 46 52 4f 4d  r(10,10)||x FROM
2380: 20 74 33 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43   t3;.    ROLLBAC
2390: 4b 3b 0a 20 20 7d 0a 20 20 73 69 67 6e 61 74 75  K;.  }.  signatu
23a0: 72 65 0a 7d 20 24 3a 3a 58 0a 0a 64 6f 5f 74 65  re.} $::X..do_te
23b0: 73 74 20 65 78 63 6c 75 73 69 76 65 2d 34 2e 33  st exclusive-4.3
23c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
23d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
23e0: 33 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72  3 SELECT randstr
23f0: 28 31 30 2c 34 30 30 29 20 46 52 4f 4d 20 74 33  (10,400) FROM t3
2400: 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 25   WHERE random()%
2410: 31 30 3d 3d 30 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  10==0;.  }.} {}.
2420: 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69  .do_test exclusi
2430: 76 65 2d 34 2e 34 20 7b 0a 20 20 63 61 74 63 68  ve-4.4 {.  catch
2440: 20 7b 73 65 74 20 3a 3a 58 20 5b 73 69 67 6e 61   {set ::X [signa
2450: 74 75 72 65 5d 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f  ture]}.} {0}.do_
2460: 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 34  test exclusive-4
2470: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
2480: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
2490: 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41  ing_mode = NORMA
24a0: 4c 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  L;.    DROP TABL
24b0: 45 20 74 33 3b 0a 20 20 20 20 44 52 4f 50 20 54  E t3;.    DROP T
24c0: 41 42 4c 45 20 61 62 63 3b 0a 20 20 7d 0a 7d 20  ABLE abc;.  }.} 
24d0: 7b 6e 6f 72 6d 61 6c 7d 0a 0a 23 2d 2d 2d 2d 2d  {normal}..#-----
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2520: 2d 0a 23 20 54 65 73 74 73 20 65 78 63 6c 75 73  -.# Tests exclus
2530: 69 76 65 2d 35 2e 58 20 2d 20 74 65 73 74 20 74  ive-5.X - test t
2540: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  hat statement jo
2550: 75 72 6e 61 6c 73 20 61 72 65 20 74 72 75 6e 63  urnals are trunc
2560: 61 74 65 64 0a 23 20 69 6e 73 74 65 61 64 20 6f  ated.# instead o
2570: 66 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 69  f deleted when i
2580: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
2590: 73 73 20 6d 6f 64 65 2e 0a 23 0a 0a 23 20 43 6c  ss mode..#..# Cl
25a0: 6f 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 74  ose and reopen t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  he database so t
25c0: 68 61 74 20 74 68 65 20 74 65 6d 70 20 64 61 74  hat the temp dat
25d0: 61 62 61 73 65 20 69 73 20 6e 6f 0a 23 20 6c 6f  abase is no.# lo
25e0: 6e 67 65 72 20 61 63 74 69 76 65 2e 0a 23 0a 64  nger active..#.d
25f0: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
2600: 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 69 66  db test.db..# if
2610: 20 77 65 27 72 65 20 75 73 69 6e 67 20 70 72 6f   we're using pro
2620: 78 79 20 6c 6f 63 6b 73 2c 20 77 65 20 75 73 65  xy locks, we use
2630: 20 33 20 66 69 6c 65 64 65 73 63 72 69 70 74 6f   3 filedescripto
2640: 72 73 20 66 6f 72 20 61 20 64 62 0a 23 20 74 68  rs for a db.# th
2650: 61 74 20 69 73 20 6f 70 65 6e 20 62 75 74 20 4e  at is open but N
2660: 4f 54 20 77 72 69 74 69 6e 67 20 63 68 61 6e 67  OT writing chang
2670: 65 73 2c 20 6e 6f 72 6d 61 6c 6c 79 0a 23 20 73  es, normally.# s
2680: 71 6c 69 74 65 20 75 73 65 73 20 31 20 28 70 72  qlite uses 1 (pr
2690: 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 61 64 64 73  oxy locking adds
26a0: 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 74   the conch and t
26b0: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 29 0a 73  he local lock).s
26c0: 65 74 20 75 73 69 6e 67 5f 70 72 6f 78 79 20 30  et using_proxy 0
26d0: 0a 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20 76  .foreach {name v
26e0: 61 6c 75 65 7d 20 5b 61 72 72 61 79 20 67 65 74  alue} [array get
26f0: 20 65 6e 76 20 53 51 4c 49 54 45 5f 46 4f 52 43   env SQLITE_FORC
2700: 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 5d  E_PROXY_LOCKING]
2710: 20 7b 0a 20 20 73 65 74 20 75 73 69 6e 67 5f 70   {.  set using_p
2720: 72 6f 78 79 20 24 76 61 6c 75 65 0a 7d 0a 73 65  roxy $value.}.se
2730: 74 20 65 78 74 72 61 66 64 73 20 30 0a 69 66 20  t extrafds 0.if 
2740: 7b 24 75 73 69 6e 67 5f 70 72 6f 78 79 21 3d 30  {$using_proxy!=0
2750: 7d 20 7b 0a 20 20 73 65 74 20 65 78 74 72 61 66  } {.  set extraf
2760: 64 73 20 32 0a 7d 20 0a 0a 64 6f 5f 74 65 73 74  ds 2.} ..do_test
2770: 20 65 78 63 6c 75 73 69 76 65 2d 35 2e 30 20 7b   exclusive-5.0 {
2780: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2790: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
27a0: 63 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  c(a UNIQUE, b UN
27b0: 49 51 55 45 2c 20 63 20 55 4e 49 51 55 45 29 3b  IQUE, c UNIQUE);
27c0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
27d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
27e0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
27f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2800: 20 61 62 63 20 53 45 4c 45 43 54 20 61 2b 31 2c   abc SELECT a+1,
2810: 20 62 2b 31 2c 20 63 2b 31 20 46 52 4f 4d 20 61   b+1, c+1 FROM a
2820: 62 63 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  bc;.  }.} {}.do_
2830: 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 35  test exclusive-5
2840: 2e 31 20 7b 0a 20 20 23 20 54 68 72 65 65 20 66  .1 {.  # Three f
2850: 69 6c 65 73 20 61 72 65 20 6f 70 65 6e 3a 20 54  iles are open: T
2860: 68 65 20 64 62 2c 20 6a 6f 75 72 6e 61 6c 20 61  he db, journal a
2870: 6e 64 20 73 74 61 74 65 6d 65 6e 74 2d 6a 6f 75  nd statement-jou
2880: 72 6e 61 6c 2e 0a 20 20 73 65 74 20 73 71 6c 69  rnal..  set sqli
2890: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
28a0: 6e 74 0a 20 20 65 78 70 72 20 24 73 71 6c 69 74  nt.  expr $sqlit
28b0: 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
28c0: 74 2d 24 65 78 74 72 61 66 64 73 0a 7d 20 5b 65  t-$extrafds.} [e
28d0: 78 70 72 20 33 20 2d 20 28 24 54 45 4d 50 5f 53  xpr 3 - ($TEMP_S
28e0: 54 4f 52 45 3e 3d 32 29 5d 0a 64 6f 5f 74 65 73  TORE>=2)].do_tes
28f0: 74 20 65 78 63 6c 75 73 69 76 65 2d 35 2e 32 20  t exclusive-5.2 
2900: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2910: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
2920: 23 20 4f 6e 65 20 66 69 6c 65 20 6f 70 65 6e 3a  # One file open:
2930: 20 74 68 65 20 64 62 2e 0a 20 20 73 65 74 20 73   the db..  set s
2940: 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
2950: 63 6f 75 6e 74 0a 20 20 65 78 70 72 20 24 73 71  count.  expr $sq
2960: 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  lite_open_file_c
2970: 6f 75 6e 74 2d 24 65 78 74 72 61 66 64 73 0a 7d  ount-$extrafds.}
2980: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 78 63   {1}.do_test exc
2990: 6c 75 73 69 76 65 2d 35 2e 33 20 7b 0a 20 20 65  lusive-5.3 {.  e
29a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
29b0: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
29c0: 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20   = exclusive;.  
29d0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
29e0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
29f0: 55 45 53 28 35 2c 20 36 2c 20 37 29 3b 0a 20 20  UES(5, 6, 7);.  
2a00: 7d 0a 20 20 23 20 54 77 6f 20 66 69 6c 65 73 20  }.  # Two files 
2a10: 6f 70 65 6e 3a 20 74 68 65 20 64 62 20 61 6e 64  open: the db and
2a20: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 73 65 74 20   journal..  set 
2a30: 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
2a40: 5f 63 6f 75 6e 74 0a 20 20 65 78 70 72 20 24 73  _count.  expr $s
2a50: 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
2a60: 63 6f 75 6e 74 2d 24 65 78 74 72 61 66 64 73 0a  count-$extrafds.
2a70: 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 65 78  } {2}.do_test ex
2a80: 63 6c 75 73 69 76 65 2d 35 2e 34 20 7b 0a 20 20  clusive-5.4 {.  
2a90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
2aa0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45  SERT INTO abc SE
2ab0: 4c 45 43 54 20 61 2b 31 30 2c 20 62 2b 31 30 2c  LECT a+10, b+10,
2ac0: 20 63 2b 31 30 20 46 52 4f 4d 20 61 62 63 3b 0a   c+10 FROM abc;.
2ad0: 20 20 7d 0a 20 20 23 20 54 68 72 65 65 20 66 69    }.  # Three fi
2ae0: 6c 65 73 20 61 72 65 20 6f 70 65 6e 3a 20 54 68  les are open: Th
2af0: 65 20 64 62 2c 20 6a 6f 75 72 6e 61 6c 20 61 6e  e db, journal an
2b00: 64 20 73 74 61 74 65 6d 65 6e 74 2d 6a 6f 75 72  d statement-jour
2b10: 6e 61 6c 2e 0a 20 20 73 65 74 20 73 71 6c 69 74  nal..  set sqlit
2b20: 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
2b30: 74 0a 20 20 65 78 70 72 20 24 73 71 6c 69 74 65  t.  expr $sqlite
2b40: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
2b50: 2d 24 65 78 74 72 61 66 64 73 0a 7d 20 5b 65 78  -$extrafds.} [ex
2b60: 70 72 20 33 20 2d 20 28 24 54 45 4d 50 5f 53 54  pr 3 - ($TEMP_ST
2b70: 4f 52 45 3e 3d 32 29 5d 0a 64 6f 5f 74 65 73 74  ORE>=2)].do_test
2b80: 20 65 78 63 6c 75 73 69 76 65 2d 35 2e 35 20 7b   exclusive-5.5 {
2b90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2ba0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 23   COMMIT;.  }.  #
2bb0: 20 54 68 72 65 65 20 66 69 6c 65 73 20 61 72 65   Three files are
2bc0: 20 73 74 69 6c 6c 20 6f 70 65 6e 3a 20 54 68 65   still open: The
2bd0: 20 64 62 2c 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   db, journal and
2be0: 20 73 74 61 74 65 6d 65 6e 74 2d 6a 6f 75 72 6e   statement-journ
2bf0: 61 6c 2e 0a 20 20 73 65 74 20 73 71 6c 69 74 65  al..  set sqlite
2c00: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
2c10: 0a 20 20 65 78 70 72 20 24 73 71 6c 69 74 65 5f  .  expr $sqlite_
2c20: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2d  open_file_count-
2c30: 24 65 78 74 72 61 66 64 73 0a 7d 20 5b 65 78 70  $extrafds.} [exp
2c40: 72 20 33 20 2d 20 28 24 54 45 4d 50 5f 53 54 4f  r 3 - ($TEMP_STO
2c50: 52 45 3e 3d 32 29 5d 0a 64 6f 5f 74 65 73 74 20  RE>=2)].do_test 
2c60: 65 78 63 6c 75 73 69 76 65 2d 35 2e 36 20 7b 0a  exclusive-5.6 {.
2c70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2c80: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
2c90: 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20  ode = normal;.  
2ca0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2cb0: 61 62 63 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 72 6d  abc;.  }.} {norm
2cc0: 61 6c 20 31 20 32 20 33 20 32 20 33 20 34 20 35  al 1 2 3 2 3 4 5
2cd0: 20 36 20 37 20 31 31 20 31 32 20 31 33 20 31 32   6 7 11 12 13 12
2ce0: 20 31 33 20 31 34 20 31 35 20 31 36 20 31 37 7d   13 14 15 16 17}
2cf0: 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69  .do_test exclusi
2d00: 76 65 2d 35 2e 37 20 7b 0a 20 20 23 20 4a 75 73  ve-5.7 {.  # Jus
2d10: 74 20 74 68 65 20 64 62 20 6f 70 65 6e 2e 0a 20  t the db open.. 
2d20: 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e   set sqlite_open
2d30: 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 20 20 65 78  _file_count.  ex
2d40: 70 72 20 24 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  pr $sqlite_open_
2d50: 66 69 6c 65 5f 63 6f 75 6e 74 2d 24 65 78 74 72  file_count-$extr
2d60: 61 66 64 73 0a 7d 20 7b 31 7d 0a 0a 23 2d 2d 2d  afds.} {1}..#---
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 65 78 65 63 73  ------..do_execs
2dc0: 71 6c 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76  ql_test exclusiv
2dd0: 65 2d 36 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  e-6.1 {.  CREATE
2de0: 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b   TABLE t4(a, b);
2df0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
2e00: 34 20 56 41 4c 55 45 53 28 27 45 64 65 6e 27 2c  4 VALUES('Eden',
2e10: 20 31 39 35 35 29 3b 0a 20 20 42 45 47 49 4e 3b   1955);.  BEGIN;
2e20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2e30: 20 74 34 20 56 41 4c 55 45 53 28 27 4d 61 63 6d   t4 VALUES('Macm
2e40: 69 6c 6c 61 6e 27 2c 20 31 39 35 37 29 3b 0a 20  illan', 1957);. 
2e50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2e60: 34 20 56 41 4c 55 45 53 28 27 44 6f 75 67 6c 61  4 VALUES('Dougla
2e70: 73 2d 48 6f 6d 65 27 2c 20 31 39 36 33 29 3b 0a  s-Home', 1963);.
2e80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2e90: 74 34 20 56 41 4c 55 45 53 28 27 57 69 6c 73 6f  t4 VALUES('Wilso
2ea0: 6e 27 2c 20 31 39 36 34 29 3b 0a 7d 0a 64 6f 5f  n', 1964);.}.do_
2eb0: 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 36  test exclusive-6
2ec0: 2e 32 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  .2 {.  forcedele
2ed0: 74 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74  te test2.db test
2ee0: 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66  2.db-journal.  f
2ef0: 69 6c 65 20 63 6f 70 79 20 74 65 73 74 2e 64 62  ile copy test.db
2f00: 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65   test2.db.  file
2f10: 20 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 6a 6f   copy test.db-jo
2f20: 75 72 6e 61 6c 20 74 65 73 74 32 2e 64 62 2d 6a  urnal test2.db-j
2f30: 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33  ournal.  sqlite3
2f40: 20 64 62 20 74 65 73 74 32 2e 64 62 0a 7d 20 7b   db test2.db.} {
2f50: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
2f60: 73 74 20 65 78 63 6c 75 73 69 76 65 2d 36 2e 33  st exclusive-6.3
2f70: 20 7b 0a 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b   {.  PRAGMA lock
2f80: 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55  ing_mode = EXCLU
2f90: 53 49 56 45 3b 0a 20 20 53 45 4c 45 43 54 20 2a  SIVE;.  SELECT *
2fa0: 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b 65 78 63   FROM t4;.} {exc
2fb0: 6c 75 73 69 76 65 20 45 64 65 6e 20 31 39 35 35  lusive Eden 1955
2fc0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75  }..do_test exclu
2fd0: 73 69 76 65 2d 36 2e 34 20 7b 0a 20 20 64 62 20  sive-6.4 {.  db 
2fe0: 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65 64 65 6c  close.  forcedel
2ff0: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
3000: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 65  .db-journal.  se
3010: 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e  t fd [open test.
3020: 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20  db-journal w].  
3030: 70 75 74 73 20 24 66 64 20 78 0a 20 20 63 6c 6f  puts $fd x.  clo
3040: 73 65 20 24 66 64 0a 20 20 73 71 6c 69 74 65 33  se $fd.  sqlite3
3050: 20 64 62 20 74 65 73 74 2e 64 62 0a 7d 20 7b 7d   db test.db.} {}
3060: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
3070: 74 20 65 78 63 6c 75 73 69 76 65 2d 36 2e 35 20  t exclusive-6.5 
3080: 7b 0a 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69  {.  PRAGMA locki
3090: 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53  ng_mode = EXCLUS
30a0: 49 56 45 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  IVE;.  SELECT * 
30b0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
30c0: 65 72 3b 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65  er;.} {exclusive
30d0: 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a  }..finish_test..