/ Hex Artifact Content
Login

Artifact 9c06ddc3a094a78ed7e49d15165b3fc458bcbfc7:


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 37 20 32  ck.test,v 1.37 2
01f0: 30 30 39 2f 30 32 2f 31 32 20 30 39 3a 33 36 3a  009/02/12 09:36:
0200: 31 36 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  16 danielk1977 E
0210: 78 70 20 24 0a 0a 0a 73 65 74 20 74 65 73 74 64  xp $...set testd
0220: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0230: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0240: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
0250: 74 63 6c 0a 0a 23 20 43 72 65 61 74 65 20 61 6e  tcl..# Create an
0260: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6e   alternative con
0270: 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
0280: 61 74 61 62 61 73 65 0a 23 0a 64 6f 5f 74 65 73  atabase.#.do_tes
0290: 74 20 6c 6f 63 6b 2d 31 2e 30 20 7b 0a 20 20 23  t lock-1.0 {.  #
02a0: 20 47 69 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   Give a complex 
02b0: 70 61 74 68 6e 6d 65 20 74 6f 20 73 74 72 65 73  pathnme to stres
02c0: 73 20 74 68 65 20 70 61 74 68 20 73 69 6d 70 6c  s the path simpl
02d0: 69 66 69 63 61 74 69 6f 6e 20 6c 6f 67 69 63 20  ification logic 
02e0: 69 6e 0a 20 20 23 20 74 68 65 20 76 78 77 6f 72  in.  # the vxwor
02f0: 6b 73 20 64 72 69 76 65 72 2e 0a 20 20 66 69 6c  ks driver..  fil
0300: 65 20 6d 6b 64 69 72 20 74 65 6d 70 64 69 72 2f  e mkdir tempdir/
0310: 74 31 2f 74 32 0a 20 20 73 71 6c 69 74 65 33 20  t1/t2.  sqlite3 
0320: 64 62 32 20 2e 2f 74 65 6d 70 64 69 72 2f 2e 2e  db2 ./tempdir/..
0330: 2f 74 65 6d 70 64 69 72 2f 74 31 2f 2e 2f 2f 74  /tempdir/t1/.//t
0340: 32 2f 2e 2e 2f 2e 2e 2f 2e 2e 2f 2f 74 65 73 74  2/../../..//test
0350: 2e 64 62 0a 20 20 73 65 74 20 64 75 6d 6d 79 20  .db.  set dummy 
0360: 7b 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  {}.} {}.do_test 
0370: 6c 6f 63 6b 2d 31 2e 31 20 7b 0a 20 20 65 78 65  lock-1.1 {.  exe
0380: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d  csql {SELECT nam
0390: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
03a0: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d  ster WHERE type=
03b0: 27 74 61 62 6c 65 27 20 4f 52 44 45 52 20 42 59  'table' ORDER BY
03c0: 20 6e 61 6d 65 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   name}.} {}.do_t
03d0: 65 73 74 20 6c 6f 63 6b 2d 31 2e 32 20 7b 0a 20  est lock-1.2 {. 
03e0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
03f0: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
0400: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
0410: 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52 44 45  ype='table' ORDE
0420: 52 20 42 59 20 6e 61 6d 65 7d 20 64 62 32 0a 7d  R BY name} db2.}
0430: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b   {}.do_test lock
0440: 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.3 {.  execsql
0450: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
0460: 31 28 61 20 69 6e 74 2c 20 62 20 69 6e 74 29 7d  1(a int, b int)}
0470: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
0480: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
0490: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
04a0: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52   type='table' OR
04b0: 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a 7d 20 7b  DER BY name}.} {
04c0: 74 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  t1}.do_test lock
04d0: 2d 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71  -1.5 {.  catchsq
04e0: 6c 20 7b 0a 20 20 20 20 20 53 45 4c 45 43 54 20  l {.     SELECT 
04f0: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
0500: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
0510: 70 65 3d 27 74 61 62 6c 65 27 20 4f 52 44 45 52  pe='table' ORDER
0520: 20 42 59 20 6e 61 6d 65 0a 20 20 7d 20 64 62 32   BY name.  } db2
0530: 0a 7d 20 7b 30 20 74 31 7d 0a 0a 64 6f 5f 74 65  .} {0 t1}..do_te
0540: 73 74 20 6c 6f 63 6b 2d 31 2e 36 20 7b 0a 20 20  st lock-1.6 {.  
0550: 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20  execsql {INSERT 
0560: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0570: 2c 32 29 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  ,2)}.  execsql {
0580: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0590: 7d 0a 7d 20 7b 31 20 32 7d 0a 23 20 55 70 64 61  }.} {1 2}.# Upda
05a0: 74 65 3a 20 54 68 65 20 73 63 68 65 6d 61 20 69  te: The schema i
05b0: 73 20 6e 6f 77 20 62 72 6f 75 67 68 74 20 75 70  s now brought up
05c0: 20 74 6f 20 64 61 74 65 20 62 79 20 74 65 73 74   to date by test
05d0: 20 6c 6f 63 6b 2d 31 2e 35 2e 0a 23 20 64 6f 5f   lock-1.5..# do_
05e0: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 37 2e 31 20  test lock-1.7.1 
05f0: 7b 0a 23 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.#   catchsql {
0600: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0610: 7d 20 64 62 32 0a 23 20 7d 20 7b 31 20 7b 6e 6f  } db2.# } {1 {no
0620: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 74 31 7d   such table: t1}
0630: 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31  }.do_test lock-1
0640: 2e 37 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  .7.2 {.  catchsq
0650: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
0660: 20 74 31 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 31   t1} db2.} {0 {1
0670: 20 32 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63   2}}.do_test loc
0680: 6b 2d 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  k-1.8 {.  execsq
0690: 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54  l {UPDATE t1 SET
06a0: 20 61 3d 62 2c 20 62 3d 61 7d 20 64 62 32 0a 20   a=b, b=a} db2. 
06b0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
06c0: 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32 0a   * FROM t1} db2.
06d0: 7d 20 7b 32 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {2 1}.do_test 
06e0: 6c 6f 63 6b 2d 31 2e 39 20 7b 0a 20 20 65 78 65  lock-1.9 {.  exe
06f0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  csql {SELECT * F
0700: 52 4f 4d 20 74 31 7d 0a 7d 20 7b 32 20 31 7d 0a  ROM t1}.} {2 1}.
0710: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31  do_test lock-1.1
0720: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 42  0 {.  execsql {B
0730: 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
0740: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 55 50 44  }.  execsql {UPD
0750: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 30  ATE t1 SET a = 0
0760: 20 57 48 45 52 45 20 30 7d 0a 20 20 65 78 65 63   WHERE 0}.  exec
0770: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
0780: 4f 4d 20 74 31 7d 0a 7d 20 7b 32 20 31 7d 0a 64  OM t1}.} {2 1}.d
0790: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 31  o_test lock-1.11
07a0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53   {.  catchsql {S
07b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
07c0: 20 64 62 32 0a 7d 20 7b 30 20 7b 32 20 31 7d 7d   db2.} {0 {2 1}}
07d0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e  .do_test lock-1.
07e0: 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  12 {.  execsql {
07f0: 52 4f 4c 4c 42 41 43 4b 7d 0a 20 20 63 61 74 63  ROLLBACK}.  catc
0800: 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  hsql {SELECT * F
0810: 52 4f 4d 20 74 31 7d 0a 7d 20 7b 30 20 7b 32 20  ROM t1}.} {0 {2 
0820: 31 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f 63  1}}..do_test loc
0830: 6b 2d 31 2e 31 33 20 7b 0a 20 20 65 78 65 63 73  k-1.13 {.  execs
0840: 71 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  ql {CREATE TABLE
0850: 20 74 32 28 78 20 69 6e 74 2c 20 79 20 69 6e 74   t2(x int, y int
0860: 29 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 49 4e  )}.  execsql {IN
0870: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0880: 55 45 53 28 38 2c 39 29 7d 0a 20 20 65 78 65 63  UES(8,9)}.  exec
0890: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
08a0: 4f 4d 20 74 32 7d 0a 7d 20 7b 38 20 39 7d 0a 64  OM t2}.} {8 9}.d
08b0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 34  o_test lock-1.14
08c0: 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .1 {.  catchsql 
08d0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
08e0: 32 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 6e 6f 20  2} db2.} {1 {no 
08f0: 73 75 63 68 20 74 61 62 6c 65 3a 20 74 32 7d 7d  such table: t2}}
0900: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e  .do_test lock-1.
0910: 31 34 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  14.2 {.  catchsq
0920: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
0930: 20 74 31 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 32   t1} db2.} {0 {2
0940: 20 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63   1}}.do_test loc
0950: 6b 2d 31 2e 31 35 20 7b 0a 20 20 63 61 74 63 68  k-1.15 {.  catch
0960: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
0970: 4f 4d 20 74 32 7d 20 64 62 32 0a 7d 20 7b 30 20  OM t2} db2.} {0 
0980: 7b 38 20 39 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  {8 9}}..do_test 
0990: 6c 6f 63 6b 2d 31 2e 31 36 20 7b 0a 20 20 64 62  lock-1.16 {.  db
09a0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20   eval {SELECT * 
09b0: 46 52 4f 4d 20 74 31 7d 20 71 76 20 7b 0a 20 20  FROM t1} qv {.  
09c0: 20 20 73 65 74 20 78 20 5b 64 62 20 65 76 61 6c    set x [db eval
09d0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
09e0: 74 31 7d 5d 0a 20 20 7d 0a 20 20 73 65 74 20 78  t1}].  }.  set x
09f0: 0a 7d 20 7b 32 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {2 1}.do_test
0a00: 20 6c 6f 63 6b 2d 31 2e 31 37 20 7b 0a 20 20 64   lock-1.17 {.  d
0a10: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a  b eval {SELECT *
0a20: 20 46 52 4f 4d 20 74 31 7d 20 71 76 20 7b 0a 20   FROM t1} qv {. 
0a30: 20 20 20 73 65 74 20 78 20 5b 64 62 20 65 76 61     set x [db eva
0a40: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
0a50: 20 74 32 7d 5d 0a 20 20 7d 0a 20 20 73 65 74 20   t2}].  }.  set 
0a60: 78 0a 7d 20 7b 38 20 39 7d 0a 0a 23 20 59 6f 75  x.} {8 9}..# You
0a70: 20 63 61 6e 6e 6f 74 20 55 50 44 41 54 45 20 61   cannot UPDATE a
0a80: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 69 74 68   table from with
0a90: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  in the callback 
0aa0: 6f 66 20 61 20 53 45 4c 45 43 54 0a 23 20 6f 6e  of a SELECT.# on
0ab0: 20 74 68 61 74 20 73 61 6d 65 20 74 61 62 6c 65   that same table
0ac0: 20 62 65 63 61 75 73 65 20 74 68 65 20 53 45 4c   because the SEL
0ad0: 45 43 54 20 68 61 73 20 74 68 65 20 74 61 62 6c  ECT has the tabl
0ae0: 65 20 6c 6f 63 6b 65 64 2e 0a 23 0a 23 20 32 30  e locked..#.# 20
0af0: 30 36 2d 30 38 2d 31 36 3a 20 20 52 65 61 64 73  06-08-16:  Reads
0b00: 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b   no longer block
0b10: 20 77 72 69 74 65 73 20 77 69 74 68 69 6e 20 74   writes within t
0b20: 68 65 20 73 61 6d 65 0a 23 20 64 61 74 61 62 61  he same.# databa
0b30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23  se connection..#
0b40: 0a 23 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31  .#do_test lock-1
0b50: 2e 31 38 20 7b 0a 23 20 20 64 62 20 65 76 61 6c  .18 {.#  db eval
0b60: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
0b70: 74 31 7d 20 71 76 20 7b 0a 23 20 20 20 20 73 65  t1} qv {.#    se
0b80: 74 20 72 20 5b 63 61 74 63 68 20 7b 64 62 20 65  t r [catch {db e
0b90: 76 61 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53  val {UPDATE t1 S
0ba0: 45 54 20 61 3d 62 2c 20 62 3d 61 7d 7d 20 6d 73  ET a=b, b=a}} ms
0bb0: 67 5d 0a 23 20 20 20 20 6c 61 70 70 65 6e 64 20  g].#    lappend 
0bc0: 72 20 24 6d 73 67 0a 23 20 20 7d 0a 23 20 20 73  r $msg.#  }.#  s
0bd0: 65 74 20 72 0a 23 7d 20 7b 31 20 7b 64 61 74 61  et r.#} {1 {data
0be0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
0bf0: 63 6b 65 64 7d 7d 0a 0a 23 20 42 75 74 20 79 6f  cked}}..# But yo
0c00: 75 20 63 61 6e 20 55 50 44 41 54 45 20 61 20 64  u can UPDATE a d
0c10: 69 66 66 65 72 65 6e 74 20 74 61 62 6c 65 20 66  ifferent table f
0c20: 72 6f 6d 20 74 68 65 20 6f 6e 65 20 74 68 61 74  rom the one that
0c30: 20 69 73 20 75 73 65 64 20 69 6e 0a 23 20 74 68   is used in.# th
0c40: 65 20 53 45 4c 45 43 54 2e 0a 23 0a 64 6f 5f 74  e SELECT..#.do_t
0c50: 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 39 20 7b 0a  est lock-1.19 {.
0c60: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
0c70: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 71 76 20  T * FROM t1} qv 
0c80: 7b 0a 20 20 20 20 73 65 74 20 72 20 5b 63 61 74  {.    set r [cat
0c90: 63 68 20 7b 64 62 20 65 76 61 6c 20 7b 55 50 44  ch {db eval {UPD
0ca0: 41 54 45 20 74 32 20 53 45 54 20 78 3d 79 2c 20  ATE t2 SET x=y, 
0cb0: 79 3d 78 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 6c  y=x}} msg].    l
0cc0: 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 20 20  append r $msg.  
0cd0: 7d 0a 20 20 73 65 74 20 72 0a 7d 20 7b 30 20 7b  }.  set r.} {0 {
0ce0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  }}.do_test lock-
0cf0: 31 2e 32 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.20 {.  execsql
0d00: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
0d10: 74 32 7d 0a 7d 20 7b 39 20 38 7d 0a 0a 23 20 49  t2}.} {9 8}..# I
0d20: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
0d30: 20 64 6f 20 61 20 53 45 4c 45 43 54 20 6f 66 20   do a SELECT of 
0d40: 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 77  the same table w
0d50: 69 74 68 69 6e 20 74 68 65 0a 23 20 63 61 6c 6c  ithin the.# call
0d60: 62 61 63 6b 20 6f 66 20 61 6e 6f 74 68 65 72 20  back of another 
0d70: 53 45 4c 45 43 54 20 6f 6e 20 74 68 61 74 20 73  SELECT on that s
0d80: 61 6d 65 20 74 61 62 6c 65 20 62 65 63 61 75 73  ame table becaus
0d90: 65 20 74 77 6f 0a 23 20 6f 72 20 6d 6f 72 65 20  e two.# or more 
0da0: 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
0db0: 73 20 63 61 6e 20 62 65 20 6f 70 65 6e 20 61 74  s can be open at
0dc0: 20 6f 6e 63 65 2e 0a 23 0a 64 6f 5f 74 65 73 74   once..#.do_test
0dd0: 20 6c 6f 63 6b 2d 31 2e 32 31 20 7b 0a 20 20 64   lock-1.21 {.  d
0de0: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a  b eval {SELECT *
0df0: 20 46 52 4f 4d 20 74 31 7d 20 71 76 20 7b 0a 20   FROM t1} qv {. 
0e00: 20 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20     set r [catch 
0e10: 7b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  {db eval {SELECT
0e20: 20 61 20 46 52 4f 4d 20 74 31 7d 7d 20 6d 73 67   a FROM t1}} msg
0e30: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 20  ].    lappend r 
0e40: 24 6d 73 67 0a 20 20 7d 0a 20 20 73 65 74 20 72  $msg.  }.  set r
0e50: 0a 7d 20 7b 30 20 32 7d 0a 0a 23 20 55 6e 64 65  .} {0 2}..# Unde
0e60: 72 20 55 4e 49 58 20 79 6f 75 20 63 61 6e 20 64  r UNIX you can d
0e70: 6f 20 74 77 6f 20 53 45 4c 45 43 54 73 20 61 74  o two SELECTs at
0e80: 20 6f 6e 63 65 20 77 69 74 68 20 64 69 66 66 65   once with diffe
0e90: 72 65 6e 74 20 64 61 74 61 62 61 73 65 0a 23 20  rent database.# 
0ea0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 20 62 65 63  connections, bec
0eb0: 61 75 73 65 20 55 4e 49 58 20 73 75 70 70 6f 72  ause UNIX suppor
0ec0: 74 73 20 72 65 61 64 65 72 2f 77 72 69 74 65 72  ts reader/writer
0ed0: 20 6c 6f 63 6b 73 2e 20 20 55 6e 64 65 72 20 77   locks.  Under w
0ee0: 69 6e 64 6f 77 73 2c 0a 23 20 74 68 69 73 20 69  indows,.# this i
0ef0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 0a  s not possible..
0f00: 23 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  #.if {$::tcl_pla
0f10: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d  tform(platform)=
0f20: 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20 64 6f 5f  ="unix"} {.  do_
0f30: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 32 32 20 7b  test lock-1.22 {
0f40: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45  .    db eval {SE
0f50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20  LECT * FROM t1} 
0f60: 71 76 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72  qv {.      set r
0f70: 20 5b 63 61 74 63 68 20 7b 64 62 32 20 65 76 61   [catch {db2 eva
0f80: 6c 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  l {SELECT a FROM
0f90: 20 74 31 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 20   t1}} msg].     
0fa0: 20 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a   lappend r $msg.
0fb0: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 72 0a      }.    set r.
0fc0: 20 20 7d 20 7b 30 20 32 7d 0a 7d 0a 69 6e 74 65    } {0 2}.}.inte
0fd0: 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 63 6b  grity_check lock
0fe0: 2d 31 2e 32 33 0a 0a 23 20 49 66 20 6f 6e 65 20  -1.23..# If one 
0ff0: 74 68 72 65 61 64 20 68 61 73 20 61 20 74 72 61  thread has a tra
1000: 6e 73 61 63 74 69 6f 6e 20 61 6e 6f 74 68 65 72  nsaction another
1010: 20 74 68 72 65 61 64 20 63 61 6e 6e 6f 74 20 73   thread cannot s
1020: 74 61 72 74 0a 23 20 61 20 74 72 61 6e 73 61 63  tart.# a transac
1030: 74 69 6f 6e 2e 20 20 2d 3e 20 4e 6f 74 20 74 72  tion.  -> Not tr
1040: 75 65 20 69 6e 20 76 65 72 73 69 6f 6e 20 33 2e  ue in version 3.
1050: 30 2e 20 20 42 75 74 20 69 66 20 6f 6e 65 20 74  0.  But if one t
1060: 68 72 65 61 64 0a 23 20 61 73 20 61 20 52 45 53  hread.# as a RES
1070: 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 6f 74 68  ERVED lock anoth
1080: 65 72 20 74 68 72 65 61 64 20 63 61 6e 6e 6f 74  er thread cannot
1090: 20 61 63 71 75 69 72 65 20 6f 6e 65 2e 0a 23 0a   acquire one..#.
10a0: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e 31  do_test lock-2.1
10b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 42 45   {.  execsql {BE
10c0: 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d  GIN TRANSACTION}
10d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 55 50 44 41  .  execsql {UPDA
10e0: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 30 20  TE t1 SET a = 0 
10f0: 57 48 45 52 45 20 30 7d 0a 20 20 65 78 65 63 73  WHERE 0}.  execs
1100: 71 6c 20 7b 42 45 47 49 4e 20 54 52 41 4e 53 41  ql {BEGIN TRANSA
1110: 43 54 49 4f 4e 7d 20 64 62 32 0a 20 20 73 65 74  CTION} db2.  set
1120: 20 72 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73   r [catch {execs
1130: 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45  ql {UPDATE t1 SE
1140: 54 20 61 20 3d 20 30 20 57 48 45 52 45 20 30 7d  T a = 0 WHERE 0}
1150: 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20 65 78 65   db2} msg].  exe
1160: 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 20  csql {ROLLBACK} 
1170: 64 62 32 0a 20 20 6c 61 70 70 65 6e 64 20 72 20  db2.  lappend r 
1180: 24 6d 73 67 0a 7d 20 7b 31 20 7b 64 61 74 61 62  $msg.} {1 {datab
1190: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
11a0: 0a 23 20 41 20 74 68 72 65 61 64 20 63 61 6e 20  .# A thread can 
11b0: 72 65 61 64 20 77 68 65 6e 20 61 6e 6f 74 68 65  read when anothe
11c0: 72 20 68 61 73 20 61 20 52 45 53 45 52 56 45 44  r has a RESERVED
11d0: 20 6c 6f 63 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74   lock..#.do_test
11e0: 20 6c 6f 63 6b 2d 32 2e 32 20 7b 0a 20 20 63 61   lock-2.2 {.  ca
11f0: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  tchsql {SELECT *
1200: 20 46 52 4f 4d 20 74 32 7d 20 64 62 32 0a 7d 20   FROM t2} db2.} 
1210: 7b 30 20 7b 39 20 38 7d 7d 0a 0a 23 20 49 66 20  {0 {9 8}}..# If 
1220: 74 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64  the other thread
1230: 20 28 74 68 65 20 6f 6e 65 20 74 68 61 74 20 64   (the one that d
1240: 6f 65 73 20 6e 6f 74 20 68 6f 6c 64 20 74 68 65  oes not hold the
1250: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74   transaction wit
1260: 68 0a 23 20 61 20 52 45 53 45 52 56 45 44 20 6c  h.# a RESERVED l
1270: 6f 63 6b 29 20 74 72 69 65 73 20 74 6f 20 67 65  ock) tries to ge
1280: 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
1290: 6b 2c 20 77 65 20 64 6f 20 67 65 74 20 61 20 62  k, we do get a b
12a0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 23 20 61  usy callback.# a
12b0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 77 65 72  s long as we wer
12c0: 65 20 6e 6f 74 20 6f 72 67 69 6e 61 6c 6c 79 20  e not orginally 
12d0: 68 6f 6c 64 69 6e 67 20 61 20 52 45 41 44 20 6c  holding a READ l
12e0: 6f 63 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c  ock..#.do_test l
12f0: 6f 63 6b 2d 32 2e 33 2e 31 20 7b 0a 20 20 70 72  ock-2.3.1 {.  pr
1300: 6f 63 20 63 61 6c 6c 62 61 63 6b 20 7b 63 6f 75  oc callback {cou
1310: 6e 74 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a  nt} {.    set ::
1320: 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 24  callback_value $
1330: 63 6f 75 6e 74 0a 20 20 20 20 62 72 65 61 6b 0a  count.    break.
1340: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63 61 6c 6c    }.  set ::call
1350: 62 61 63 6b 5f 76 61 6c 75 65 20 7b 7d 0a 20 20  back_value {}.  
1360: 64 62 32 20 62 75 73 79 20 63 61 6c 6c 62 61 63  db2 busy callbac
1370: 6b 0a 20 20 23 20 64 62 32 20 64 6f 65 73 20 6e  k.  # db2 does n
1380: 6f 74 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 73  ot hold a lock s
1390: 6f 20 77 65 20 73 68 6f 75 6c 64 20 67 65 74 20  o we should get 
13a0: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
13b0: 68 65 72 65 0a 20 20 73 65 74 20 72 20 5b 63 61  here.  set r [ca
13c0: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 55 50  tch {execsql {UP
13d0: 44 41 54 45 20 74 31 20 53 45 54 20 61 3d 62 2c  DATE t1 SET a=b,
13e0: 20 62 3d 61 7d 20 64 62 32 7d 20 6d 73 67 5d 0a   b=a} db2} msg].
13f0: 20 20 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67    lappend r $msg
1400: 0a 20 20 6c 61 70 70 65 6e 64 20 72 20 24 3a 3a  .  lappend r $::
1410: 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 0a 7d  callback_value.}
1420: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
1430: 20 6c 6f 63 6b 65 64 7d 20 30 7d 0a 64 6f 5f 74   locked} 0}.do_t
1440: 65 73 74 20 6c 6f 63 6b 2d 32 2e 33 2e 32 20 7b  est lock-2.3.2 {
1450: 0a 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63  .  set ::callbac
1460: 6b 5f 76 61 6c 75 65 20 7b 7d 0a 20 20 65 78 65  k_value {}.  exe
1470: 63 73 71 6c 20 7b 42 45 47 49 4e 3b 20 53 45 4c  csql {BEGIN; SEL
1480: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  ECT rowid FROM s
1490: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49 4d  qlite_master LIM
14a0: 49 54 20 31 7d 20 64 62 32 0a 20 20 23 20 54 68  IT 1} db2.  # Th
14b0: 69 73 20 74 69 6d 65 20 64 62 32 20 64 6f 65 73  is time db2 does
14c0: 20 68 6f 6c 64 20 61 20 72 65 61 64 20 6c 6f 63   hold a read loc
14d0: 6b 2e 20 20 4e 6f 20 62 75 73 79 20 63 61 6c 6c  k.  No busy call
14e0: 62 61 63 6b 20 74 68 69 73 20 74 69 6d 65 2e 0a  back this time..
14f0: 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b    set r [catch {
1500: 65 78 65 63 73 71 6c 20 7b 55 50 44 41 54 45 20  execsql {UPDATE 
1510: 74 31 20 53 45 54 20 61 3d 62 2c 20 62 3d 61 7d  t1 SET a=b, b=a}
1520: 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20 6c 61 70   db2} msg].  lap
1530: 70 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 6c 61  pend r $msg.  la
1540: 70 70 65 6e 64 20 72 20 24 3a 3a 63 61 6c 6c 62  ppend r $::callb
1550: 61 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b 31 20 7b  ack_value.} {1 {
1560: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1570: 65 64 7d 20 7b 7d 7d 0a 63 61 74 63 68 20 7b 65  ed} {}}.catch {e
1580: 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b  xecsql {ROLLBACK
1590: 7d 20 64 62 32 7d 0a 64 6f 5f 74 65 73 74 20 6c  } db2}.do_test l
15a0: 6f 63 6b 2d 32 2e 34 2e 31 20 7b 0a 20 20 70 72  ock-2.4.1 {.  pr
15b0: 6f 63 20 63 61 6c 6c 62 61 63 6b 20 7b 63 6f 75  oc callback {cou
15c0: 6e 74 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  nt} {.    lappen
15d0: 64 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c  d ::callback_val
15e0: 75 65 20 24 63 6f 75 6e 74 0a 20 20 20 20 69 66  ue $count.    if
15f0: 20 7b 24 63 6f 75 6e 74 3e 34 7d 20 62 72 65 61   {$count>4} brea
1600: 6b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63 61  k.  }.  set ::ca
1610: 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 7b 7d 0a  llback_value {}.
1620: 20 20 64 62 32 20 62 75 73 79 20 63 61 6c 6c 62    db2 busy callb
1630: 61 63 6b 0a 20 20 23 20 57 65 20 67 65 74 20 61  ack.  # We get a
1640: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 62   busy callback b
1650: 65 63 61 75 73 65 20 64 62 32 20 69 73 20 6e 6f  ecause db2 is no
1660: 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  t holding a lock
1670: 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20  .  set r [catch 
1680: 7b 65 78 65 63 73 71 6c 20 7b 55 50 44 41 54 45  {execsql {UPDATE
1690: 20 74 31 20 53 45 54 20 61 3d 62 2c 20 62 3d 61   t1 SET a=b, b=a
16a0: 7d 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20 6c 61  } db2} msg].  la
16b0: 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 6c  ppend r $msg.  l
16c0: 61 70 70 65 6e 64 20 72 20 24 3a 3a 63 61 6c 6c  append r $::call
16d0: 62 61 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b 31 20  back_value.} {1 
16e0: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
16f0: 6b 65 64 7d 20 7b 30 20 31 20 32 20 33 20 34 20  ked} {0 1 2 3 4 
1700: 35 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  5}}.do_test lock
1710: 2d 32 2e 34 2e 32 20 7b 0a 20 20 70 72 6f 63 20  -2.4.2 {.  proc 
1720: 63 61 6c 6c 62 61 63 6b 20 7b 63 6f 75 6e 74 7d  callback {count}
1730: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
1740: 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20  :callback_value 
1750: 24 63 6f 75 6e 74 0a 20 20 20 20 69 66 20 7b 24  $count.    if {$
1760: 63 6f 75 6e 74 3e 34 7d 20 62 72 65 61 6b 0a 20  count>4} break. 
1770: 20 7d 0a 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62   }.  set ::callb
1780: 61 63 6b 5f 76 61 6c 75 65 20 7b 7d 0a 20 20 64  ack_value {}.  d
1790: 62 32 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  b2 busy callback
17a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 42 45 47 49  .  execsql {BEGI
17b0: 4e 3b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N; SELECT rowid 
17c0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
17d0: 65 72 20 4c 49 4d 49 54 20 31 7d 20 64 62 32 0a  er LIMIT 1} db2.
17e0: 20 20 23 20 4e 6f 20 62 75 73 79 20 63 61 6c 6c    # No busy call
17f0: 62 61 63 6b 20 74 68 69 73 20 74 69 6d 65 20 62  back this time b
1800: 65 63 61 75 73 65 20 77 65 20 61 72 65 20 68 6f  ecause we are ho
1810: 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 0a 20 20 73  lding a lock.  s
1820: 65 74 20 72 20 5b 63 61 74 63 68 20 7b 65 78 65  et r [catch {exe
1830: 63 73 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20  csql {UPDATE t1 
1840: 53 45 54 20 61 3d 62 2c 20 62 3d 61 7d 20 64 62  SET a=b, b=a} db
1850: 32 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  2} msg].  lappen
1860: 64 20 72 20 24 6d 73 67 0a 20 20 6c 61 70 70 65  d r $msg.  lappe
1870: 6e 64 20 72 20 24 3a 3a 63 61 6c 6c 62 61 63 6b  nd r $::callback
1880: 5f 76 61 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74  _value.} {1 {dat
1890: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
18a0: 20 7b 7d 7d 0a 63 61 74 63 68 20 7b 65 78 65 63   {}}.catch {exec
18b0: 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 20 64  sql {ROLLBACK} d
18c0: 62 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  b2}.do_test lock
18d0: 2d 32 2e 35 20 7b 0a 20 20 70 72 6f 63 20 63 61  -2.5 {.  proc ca
18e0: 6c 6c 62 61 63 6b 20 7b 63 6f 75 6e 74 7d 20 7b  llback {count} {
18f0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 63  .    lappend ::c
1900: 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 24 63  allback_value $c
1910: 6f 75 6e 74 0a 20 20 20 20 69 66 20 7b 24 63 6f  ount.    if {$co
1920: 75 6e 74 3e 34 7d 20 62 72 65 61 6b 0a 20 20 7d  unt>4} break.  }
1930: 0a 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63  .  set ::callbac
1940: 6b 5f 76 61 6c 75 65 20 7b 7d 0a 20 20 64 62 32  k_value {}.  db2
1950: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20   busy callback. 
1960: 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b 65   set r [catch {e
1970: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
1980: 20 46 52 4f 4d 20 74 31 7d 20 64 62 32 7d 20 6d   FROM t1} db2} m
1990: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 20  sg].  lappend r 
19a0: 24 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20 72  $msg.  lappend r
19b0: 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c   $::callback_val
19c0: 75 65 0a 7d 20 7b 30 20 7b 32 20 31 7d 20 7b 7d  ue.} {0 {2 1} {}
19d0: 7d 0a 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42  }.execsql {ROLLB
19e0: 41 43 4b 7d 0a 0a 23 20 54 65 73 74 20 74 68 65  ACK}..# Test the
19f0: 20 62 75 69 6c 74 2d 69 6e 20 62 75 73 79 20 74   built-in busy t
1a00: 69 6d 65 6f 75 74 20 68 61 6e 64 6c 65 72 0a 23  imeout handler.#
1a10: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e  .do_test lock-2.
1a20: 38 20 7b 0a 20 20 64 62 32 20 74 69 6d 65 6f 75  8 {.  db2 timeou
1a30: 74 20 34 30 30 0a 20 20 65 78 65 63 73 71 6c 20  t 400.  execsql 
1a40: 42 45 47 49 4e 0a 20 20 65 78 65 63 73 71 6c 20  BEGIN.  execsql 
1a50: 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61  {UPDATE t1 SET a
1a60: 20 3d 20 30 20 57 48 45 52 45 20 30 7d 0a 20 20   = 0 WHERE 0}.  
1a70: 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 20  catchsql {BEGIN 
1a80: 45 58 43 4c 55 53 49 56 45 3b 7d 20 64 62 32 0a  EXCLUSIVE;} db2.
1a90: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
1aa0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
1ab0: 73 74 20 6c 6f 63 6b 2d 32 2e 39 20 7b 0a 20 20  st lock-2.9 {.  
1ac0: 64 62 32 20 74 69 6d 65 6f 75 74 20 30 0a 20 20  db2 timeout 0.  
1ad0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
1ae0: 20 7b 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68   {}.integrity_ch
1af0: 65 63 6b 20 6c 6f 63 6b 2d 32 2e 31 30 0a 0a 23  eck lock-2.10..#
1b00: 20 54 72 79 20 74 6f 20 73 74 61 72 74 20 74 77   Try to start tw
1b10: 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 69  o transactions i
1b20: 6e 20 61 20 72 6f 77 0a 23 0a 64 6f 5f 74 65 73  n a row.#.do_tes
1b30: 74 20 6c 6f 63 6b 2d 33 2e 31 20 7b 0a 20 20 65  t lock-3.1 {.  e
1b40: 78 65 63 73 71 6c 20 7b 42 45 47 49 4e 20 54 52  xecsql {BEGIN TR
1b50: 41 4e 53 41 43 54 49 4f 4e 7d 0a 20 20 73 65 74  ANSACTION}.  set
1b60: 20 72 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73   r [catch {execs
1b70: 71 6c 20 7b 42 45 47 49 4e 20 54 52 41 4e 53 41  ql {BEGIN TRANSA
1b80: 43 54 49 4f 4e 7d 7d 20 6d 73 67 5d 0a 20 20 65  CTION}} msg].  e
1b90: 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b  xecsql {ROLLBACK
1ba0: 7d 0a 20 20 6c 61 70 70 65 6e 64 20 72 20 24 6d  }.  lappend r $m
1bb0: 73 67 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20  sg.} {1 {cannot 
1bc0: 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
1bd0: 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61  ion within a tra
1be0: 6e 73 61 63 74 69 6f 6e 7d 7d 0a 69 6e 74 65 67  nsaction}}.integ
1bf0: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 63 6b 2d  rity_check lock-
1c00: 33 2e 32 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65  3.2..# Make sure
1c10: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c20: 72 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  r and error mess
1c30: 61 67 65 73 20 77 6f 72 6b 20 77 68 65 6e 0a 23  ages work when.#
1c40: 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 70   opening a new p
1c50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
1c60: 74 61 62 61 73 65 20 77 68 69 6c 65 20 61 6e 6f  tabase while ano
1c70: 74 68 65 72 20 70 6f 69 6e 74 65 72 0a 23 20 68  ther pointer.# h
1c80: 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
1c90: 6c 6f 63 6b 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  locked..#.do_tes
1ca0: 74 20 6c 6f 63 6b 2d 34 2e 31 20 7b 0a 20 20 64  t lock-4.1 {.  d
1cb0: 62 32 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68  b2 close.  catch
1cc0: 20 7b 64 62 20 65 76 61 6c 20 52 4f 4c 4c 42 41   {db eval ROLLBA
1cd0: 43 4b 7d 0a 20 20 64 62 20 65 76 61 6c 20 42 45  CK}.  db eval BE
1ce0: 47 49 4e 0a 20 20 64 62 20 65 76 61 6c 20 7b 55  GIN.  db eval {U
1cf0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 3d 30  PDATE t1 SET a=0
1d00: 20 57 48 45 52 45 20 30 7d 0a 20 20 73 71 6c 69   WHERE 0}.  sqli
1d10: 74 65 33 20 64 62 32 20 2e 2f 74 65 73 74 2e 64  te3 db2 ./test.d
1d20: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 55 50  b.  catchsql {UP
1d30: 44 41 54 45 20 74 31 20 53 45 54 20 61 3d 30 7d  DATE t1 SET a=0}
1d40: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
1d50: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1d60: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 34 2e 32  do_test lock-4.2
1d70: 20 7b 0a 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62   {.  set ::callb
1d80: 61 63 6b 5f 76 61 6c 75 65 20 7b 7d 0a 20 20 73  ack_value {}.  s
1d90: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62  et rc [catch {db
1da0: 32 20 65 76 61 6c 20 7b 55 50 44 41 54 45 20 74  2 eval {UPDATE t
1db0: 31 20 53 45 54 20 61 3d 30 7d 7d 20 6d 73 67 5d  1 SET a=0}} msg]
1dc0: 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d  .  lappend rc $m
1dd0: 73 67 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76  sg $::callback_v
1de0: 61 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62  alue.} {1 {datab
1df0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b  ase is locked} {
1e00: 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  }}.do_test lock-
1e10: 34 2e 33 20 7b 0a 20 20 70 72 6f 63 20 63 61 6c  4.3 {.  proc cal
1e20: 6c 62 61 63 6b 20 7b 63 6f 75 6e 74 7d 20 7b 0a  lback {count} {.
1e30: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 63 61      lappend ::ca
1e40: 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 24 63 6f  llback_value $co
1e50: 75 6e 74 0a 20 20 20 20 69 66 20 7b 24 63 6f 75  unt.    if {$cou
1e60: 6e 74 3e 34 7d 20 62 72 65 61 6b 0a 20 20 7d 0a  nt>4} break.  }.
1e70: 20 20 64 62 32 20 62 75 73 79 20 63 61 6c 6c 62    db2 busy callb
1e80: 61 63 6b 0a 20 20 73 65 74 20 72 63 20 5b 63 61  ack.  set rc [ca
1e90: 74 63 68 20 7b 64 62 32 20 65 76 61 6c 20 7b 55  tch {db2 eval {U
1ea0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 3d 30  PDATE t1 SET a=0
1eb0: 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  }} msg].  lappen
1ec0: 64 20 72 63 20 24 6d 73 67 20 24 3a 3a 63 61 6c  d rc $msg $::cal
1ed0: 6c 62 61 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b 31  lback_value.} {1
1ee0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
1ef0: 63 6b 65 64 7d 20 7b 30 20 31 20 32 20 33 20 34  cked} {0 1 2 3 4
1f00: 20 35 7d 7d 0a 65 78 65 63 73 71 6c 20 7b 52 4f   5}}.execsql {RO
1f10: 4c 4c 42 41 43 4b 7d 0a 0a 23 20 57 68 65 6e 20  LLBACK}..# When 
1f20: 6f 6e 65 20 74 68 72 65 61 64 20 69 73 20 77 72  one thread is wr
1f30: 69 74 69 6e 67 2c 20 6f 74 68 65 72 20 74 68 72  iting, other thr
1f40: 65 61 64 73 20 63 61 6e 6e 6f 74 20 72 65 61 64  eads cannot read
1f50: 2e 20 20 45 78 63 65 70 74 20 69 66 20 74 68 65  .  Except if the
1f60: 0a 23 20 77 72 69 74 69 6e 67 20 74 68 72 65 61  .# writing threa
1f70: 64 20 69 73 20 77 72 69 74 69 6e 67 20 74 6f 20  d is writing to 
1f80: 69 74 73 20 74 65 6d 70 6f 72 61 72 79 20 74 61  its temporary ta
1f90: 62 6c 65 73 2c 20 74 68 65 20 6f 74 68 65 72 20  bles, the other 
1fa0: 74 68 72 65 61 64 73 0a 23 20 63 61 6e 20 73 74  threads.# can st
1fb0: 69 6c 6c 20 72 65 61 64 2e 20 20 2d 3e 20 4e 6f  ill read.  -> No
1fc0: 74 20 73 6f 20 69 6e 20 33 2e 30 2e 20 20 4f 6e  t so in 3.0.  On
1fd0: 65 20 74 68 72 65 61 64 20 63 61 6e 20 72 65 61  e thread can rea
1fe0: 64 20 77 68 69 6c 65 20 61 6e 6f 74 68 65 72 0a  d while another.
1ff0: 23 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  # holds a RESERV
2000: 45 44 20 6c 6f 63 6b 2e 0a 23 0a 70 72 6f 63 20  ED lock..#.proc 
2010: 74 78 5f 65 78 65 63 20 7b 73 71 6c 7d 20 7b 0a  tx_exec {sql} {.
2020: 20 20 64 62 32 20 65 76 61 6c 20 24 73 71 6c 0a    db2 eval $sql.
2030: 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35  }.do_test lock-5
2040: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2050: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2060: 4f 4d 20 74 31 0a 20 20 7d 0a 7d 20 7b 32 20 31  OM t1.  }.} {2 1
2070: 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35  }.do_test lock-5
2080: 2e 32 20 7b 0a 20 20 64 62 20 66 75 6e 63 74 69  .2 {.  db functi
2090: 6f 6e 20 74 78 5f 65 78 65 63 20 74 78 5f 65 78  on tx_exec tx_ex
20a0: 65 63 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  ec.  catchsql {.
20b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
20c0: 74 31 28 61 2c 62 29 20 53 45 4c 45 43 54 20 33  t1(a,b) SELECT 3
20d0: 2c 20 74 78 5f 65 78 65 63 28 27 53 45 4c 45 43  , tx_exec('SELEC
20e0: 54 20 79 20 46 52 4f 4d 20 74 32 20 4c 49 4d 49  T y FROM t2 LIMI
20f0: 54 20 31 27 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20  T 1');.  }.} {0 
2100: 7b 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 74  {}}..ifcapable t
2110: 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65 73  empdb {.  do_tes
2120: 74 20 6c 6f 63 6b 2d 35 2e 33 20 7b 0a 20 20 20  t lock-5.3 {.   
2130: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2140: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
2150: 4c 45 20 74 33 28 78 29 3b 0a 20 20 20 20 20 20  LE t3(x);.      
2160: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
2170: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ;.    }.  } {}. 
2180: 20 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35 2e   do_test lock-5.
2190: 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  4 {.    catchsql
21a0: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
21b0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 74  INTO t3 SELECT t
21c0: 78 5f 65 78 65 63 28 27 53 45 4c 45 43 54 20 79  x_exec('SELECT y
21d0: 20 46 52 4f 4d 20 74 32 20 4c 49 4d 49 54 20 31   FROM t2 LIMIT 1
21e0: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30  ');.    }.  } {0
21f0: 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c   {}}.  do_test l
2200: 6f 63 6b 2d 35 2e 35 20 7b 0a 20 20 20 20 65 78  ock-5.5 {.    ex
2210: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
2220: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a  LECT * FROM t3;.
2230: 20 20 20 20 7d 0a 20 20 7d 20 7b 38 7d 0a 20 20      }.  } {8}.  
2240: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35 2e 36  do_test lock-5.6
2250: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
2260: 7b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  {.      UPDATE t
2270: 31 20 53 45 54 20 61 3d 74 78 5f 65 78 65 63 28  1 SET a=tx_exec(
2280: 27 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  'SELECT x FROM t
2290: 32 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  2');.    }.  } {
22a0: 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  0 {}}.  do_test 
22b0: 6c 6f 63 6b 2d 35 2e 37 20 7b 0a 20 20 20 20 65  lock-5.7 {.    e
22c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
22d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
22e0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 39 20 31 20  .    }.  } {9 1 
22f0: 39 20 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c  9 8}.  do_test l
2300: 6f 63 6b 2d 35 2e 38 20 7b 0a 20 20 20 20 63 61  ock-5.8 {.    ca
2310: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 55  tchsql {.      U
2320: 50 44 41 54 45 20 74 33 20 53 45 54 20 78 3d 74  PDATE t3 SET x=t
2330: 78 5f 65 78 65 63 28 27 53 45 4c 45 43 54 20 78  x_exec('SELECT x
2340: 20 46 52 4f 4d 20 74 32 27 29 3b 0a 20 20 20 20   FROM t2');.    
2350: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64  }.  } {0 {}}.  d
2360: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35 2e 39 20  o_test lock-5.9 
2370: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
2380: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2390: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20  ROM t3;.    }.  
23a0: 7d 20 7b 39 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  } {9}.}..do_test
23b0: 20 6c 6f 63 6b 2d 36 2e 31 20 7b 0a 20 20 65 78   lock-6.1 {.  ex
23c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
23d0: 54 45 20 54 41 42 4c 45 20 74 34 28 61 20 50 52  TE TABLE t4(a PR
23e0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
23f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2400: 34 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65  4 VALUES(1, 'one
2410: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
2420: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32 2c  NTO t4 VALUES(2,
2430: 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53   'two');.    INS
2440: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
2450: 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a  ES(3, 'three');.
2460: 20 20 7d 0a 0a 20 20 73 65 74 20 53 54 4d 54 20    }..  set STMT 
2470: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
2480: 20 24 44 42 20 22 53 45 4c 45 43 54 20 2a 20 46   $DB "SELECT * F
2490: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
24a0: 72 22 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71  r" -1 TAIL].  sq
24b0: 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54  lite3_step $STMT
24c0: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45  ..  execsql { DE
24d0: 4c 45 54 45 20 46 52 4f 4d 20 74 34 20 7d 0a 20  LETE FROM t4 }. 
24e0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
24f0: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2500: 6d 61 73 74 65 72 20 7d 20 64 62 32 0a 20 20 65  master } db2.  e
2510: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
2520: 2a 20 46 52 4f 4d 20 74 34 20 7d 20 64 62 32 0a  * FROM t4 } db2.
2530: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f  } {}..do_test lo
2540: 63 6b 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  ck-6.2 {.  execs
2550: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
2560: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2570: 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   t4 VALUES(1, 'o
2580: 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ne');.    INSERT
2590: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
25a0: 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 49  2, 'two');.    I
25b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
25c0: 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27 29  LUES(3, 'three')
25d0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
25e0: 7d 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  }..  execsql { S
25f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20  ELECT * FROM t4 
2600: 7d 20 64 62 32 0a 7d 20 7b 31 20 6f 6e 65 20 32  } db2.} {1 one 2
2610: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 64   two 3 three}..d
2620: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 36 2e 33 20  o_test lock-6.3 
2630: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
2640: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 34 20 4f  LECT a FROM t4 O
2650: 52 44 45 52 20 42 59 20 61 20 7d 20 64 62 32 0a  RDER BY a } db2.
2660: 7d 20 7b 31 20 32 20 33 7d 0a 0a 64 6f 5f 74 65  } {1 2 3}..do_te
2670: 73 74 20 6c 6f 63 6b 2d 36 2e 34 20 7b 0a 20 20  st lock-6.4 {.  
2680: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
2690: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
26a0: 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 64   } db2.} {ok}..d
26b0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 36 2e 35 20  o_test lock-6.5 
26c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  {.  sqlite3_fina
26d0: 6c 69 7a 65 20 24 53 54 4d 54 0a 7d 20 7b 53 51  lize $STMT.} {SQ
26e0: 4c 49 54 45 5f 4f 4b 7d 0a 0a 23 20 41 74 20 6f  LITE_OK}..# At o
26f0: 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 66 6f 6c  ne point the fol
2700: 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 63 6f  lowing set of co
2710: 6e 64 69 74 69 6f 6e 73 20 77 6f 75 6c 64 20 63  nditions would c
2720: 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 0a  ause SQLite to .
2730: 23 20 72 65 74 61 69 6e 20 61 20 52 45 53 45 52  # retain a RESER
2740: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
2750: 20 6c 6f 63 6b 20 61 66 74 65 72 20 74 68 65 20   lock after the 
2760: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
2770: 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 20 0a 23 20  committed:.# .# 
2780: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 2d    * The journal-
2790: 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 73  mode is set to s
27a0: 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
27b0: 68 61 6e 20 27 64 65 6c 65 74 65 27 2c 20 61 6e  han 'delete', an
27c0: 64 0a 23 20 20 20 2a 20 74 68 65 72 65 20 65 78  d.#   * there ex
27d0: 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
27e0: 20 61 63 74 69 76 65 20 72 65 61 64 2d 6f 6e 6c   active read-onl
27f0: 79 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 61 6e  y statements, an
2800: 64 0a 23 20 20 20 2a 20 61 20 74 72 61 6e 73 61  d.#   * a transa
2810: 63 74 69 6f 6e 20 74 68 61 74 20 6d 6f 64 69 66  ction that modif
2820: 69 65 64 20 7a 65 72 6f 20 64 61 74 61 62 61 73  ied zero databas
2830: 65 20 70 61 67 65 73 20 69 73 20 63 6f 6d 6d 69  e pages is commi
2840: 74 74 65 64 2e 0a 23 20 0a 73 65 74 20 74 65 6d  tted..# .set tem
2850: 70 5f 73 74 61 74 75 73 20 75 6e 6c 6f 63 6b 65  p_status unlocke
2860: 64 0a 69 66 20 7b 24 54 45 4d 50 5f 53 54 4f 52  d.if {$TEMP_STOR
2870: 45 3d 3d 33 7d 20 7b 73 65 74 20 74 65 6d 70 5f  E==3} {set temp_
2880: 73 74 61 74 75 73 20 75 6e 6b 6e 6f 77 6e 7d 0a  status unknown}.
2890: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 37 2e 31  do_test lock-7.1
28a0: 20 7b 0a 20 20 73 65 74 20 53 54 4d 54 20 5b 73   {.  set STMT [s
28b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 24  qlite3_prepare $
28c0: 44 42 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  DB "SELECT * FRO
28d0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
28e0: 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c 69   -1 TAIL].  sqli
28f0: 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 7d  te3_step $STMT.}
2900: 20 7b 53 51 4c 49 54 45 5f 52 4f 57 7d 0a 64 6f   {SQLITE_ROW}.do
2910: 5f 74 65 73 74 20 6c 6f 63 6b 2d 37 2e 32 20 7b  _test lock-7.2 {
2920: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
2930: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
2940: 7d 0a 7d 20 5b 6c 69 73 74 20 6d 61 69 6e 20 73  }.} [list main s
2950: 68 61 72 65 64 20 74 65 6d 70 20 24 74 65 6d 70  hared temp $temp
2960: 5f 73 74 61 74 75 73 5d 0a 64 6f 5f 74 65 73 74  _status].do_test
2970: 20 6c 6f 63 6b 2d 37 2e 33 20 7b 0a 20 20 65 78   lock-7.3 {.  ex
2980: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
2990: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
29a0: 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20 20 20 20  = truncate;.    
29b0: 42 45 47 49 4e 3b 0a 20 20 20 20 55 50 44 41 54  BEGIN;.    UPDAT
29c0: 45 20 74 34 20 53 45 54 20 61 20 3d 20 31 30 20  E t4 SET a = 10 
29d0: 57 48 45 52 45 20 30 3b 0a 20 20 20 20 43 4f 4d  WHERE 0;.    COM
29e0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  MIT;.  }.  execs
29f0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b  ql { PRAGMA lock
2a00: 5f 73 74 61 74 75 73 20 7d 0a 7d 20 5b 6c 69 73  _status }.} [lis
2a10: 74 20 6d 61 69 6e 20 73 68 61 72 65 64 20 74 65  t main shared te
2a20: 6d 70 20 24 74 65 6d 70 5f 73 74 61 74 75 73 5d  mp $temp_status]
2a30: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 37 2e  .do_test lock-7.
2a40: 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  4 {.  sqlite3_fi
2a50: 6e 61 6c 69 7a 65 20 24 53 54 4d 54 0a 7d 20 7b  nalize $STMT.} {
2a60: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74  SQLITE_OK}..do_t
2a70: 65 73 74 20 6c 6f 63 6b 2d 39 39 39 2e 31 20 7b  est lock-999.1 {
2a80: 0a 20 20 72 65 6e 61 6d 65 20 64 62 32 20 7b 7d  .  rename db2 {}
2a90: 0a 7d 20 7b 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  .} {}..finish_te
2aa0: 73 74 0a                                         st.