/ Hex Artifact Content
Login

Artifact 4d8a112d6c5bf52014e9383c25ff193cc4f67185:


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 73  ft_heap_limit $s
13e0: 6f 66 74 5f 6c 69 6d 69 74 0a 0a 64 6f 5f 74 65  oft_limit..do_te
13f0: 73 74 20 65 78 63 6c 75 73 69 76 65 2d 32 2e 39  st exclusive-2.9
1400: 20 7b 0a 20 20 23 20 57 72 69 74 65 20 74 68 65   {.  # Write the
1410: 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 73 74   database to est
1420: 61 62 6c 69 73 68 20 74 68 65 20 65 78 63 6c 75  ablish the exclu
1430: 73 69 76 65 20 6c 6f 63 6b 20 77 69 74 68 20 63  sive lock with c
1440: 6f 6e 6e 65 63 74 69 6f 6e 20 27 64 62 2e 0a 20  onnection 'db.. 
1450: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
1460: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
1470: 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a  ALUES(7, 8, 9);.
1480: 20 20 7d 20 64 62 0a 20 20 63 61 74 63 68 73 71    } db.  catchsq
1490: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
14a0: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64   FROM abc;.  } d
14b0: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
14c0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f  e is locked}}.do
14d0: 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d  _test exclusive-
14e0: 32 2e 31 30 20 7b 0a 20 20 23 20 43 68 61 6e 67  2.10 {.  # Chang
14f0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  ing the locking-
1500: 6d 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 72 65  mode does not re
1510: 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 2e  lease any locks.
1520: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1530: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
1540: 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20  mode = normal;. 
1550: 20 7d 20 64 62 0a 20 20 63 61 74 63 68 73 71 6c   } db.  catchsql
1560: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
1570: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62  FROM abc;.  } db
1580: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
1590: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
15a0: 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 32  test exclusive-2
15b0: 2e 31 31 20 7b 0a 20 20 23 20 41 66 74 65 72 20  .11 {.  # After 
15c0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6c 6f 63  changing the loc
15d0: 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 63 63 65 73  king mode, acces
15e0: 73 69 6e 67 20 74 68 65 20 64 62 20 72 65 6c 65  sing the db rele
15f0: 61 73 65 73 20 6c 6f 63 6b 73 2e 0a 20 20 65 78  ases locks..  ex
1600: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
1610: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
1620: 20 7d 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20   } db.  execsql 
1630: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
1640: 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62 32  ROM abc;.  } db2
1650: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
1660: 37 20 38 20 39 7d 0a 64 62 32 20 63 6c 6f 73 65  7 8 9}.db2 close
1670: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74  ---------.# Test
16c0: 73 20 65 78 63 6c 75 73 69 76 65 2d 33 2e 58 20  s exclusive-3.X 
16d0: 2d 20 74 65 73 74 20 74 68 61 74 20 61 20 63 6f  - test that a co
16e0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 65 78 63 6c  nnection in excl
16f0: 75 73 69 76 65 20 6d 6f 64 65 20 0a 23 20 74 72  usive mode .# tr
1700: 75 6e 63 61 74 65 73 20 69 6e 73 74 65 61 64 20  uncates instead 
1710: 6f 66 20 64 65 6c 65 74 65 73 20 74 68 65 20 6a  of deletes the j
1720: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
1730: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 61   committing .# a
1740: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
1750: 23 20 54 68 65 73 65 20 74 65 73 74 73 20 61 72  # These tests ar
1760: 65 20 6e 6f 74 20 72 75 6e 20 6f 6e 20 77 69 6e  e not run on win
1770: 64 6f 77 73 20 62 65 63 61 75 73 65 20 74 68 65  dows because the
1780: 20 77 69 6e 64 6f 77 73 20 62 61 63 6b 65 6e 64   windows backend
1790: 0a 23 20 6f 70 65 6e 73 20 74 68 65 20 6a 6f 75  .# opens the jou
17a0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 65 78  rnal file for ex
17b0: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c 20  clusive access, 
17c0: 70 72 65 76 65 6e 74 69 6e 67 20 69 74 73 20 63  preventing its c
17d0: 6f 6e 74 65 6e 74 73 20 0a 23 20 66 72 6f 6d 20  ontents .# from 
17e0: 62 65 69 6e 67 20 69 6e 73 70 65 63 74 65 64 20  being inspected 
17f0: 65 78 74 65 72 6e 61 6c 6c 79 2e 0a 23 0a 69 66  externally..#.if
1800: 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   {$tcl_platform(
1810: 70 6c 61 74 66 6f 72 6d 29 20 21 3d 20 22 77 69  platform) != "wi
1820: 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 70 72 6f 63  ndows"} {.  proc
1830: 20 66 69 6c 65 73 74 61 74 65 20 7b 66 6e 61 6d   filestate {fnam
1840: 65 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 78 69  e} {.    set exi
1850: 73 74 73 20 30 0a 20 20 20 20 73 65 74 20 63 6f  sts 0.    set co
1860: 6e 74 65 6e 74 20 30 0a 20 20 20 20 69 66 20 7b  ntent 0.    if {
1870: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 6e  [file exists $fn
1880: 61 6d 65 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65  ame]} {.      se
1890: 74 20 65 78 69 73 74 73 20 31 0a 20 20 20 20 20  t exists 1.     
18a0: 20 73 65 74 20 68 64 72 20 5b 68 65 78 69 6f 5f   set hdr [hexio_
18b0: 72 65 61 64 20 24 66 6e 61 6d 65 20 30 20 32 38  read $fname 0 28
18c0: 5d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6e 74  ].      set cont
18d0: 65 6e 74 20 5b 65 78 70 72 20 7b 30 3d 3d 5b 73  ent [expr {0==[s
18e0: 74 72 69 6e 67 20 6d 61 74 63 68 20 24 68 64 72  tring match $hdr
18f0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
1900: 30 20 35 36 5d 5d 7d 5d 0a 20 20 20 20 7d 0a 20  0 56]]}].    }. 
1910: 20 20 20 6c 69 73 74 20 24 65 78 69 73 74 73 20     list $exists 
1920: 24 63 6f 6e 74 65 6e 74 0a 20 20 7d 0a 20 20 64  $content.  }.  d
1930: 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76 65  o_test exclusive
1940: 2d 33 2e 30 20 7b 0a 20 20 20 20 66 69 6c 65 73  -3.0 {.    files
1950: 74 61 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  tate test.db-jou
1960: 72 6e 61 6c 0a 20 20 7d 20 7b 30 20 30 7d 0a 20  rnal.  } {0 0}. 
1970: 20 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69   do_test exclusi
1980: 76 65 2d 33 2e 31 20 7b 0a 20 20 20 20 65 78 65  ve-3.1 {.    exe
1990: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
19a0: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
19b0: 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20   = exclusive;.  
19c0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
19d0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63   DELETE FROM abc
19e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65  ;.    }.    file
19f0: 73 74 61 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  state test.db-jo
1a00: 75 72 6e 61 6c 0a 20 20 7d 20 7b 31 20 31 7d 0a  urnal.  } {1 1}.
1a10: 20 20 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73    do_test exclus
1a20: 69 76 65 2d 33 2e 32 20 7b 0a 20 20 20 20 65 78  ive-3.2 {.    ex
1a30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f  ecsql {.      CO
1a40: 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  MMIT;.    }.    
1a50: 66 69 6c 65 73 74 61 74 65 20 74 65 73 74 2e 64  filestate test.d
1a60: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 7b 31  b-journal.  } {1
1a70: 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78   0}.  do_test ex
1a80: 63 6c 75 73 69 76 65 2d 33 2e 33 20 7b 0a 20 20  clusive-3.3 {.  
1a90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1aa0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
1ab0: 63 20 56 41 4c 55 45 53 28 27 41 27 2c 20 27 42  c VALUES('A', 'B
1ac0: 27 2c 20 27 43 27 29 3b 0a 20 20 20 20 20 20 53  ', 'C');.      S
1ad0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
1ae0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 41 20 42  ;.    }.  } {A B
1af0: 20 43 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 78   C}.  do_test ex
1b00: 63 6c 75 73 69 76 65 2d 33 2e 34 20 7b 0a 20 20  clusive-3.4 {.  
1b10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1b20: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
1b30: 50 44 41 54 45 20 61 62 63 20 53 45 54 20 61 20  PDATE abc SET a 
1b40: 3d 20 31 2c 20 62 20 3d 20 32 2c 20 63 20 3d 20  = 1, b = 2, c = 
1b50: 33 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  3;.      ROLLBAC
1b60: 4b 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  K;.      SELECT 
1b70: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20  * FROM abc;.    
1b80: 7d 0a 20 20 7d 20 7b 41 20 42 20 43 7d 0a 20 20  }.  } {A B C}.  
1b90: 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76  do_test exclusiv
1ba0: 65 2d 33 2e 35 20 7b 0a 20 20 20 20 66 69 6c 65  e-3.5 {.    file
1bb0: 73 74 61 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  state test.db-jo
1bc0: 75 72 6e 61 6c 0a 20 20 7d 20 7b 31 20 30 7d 0a  urnal.  } {1 0}.
1bd0: 20 20 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73    do_test exclus
1be0: 69 76 65 2d 33 2e 36 20 7b 0a 20 20 20 20 65 78  ive-3.6 {.    ex
1bf0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
1c00: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
1c10: 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20  e = normal;.    
1c20: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1c30: 61 62 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  abc;.    }.    f
1c40: 69 6c 65 73 74 61 74 65 20 74 65 73 74 2e 64 62  ilestate test.db
1c50: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 7b 30 20  -journal.  } {0 
1c60: 30 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  0}.}..#---------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
1cb0: 54 65 73 74 73 20 65 78 63 6c 75 73 69 76 65 2d  Tests exclusive-
1cc0: 34 2e 58 20 2d 20 74 65 73 74 20 74 68 61 74 20  4.X - test that 
1cd0: 72 6f 6c 6c 62 61 63 6b 20 77 6f 72 6b 73 20 63  rollback works c
1ce0: 6f 72 72 65 63 74 6c 79 20 77 68 65 6e 0a 23 20  orrectly when.# 
1cf0: 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1d00: 65 73 73 20 6d 6f 64 65 2e 0a 23 0a 0a 23 20 54  ess mode..#..# T
1d10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1d20: 63 65 64 75 72 65 20 63 6f 6d 70 75 74 65 73 20  cedure computes 
1d30: 61 20 22 73 69 67 6e 61 74 75 72 65 22 20 66 6f  a "signature" fo
1d40: 72 20 74 61 62 6c 65 20 22 74 33 22 2e 20 20 49  r table "t3".  I
1d50: 66 0a 23 20 54 33 20 63 68 61 6e 67 65 73 20 69  f.# T3 changes i
1d60: 6e 20 61 6e 79 20 77 61 79 2c 20 74 68 65 20 73  n any way, the s
1d70: 69 67 6e 61 74 75 72 65 20 73 68 6f 75 6c 64 20  ignature should 
1d80: 63 68 61 6e 67 65 2e 20 20 0a 23 0a 23 20 54 68  change.  .#.# Th
1d90: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1da0: 73 74 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 57 65  st ROLLBACK.  We
1db0: 20 67 61 74 68 65 72 20 61 20 73 69 67 6e 61 74   gather a signat
1dc0: 75 72 65 20 66 6f 72 20 74 33 2c 20 74 68 65 6e  ure for t3, then
1dd0: 0a 23 20 6d 61 6b 65 20 6c 6f 74 73 20 6f 66 20  .# make lots of 
1de0: 63 68 61 6e 67 65 73 20 74 6f 20 74 33 2c 20 74  changes to t3, t
1df0: 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  hen rollback and
1e00: 20 74 61 6b 65 20 61 6e 6f 74 68 65 72 20 73 69   take another si
1e10: 67 6e 61 74 75 72 65 2e 0a 23 20 54 68 65 20 74  gnature..# The t
1e20: 77 6f 20 73 69 67 6e 61 74 75 72 65 73 20 73 68  wo signatures sh
1e30: 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
1e40: 2e 0a 23 0a 70 72 6f 63 20 73 69 67 6e 61 74 75  ..#.proc signatu
1e50: 72 65 20 7b 7d 20 7b 0a 20 20 72 65 74 75 72 6e  re {} {.  return
1e60: 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43   [db eval {SELEC
1e70: 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 64 35 73  T count(*), md5s
1e80: 75 6d 28 78 29 20 46 52 4f 4d 20 74 33 7d 5d 0a  um(x) FROM t3}].
1e90: 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75  }..do_test exclu
1ea0: 73 69 76 65 2d 34 2e 30 20 7b 0a 20 20 65 78 65  sive-4.0 {.  exe
1eb0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f  csql { PRAGMA lo
1ec0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
1ed0: 6c 75 73 69 76 65 3b 20 7d 0a 20 20 65 78 65 63  lusive; }.  exec
1ee0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 64 65 66  sql { PRAGMA def
1ef0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 20  ault_cache_size 
1f00: 3d 20 31 30 3b 20 7d 0a 20 20 65 78 65 63 73 71  = 10; }.  execsq
1f10: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
1f20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1f30: 74 33 28 78 20 54 45 58 54 29 3b 0a 20 20 20 20  t3(x TEXT);.    
1f40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
1f50: 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 31 30  ALUES(randstr(10
1f60: 2c 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  ,400));.    INSE
1f70: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
1f80: 53 28 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30  S(randstr(10,400
1f90: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
1fa0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
1fb0: 6e 64 73 74 72 28 31 30 2c 34 30 30 29 20 46 52  ndstr(10,400) FR
1fc0: 4f 4d 20 74 33 3b 0a 20 20 20 20 49 4e 53 45 52  OM t3;.    INSER
1fd0: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
1fe0: 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29   randstr(10,400)
1ff0: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 49 4e   FROM t3;.    IN
2000: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
2010: 45 43 54 20 72 61 6e 64 73 74 72 28 31 30 2c 34  ECT randstr(10,4
2020: 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  00) FROM t3;.   
2030: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
2040: 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31  SELECT randstr(1
2050: 30 2c 34 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a  0,400) FROM t3;.
2060: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
2070: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
2080: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2090: 74 33 3b 7d 0a 7d 20 7b 33 32 7d 0a 0a 73 65 74  t3;}.} {32}..set
20a0: 20 3a 3a 58 20 5b 73 69 67 6e 61 74 75 72 65 5d   ::X [signature]
20b0: 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69  .do_test exclusi
20c0: 76 65 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  ve-4.1 {.  execs
20d0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
20e0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
20f0: 74 33 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28  t3 WHERE random(
2100: 29 25 31 30 21 3d 30 3b 0a 20 20 20 20 49 4e 53  )%10!=0;.    INS
2110: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
2120: 43 54 20 72 61 6e 64 73 74 72 28 31 30 2c 31 30  CT randstr(10,10
2130: 29 7c 7c 78 20 46 52 4f 4d 20 74 33 3b 0a 20 20  )||x FROM t3;.  
2140: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
2150: 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28   SELECT randstr(
2160: 31 30 2c 31 30 29 7c 7c 78 20 46 52 4f 4d 20 74  10,10)||x FROM t
2170: 33 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  3;.    SELECT co
2180: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 33 3b 0a  unt(*) FROM t3;.
2190: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
21a0: 7d 0a 20 20 73 69 67 6e 61 74 75 72 65 0a 7d 20  }.  signature.} 
21b0: 24 3a 3a 58 0a 0a 64 6f 5f 74 65 73 74 20 65 78  $::X..do_test ex
21c0: 63 6c 75 73 69 76 65 2d 34 2e 32 20 7b 0a 20 20  clusive-4.2 {.  
21d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
21e0: 47 49 4e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  GIN;.    DELETE 
21f0: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 72 61  FROM t3 WHERE ra
2200: 6e 64 6f 6d 28 29 25 31 30 21 3d 30 3b 0a 20 20  ndom()%10!=0;.  
2210: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
2220: 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28   SELECT randstr(
2230: 31 30 2c 31 30 29 7c 7c 78 20 46 52 4f 4d 20 74  10,10)||x FROM t
2240: 33 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  3;.    DELETE FR
2250: 4f 4d 20 74 33 20 57 48 45 52 45 20 72 61 6e 64  OM t3 WHERE rand
2260: 6f 6d 28 29 25 31 30 21 3d 30 3b 0a 20 20 20 20  om()%10!=0;.    
2270: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
2280: 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31 30  ELECT randstr(10
2290: 2c 31 30 29 7c 7c 78 20 46 52 4f 4d 20 74 33 3b  ,10)||x FROM t3;
22a0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
22b0: 20 7d 0a 20 20 73 69 67 6e 61 74 75 72 65 0a 7d   }.  signature.}
22c0: 20 24 3a 3a 58 0a 0a 64 6f 5f 74 65 73 74 20 65   $::X..do_test e
22d0: 78 63 6c 75 73 69 76 65 2d 34 2e 33 20 7b 0a 20  xclusive-4.3 {. 
22e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
22f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
2300: 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31 30 2c  LECT randstr(10,
2310: 34 30 30 29 20 46 52 4f 4d 20 74 33 20 57 48 45  400) FROM t3 WHE
2320: 52 45 20 72 61 6e 64 6f 6d 28 29 25 31 30 3d 3d  RE random()%10==
2330: 30 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  0;.  }.} {}..do_
2340: 74 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 34  test exclusive-4
2350: 2e 34 20 7b 0a 20 20 63 61 74 63 68 20 7b 73 65  .4 {.  catch {se
2360: 74 20 3a 3a 58 20 5b 73 69 67 6e 61 74 75 72 65  t ::X [signature
2370: 5d 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  ]}.} {0}.do_test
2380: 20 65 78 63 6c 75 73 69 76 65 2d 34 2e 35 20 7b   exclusive-4.5 {
2390: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
23a0: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
23b0: 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20  mode = NORMAL;. 
23c0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 33     DROP TABLE t3
23d0: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
23e0: 20 61 62 63 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 72   abc;.  }.} {nor
23f0: 6d 61 6c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  mal}..#---------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2440: 54 65 73 74 73 20 65 78 63 6c 75 73 69 76 65 2d  Tests exclusive-
2450: 35 2e 58 20 2d 20 74 65 73 74 20 74 68 61 74 20  5.X - test that 
2460: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2470: 6c 73 20 61 72 65 20 74 72 75 6e 63 61 74 65 64  ls are truncated
2480: 0a 23 20 69 6e 73 74 65 61 64 20 6f 66 20 64 65  .# instead of de
2490: 6c 65 74 65 64 20 77 68 65 6e 20 69 6e 20 65 78  leted when in ex
24a0: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
24b0: 6f 64 65 2e 0a 23 0a 0a 23 20 43 6c 6f 73 65 20  ode..#..# Close 
24c0: 61 6e 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64  and reopen the d
24d0: 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
24e0: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
24f0: 65 20 69 73 20 6e 6f 0a 23 20 6c 6f 6e 67 65 72  e is no.# longer
2500: 20 61 63 74 69 76 65 2e 0a 23 0a 64 62 20 63 6c   active..#.db cl
2510: 6f 73 65 0a 73 71 6c 69 74 65 20 64 62 20 74 65  ose.sqlite db te
2520: 73 74 2e 64 62 0a 0a 23 20 69 66 20 77 65 27 72  st.db..# if we'r
2530: 65 20 75 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  e using proxy lo
2540: 63 6b 73 2c 20 77 65 20 75 73 65 20 33 20 66 69  cks, we use 3 fi
2550: 6c 65 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  ledescriptors fo
2560: 72 20 61 20 64 62 0a 23 20 74 68 61 74 20 69 73  r a db.# that is
2570: 20 6f 70 65 6e 20 62 75 74 20 4e 4f 54 20 77 72   open but NOT wr
2580: 69 74 69 6e 67 20 63 68 61 6e 67 65 73 2c 20 6e  iting changes, n
2590: 6f 72 6d 61 6c 6c 79 0a 23 20 73 71 6c 69 74 65  ormally.# sqlite
25a0: 20 75 73 65 73 20 31 20 28 70 72 6f 78 79 20 6c   uses 1 (proxy l
25b0: 6f 63 6b 69 6e 67 20 61 64 64 73 20 74 68 65 20  ocking adds the 
25c0: 63 6f 6e 63 68 20 61 6e 64 20 74 68 65 20 6c 6f  conch and the lo
25d0: 63 61 6c 20 6c 6f 63 6b 29 0a 73 65 74 20 75 73  cal lock).set us
25e0: 69 6e 67 5f 70 72 6f 78 79 20 30 0a 66 6f 72 65  ing_proxy 0.fore
25f0: 61 63 68 20 7b 6e 61 6d 65 20 76 61 6c 75 65 7d  ach {name value}
2600: 20 5b 61 72 72 61 79 20 67 65 74 20 65 6e 76 20   [array get env 
2610: 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2620: 58 59 5f 4c 4f 43 4b 49 4e 47 5d 20 7b 0a 20 20  XY_LOCKING] {.  
2630: 73 65 74 20 75 73 69 6e 67 5f 70 72 6f 78 79 20  set using_proxy 
2640: 24 76 61 6c 75 65 0a 7d 0a 73 65 74 20 65 78 74  $value.}.set ext
2650: 72 61 66 64 73 20 30 0a 69 66 20 7b 24 75 73 69  rafds 0.if {$usi
2660: 6e 67 5f 70 72 6f 78 79 21 3d 30 7d 20 7b 0a 20  ng_proxy!=0} {. 
2670: 20 73 65 74 20 65 78 74 72 61 66 64 73 20 32 0a   set extrafds 2.
2680: 7d 20 0a 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c  } ..do_test excl
2690: 75 73 69 76 65 2d 35 2e 30 20 7b 0a 20 20 65 78  usive-5.0 {.  ex
26a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
26b0: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 20 55  TE TABLE abc(a U
26c0: 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55 45 2c  NIQUE, b UNIQUE,
26d0: 20 63 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   c UNIQUE);.    
26e0: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
26f0: 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45  T INTO abc VALUE
2700: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  S(1, 2, 3);.    
2710: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
2720: 53 45 4c 45 43 54 20 61 2b 31 2c 20 62 2b 31 2c  SELECT a+1, b+1,
2730: 20 63 2b 31 20 46 52 4f 4d 20 61 62 63 3b 0a 20   c+1 FROM abc;. 
2740: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
2750: 65 78 63 6c 75 73 69 76 65 2d 35 2e 31 20 7b 0a  exclusive-5.1 {.
2760: 20 20 23 20 54 68 72 65 65 20 66 69 6c 65 73 20    # Three files 
2770: 61 72 65 20 6f 70 65 6e 3a 20 54 68 65 20 64 62  are open: The db
2780: 2c 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 73 74  , journal and st
2790: 61 74 65 6d 65 6e 74 2d 6a 6f 75 72 6e 61 6c 2e  atement-journal.
27a0: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70  .  set sqlite_op
27b0: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 20 20  en_file_count.  
27c0: 65 78 70 72 20 24 73 71 6c 69 74 65 5f 6f 70 65  expr $sqlite_ope
27d0: 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2d 24 65 78  n_file_count-$ex
27e0: 74 72 61 66 64 73 0a 7d 20 5b 65 78 70 72 20 33  trafds.} [expr 3
27f0: 20 2d 20 28 24 54 45 4d 50 5f 53 54 4f 52 45 3e   - ($TEMP_STORE>
2800: 3d 32 29 5d 0a 64 6f 5f 74 65 73 74 20 65 78 63  =2)].do_test exc
2810: 6c 75 73 69 76 65 2d 35 2e 32 20 7b 0a 20 20 65  lusive-5.2 {.  e
2820: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
2830: 4d 49 54 3b 0a 20 20 7d 0a 20 20 23 20 4f 6e 65  MIT;.  }.  # One
2840: 20 66 69 6c 65 20 6f 70 65 6e 3a 20 74 68 65 20   file open: the 
2850: 64 62 2e 0a 20 20 73 65 74 20 73 71 6c 69 74 65  db..  set sqlite
2860: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
2870: 0a 20 20 65 78 70 72 20 24 73 71 6c 69 74 65 5f  .  expr $sqlite_
2880: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2d  open_file_count-
2890: 24 65 78 74 72 61 66 64 73 0a 7d 20 7b 31 7d 0a  $extrafds.} {1}.
28a0: 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69 76  do_test exclusiv
28b0: 65 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  e-5.3 {.  execsq
28c0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  l {.    PRAGMA l
28d0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
28e0: 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 42 45 47  clusive;.    BEG
28f0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
2900: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 35  NTO abc VALUES(5
2910: 2c 20 36 2c 20 37 29 3b 0a 20 20 7d 0a 20 20 23  , 6, 7);.  }.  #
2920: 20 54 77 6f 20 66 69 6c 65 73 20 6f 70 65 6e 3a   Two files open:
2930: 20 74 68 65 20 64 62 20 61 6e 64 20 6a 6f 75 72   the db and jour
2940: 6e 61 6c 2e 0a 20 20 73 65 74 20 73 71 6c 69 74  nal..  set sqlit
2950: 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
2960: 74 0a 20 20 65 78 70 72 20 24 73 71 6c 69 74 65  t.  expr $sqlite
2970: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
2980: 2d 24 65 78 74 72 61 66 64 73 0a 7d 20 7b 32 7d  -$extrafds.} {2}
2990: 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75 73 69  .do_test exclusi
29a0: 76 65 2d 35 2e 34 20 7b 0a 20 20 65 78 65 63 73  ve-5.4 {.  execs
29b0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
29c0: 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20  INTO abc SELECT 
29d0: 61 2b 31 30 2c 20 62 2b 31 30 2c 20 63 2b 31 30  a+10, b+10, c+10
29e0: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 20   FROM abc;.  }. 
29f0: 20 23 20 54 68 72 65 65 20 66 69 6c 65 73 20 61   # Three files a
2a00: 72 65 20 6f 70 65 6e 3a 20 54 68 65 20 64 62 2c  re open: The db,
2a10: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 73 74 61   journal and sta
2a20: 74 65 6d 65 6e 74 2d 6a 6f 75 72 6e 61 6c 2e 0a  tement-journal..
2a30: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70 65    set sqlite_ope
2a40: 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 20 20 65  n_file_count.  e
2a50: 78 70 72 20 24 73 71 6c 69 74 65 5f 6f 70 65 6e  xpr $sqlite_open
2a60: 5f 66 69 6c 65 5f 63 6f 75 6e 74 2d 24 65 78 74  _file_count-$ext
2a70: 72 61 66 64 73 0a 7d 20 5b 65 78 70 72 20 33 20  rafds.} [expr 3 
2a80: 2d 20 28 24 54 45 4d 50 5f 53 54 4f 52 45 3e 3d  - ($TEMP_STORE>=
2a90: 32 29 5d 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c  2)].do_test excl
2aa0: 75 73 69 76 65 2d 35 2e 35 20 7b 0a 20 20 65 78  usive-5.5 {.  ex
2ab0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d  ecsql {.    COMM
2ac0: 49 54 3b 0a 20 20 7d 0a 20 20 23 20 54 68 72 65  IT;.  }.  # Thre
2ad0: 65 20 66 69 6c 65 73 20 61 72 65 20 73 74 69 6c  e files are stil
2ae0: 6c 20 6f 70 65 6e 3a 20 54 68 65 20 64 62 2c 20  l open: The db, 
2af0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 73 74 61 74  journal and stat
2b00: 65 6d 65 6e 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  ement-journal.. 
2b10: 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e   set sqlite_open
2b20: 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 20 20 65 78  _file_count.  ex
2b30: 70 72 20 24 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  pr $sqlite_open_
2b40: 66 69 6c 65 5f 63 6f 75 6e 74 2d 24 65 78 74 72  file_count-$extr
2b50: 61 66 64 73 0a 7d 20 5b 65 78 70 72 20 33 20 2d  afds.} [expr 3 -
2b60: 20 28 24 54 45 4d 50 5f 53 54 4f 52 45 3e 3d 32   ($TEMP_STORE>=2
2b70: 29 5d 0a 64 6f 5f 74 65 73 74 20 65 78 63 6c 75  )].do_test exclu
2b80: 73 69 76 65 2d 35 2e 36 20 7b 0a 20 20 65 78 65  sive-5.6 {.  exe
2b90: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
2ba0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
2bb0: 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 53 45 4c   normal;.    SEL
2bc0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
2bd0: 20 20 7d 0a 7d 20 7b 6e 6f 72 6d 61 6c 20 31 20    }.} {normal 1 
2be0: 32 20 33 20 32 20 33 20 34 20 35 20 36 20 37 20  2 3 2 3 4 5 6 7 
2bf0: 31 31 20 31 32 20 31 33 20 31 32 20 31 33 20 31  11 12 13 12 13 1
2c00: 34 20 31 35 20 31 36 20 31 37 7d 0a 64 6f 5f 74  4 15 16 17}.do_t
2c10: 65 73 74 20 65 78 63 6c 75 73 69 76 65 2d 35 2e  est exclusive-5.
2c20: 37 20 7b 0a 20 20 23 20 4a 75 73 74 20 74 68 65  7 {.  # Just the
2c30: 20 64 62 20 6f 70 65 6e 2e 0a 20 20 73 65 74 20   db open..  set 
2c40: 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
2c50: 5f 63 6f 75 6e 74 0a 20 20 65 78 70 72 20 24 73  _count.  expr $s
2c60: 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
2c70: 63 6f 75 6e 74 2d 24 65 78 74 72 61 66 64 73 0a  count-$extrafds.
2c80: 7d 20 7b 31 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  } {1}..finish_te
2c90: 73 74 0a                                         st.