/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact edf5585398a33534db71a2a6108308d9e89c16d1:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .#**************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 73 63 72 69 70  us of this scrip
01c0: 74 20 69 73 20 64 61 74 61 62 61 73 65 20 6c 6f  t is database lo
01d0: 63 6b 73 2e 0a 23 0a 23 20 24 49 64 3a 20 6c 6f  cks..#.# $Id: lo
01e0: 63 6b 2e 74 65 73 74 2c 76 20 31 2e 33 39 20 32  ck.test,v 1.39 2
01f0: 30 30 39 2f 30 33 2f 32 38 20 31 35 3a 30 34 3a  009/03/28 15:04:
0200: 32 34 20 64 72 68 20 45 78 70 20 24 0a 0a 0a 73  24 drh Exp $...s
0210: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
0220: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0230: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0240: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 43  /tester.tcl..# C
0250: 72 65 61 74 65 20 61 6e 20 61 6c 74 65 72 6e 61  reate an alterna
0260: 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tive connection 
0270: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
0280: 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31  #.do_test lock-1
0290: 2e 30 20 7b 0a 20 20 23 20 47 69 76 65 20 61 20  .0 {.  # Give a 
02a0: 63 6f 6d 70 6c 65 78 20 70 61 74 68 6e 61 6d 65  complex pathname
02b0: 20 74 6f 20 73 74 72 65 73 73 20 74 68 65 20 70   to stress the p
02c0: 61 74 68 20 73 69 6d 70 6c 69 66 69 63 61 74 69  ath simplificati
02d0: 6f 6e 20 6c 6f 67 69 63 20 69 6e 0a 20 20 23 20  on logic in.  # 
02e0: 74 68 65 20 76 78 77 6f 72 6b 73 20 64 72 69 76  the vxworks driv
02f0: 65 72 20 61 6e 64 20 69 6e 20 74 65 73 74 5f 61  er and in test_a
0300: 73 79 6e 63 2e 0a 20 20 66 69 6c 65 20 6d 6b 64  sync..  file mkd
0310: 69 72 20 74 65 6d 70 64 69 72 2f 74 31 2f 74 32  ir tempdir/t1/t2
0320: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 2e  .  sqlite3 db2 .
0330: 2f 74 65 6d 70 64 69 72 2f 2e 2e 2f 74 65 6d 70  /tempdir/../temp
0340: 64 69 72 2f 74 31 2f 2e 2f 2f 74 32 2f 2e 2e 2f  dir/t1/.//t2/../
0350: 2e 2e 2f 2e 2e 2f 2f 74 65 73 74 2e 64 62 0a 20  ../..//test.db. 
0360: 20 73 65 74 20 64 75 6d 6d 79 20 7b 7d 0a 7d 20   set dummy {}.} 
0370: 7b 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  {}.do_test lock-
0380: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
0390: 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  {SELECT name FRO
03a0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
03b0: 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
03c0: 65 27 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65  e' ORDER BY name
03d0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6c  }.} {}.do_test l
03e0: 6f 63 6b 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63  ock-1.2 {.  exec
03f0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65  sql {SELECT name
0400: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
0410: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
0420: 74 61 62 6c 65 27 20 4f 52 44 45 52 20 42 59 20  table' ORDER BY 
0430: 6e 61 6d 65 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64  name} db2.} {}.d
0440: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 33 20  o_test lock-1.3 
0450: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45  {.  execsql {CRE
0460: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 69  ATE TABLE t1(a i
0470: 6e 74 2c 20 62 20 69 6e 74 29 7d 0a 20 20 65 78  nt, b int)}.  ex
0480: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61  ecsql {SELECT na
0490: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
04a0: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
04b0: 3d 27 74 61 62 6c 65 27 20 4f 52 44 45 52 20 42  ='table' ORDER B
04c0: 59 20 6e 61 6d 65 7d 0a 7d 20 7b 74 31 7d 0a 64  Y name}.} {t1}.d
04d0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 35 20  o_test lock-1.5 
04e0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
04f0: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
0500: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
0510: 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  er WHERE type='t
0520: 61 62 6c 65 27 20 4f 52 44 45 52 20 42 59 20 6e  able' ORDER BY n
0530: 61 6d 65 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 30  ame.  } db2.} {0
0540: 20 74 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f   t1}..do_test lo
0550: 63 6b 2d 31 2e 36 20 7b 0a 20 20 65 78 65 63 73  ck-1.6 {.  execs
0560: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
0570: 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29 7d 0a  t1 VALUES(1,2)}.
0580: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0590: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b  T * FROM t1}.} {
05a0: 31 20 32 7d 0a 23 20 55 70 64 61 74 65 3a 20 54  1 2}.# Update: T
05b0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e 6f 77  he schema is now
05c0: 20 62 72 6f 75 67 68 74 20 75 70 20 74 6f 20 64   brought up to d
05d0: 61 74 65 20 62 79 20 74 65 73 74 20 6c 6f 63 6b  ate by test lock
05e0: 2d 31 2e 35 2e 0a 23 20 64 6f 5f 74 65 73 74 20  -1.5..# do_test 
05f0: 6c 6f 63 6b 2d 31 2e 37 2e 31 20 7b 0a 23 20 20  lock-1.7.1 {.#  
0600: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
0610: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32  T * FROM t1} db2
0620: 0a 23 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  .# } {1 {no such
0630: 20 74 61 62 6c 65 3a 20 74 31 7d 7d 0a 64 6f 5f   table: t1}}.do_
0640: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 37 2e 32 20  test lock-1.7.2 
0650: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45  {.  catchsql {SE
0660: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20  LECT * FROM t1} 
0670: 64 62 32 0a 7d 20 7b 30 20 7b 31 20 32 7d 7d 0a  db2.} {0 {1 2}}.
0680: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 38  do_test lock-1.8
0690: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 55 50   {.  execsql {UP
06a0: 44 41 54 45 20 74 31 20 53 45 54 20 61 3d 62 2c  DATE t1 SET a=b,
06b0: 20 62 3d 61 7d 20 64 62 32 0a 20 20 65 78 65 63   b=a} db2.  exec
06c0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
06d0: 4f 4d 20 74 31 7d 20 64 62 32 0a 7d 20 7b 32 20  OM t1} db2.} {2 
06e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  1}.do_test lock-
06f0: 31 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.9 {.  execsql 
0700: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
0710: 31 7d 0a 7d 20 7b 32 20 31 7d 0a 64 6f 5f 74 65  1}.} {2 1}.do_te
0720: 73 74 20 6c 6f 63 6b 2d 31 2e 31 30 20 7b 0a 20  st lock-1.10 {. 
0730: 20 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e 20   execsql {BEGIN 
0740: 54 52 41 4e 53 41 43 54 49 4f 4e 7d 0a 20 20 65  TRANSACTION}.  e
0750: 78 65 63 73 71 6c 20 7b 55 50 44 41 54 45 20 74  xecsql {UPDATE t
0760: 31 20 53 45 54 20 61 20 3d 20 30 20 57 48 45 52  1 SET a = 0 WHER
0770: 45 20 30 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  E 0}.  execsql {
0780: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0790: 7d 0a 7d 20 7b 32 20 31 7d 0a 64 6f 5f 74 65 73  }.} {2 1}.do_tes
07a0: 74 20 6c 6f 63 6b 2d 31 2e 31 31 20 7b 0a 20 20  t lock-1.11 {.  
07b0: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
07c0: 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32 0a   * FROM t1} db2.
07d0: 7d 20 7b 30 20 7b 32 20 31 7d 7d 0a 64 6f 5f 74  } {0 {2 1}}.do_t
07e0: 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 32 20 7b 0a  est lock-1.12 {.
07f0: 20 20 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42    execsql {ROLLB
0800: 41 43 4b 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  ACK}.  catchsql 
0810: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
0820: 31 7d 0a 7d 20 7b 30 20 7b 32 20 31 7d 7d 0a 0a  1}.} {0 {2 1}}..
0830: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31  do_test lock-1.1
0840: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 43  3 {.  execsql {C
0850: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
0860: 20 69 6e 74 2c 20 79 20 69 6e 74 29 7d 0a 20 20   int, y int)}.  
0870: 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20  execsql {INSERT 
0880: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38  INTO t2 VALUES(8
0890: 2c 39 29 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  ,9)}.  execsql {
08a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
08b0: 7d 0a 7d 20 7b 38 20 39 7d 0a 64 6f 5f 74 65 73  }.} {8 9}.do_tes
08c0: 74 20 6c 6f 63 6b 2d 31 2e 31 34 2e 31 20 7b 0a  t lock-1.14.1 {.
08d0: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
08e0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20 64 62  CT * FROM t2} db
08f0: 32 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  2.} {1 {no such 
0900: 74 61 62 6c 65 3a 20 74 32 7d 7d 0a 64 6f 5f 74  table: t2}}.do_t
0910: 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 34 2e 32 20  est lock-1.14.2 
0920: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45  {.  catchsql {SE
0930: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20  LECT * FROM t1} 
0940: 64 62 32 0a 7d 20 7b 30 20 7b 32 20 31 7d 7d 0a  db2.} {0 {2 1}}.
0950: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31  do_test lock-1.1
0960: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
0970: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
0980: 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 38 20 39 7d  } db2.} {0 {8 9}
0990: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  }..do_test lock-
09a0: 31 2e 31 36 20 7b 0a 20 20 64 62 20 65 76 61 6c  1.16 {.  db eval
09b0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
09c0: 74 31 7d 20 71 76 20 7b 0a 20 20 20 20 73 65 74  t1} qv {.    set
09d0: 20 78 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c   x [db eval {SEL
09e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 5d 0a  ECT * FROM t1}].
09f0: 20 20 7d 0a 20 20 73 65 74 20 78 0a 7d 20 7b 32    }.  set x.} {2
0a00: 20 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b   1}.do_test lock
0a10: 2d 31 2e 31 37 20 7b 0a 20 20 64 62 20 65 76 61  -1.17 {.  db eva
0a20: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
0a30: 20 74 31 7d 20 71 76 20 7b 0a 20 20 20 20 73 65   t1} qv {.    se
0a40: 74 20 78 20 5b 64 62 20 65 76 61 6c 20 7b 53 45  t x [db eval {SE
0a50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 5d  LECT * FROM t2}]
0a60: 0a 20 20 7d 0a 20 20 73 65 74 20 78 0a 7d 20 7b  .  }.  set x.} {
0a70: 38 20 39 7d 0a 0a 23 20 59 6f 75 20 63 61 6e 6e  8 9}..# You cann
0a80: 6f 74 20 55 50 44 41 54 45 20 61 20 74 61 62 6c  ot UPDATE a tabl
0a90: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
0aa0: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 66 20 61 20  e callback of a 
0ab0: 53 45 4c 45 43 54 0a 23 20 6f 6e 20 74 68 61 74  SELECT.# on that
0ac0: 20 73 61 6d 65 20 74 61 62 6c 65 20 62 65 63 61   same table beca
0ad0: 75 73 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  use the SELECT h
0ae0: 61 73 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63  as the table loc
0af0: 6b 65 64 2e 0a 23 0a 23 20 32 30 30 36 2d 30 38  ked..#.# 2006-08
0b00: 2d 31 36 3a 20 20 52 65 61 64 73 20 6e 6f 20 6c  -16:  Reads no l
0b10: 6f 6e 67 65 72 20 62 6c 6f 63 6b 20 77 72 69 74  onger block writ
0b20: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  es within the sa
0b30: 6d 65 0a 23 20 64 61 74 61 62 61 73 65 20 63 6f  me.# database co
0b40: 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 23 64 6f 5f  nnection..#.#do_
0b50: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 38 20 7b  test lock-1.18 {
0b60: 0a 23 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  .#  db eval {SEL
0b70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 71  ECT * FROM t1} q
0b80: 76 20 7b 0a 23 20 20 20 20 73 65 74 20 72 20 5b  v {.#    set r [
0b90: 63 61 74 63 68 20 7b 64 62 20 65 76 61 6c 20 7b  catch {db eval {
0ba0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 3d  UPDATE t1 SET a=
0bb0: 62 2c 20 62 3d 61 7d 7d 20 6d 73 67 5d 0a 23 20  b, b=a}} msg].# 
0bc0: 20 20 20 6c 61 70 70 65 6e 64 20 72 20 24 6d 73     lappend r $ms
0bd0: 67 0a 23 20 20 7d 0a 23 20 20 73 65 74 20 72 0a  g.#  }.#  set r.
0be0: 23 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  #} {1 {database 
0bf0: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d  table is locked}
0c00: 7d 0a 0a 23 20 42 75 74 20 79 6f 75 20 63 61 6e  }..# But you can
0c10: 20 55 50 44 41 54 45 20 61 20 64 69 66 66 65 72   UPDATE a differ
0c20: 65 6e 74 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ent table from t
0c30: 68 65 20 6f 6e 65 20 74 68 61 74 20 69 73 20 75  he one that is u
0c40: 73 65 64 20 69 6e 0a 23 20 74 68 65 20 53 45 4c  sed in.# the SEL
0c50: 45 43 54 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c  ECT..#.do_test l
0c60: 6f 63 6b 2d 31 2e 31 39 20 7b 0a 20 20 64 62 20  ock-1.19 {.  db 
0c70: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
0c80: 52 4f 4d 20 74 31 7d 20 71 76 20 7b 0a 20 20 20  ROM t1} qv {.   
0c90: 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b 64   set r [catch {d
0ca0: 62 20 65 76 61 6c 20 7b 55 50 44 41 54 45 20 74  b eval {UPDATE t
0cb0: 32 20 53 45 54 20 78 3d 79 2c 20 79 3d 78 7d 7d  2 SET x=y, y=x}}
0cc0: 20 6d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e   msg].    lappen
0cd0: 64 20 72 20 24 6d 73 67 0a 20 20 7d 0a 20 20 73  d r $msg.  }.  s
0ce0: 65 74 20 72 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  et r.} {0 {}}.do
0cf0: 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 32 30 20  _test lock-1.20 
0d00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0d10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d  ECT * FROM t2}.}
0d20: 20 7b 39 20 38 7d 0a 0a 23 20 49 74 20 69 73 20   {9 8}..# It is 
0d30: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
0d40: 20 53 45 4c 45 43 54 20 6f 66 20 74 68 65 20 73   SELECT of the s
0d50: 61 6d 65 20 74 61 62 6c 65 20 77 69 74 68 69 6e  ame table within
0d60: 20 74 68 65 0a 23 20 63 61 6c 6c 62 61 63 6b 20   the.# callback 
0d70: 6f 66 20 61 6e 6f 74 68 65 72 20 53 45 4c 45 43  of another SELEC
0d80: 54 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 20 74  T on that same t
0d90: 61 62 6c 65 20 62 65 63 61 75 73 65 20 74 77 6f  able because two
0da0: 0a 23 20 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d  .# or more read-
0db0: 6f 6e 6c 79 20 63 75 72 73 6f 72 73 20 63 61 6e  only cursors can
0dc0: 20 62 65 20 6f 70 65 6e 20 61 74 20 6f 6e 63 65   be open at once
0dd0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  ..#.do_test lock
0de0: 2d 31 2e 32 31 20 7b 0a 20 20 64 62 20 65 76 61  -1.21 {.  db eva
0df0: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
0e00: 20 74 31 7d 20 71 76 20 7b 0a 20 20 20 20 73 65   t1} qv {.    se
0e10: 74 20 72 20 5b 63 61 74 63 68 20 7b 64 62 20 65  t r [catch {db e
0e20: 76 61 6c 20 7b 53 45 4c 45 43 54 20 61 20 46 52  val {SELECT a FR
0e30: 4f 4d 20 74 31 7d 7d 20 6d 73 67 5d 0a 20 20 20  OM t1}} msg].   
0e40: 20 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a   lappend r $msg.
0e50: 20 20 7d 0a 20 20 73 65 74 20 72 0a 7d 20 7b 30    }.  set r.} {0
0e60: 20 32 7d 0a 0a 23 20 55 6e 64 65 72 20 55 4e 49   2}..# Under UNI
0e70: 58 20 79 6f 75 20 63 61 6e 20 64 6f 20 74 77 6f  X you can do two
0e80: 20 53 45 4c 45 43 54 73 20 61 74 20 6f 6e 63 65   SELECTs at once
0e90: 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20   with different 
0ea0: 64 61 74 61 62 61 73 65 0a 23 20 63 6f 6e 6e 65  database.# conne
0eb0: 63 74 69 6f 6e 73 2c 20 62 65 63 61 75 73 65 20  ctions, because 
0ec0: 55 4e 49 58 20 73 75 70 70 6f 72 74 73 20 72 65  UNIX supports re
0ed0: 61 64 65 72 2f 77 72 69 74 65 72 20 6c 6f 63 6b  ader/writer lock
0ee0: 73 2e 20 20 55 6e 64 65 72 20 77 69 6e 64 6f 77  s.  Under window
0ef0: 73 2c 0a 23 20 74 68 69 73 20 69 73 20 6e 6f 74  s,.# this is not
0f00: 20 70 6f 73 73 69 62 6c 65 2e 0a 23 0a 69 66 20   possible..#.if 
0f10: 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  {$::tcl_platform
0f20: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69  (platform)=="uni
0f30: 78 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  x"} {.  do_test 
0f40: 6c 6f 63 6b 2d 31 2e 32 32 20 7b 0a 20 20 20 20  lock-1.22 {.    
0f50: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
0f60: 2a 20 46 52 4f 4d 20 74 31 7d 20 71 76 20 7b 0a  * FROM t1} qv {.
0f70: 20 20 20 20 20 20 73 65 74 20 72 20 5b 63 61 74        set r [cat
0f80: 63 68 20 7b 64 62 32 20 65 76 61 6c 20 7b 53 45  ch {db2 eval {SE
0f90: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 7d 7d  LECT a FROM t1}}
0fa0: 20 6d 73 67 5d 0a 20 20 20 20 20 20 6c 61 70 70   msg].      lapp
0fb0: 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 20 20 7d  end r $msg.    }
0fc0: 0a 20 20 20 20 73 65 74 20 72 0a 20 20 7d 20 7b  .    set r.  } {
0fd0: 30 20 32 7d 0a 7d 0a 69 6e 74 65 67 72 69 74 79  0 2}.}.integrity
0fe0: 5f 63 68 65 63 6b 20 6c 6f 63 6b 2d 31 2e 32 33  _check lock-1.23
0ff0: 0a 0a 23 20 49 66 20 6f 6e 65 20 74 68 72 65 61  ..# If one threa
1000: 64 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  d has a transact
1010: 69 6f 6e 20 61 6e 6f 74 68 65 72 20 74 68 72 65  ion another thre
1020: 61 64 20 63 61 6e 6e 6f 74 20 73 74 61 72 74 0a  ad cannot start.
1030: 23 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  # a transaction.
1040: 20 20 2d 3e 20 4e 6f 74 20 74 72 75 65 20 69 6e    -> Not true in
1050: 20 76 65 72 73 69 6f 6e 20 33 2e 30 2e 20 20 42   version 3.0.  B
1060: 75 74 20 69 66 20 6f 6e 65 20 74 68 72 65 61 64  ut if one thread
1070: 0a 23 20 61 73 20 61 20 52 45 53 45 52 56 45 44  .# as a RESERVED
1080: 20 6c 6f 63 6b 20 61 6e 6f 74 68 65 72 20 74 68   lock another th
1090: 72 65 61 64 20 63 61 6e 6e 6f 74 20 61 63 71 75  read cannot acqu
10a0: 69 72 65 20 6f 6e 65 2e 0a 23 0a 64 6f 5f 74 65  ire one..#.do_te
10b0: 73 74 20 6c 6f 63 6b 2d 32 2e 31 20 7b 0a 20 20  st lock-2.1 {.  
10c0: 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e 20 54  execsql {BEGIN T
10d0: 52 41 4e 53 41 43 54 49 4f 4e 7d 0a 20 20 65 78  RANSACTION}.  ex
10e0: 65 63 73 71 6c 20 7b 55 50 44 41 54 45 20 74 31  ecsql {UPDATE t1
10f0: 20 53 45 54 20 61 20 3d 20 30 20 57 48 45 52 45   SET a = 0 WHERE
1100: 20 30 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 42   0}.  execsql {B
1110: 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
1120: 7d 20 64 62 32 0a 20 20 73 65 74 20 72 20 5b 63  } db2.  set r [c
1130: 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 55  atch {execsql {U
1140: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
1150: 20 30 20 57 48 45 52 45 20 30 7d 20 64 62 32 7d   0 WHERE 0} db2}
1160: 20 6d 73 67 5d 0a 20 20 65 78 65 63 73 71 6c 20   msg].  execsql 
1170: 7b 52 4f 4c 4c 42 41 43 4b 7d 20 64 62 32 0a 20  {ROLLBACK} db2. 
1180: 20 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a   lappend r $msg.
1190: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
11a0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 23 20 41 20  s locked}}..# A 
11b0: 74 68 72 65 61 64 20 63 61 6e 20 72 65 61 64 20  thread can read 
11c0: 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 68 61 73  when another has
11d0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
11e0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  ..#.do_test lock
11f0: 2d 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  -2.2 {.  catchsq
1200: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
1210: 20 74 32 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 39   t2} db2.} {0 {9
1220: 20 38 7d 7d 0a 0a 23 20 49 66 20 74 68 65 20 6f   8}}..# If the o
1230: 74 68 65 72 20 74 68 72 65 61 64 20 28 74 68 65  ther thread (the
1240: 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20 6e   one that does n
1250: 6f 74 20 68 6f 6c 64 20 74 68 65 20 74 72 61 6e  ot hold the tran
1260: 73 61 63 74 69 6f 6e 20 77 69 74 68 0a 23 20 61  saction with.# a
1270: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 29 20   RESERVED lock) 
1280: 74 72 69 65 73 20 74 6f 20 67 65 74 20 61 20 52  tries to get a R
1290: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 77 65  ESERVED lock, we
12a0: 20 64 6f 20 67 65 74 20 61 20 62 75 73 79 20 63   do get a busy c
12b0: 61 6c 6c 62 61 63 6b 0a 23 20 61 73 20 6c 6f 6e  allback.# as lon
12c0: 67 20 61 73 20 77 65 20 77 65 72 65 20 6e 6f 74  g as we were not
12d0: 20 6f 72 67 69 6e 61 6c 6c 79 20 68 6f 6c 64 69   orginally holdi
12e0: 6e 67 20 61 20 52 45 41 44 20 6c 6f 63 6b 2e 0a  ng a READ lock..
12f0: 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32  #.do_test lock-2
1300: 2e 33 2e 31 20 7b 0a 20 20 70 72 6f 63 20 63 61  .3.1 {.  proc ca
1310: 6c 6c 62 61 63 6b 20 7b 63 6f 75 6e 74 7d 20 7b  llback {count} {
1320: 0a 20 20 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62  .    set ::callb
1330: 61 63 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e 74  ack_value $count
1340: 0a 20 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a 20  .    break.  }. 
1350: 20 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f   set ::callback_
1360: 76 61 6c 75 65 20 7b 7d 0a 20 20 64 62 32 20 62  value {}.  db2 b
1370: 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20 20 23  usy callback.  #
1380: 20 64 62 32 20 64 6f 65 73 20 6e 6f 74 20 68 6f   db2 does not ho
1390: 6c 64 20 61 20 6c 6f 63 6b 20 73 6f 20 77 65 20  ld a lock so we 
13a0: 73 68 6f 75 6c 64 20 67 65 74 20 61 20 62 75 73  should get a bus
13b0: 79 20 63 61 6c 6c 62 61 63 6b 20 68 65 72 65 0a  y callback here.
13c0: 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b    set r [catch {
13d0: 65 78 65 63 73 71 6c 20 7b 55 50 44 41 54 45 20  execsql {UPDATE 
13e0: 74 31 20 53 45 54 20 61 3d 62 2c 20 62 3d 61 7d  t1 SET a=b, b=a}
13f0: 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20 6c 61 70   db2} msg].  lap
1400: 70 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 6c 61  pend r $msg.  la
1410: 70 70 65 6e 64 20 72 20 24 3a 3a 63 61 6c 6c 62  ppend r $::callb
1420: 61 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b 31 20 7b  ack_value.} {1 {
1430: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1440: 65 64 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20 6c  ed} 0}.do_test l
1450: 6f 63 6b 2d 32 2e 33 2e 32 20 7b 0a 20 20 73 65  ock-2.3.2 {.  se
1460: 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c  t ::callback_val
1470: 75 65 20 7b 7d 0a 20 20 65 78 65 63 73 71 6c 20  ue {}.  execsql 
1480: 7b 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 72  {BEGIN; SELECT r
1490: 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65  owid FROM sqlite
14a0: 5f 6d 61 73 74 65 72 20 4c 49 4d 49 54 20 31 7d  _master LIMIT 1}
14b0: 20 64 62 32 0a 20 20 23 20 54 68 69 73 20 74 69   db2.  # This ti
14c0: 6d 65 20 64 62 32 20 64 6f 65 73 20 68 6f 6c 64  me db2 does hold
14d0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 4e   a read lock.  N
14e0: 6f 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  o busy callback 
14f0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 73 65 74  this time..  set
1500: 20 72 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73   r [catch {execs
1510: 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45  ql {UPDATE t1 SE
1520: 54 20 61 3d 62 2c 20 62 3d 61 7d 20 64 62 32 7d  T a=b, b=a} db2}
1530: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
1540: 72 20 24 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64  r $msg.  lappend
1550: 20 72 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76   r $::callback_v
1560: 61 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62  alue.} {1 {datab
1570: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b  ase is locked} {
1580: 7d 7d 0a 63 61 74 63 68 20 7b 65 78 65 63 73 71  }}.catch {execsq
1590: 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 20 64 62 32  l {ROLLBACK} db2
15a0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32  }.do_test lock-2
15b0: 2e 34 2e 31 20 7b 0a 20 20 70 72 6f 63 20 63 61  .4.1 {.  proc ca
15c0: 6c 6c 62 61 63 6b 20 7b 63 6f 75 6e 74 7d 20 7b  llback {count} {
15d0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 63  .    lappend ::c
15e0: 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 24 63  allback_value $c
15f0: 6f 75 6e 74 0a 20 20 20 20 69 66 20 7b 24 63 6f  ount.    if {$co
1600: 75 6e 74 3e 34 7d 20 62 72 65 61 6b 0a 20 20 7d  unt>4} break.  }
1610: 0a 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63  .  set ::callbac
1620: 6b 5f 76 61 6c 75 65 20 7b 7d 0a 20 20 64 62 32  k_value {}.  db2
1630: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20   busy callback. 
1640: 20 23 20 57 65 20 67 65 74 20 61 20 62 75 73 79   # We get a busy
1650: 20 63 61 6c 6c 62 61 63 6b 20 62 65 63 61 75 73   callback becaus
1660: 65 20 64 62 32 20 69 73 20 6e 6f 74 20 68 6f 6c  e db2 is not hol
1670: 64 69 6e 67 20 61 20 6c 6f 63 6b 0a 20 20 73 65  ding a lock.  se
1680: 74 20 72 20 5b 63 61 74 63 68 20 7b 65 78 65 63  t r [catch {exec
1690: 73 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53  sql {UPDATE t1 S
16a0: 45 54 20 61 3d 62 2c 20 62 3d 61 7d 20 64 62 32  ET a=b, b=a} db2
16b0: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
16c0: 20 72 20 24 6d 73 67 0a 20 20 6c 61 70 70 65 6e   r $msg.  lappen
16d0: 64 20 72 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f  d r $::callback_
16e0: 76 61 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74 61  value.} {1 {data
16f0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 20  base is locked} 
1700: 7b 30 20 31 20 32 20 33 20 34 20 35 7d 7d 0a 64  {0 1 2 3 4 5}}.d
1710: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e 34 2e  o_test lock-2.4.
1720: 32 20 7b 0a 20 20 70 72 6f 63 20 63 61 6c 6c 62  2 {.  proc callb
1730: 61 63 6b 20 7b 63 6f 75 6e 74 7d 20 7b 0a 20 20  ack {count} {.  
1740: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 63 61 6c 6c    lappend ::call
1750: 62 61 63 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e  back_value $coun
1760: 74 0a 20 20 20 20 69 66 20 7b 24 63 6f 75 6e 74  t.    if {$count
1770: 3e 34 7d 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20  >4} break.  }.  
1780: 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76  set ::callback_v
1790: 61 6c 75 65 20 7b 7d 0a 20 20 64 62 32 20 62 75  alue {}.  db2 bu
17a0: 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20 20 65 78  sy callback.  ex
17b0: 65 63 73 71 6c 20 7b 42 45 47 49 4e 3b 20 53 45  ecsql {BEGIN; SE
17c0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
17d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49  sqlite_master LI
17e0: 4d 49 54 20 31 7d 20 64 62 32 0a 20 20 23 20 4e  MIT 1} db2.  # N
17f0: 6f 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  o busy callback 
1800: 74 68 69 73 20 74 69 6d 65 20 62 65 63 61 75 73  this time becaus
1810: 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  e we are holding
1820: 20 61 20 6c 6f 63 6b 0a 20 20 73 65 74 20 72 20   a lock.  set r 
1830: 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20  [catch {execsql 
1840: 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61  {UPDATE t1 SET a
1850: 3d 62 2c 20 62 3d 61 7d 20 64 62 32 7d 20 6d 73  =b, b=a} db2} ms
1860: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 20 24  g].  lappend r $
1870: 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20 72 20  msg.  lappend r 
1880: 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75  $::callback_valu
1890: 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  e.} {1 {database
18a0: 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b 7d 7d 0a   is locked} {}}.
18b0: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
18c0: 52 4f 4c 4c 42 41 43 4b 7d 20 64 62 32 7d 0a 64  ROLLBACK} db2}.d
18d0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e 35 20  o_test lock-2.5 
18e0: 7b 0a 20 20 70 72 6f 63 20 63 61 6c 6c 62 61 63  {.  proc callbac
18f0: 6b 20 7b 63 6f 75 6e 74 7d 20 7b 0a 20 20 20 20  k {count} {.    
1900: 6c 61 70 70 65 6e 64 20 3a 3a 63 61 6c 6c 62 61  lappend ::callba
1910: 63 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e 74 0a  ck_value $count.
1920: 20 20 20 20 69 66 20 7b 24 63 6f 75 6e 74 3e 34      if {$count>4
1930: 7d 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 73 65  } break.  }.  se
1940: 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c  t ::callback_val
1950: 75 65 20 7b 7d 0a 20 20 64 62 32 20 62 75 73 79  ue {}.  db2 busy
1960: 20 63 61 6c 6c 62 61 63 6b 0a 20 20 73 65 74 20   callback.  set 
1970: 72 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  r [catch {execsq
1980: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
1990: 20 74 31 7d 20 64 62 32 7d 20 6d 73 67 5d 0a 20   t1} db2} msg]. 
19a0: 20 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a   lappend r $msg.
19b0: 20 20 6c 61 70 70 65 6e 64 20 72 20 24 3a 3a 63    lappend r $::c
19c0: 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 0a 7d 20  allback_value.} 
19d0: 7b 30 20 7b 32 20 31 7d 20 7b 7d 7d 0a 65 78 65  {0 {2 1} {}}.exe
19e0: 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 0a  csql {ROLLBACK}.
19f0: 0a 23 20 54 65 73 74 20 74 68 65 20 62 75 69 6c  .# Test the buil
1a00: 74 2d 69 6e 20 62 75 73 79 20 74 69 6d 65 6f 75  t-in busy timeou
1a10: 74 20 68 61 6e 64 6c 65 72 0a 23 0a 64 6f 5f 74  t handler.#.do_t
1a20: 65 73 74 20 6c 6f 63 6b 2d 32 2e 38 20 7b 0a 20  est lock-2.8 {. 
1a30: 20 64 62 32 20 74 69 6d 65 6f 75 74 20 34 30 30   db2 timeout 400
1a40: 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e  .  execsql BEGIN
1a50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 55 50 44 41  .  execsql {UPDA
1a60: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 30 20  TE t1 SET a = 0 
1a70: 57 48 45 52 45 20 30 7d 0a 20 20 63 61 74 63 68  WHERE 0}.  catch
1a80: 73 71 6c 20 7b 42 45 47 49 4e 20 45 58 43 4c 55  sql {BEGIN EXCLU
1a90: 53 49 56 45 3b 7d 20 64 62 32 0a 7d 20 7b 31 20  SIVE;} db2.} {1 
1aa0: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1ab0: 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f  ked}}.do_test lo
1ac0: 63 6b 2d 32 2e 39 20 7b 0a 20 20 64 62 32 20 74  ck-2.9 {.  db2 t
1ad0: 69 6d 65 6f 75 74 20 30 0a 20 20 65 78 65 63 73  imeout 0.  execs
1ae0: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 69  ql COMMIT.} {}.i
1af0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
1b00: 6f 63 6b 2d 32 2e 31 30 0a 0a 23 20 54 72 79 20  ock-2.10..# Try 
1b10: 74 6f 20 73 74 61 72 74 20 74 77 6f 20 74 72 61  to start two tra
1b20: 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20 61 20 72  nsactions in a r
1b30: 6f 77 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63  ow.#.do_test loc
1b40: 6b 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  k-3.1 {.  execsq
1b50: 6c 20 7b 42 45 47 49 4e 20 54 52 41 4e 53 41 43  l {BEGIN TRANSAC
1b60: 54 49 4f 4e 7d 0a 20 20 73 65 74 20 72 20 5b 63  TION}.  set r [c
1b70: 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 42  atch {execsql {B
1b80: 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
1b90: 7d 7d 20 6d 73 67 5d 0a 20 20 65 78 65 63 73 71  }} msg].  execsq
1ba0: 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 0a 20 20 6c  l {ROLLBACK}.  l
1bb0: 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 7d 20  append r $msg.} 
1bc0: 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72 74  {1 {cannot start
1bd0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
1be0: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
1bf0: 69 6f 6e 7d 7d 0a 69 6e 74 65 67 72 69 74 79 5f  ion}}.integrity_
1c00: 63 68 65 63 6b 20 6c 6f 63 6b 2d 33 2e 32 0a 0a  check lock-3.2..
1c10: 23 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  # Make sure the 
1c20: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 61 6e 64  busy handler and
1c30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1c40: 77 6f 72 6b 20 77 68 65 6e 0a 23 20 6f 70 65 6e  work when.# open
1c50: 69 6e 67 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  ing a new pointe
1c60: 72 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  r to the databas
1c70: 65 20 77 68 69 6c 65 20 61 6e 6f 74 68 65 72 20  e while another 
1c80: 70 6f 69 6e 74 65 72 0a 23 20 68 61 73 20 74 68  pointer.# has th
1c90: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 65  e database locke
1ca0: 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63  d..#.do_test loc
1cb0: 6b 2d 34 2e 31 20 7b 0a 20 20 64 62 32 20 63 6c  k-4.1 {.  db2 cl
1cc0: 6f 73 65 0a 20 20 63 61 74 63 68 20 7b 64 62 20  ose.  catch {db 
1cd0: 65 76 61 6c 20 52 4f 4c 4c 42 41 43 4b 7d 0a 20  eval ROLLBACK}. 
1ce0: 20 64 62 20 65 76 61 6c 20 42 45 47 49 4e 0a 20   db eval BEGIN. 
1cf0: 20 64 62 20 65 76 61 6c 20 7b 55 50 44 41 54 45   db eval {UPDATE
1d00: 20 74 31 20 53 45 54 20 61 3d 30 20 57 48 45 52   t1 SET a=0 WHER
1d10: 45 20 30 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  E 0}.  sqlite3 d
1d20: 62 32 20 2e 2f 74 65 73 74 2e 64 62 0a 20 20 63  b2 ./test.db.  c
1d30: 61 74 63 68 73 71 6c 20 7b 55 50 44 41 54 45 20  atchsql {UPDATE 
1d40: 74 31 20 53 45 54 20 61 3d 30 7d 20 64 62 32 0a  t1 SET a=0} db2.
1d50: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
1d60: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
1d70: 73 74 20 6c 6f 63 6b 2d 34 2e 32 20 7b 0a 20 20  st lock-4.2 {.  
1d80: 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76  set ::callback_v
1d90: 61 6c 75 65 20 7b 7d 0a 20 20 73 65 74 20 72 63  alue {}.  set rc
1da0: 20 5b 63 61 74 63 68 20 7b 64 62 32 20 65 76 61   [catch {db2 eva
1db0: 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54  l {UPDATE t1 SET
1dc0: 20 61 3d 30 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61   a=0}} msg].  la
1dd0: 70 70 65 6e 64 20 72 63 20 24 6d 73 67 20 24 3a  ppend rc $msg $:
1de0: 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 0a  :callback_value.
1df0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
1e00: 73 20 6c 6f 63 6b 65 64 7d 20 7b 7d 7d 0a 64 6f  s locked} {}}.do
1e10: 5f 74 65 73 74 20 6c 6f 63 6b 2d 34 2e 33 20 7b  _test lock-4.3 {
1e20: 0a 20 20 70 72 6f 63 20 63 61 6c 6c 62 61 63 6b  .  proc callback
1e30: 20 7b 63 6f 75 6e 74 7d 20 7b 0a 20 20 20 20 6c   {count} {.    l
1e40: 61 70 70 65 6e 64 20 3a 3a 63 61 6c 6c 62 61 63  append ::callbac
1e50: 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e 74 0a 20  k_value $count. 
1e60: 20 20 20 69 66 20 7b 24 63 6f 75 6e 74 3e 34 7d     if {$count>4}
1e70: 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 64 62 32   break.  }.  db2
1e80: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20   busy callback. 
1e90: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
1ea0: 64 62 32 20 65 76 61 6c 20 7b 55 50 44 41 54 45  db2 eval {UPDATE
1eb0: 20 74 31 20 53 45 54 20 61 3d 30 7d 7d 20 6d 73   t1 SET a=0}} ms
1ec0: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20  g].  lappend rc 
1ed0: 24 6d 73 67 20 24 3a 3a 63 61 6c 6c 62 61 63 6b  $msg $::callback
1ee0: 5f 76 61 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74  _value.} {1 {dat
1ef0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1f00: 20 7b 30 20 31 20 32 20 33 20 34 20 35 7d 7d 0a   {0 1 2 3 4 5}}.
1f10: 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43  execsql {ROLLBAC
1f20: 4b 7d 0a 0a 23 20 57 68 65 6e 20 6f 6e 65 20 74  K}..# When one t
1f30: 68 72 65 61 64 20 69 73 20 77 72 69 74 69 6e 67  hread is writing
1f40: 2c 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  , other threads 
1f50: 63 61 6e 6e 6f 74 20 72 65 61 64 2e 20 20 45 78  cannot read.  Ex
1f60: 63 65 70 74 20 69 66 20 74 68 65 0a 23 20 77 72  cept if the.# wr
1f70: 69 74 69 6e 67 20 74 68 72 65 61 64 20 69 73 20  iting thread is 
1f80: 77 72 69 74 69 6e 67 20 74 6f 20 69 74 73 20 74  writing to its t
1f90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2c  emporary tables,
1fa0: 20 74 68 65 20 6f 74 68 65 72 20 74 68 72 65 61   the other threa
1fb0: 64 73 0a 23 20 63 61 6e 20 73 74 69 6c 6c 20 72  ds.# can still r
1fc0: 65 61 64 2e 20 20 2d 3e 20 4e 6f 74 20 73 6f 20  ead.  -> Not so 
1fd0: 69 6e 20 33 2e 30 2e 20 20 4f 6e 65 20 74 68 72  in 3.0.  One thr
1fe0: 65 61 64 20 63 61 6e 20 72 65 61 64 20 77 68 69  ead can read whi
1ff0: 6c 65 20 61 6e 6f 74 68 65 72 0a 23 20 68 6f 6c  le another.# hol
2000: 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2010: 63 6b 2e 0a 23 0a 70 72 6f 63 20 74 78 5f 65 78  ck..#.proc tx_ex
2020: 65 63 20 7b 73 71 6c 7d 20 7b 0a 20 20 64 62 32  ec {sql} {.  db2
2030: 20 65 76 61 6c 20 24 73 71 6c 0a 7d 0a 64 6f 5f   eval $sql.}.do_
2040: 74 65 73 74 20 6c 6f 63 6b 2d 35 2e 31 20 7b 0a  test lock-5.1 {.
2050: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2060: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2070: 0a 20 20 7d 0a 7d 20 7b 32 20 31 7d 0a 64 6f 5f  .  }.} {2 1}.do_
2080: 74 65 73 74 20 6c 6f 63 6b 2d 35 2e 32 20 7b 0a  test lock-5.2 {.
2090: 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 74 78    db function tx
20a0: 5f 65 78 65 63 20 74 78 5f 65 78 65 63 0a 20 20  _exec tx_exec.  
20b0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
20c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 2c  NSERT INTO t1(a,
20d0: 62 29 20 53 45 4c 45 43 54 20 33 2c 20 74 78 5f  b) SELECT 3, tx_
20e0: 65 78 65 63 28 27 53 45 4c 45 43 54 20 79 20 46  exec('SELECT y F
20f0: 52 4f 4d 20 74 32 20 4c 49 4d 49 54 20 31 27 29  ROM t2 LIMIT 1')
2100: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a  ;.  }.} {0 {}}..
2110: 69 66 63 61 70 61 62 6c 65 20 74 65 6d 70 64 62  ifcapable tempdb
2120: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 6c 6f 63   {.  do_test loc
2130: 6b 2d 35 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  k-5.3 {.    exec
2140: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
2150: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 33  TE TEMP TABLE t3
2160: 28 78 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  (x);.      SELEC
2170: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  T * FROM t3;.   
2180: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
2190: 65 73 74 20 6c 6f 63 6b 2d 35 2e 34 20 7b 0a 20  est lock-5.4 {. 
21a0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20     catchsql {.  
21b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
21c0: 74 33 20 53 45 4c 45 43 54 20 74 78 5f 65 78 65  t3 SELECT tx_exe
21d0: 63 28 27 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  c('SELECT y FROM
21e0: 20 74 32 20 4c 49 4d 49 54 20 31 27 29 3b 0a 20   t2 LIMIT 1');. 
21f0: 20 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a     }.  } {0 {}}.
2200: 20 20 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35    do_test lock-5
2210: 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .5 {.    execsql
2220: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2230: 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d  * FROM t3;.    }
2240: 0a 20 20 7d 20 7b 38 7d 0a 20 20 64 6f 5f 74 65  .  } {8}.  do_te
2250: 73 74 20 6c 6f 63 6b 2d 35 2e 36 20 7b 0a 20 20  st lock-5.6 {.  
2260: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
2270: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
2280: 20 61 3d 74 78 5f 65 78 65 63 28 27 53 45 4c 45   a=tx_exec('SELE
2290: 43 54 20 78 20 46 52 4f 4d 20 74 32 27 29 3b 0a  CT x FROM t2');.
22a0: 20 20 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d      }.  } {0 {}}
22b0: 0a 20 20 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  .  do_test lock-
22c0: 35 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71  5.7 {.    execsq
22d0: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
22e0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
22f0: 7d 0a 20 20 7d 20 7b 39 20 31 20 39 20 38 7d 0a  }.  } {9 1 9 8}.
2300: 20 20 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35    do_test lock-5
2310: 2e 38 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .8 {.    catchsq
2320: 6c 20 7b 0a 20 20 20 20 20 20 55 50 44 41 54 45  l {.      UPDATE
2330: 20 74 33 20 53 45 54 20 78 3d 74 78 5f 65 78 65   t3 SET x=tx_exe
2340: 63 28 27 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  c('SELECT x FROM
2350: 20 74 32 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   t2');.    }.  }
2360: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
2370: 74 20 6c 6f 63 6b 2d 35 2e 39 20 7b 0a 20 20 20  t lock-5.9 {.   
2380: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2390: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
23a0: 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 39 7d  3;.    }.  } {9}
23b0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  .}..do_test lock
23c0: 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.1 {.  execsql
23d0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
23e0: 42 4c 45 20 74 34 28 61 20 50 52 49 4d 41 52 59  BLE t4(a PRIMARY
23f0: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e   KEY, b);.    IN
2400: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
2410: 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20  UES(1, 'one');. 
2420: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2430: 34 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f  4 VALUES(2, 'two
2440: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
2450: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 33 2c  NTO t4 VALUES(3,
2460: 20 27 74 68 72 65 65 27 29 3b 0a 20 20 7d 0a 0a   'three');.  }..
2470: 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71 6c 69    set STMT [sqli
2480: 74 65 33 5f 70 72 65 70 61 72 65 20 24 44 42 20  te3_prepare $DB 
2490: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
24a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 2d 31  qlite_master" -1
24b0: 20 54 41 49 4c 5d 0a 20 20 73 71 6c 69 74 65 33   TAIL].  sqlite3
24c0: 5f 73 74 65 70 20 24 53 54 4d 54 0a 0a 20 20 65  _step $STMT..  e
24d0: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
24e0: 46 52 4f 4d 20 74 34 20 7d 0a 20 20 65 78 65 63  FROM t4 }.  exec
24f0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
2500: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2510: 72 20 7d 20 64 62 32 0a 20 20 65 78 65 63 73 71  r } db2.  execsq
2520: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
2530: 4d 20 74 34 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a  M t4 } db2.} {}.
2540: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 36 2e  .do_test lock-6.
2550: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
2560: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
2570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
2580: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
2590: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
25a0: 20 74 34 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t4 VALUES(2, 't
25b0: 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  wo');.    INSERT
25c0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
25d0: 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20  3, 'three');.   
25e0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20   COMMIT;.  }..  
25f0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
2600: 20 2a 20 46 52 4f 4d 20 74 34 20 7d 20 64 62 32   * FROM t4 } db2
2610: 0a 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20  .} {1 one 2 two 
2620: 33 20 74 68 72 65 65 7d 0a 0a 64 6f 5f 74 65 73  3 three}..do_tes
2630: 74 20 6c 6f 63 6b 2d 36 2e 33 20 7b 0a 20 20 65  t lock-6.3 {.  e
2640: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
2650: 61 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20  a FROM t4 ORDER 
2660: 42 59 20 61 20 7d 20 64 62 32 0a 7d 20 7b 31 20  BY a } db2.} {1 
2670: 32 20 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f  2 3}..do_test lo
2680: 63 6b 2d 36 2e 34 20 7b 0a 20 20 65 78 65 63 73  ck-6.4 {.  execs
2690: 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  ql { PRAGMA inte
26a0: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62  grity_check } db
26b0: 32 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73  2.} {ok}..do_tes
26c0: 74 20 6c 6f 63 6b 2d 36 2e 35 20 7b 0a 20 20 73  t lock-6.5 {.  s
26d0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
26e0: 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f  $STMT.} {SQLITE_
26f0: 4f 4b 7d 0a 0a 23 20 41 74 20 6f 6e 65 20 70 6f  OK}..# At one po
2700: 69 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  int the followin
2710: 67 20 73 65 74 20 6f 66 20 63 6f 6e 64 69 74 69  g set of conditi
2720: 6f 6e 73 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ons would cause 
2730: 53 51 4c 69 74 65 20 74 6f 20 0a 23 20 72 65 74  SQLite to .# ret
2740: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6f  ain a RESERVED o
2750: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
2760: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
2770: 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
2780: 74 74 65 64 3a 0a 23 20 0a 23 20 20 20 2a 20 54  tted:.# .#   * T
2790: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
27a0: 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68  is set to someth
27b0: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 27  ing other than '
27c0: 64 65 6c 65 74 65 27 2c 20 61 6e 64 0a 23 20 20  delete', and.#  
27d0: 20 2a 20 74 68 65 72 65 20 65 78 69 73 74 73 20   * there exists 
27e0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 63 74 69  one or more acti
27f0: 76 65 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74 61  ve read-only sta
2800: 74 65 6d 65 6e 74 73 2c 20 61 6e 64 0a 23 20 20  tements, and.#  
2810: 20 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e   * a transaction
2820: 20 74 68 61 74 20 6d 6f 64 69 66 69 65 64 20 7a   that modified z
2830: 65 72 6f 20 64 61 74 61 62 61 73 65 20 70 61 67  ero database pag
2840: 65 73 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  es is committed.
2850: 0a 23 20 0a 73 65 74 20 74 65 6d 70 5f 73 74 61  .# .set temp_sta
2860: 74 75 73 20 75 6e 6c 6f 63 6b 65 64 0a 69 66 20  tus unlocked.if 
2870: 7b 24 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 7d  {$TEMP_STORE==3}
2880: 20 7b 73 65 74 20 74 65 6d 70 5f 73 74 61 74 75   {set temp_statu
2890: 73 20 75 6e 6b 6e 6f 77 6e 7d 0a 64 6f 5f 74 65  s unknown}.do_te
28a0: 73 74 20 6c 6f 63 6b 2d 37 2e 31 20 7b 0a 20 20  st lock-7.1 {.  
28b0: 73 65 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65  set STMT [sqlite
28c0: 33 5f 70 72 65 70 61 72 65 20 24 44 42 20 22 53  3_prepare $DB "S
28d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
28e0: 69 74 65 5f 6d 61 73 74 65 72 22 20 2d 31 20 54  ite_master" -1 T
28f0: 41 49 4c 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73  AIL].  sqlite3_s
2900: 74 65 70 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c  tep $STMT.} {SQL
2910: 49 54 45 5f 52 4f 57 7d 0a 64 6f 5f 74 65 73 74  ITE_ROW}.do_test
2920: 20 6c 6f 63 6b 2d 37 2e 32 20 7b 0a 20 20 65 78   lock-7.2 {.  ex
2930: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c  ecsql { PRAGMA l
2940: 6f 63 6b 5f 73 74 61 74 75 73 20 7d 0a 7d 20 5b  ock_status }.} [
2950: 6c 69 73 74 20 6d 61 69 6e 20 73 68 61 72 65 64  list main shared
2960: 20 74 65 6d 70 20 24 74 65 6d 70 5f 73 74 61 74   temp $temp_stat
2970: 75 73 5d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  us].do_test lock
2980: 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.3 {.  execsql
2990: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
29a0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75  urnal_mode = tru
29b0: 6e 63 61 74 65 3b 0a 20 20 20 20 42 45 47 49 4e  ncate;.    BEGIN
29c0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 34 20  ;.    UPDATE t4 
29d0: 53 45 54 20 61 20 3d 20 31 30 20 57 48 45 52 45  SET a = 10 WHERE
29e0: 20 30 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a   0;.    COMMIT;.
29f0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
2a00: 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74  PRAGMA lock_stat
2a10: 75 73 20 7d 0a 7d 20 5b 6c 69 73 74 20 6d 61 69  us }.} [list mai
2a20: 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20 24 74  n shared temp $t
2a30: 65 6d 70 5f 73 74 61 74 75 73 5d 0a 64 6f 5f 74  emp_status].do_t
2a40: 65 73 74 20 6c 6f 63 6b 2d 37 2e 34 20 7b 0a 20  est lock-7.4 {. 
2a50: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2a60: 65 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54  e $STMT.} {SQLIT
2a70: 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c  E_OK}..do_test l
2a80: 6f 63 6b 2d 39 39 39 2e 31 20 7b 0a 20 20 72 65  ock-999.1 {.  re
2a90: 6e 61 6d 65 20 64 62 32 20 7b 7d 0a 7d 20 7b 7d  name db2 {}.} {}
2aa0: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.