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

Artifact a280c87f86cfe25ac8899bd6cdfd23ffc5aca40a:


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 34 20 32  ck.test,v 1.34 2
01f0: 30 30 38 2f 31 31 2f 32 31 20 32 32 3a 32 31 3a  008/11/21 22:21:
0200: 35 31 20 64 72 68 20 45 78 70 20 24 0a 0a 0a 73  51 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 6d 65 20  complex pathnme 
02b0: 74 6f 20 73 74 72 65 73 73 20 74 68 65 20 70 61  to stress the pa
02c0: 74 68 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  th simplificatio
02d0: 6e 20 6c 6f 67 69 63 20 69 6e 0a 20 20 23 20 74  n logic in.  # t
02e0: 68 65 20 76 78 77 6f 72 6b 73 20 64 72 69 76 65  he vxworks drive
02f0: 72 2e 0a 20 20 66 69 6c 65 20 6d 6b 64 69 72 20  r..  file mkdir 
0300: 74 65 6d 70 64 69 72 2f 74 31 2f 74 32 0a 20 20  tempdir/t1/t2.  
0310: 73 71 6c 69 74 65 33 20 64 62 32 20 2e 2f 74 65  sqlite3 db2 ./te
0320: 6d 70 64 69 72 2f 2e 2e 2f 74 65 6d 70 64 69 72  mpdir/../tempdir
0330: 2f 74 31 2f 2e 2f 2f 74 32 2f 2e 2e 2f 2e 2e 2f  /t1/.//t2/../../
0340: 2e 2e 2f 2f 74 65 73 74 2e 64 62 0a 20 20 73 65  ..//test.db.  se
0350: 74 20 64 75 6d 6d 79 20 7b 7d 0a 7d 20 7b 7d 0a  t dummy {}.} {}.
0360: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31  do_test lock-1.1
0370: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
0380: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
0390: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
03a0: 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20  RE type='table' 
03b0: 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a 7d  ORDER BY name}.}
03c0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b   {}.do_test lock
03d0: 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.2 {.  execsql
03e0: 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   {SELECT name FR
03f0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
0400: 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
0410: 6c 65 27 20 4f 52 44 45 52 20 42 59 20 6e 61 6d  le' ORDER BY nam
0420: 65 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74  e} db2.} {}.do_t
0430: 65 73 74 20 6c 6f 63 6b 2d 31 2e 33 20 7b 0a 20  est lock-1.3 {. 
0440: 20 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54 45   execsql {CREATE
0450: 20 54 41 42 4c 45 20 74 31 28 61 20 69 6e 74 2c   TABLE t1(a int,
0460: 20 62 20 69 6e 74 29 7d 0a 20 20 65 78 65 63 73   b int)}.  execs
0470: 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20  ql {SELECT name 
0480: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
0490: 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  er WHERE type='t
04a0: 61 62 6c 65 27 20 4f 52 44 45 52 20 42 59 20 6e  able' ORDER BY n
04b0: 61 6d 65 7d 0a 7d 20 7b 74 31 7d 0a 64 6f 5f 74  ame}.} {t1}.do_t
04c0: 65 73 74 20 6c 6f 63 6b 2d 31 2e 35 20 7b 0a 20  est lock-1.5 {. 
04d0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
04e0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
04f0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
0500: 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
0510: 65 27 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65  e' ORDER BY name
0520: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 30 20 74 31  .  } db2.} {0 t1
0530: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  }..do_test lock-
0540: 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.6 {.  execsql 
0550: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  {INSERT INTO t1 
0560: 56 41 4c 55 45 53 28 31 2c 32 29 7d 0a 20 20 65  VALUES(1,2)}.  e
0570: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
0580: 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 31 20 32   FROM t1}.} {1 2
0590: 7d 0a 23 20 55 70 64 61 74 65 3a 20 54 68 65 20  }.# Update: The 
05a0: 73 63 68 65 6d 61 20 69 73 20 6e 6f 77 20 62 72  schema is now br
05b0: 6f 75 67 68 74 20 75 70 20 74 6f 20 64 61 74 65  ought up to date
05c0: 20 62 79 20 74 65 73 74 20 6c 6f 63 6b 2d 31 2e   by test lock-1.
05d0: 35 2e 0a 23 20 64 6f 5f 74 65 73 74 20 6c 6f 63  5..# do_test loc
05e0: 6b 2d 31 2e 37 2e 31 20 7b 0a 23 20 20 20 63 61  k-1.7.1 {.#   ca
05f0: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  tchsql {SELECT *
0600: 20 46 52 4f 4d 20 74 31 7d 20 64 62 32 0a 23 20   FROM t1} db2.# 
0610: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61  } {1 {no such ta
0620: 62 6c 65 3a 20 74 31 7d 7d 0a 64 6f 5f 74 65 73  ble: t1}}.do_tes
0630: 74 20 6c 6f 63 6b 2d 31 2e 37 2e 32 20 7b 0a 20  t lock-1.7.2 {. 
0640: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
0650: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32  T * FROM t1} db2
0660: 0a 7d 20 7b 30 20 7b 31 20 32 7d 7d 0a 64 6f 5f  .} {0 {1 2}}.do_
0670: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 38 20 7b 0a  test lock-1.8 {.
0680: 20 20 65 78 65 63 73 71 6c 20 7b 55 50 44 41 54    execsql {UPDAT
0690: 45 20 74 31 20 53 45 54 20 61 3d 62 2c 20 62 3d  E t1 SET a=b, b=
06a0: 61 7d 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c  a} db2.  execsql
06b0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
06c0: 74 31 7d 20 64 62 32 0a 7d 20 7b 32 20 31 7d 0a  t1} db2.} {2 1}.
06d0: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 39  do_test lock-1.9
06e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
06f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
0700: 7d 20 7b 32 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {2 1}.do_test 
0710: 6c 6f 63 6b 2d 31 2e 31 30 20 7b 0a 20 20 65 78  lock-1.10 {.  ex
0720: 65 63 73 71 6c 20 7b 42 45 47 49 4e 20 54 52 41  ecsql {BEGIN TRA
0730: 4e 53 41 43 54 49 4f 4e 7d 0a 20 20 65 78 65 63  NSACTION}.  exec
0740: 73 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53  sql {UPDATE t1 S
0750: 45 54 20 61 20 3d 20 30 20 57 48 45 52 45 20 30  ET a = 0 WHERE 0
0760: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
0770: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 7d  ECT * FROM t1}.}
0780: 20 7b 32 20 31 7d 0a 64 6f 5f 74 65 73 74 20 6c   {2 1}.do_test l
0790: 6f 63 6b 2d 31 2e 31 31 20 7b 0a 20 20 63 61 74  ock-1.11 {.  cat
07a0: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  chsql {SELECT * 
07b0: 46 52 4f 4d 20 74 31 7d 20 64 62 32 0a 7d 20 7b  FROM t1} db2.} {
07c0: 30 20 7b 32 20 31 7d 7d 0a 64 6f 5f 74 65 73 74  0 {2 1}}.do_test
07d0: 20 6c 6f 63 6b 2d 31 2e 31 32 20 7b 0a 20 20 65   lock-1.12 {.  e
07e0: 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b  xecsql {ROLLBACK
07f0: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45  }.  catchsql {SE
0800: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
0810: 7d 20 7b 30 20 7b 32 20 31 7d 7d 0a 0a 64 6f 5f  } {0 {2 1}}..do_
0820: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 33 20 7b  test lock-1.13 {
0830: 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45 41  .  execsql {CREA
0840: 54 45 20 54 41 42 4c 45 20 74 32 28 78 20 69 6e  TE TABLE t2(x in
0850: 74 2c 20 79 20 69 6e 74 29 7d 0a 20 20 65 78 65  t, y int)}.  exe
0860: 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  csql {INSERT INT
0870: 4f 20 74 32 20 56 41 4c 55 45 53 28 38 2c 39 29  O t2 VALUES(8,9)
0880: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
0890: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d  ECT * FROM t2}.}
08a0: 20 7b 38 20 39 7d 0a 64 6f 5f 74 65 73 74 20 6c   {8 9}.do_test l
08b0: 6f 63 6b 2d 31 2e 31 34 2e 31 20 7b 0a 20 20 63  ock-1.14.1 {.  c
08c0: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
08d0: 2a 20 46 52 4f 4d 20 74 32 7d 20 64 62 32 0a 7d  * FROM t2} db2.}
08e0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62   {1 {no such tab
08f0: 6c 65 3a 20 74 32 7d 7d 0a 64 6f 5f 74 65 73 74  le: t2}}.do_test
0900: 20 6c 6f 63 6b 2d 31 2e 31 34 2e 32 20 7b 0a 20   lock-1.14.2 {. 
0910: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
0920: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32  T * FROM t1} db2
0930: 0a 7d 20 7b 30 20 7b 32 20 31 7d 7d 0a 64 6f 5f  .} {0 {2 1}}.do_
0940: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 35 20 7b  test lock-1.15 {
0950: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
0960: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20 64  ECT * FROM t2} d
0970: 62 32 0a 7d 20 7b 30 20 7b 38 20 39 7d 7d 0a 0a  b2.} {0 {8 9}}..
0980: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31  do_test lock-1.1
0990: 36 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  6 {.  db eval {S
09a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
09b0: 20 71 76 20 7b 0a 20 20 20 20 73 65 74 20 78 20   qv {.    set x 
09c0: 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  [db eval {SELECT
09d0: 20 2a 20 46 52 4f 4d 20 74 31 7d 5d 0a 20 20 7d   * FROM t1}].  }
09e0: 0a 20 20 73 65 74 20 78 0a 7d 20 7b 32 20 31 7d  .  set x.} {2 1}
09f0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e  .do_test lock-1.
0a00: 31 37 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  17 {.  db eval {
0a10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0a20: 7d 20 71 76 20 7b 0a 20 20 20 20 73 65 74 20 78  } qv {.    set x
0a30: 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43   [db eval {SELEC
0a40: 54 20 2a 20 46 52 4f 4d 20 74 32 7d 5d 0a 20 20  T * FROM t2}].  
0a50: 7d 0a 20 20 73 65 74 20 78 0a 7d 20 7b 38 20 39  }.  set x.} {8 9
0a60: 7d 0a 0a 23 20 59 6f 75 20 63 61 6e 6e 6f 74 20  }..# You cannot 
0a70: 55 50 44 41 54 45 20 61 20 74 61 62 6c 65 20 66  UPDATE a table f
0a80: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63  rom within the c
0a90: 61 6c 6c 62 61 63 6b 20 6f 66 20 61 20 53 45 4c  allback of a SEL
0aa0: 45 43 54 0a 23 20 6f 6e 20 74 68 61 74 20 73 61  ECT.# on that sa
0ab0: 6d 65 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  me table because
0ac0: 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
0ad0: 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64  the table locked
0ae0: 2e 0a 23 0a 23 20 32 30 30 36 2d 30 38 2d 31 36  ..#.# 2006-08-16
0af0: 3a 20 20 52 65 61 64 73 20 6e 6f 20 6c 6f 6e 67  :  Reads no long
0b00: 65 72 20 62 6c 6f 63 6b 20 77 72 69 74 65 73 20  er block writes 
0b10: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
0b20: 23 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  # database conne
0b30: 63 74 69 6f 6e 2e 0a 23 0a 23 64 6f 5f 74 65 73  ction..#.#do_tes
0b40: 74 20 6c 6f 63 6b 2d 31 2e 31 38 20 7b 0a 23 20  t lock-1.18 {.# 
0b50: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
0b60: 20 2a 20 46 52 4f 4d 20 74 31 7d 20 71 76 20 7b   * FROM t1} qv {
0b70: 0a 23 20 20 20 20 73 65 74 20 72 20 5b 63 61 74  .#    set r [cat
0b80: 63 68 20 7b 64 62 20 65 76 61 6c 20 7b 55 50 44  ch {db eval {UPD
0b90: 41 54 45 20 74 31 20 53 45 54 20 61 3d 62 2c 20  ATE t1 SET a=b, 
0ba0: 62 3d 61 7d 7d 20 6d 73 67 5d 0a 23 20 20 20 20  b=a}} msg].#    
0bb0: 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 23  lappend r $msg.#
0bc0: 20 20 7d 0a 23 20 20 73 65 74 20 72 0a 23 7d 20    }.#  set r.#} 
0bd0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 74 61 62  {1 {database tab
0be0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  le is locked}}..
0bf0: 23 20 42 75 74 20 79 6f 75 20 63 61 6e 20 55 50  # But you can UP
0c00: 44 41 54 45 20 61 20 64 69 66 66 65 72 65 6e 74  DATE a different
0c10: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
0c20: 6f 6e 65 20 74 68 61 74 20 69 73 20 75 73 65 64  one that is used
0c30: 20 69 6e 0a 23 20 74 68 65 20 53 45 4c 45 43 54   in.# the SELECT
0c40: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  ..#.do_test lock
0c50: 2d 31 2e 31 39 20 7b 0a 20 20 64 62 20 65 76 61  -1.19 {.  db eva
0c60: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
0c70: 20 74 31 7d 20 71 76 20 7b 0a 20 20 20 20 73 65   t1} qv {.    se
0c80: 74 20 72 20 5b 63 61 74 63 68 20 7b 64 62 20 65  t r [catch {db e
0c90: 76 61 6c 20 7b 55 50 44 41 54 45 20 74 32 20 53  val {UPDATE t2 S
0ca0: 45 54 20 78 3d 79 2c 20 79 3d 78 7d 7d 20 6d 73  ET x=y, y=x}} ms
0cb0: 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72  g].    lappend r
0cc0: 20 24 6d 73 67 0a 20 20 7d 0a 20 20 73 65 74 20   $msg.  }.  set 
0cd0: 72 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65  r.} {0 {}}.do_te
0ce0: 73 74 20 6c 6f 63 6b 2d 31 2e 32 30 20 7b 0a 20  st lock-1.20 {. 
0cf0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
0d00: 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 39   * FROM t2}.} {9
0d10: 20 38 7d 0a 0a 23 20 49 74 20 69 73 20 70 6f 73   8}..# It is pos
0d20: 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 53 45  sible to do a SE
0d30: 4c 45 43 54 20 6f 66 20 74 68 65 20 73 61 6d 65  LECT of the same
0d40: 20 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74 68   table within th
0d50: 65 0a 23 20 63 61 6c 6c 62 61 63 6b 20 6f 66 20  e.# callback of 
0d60: 61 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 6f  another SELECT o
0d70: 6e 20 74 68 61 74 20 73 61 6d 65 20 74 61 62 6c  n that same tabl
0d80: 65 20 62 65 63 61 75 73 65 20 74 77 6f 0a 23 20  e because two.# 
0d90: 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c  or more read-onl
0da0: 79 20 63 75 72 73 6f 72 73 20 63 61 6e 20 62 65  y cursors can be
0db0: 20 6f 70 65 6e 20 61 74 20 6f 6e 63 65 2e 0a 23   open at once..#
0dc0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e  .do_test lock-1.
0dd0: 32 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  21 {.  db eval {
0de0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0df0: 7d 20 71 76 20 7b 0a 20 20 20 20 73 65 74 20 72  } qv {.    set r
0e00: 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76 61 6c   [catch {db eval
0e10: 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   {SELECT a FROM 
0e20: 74 31 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 61  t1}} msg].    la
0e30: 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 7d  ppend r $msg.  }
0e40: 0a 20 20 73 65 74 20 72 0a 7d 20 7b 30 20 32 7d  .  set r.} {0 2}
0e50: 0a 0a 23 20 55 6e 64 65 72 20 55 4e 49 58 20 79  ..# Under UNIX y
0e60: 6f 75 20 63 61 6e 20 64 6f 20 74 77 6f 20 53 45  ou can do two SE
0e70: 4c 45 43 54 73 20 61 74 20 6f 6e 63 65 20 77 69  LECTs at once wi
0e80: 74 68 20 64 69 66 66 65 72 65 6e 74 20 64 61 74  th different dat
0e90: 61 62 61 73 65 0a 23 20 63 6f 6e 6e 65 63 74 69  abase.# connecti
0ea0: 6f 6e 73 2c 20 62 65 63 61 75 73 65 20 55 4e 49  ons, because UNI
0eb0: 58 20 73 75 70 70 6f 72 74 73 20 72 65 61 64 65  X supports reade
0ec0: 72 2f 77 72 69 74 65 72 20 6c 6f 63 6b 73 2e 20  r/writer locks. 
0ed0: 20 55 6e 64 65 72 20 77 69 6e 64 6f 77 73 2c 0a   Under windows,.
0ee0: 23 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f  # this is not po
0ef0: 73 73 69 62 6c 65 2e 0a 23 0a 69 66 20 7b 24 3a  ssible..#.if {$:
0f00: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  :tcl_platform(pl
0f10: 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d  atform)=="unix"}
0f20: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 6c 6f 63   {.  do_test loc
0f30: 6b 2d 31 2e 32 32 20 7b 0a 20 20 20 20 64 62 20  k-1.22 {.    db 
0f40: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
0f50: 52 4f 4d 20 74 31 7d 20 71 76 20 7b 0a 20 20 20  ROM t1} qv {.   
0f60: 20 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20     set r [catch 
0f70: 7b 64 62 32 20 65 76 61 6c 20 7b 53 45 4c 45 43  {db2 eval {SELEC
0f80: 54 20 61 20 46 52 4f 4d 20 74 31 7d 7d 20 6d 73  T a FROM t1}} ms
0f90: 67 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64  g].      lappend
0fa0: 20 72 20 24 6d 73 67 0a 20 20 20 20 7d 0a 20 20   r $msg.    }.  
0fb0: 20 20 73 65 74 20 72 0a 20 20 7d 20 7b 30 20 32    set r.  } {0 2
0fc0: 7d 0a 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68  }.}.integrity_ch
0fd0: 65 63 6b 20 6c 6f 63 6b 2d 31 2e 32 33 0a 0a 23  eck lock-1.23..#
0fe0: 20 49 66 20 6f 6e 65 20 74 68 72 65 61 64 20 68   If one thread h
0ff0: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
1000: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
1010: 63 61 6e 6e 6f 74 20 73 74 61 72 74 0a 23 20 61  cannot start.# a
1020: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2d   transaction.  -
1030: 3e 20 4e 6f 74 20 74 72 75 65 20 69 6e 20 76 65  > Not true in ve
1040: 72 73 69 6f 6e 20 33 2e 30 2e 20 20 42 75 74 20  rsion 3.0.  But 
1050: 69 66 20 6f 6e 65 20 74 68 72 65 61 64 0a 23 20  if one thread.# 
1060: 61 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  as a RESERVED lo
1070: 63 6b 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ck another threa
1080: 64 20 63 61 6e 6e 6f 74 20 61 63 71 75 69 72 65  d cannot acquire
1090: 20 6f 6e 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20   one..#.do_test 
10a0: 6c 6f 63 6b 2d 32 2e 31 20 7b 0a 20 20 65 78 65  lock-2.1 {.  exe
10b0: 63 73 71 6c 20 7b 42 45 47 49 4e 20 54 52 41 4e  csql {BEGIN TRAN
10c0: 53 41 43 54 49 4f 4e 7d 0a 20 20 65 78 65 63 73  SACTION}.  execs
10d0: 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45  ql {UPDATE t1 SE
10e0: 54 20 61 20 3d 20 30 20 57 48 45 52 45 20 30 7d  T a = 0 WHERE 0}
10f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 42 45 47 49  .  execsql {BEGI
1100: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d 20 64  N TRANSACTION} d
1110: 62 32 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63  b2.  set r [catc
1120: 68 20 7b 65 78 65 63 73 71 6c 20 7b 55 50 44 41  h {execsql {UPDA
1130: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 30 20  TE t1 SET a = 0 
1140: 57 48 45 52 45 20 30 7d 20 64 62 32 7d 20 6d 73  WHERE 0} db2} ms
1150: 67 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 52 4f  g].  execsql {RO
1160: 4c 4c 42 41 43 4b 7d 20 64 62 32 0a 20 20 6c 61  LLBACK} db2.  la
1170: 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b  ppend r $msg.} {
1180: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1190: 6f 63 6b 65 64 7d 7d 0a 0a 23 20 41 20 74 68 72  ocked}}..# A thr
11a0: 65 61 64 20 63 61 6e 20 72 65 61 64 20 77 68 65  ead can read whe
11b0: 6e 20 61 6e 6f 74 68 65 72 20 68 61 73 20 61 20  n another has a 
11c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 23  RESERVED lock..#
11d0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e  .do_test lock-2.
11e0: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
11f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1200: 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 39 20 38 7d  } db2.} {0 {9 8}
1210: 7d 0a 0a 23 20 49 66 20 74 68 65 20 6f 74 68 65  }..# If the othe
1220: 72 20 74 68 72 65 61 64 20 28 74 68 65 20 6f 6e  r thread (the on
1230: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1240: 68 6f 6c 64 20 74 68 65 20 74 72 61 6e 73 61 63  hold the transac
1250: 74 69 6f 6e 20 77 69 74 68 0a 23 20 61 20 52 45  tion with.# a RE
1260: 53 45 52 56 45 44 20 6c 6f 63 6b 29 20 74 72 69  SERVED lock) tri
1270: 65 73 20 74 6f 20 67 65 74 20 61 20 52 45 53 45  es to get a RESE
1280: 52 56 45 44 20 6c 6f 63 6b 2c 20 77 65 20 64 6f  RVED lock, we do
1290: 20 67 65 74 20 61 20 62 75 73 79 20 63 61 6c 6c   get a busy call
12a0: 62 61 63 6b 0a 23 20 61 73 20 6c 6f 6e 67 20 61  back.# as long a
12b0: 73 20 77 65 20 77 65 72 65 20 6e 6f 74 20 6f 72  s we were not or
12c0: 67 69 6e 61 6c 6c 79 20 68 6f 6c 64 69 6e 67 20  ginally holding 
12d0: 61 20 52 45 41 44 20 6c 6f 63 6b 2e 0a 23 0a 64  a READ lock..#.d
12e0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e 33 2e  o_test lock-2.3.
12f0: 31 20 7b 0a 20 20 70 72 6f 63 20 63 61 6c 6c 62  1 {.  proc callb
1300: 61 63 6b 20 7b 63 6f 75 6e 74 7d 20 7b 0a 20 20  ack {count} {.  
1310: 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63 6b    set ::callback
1320: 5f 76 61 6c 75 65 20 24 63 6f 75 6e 74 0a 20 20  _value $count.  
1330: 20 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 73 65    break.  }.  se
1340: 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c  t ::callback_val
1350: 75 65 20 7b 7d 0a 20 20 64 62 32 20 62 75 73 79  ue {}.  db2 busy
1360: 20 63 61 6c 6c 62 61 63 6b 0a 20 20 23 20 64 62   callback.  # db
1370: 32 20 64 6f 65 73 20 6e 6f 74 20 68 6f 6c 64 20  2 does not hold 
1380: 61 20 6c 6f 63 6b 20 73 6f 20 77 65 20 73 68 6f  a lock so we sho
1390: 75 6c 64 20 67 65 74 20 61 20 62 75 73 79 20 63  uld get a busy c
13a0: 61 6c 6c 62 61 63 6b 20 68 65 72 65 0a 20 20 73  allback here.  s
13b0: 65 74 20 72 20 5b 63 61 74 63 68 20 7b 65 78 65  et r [catch {exe
13c0: 63 73 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20  csql {UPDATE t1 
13d0: 53 45 54 20 61 3d 62 2c 20 62 3d 61 7d 20 64 62  SET a=b, b=a} db
13e0: 32 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  2} msg].  lappen
13f0: 64 20 72 20 24 6d 73 67 0a 20 20 6c 61 70 70 65  d r $msg.  lappe
1400: 6e 64 20 72 20 24 3a 3a 63 61 6c 6c 62 61 63 6b  nd r $::callback
1410: 5f 76 61 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74  _value.} {1 {dat
1420: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1430: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b   0}.do_test lock
1440: 2d 32 2e 33 2e 32 20 7b 0a 20 20 73 65 74 20 3a  -2.3.2 {.  set :
1450: 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20  :callback_value 
1460: 7b 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 42 45  {}.  execsql {BE
1470: 47 49 4e 3b 20 53 45 4c 45 43 54 20 72 6f 77 69  GIN; SELECT rowi
1480: 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  d FROM sqlite_ma
1490: 73 74 65 72 20 4c 49 4d 49 54 20 31 7d 20 64 62  ster LIMIT 1} db
14a0: 32 0a 20 20 23 20 54 68 69 73 20 74 69 6d 65 20  2.  # This time 
14b0: 64 62 32 20 64 6f 65 73 20 68 6f 6c 64 20 61 20  db2 does hold a 
14c0: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 4e 6f 20 62  read lock.  No b
14d0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 69  usy callback thi
14e0: 73 20 74 69 6d 65 2e 0a 20 20 73 65 74 20 72 20  s time..  set r 
14f0: 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20  [catch {execsql 
1500: 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61  {UPDATE t1 SET a
1510: 3d 62 2c 20 62 3d 61 7d 20 64 62 32 7d 20 6d 73  =b, b=a} db2} ms
1520: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 20 24  g].  lappend r $
1530: 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20 72 20  msg.  lappend r 
1540: 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75  $::callback_valu
1550: 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  e.} {1 {database
1560: 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b 7d 7d 0a   is locked} {}}.
1570: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
1580: 52 4f 4c 4c 42 41 43 4b 7d 20 64 62 32 7d 0a 64  ROLLBACK} db2}.d
1590: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e 34 2e  o_test lock-2.4.
15a0: 31 20 7b 0a 20 20 70 72 6f 63 20 63 61 6c 6c 62  1 {.  proc callb
15b0: 61 63 6b 20 7b 63 6f 75 6e 74 7d 20 7b 0a 20 20  ack {count} {.  
15c0: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 63 61 6c 6c    lappend ::call
15d0: 62 61 63 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e  back_value $coun
15e0: 74 0a 20 20 20 20 69 66 20 7b 24 63 6f 75 6e 74  t.    if {$count
15f0: 3e 34 7d 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20  >4} break.  }.  
1600: 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76  set ::callback_v
1610: 61 6c 75 65 20 7b 7d 0a 20 20 64 62 32 20 62 75  alue {}.  db2 bu
1620: 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20 20 23 20  sy callback.  # 
1630: 57 65 20 67 65 74 20 61 20 62 75 73 79 20 63 61  We get a busy ca
1640: 6c 6c 62 61 63 6b 20 62 65 63 61 75 73 65 20 64  llback because d
1650: 62 32 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  b2 is not holdin
1660: 67 20 61 20 6c 6f 63 6b 0a 20 20 73 65 74 20 72  g a lock.  set r
1670: 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c   [catch {execsql
1680: 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20   {UPDATE t1 SET 
1690: 61 3d 62 2c 20 62 3d 61 7d 20 64 62 32 7d 20 6d  a=b, b=a} db2} m
16a0: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 20  sg].  lappend r 
16b0: 24 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20 72  $msg.  lappend r
16c0: 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c   $::callback_val
16d0: 75 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  ue.} {1 {databas
16e0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b 30 20  e is locked} {0 
16f0: 31 20 32 20 33 20 34 20 35 7d 7d 0a 64 6f 5f 74  1 2 3 4 5}}.do_t
1700: 65 73 74 20 6c 6f 63 6b 2d 32 2e 34 2e 32 20 7b  est lock-2.4.2 {
1710: 0a 20 20 70 72 6f 63 20 63 61 6c 6c 62 61 63 6b  .  proc callback
1720: 20 7b 63 6f 75 6e 74 7d 20 7b 0a 20 20 20 20 6c   {count} {.    l
1730: 61 70 70 65 6e 64 20 3a 3a 63 61 6c 6c 62 61 63  append ::callbac
1740: 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e 74 0a 20  k_value $count. 
1750: 20 20 20 69 66 20 7b 24 63 6f 75 6e 74 3e 34 7d     if {$count>4}
1760: 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 73 65 74   break.  }.  set
1770: 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75   ::callback_valu
1780: 65 20 7b 7d 0a 20 20 64 62 32 20 62 75 73 79 20  e {}.  db2 busy 
1790: 63 61 6c 6c 62 61 63 6b 0a 20 20 65 78 65 63 73  callback.  execs
17a0: 71 6c 20 7b 42 45 47 49 4e 3b 20 53 45 4c 45 43  ql {BEGIN; SELEC
17b0: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  T rowid FROM sql
17c0: 69 74 65 5f 6d 61 73 74 65 72 20 4c 49 4d 49 54  ite_master LIMIT
17d0: 20 31 7d 20 64 62 32 0a 20 20 23 20 4e 6f 20 62   1} db2.  # No b
17e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 69  usy callback thi
17f0: 73 20 74 69 6d 65 20 62 65 63 61 75 73 65 20 77  s time because w
1800: 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
1810: 6c 6f 63 6b 0a 20 20 73 65 74 20 72 20 5b 63 61  lock.  set r [ca
1820: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 55 50  tch {execsql {UP
1830: 44 41 54 45 20 74 31 20 53 45 54 20 61 3d 62 2c  DATE t1 SET a=b,
1840: 20 62 3d 61 7d 20 64 62 32 7d 20 6d 73 67 5d 0a   b=a} db2} msg].
1850: 20 20 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67    lappend r $msg
1860: 0a 20 20 6c 61 70 70 65 6e 64 20 72 20 24 3a 3a  .  lappend r $::
1870: 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 0a 7d  callback_value.}
1880: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
1890: 20 6c 6f 63 6b 65 64 7d 20 7b 7d 7d 0a 63 61 74   locked} {}}.cat
18a0: 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 52 4f 4c  ch {execsql {ROL
18b0: 4c 42 41 43 4b 7d 20 64 62 32 7d 0a 64 6f 5f 74  LBACK} db2}.do_t
18c0: 65 73 74 20 6c 6f 63 6b 2d 32 2e 35 20 7b 0a 20  est lock-2.5 {. 
18d0: 20 70 72 6f 63 20 63 61 6c 6c 62 61 63 6b 20 7b   proc callback {
18e0: 63 6f 75 6e 74 7d 20 7b 0a 20 20 20 20 6c 61 70  count} {.    lap
18f0: 70 65 6e 64 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f  pend ::callback_
1900: 76 61 6c 75 65 20 24 63 6f 75 6e 74 0a 20 20 20  value $count.   
1910: 20 69 66 20 7b 24 63 6f 75 6e 74 3e 34 7d 20 62   if {$count>4} b
1920: 72 65 61 6b 0a 20 20 7d 0a 20 20 73 65 74 20 3a  reak.  }.  set :
1930: 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20  :callback_value 
1940: 7b 7d 0a 20 20 64 62 32 20 62 75 73 79 20 63 61  {}.  db2 busy ca
1950: 6c 6c 62 61 63 6b 0a 20 20 73 65 74 20 72 20 5b  llback.  set r [
1960: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
1970: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1980: 7d 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20 6c 61  } db2} msg].  la
1990: 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 6c  ppend r $msg.  l
19a0: 61 70 70 65 6e 64 20 72 20 24 3a 3a 63 61 6c 6c  append r $::call
19b0: 62 61 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b 30 20  back_value.} {0 
19c0: 7b 32 20 31 7d 20 7b 7d 7d 0a 65 78 65 63 73 71  {2 1} {}}.execsq
19d0: 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 0a 0a 23 20  l {ROLLBACK}..# 
19e0: 54 65 73 74 20 74 68 65 20 62 75 69 6c 74 2d 69  Test the built-i
19f0: 6e 20 62 75 73 79 20 74 69 6d 65 6f 75 74 20 68  n busy timeout h
1a00: 61 6e 64 6c 65 72 0a 23 0a 64 6f 5f 74 65 73 74  andler.#.do_test
1a10: 20 6c 6f 63 6b 2d 32 2e 38 20 7b 0a 20 20 64 62   lock-2.8 {.  db
1a20: 32 20 74 69 6d 65 6f 75 74 20 34 30 30 0a 20 20  2 timeout 400.  
1a30: 65 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 20 20  execsql BEGIN.  
1a40: 65 78 65 63 73 71 6c 20 7b 55 50 44 41 54 45 20  execsql {UPDATE 
1a50: 74 31 20 53 45 54 20 61 20 3d 20 30 20 57 48 45  t1 SET a = 0 WHE
1a60: 52 45 20 30 7d 0a 20 20 63 61 74 63 68 73 71 6c  RE 0}.  catchsql
1a70: 20 7b 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   {BEGIN EXCLUSIV
1a80: 45 3b 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61  E;} db2.} {1 {da
1a90: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
1aa0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  }}.do_test lock-
1ab0: 32 2e 39 20 7b 0a 20 20 64 62 32 20 74 69 6d 65  2.9 {.  db2 time
1ac0: 6f 75 74 20 30 0a 20 20 65 78 65 63 73 71 6c 20  out 0.  execsql 
1ad0: 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 69 6e 74 65  COMMIT.} {}.inte
1ae0: 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 63 6b  grity_check lock
1af0: 2d 32 2e 31 30 0a 0a 23 20 54 72 79 20 74 6f 20  -2.10..# Try to 
1b00: 73 74 61 72 74 20 74 77 6f 20 74 72 61 6e 73 61  start two transa
1b10: 63 74 69 6f 6e 73 20 69 6e 20 61 20 72 6f 77 0a  ctions in a row.
1b20: 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 33  #.do_test lock-3
1b30: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
1b40: 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f  BEGIN TRANSACTIO
1b50: 4e 7d 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63  N}.  set r [catc
1b60: 68 20 7b 65 78 65 63 73 71 6c 20 7b 42 45 47 49  h {execsql {BEGI
1b70: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d 7d 20  N TRANSACTION}} 
1b80: 6d 73 67 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b  msg].  execsql {
1b90: 52 4f 4c 4c 42 41 43 4b 7d 0a 20 20 6c 61 70 70  ROLLBACK}.  lapp
1ba0: 65 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b 31 20  end r $msg.} {1 
1bb0: 7b 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  {cannot start a 
1bc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
1bd0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1be0: 7d 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65  }}.integrity_che
1bf0: 63 6b 20 6c 6f 63 6b 2d 33 2e 32 0a 0a 23 20 4d  ck lock-3.2..# M
1c00: 61 6b 65 20 73 75 72 65 20 74 68 65 20 62 75 73  ake sure the bus
1c10: 79 20 68 61 6e 64 6c 65 72 20 61 6e 64 20 65 72  y handler and er
1c20: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 6f 72  ror messages wor
1c30: 6b 20 77 68 65 6e 0a 23 20 6f 70 65 6e 69 6e 67  k when.# opening
1c40: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74   a new pointer t
1c50: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  o the database w
1c60: 68 69 6c 65 20 61 6e 6f 74 68 65 72 20 70 6f 69  hile another poi
1c70: 6e 74 65 72 0a 23 20 68 61 73 20 74 68 65 20 64  nter.# has the d
1c80: 61 74 61 62 61 73 65 20 6c 6f 63 6b 65 64 2e 0a  atabase locked..
1c90: 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 34  #.do_test lock-4
1ca0: 2e 31 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65  .1 {.  db2 close
1cb0: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 65 76 61  .  catch {db eva
1cc0: 6c 20 52 4f 4c 4c 42 41 43 4b 7d 0a 20 20 64 62  l ROLLBACK}.  db
1cd0: 20 65 76 61 6c 20 42 45 47 49 4e 0a 20 20 64 62   eval BEGIN.  db
1ce0: 20 65 76 61 6c 20 7b 55 50 44 41 54 45 20 74 31   eval {UPDATE t1
1cf0: 20 53 45 54 20 61 3d 30 20 57 48 45 52 45 20 30   SET a=0 WHERE 0
1d00: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  }.  sqlite3 db2 
1d10: 2e 2f 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  ./test.db.  catc
1d20: 68 73 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20  hsql {UPDATE t1 
1d30: 53 45 54 20 61 3d 30 7d 20 64 62 32 0a 7d 20 7b  SET a=0} db2.} {
1d40: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1d50: 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ocked}}.do_test 
1d60: 6c 6f 63 6b 2d 34 2e 32 20 7b 0a 20 20 73 65 74  lock-4.2 {.  set
1d70: 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75   ::callback_valu
1d80: 65 20 7b 7d 0a 20 20 73 65 74 20 72 63 20 5b 63  e {}.  set rc [c
1d90: 61 74 63 68 20 7b 64 62 32 20 65 76 61 6c 20 7b  atch {db2 eval {
1da0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 3d  UPDATE t1 SET a=
1db0: 30 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  0}} msg].  lappe
1dc0: 6e 64 20 72 63 20 24 6d 73 67 20 24 3a 3a 63 61  nd rc $msg $::ca
1dd0: 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b  llback_value.} {
1de0: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1df0: 6f 63 6b 65 64 7d 20 7b 7d 7d 0a 64 6f 5f 74 65  ocked} {}}.do_te
1e00: 73 74 20 6c 6f 63 6b 2d 34 2e 33 20 7b 0a 20 20  st lock-4.3 {.  
1e10: 70 72 6f 63 20 63 61 6c 6c 62 61 63 6b 20 7b 63  proc callback {c
1e20: 6f 75 6e 74 7d 20 7b 0a 20 20 20 20 6c 61 70 70  ount} {.    lapp
1e30: 65 6e 64 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76  end ::callback_v
1e40: 61 6c 75 65 20 24 63 6f 75 6e 74 0a 20 20 20 20  alue $count.    
1e50: 69 66 20 7b 24 63 6f 75 6e 74 3e 34 7d 20 62 72  if {$count>4} br
1e60: 65 61 6b 0a 20 20 7d 0a 20 20 64 62 32 20 62 75  eak.  }.  db2 bu
1e70: 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20 20 73 65  sy callback.  se
1e80: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62 32  t rc [catch {db2
1e90: 20 65 76 61 6c 20 7b 55 50 44 41 54 45 20 74 31   eval {UPDATE t1
1ea0: 20 53 45 54 20 61 3d 30 7d 7d 20 6d 73 67 5d 0a   SET a=0}} msg].
1eb0: 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73    lappend rc $ms
1ec0: 67 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61  g $::callback_va
1ed0: 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  lue.} {1 {databa
1ee0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b 30  se is locked} {0
1ef0: 20 31 20 32 20 33 20 34 20 35 7d 7d 0a 65 78 65   1 2 3 4 5}}.exe
1f00: 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 0a  csql {ROLLBACK}.
1f10: 0a 23 20 57 68 65 6e 20 6f 6e 65 20 74 68 72 65  .# When one thre
1f20: 61 64 20 69 73 20 77 72 69 74 69 6e 67 2c 20 6f  ad is writing, o
1f30: 74 68 65 72 20 74 68 72 65 61 64 73 20 63 61 6e  ther threads can
1f40: 6e 6f 74 20 72 65 61 64 2e 20 20 45 78 63 65 70  not read.  Excep
1f50: 74 20 69 66 20 74 68 65 0a 23 20 77 72 69 74 69  t if the.# writi
1f60: 6e 67 20 74 68 72 65 61 64 20 69 73 20 77 72 69  ng thread is wri
1f70: 74 69 6e 67 20 74 6f 20 69 74 73 20 74 65 6d 70  ting to its temp
1f80: 6f 72 61 72 79 20 74 61 62 6c 65 73 2c 20 74 68  orary tables, th
1f90: 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 0a  e other threads.
1fa0: 23 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64  # can still read
1fb0: 2e 20 20 2d 3e 20 4e 6f 74 20 73 6f 20 69 6e 20  .  -> Not so in 
1fc0: 33 2e 30 2e 20 20 4f 6e 65 20 74 68 72 65 61 64  3.0.  One thread
1fd0: 20 63 61 6e 20 72 65 61 64 20 77 68 69 6c 65 20   can read while 
1fe0: 61 6e 6f 74 68 65 72 0a 23 20 68 6f 6c 64 73 20  another.# holds 
1ff0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
2000: 0a 23 0a 70 72 6f 63 20 74 78 5f 65 78 65 63 20  .#.proc tx_exec 
2010: 7b 73 71 6c 7d 20 7b 0a 20 20 64 62 32 20 65 76  {sql} {.  db2 ev
2020: 61 6c 20 24 73 71 6c 0a 7d 0a 64 6f 5f 74 65 73  al $sql.}.do_tes
2030: 74 20 6c 6f 63 6b 2d 35 2e 31 20 7b 0a 20 20 65  t lock-5.1 {.  e
2040: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
2050: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20  ECT * FROM t1.  
2060: 7d 0a 7d 20 7b 32 20 31 7d 0a 64 6f 5f 74 65 73  }.} {2 1}.do_tes
2070: 74 20 6c 6f 63 6b 2d 35 2e 32 20 7b 0a 20 20 64  t lock-5.2 {.  d
2080: 62 20 66 75 6e 63 74 69 6f 6e 20 74 78 5f 65 78  b function tx_ex
2090: 65 63 20 74 78 5f 65 78 65 63 0a 20 20 63 61 74  ec tx_exec.  cat
20a0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  chsql {.    INSE
20b0: 52 54 20 49 4e 54 4f 20 74 31 28 61 2c 62 29 20  RT INTO t1(a,b) 
20c0: 53 45 4c 45 43 54 20 33 2c 20 74 78 5f 65 78 65  SELECT 3, tx_exe
20d0: 63 28 27 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  c('SELECT y FROM
20e0: 20 74 32 20 4c 49 4d 49 54 20 31 27 29 3b 0a 20   t2 LIMIT 1');. 
20f0: 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 69 66 63   }.} {0 {}}..ifc
2100: 61 70 61 62 6c 65 20 74 65 6d 70 64 62 20 7b 0a  apable tempdb {.
2110: 20 20 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35    do_test lock-5
2120: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
2130: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
2140: 54 45 4d 50 20 54 41 42 4c 45 20 74 33 28 78 29  TEMP TABLE t3(x)
2150: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
2160: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a   FROM t3;.    }.
2170: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
2180: 20 6c 6f 63 6b 2d 35 2e 34 20 7b 0a 20 20 20 20   lock-5.4 {.    
2190: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20  catchsql {.     
21a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
21b0: 53 45 4c 45 43 54 20 74 78 5f 65 78 65 63 28 27  SELECT tx_exec('
21c0: 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32  SELECT y FROM t2
21d0: 20 4c 49 4d 49 54 20 31 27 29 3b 0a 20 20 20 20   LIMIT 1');.    
21e0: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64  }.  } {0 {}}.  d
21f0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35 2e 35 20  o_test lock-5.5 
2200: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
2210: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2220: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20  ROM t3;.    }.  
2230: 7d 20 7b 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20  } {8}.  do_test 
2240: 6c 6f 63 6b 2d 35 2e 36 20 7b 0a 20 20 20 20 63  lock-5.6 {.    c
2250: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
2260: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 3d  UPDATE t1 SET a=
2270: 74 78 5f 65 78 65 63 28 27 53 45 4c 45 43 54 20  tx_exec('SELECT 
2280: 78 20 46 52 4f 4d 20 74 32 27 29 3b 0a 20 20 20  x FROM t2');.   
2290: 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20   }.  } {0 {}}.  
22a0: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35 2e 37  do_test lock-5.7
22b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
22c0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
22d0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20  FROM t1;.    }. 
22e0: 20 7d 20 7b 39 20 31 20 39 20 38 7d 0a 20 20 64   } {9 1 9 8}.  d
22f0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 35 2e 38 20  o_test lock-5.8 
2300: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
2310: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 33  .      UPDATE t3
2320: 20 53 45 54 20 78 3d 74 78 5f 65 78 65 63 28 27   SET x=tx_exec('
2330: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
2340: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30  ');.    }.  } {0
2350: 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c   {}}.  do_test l
2360: 6f 63 6b 2d 35 2e 39 20 7b 0a 20 20 20 20 65 78  ock-5.9 {.    ex
2370: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
2380: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a  LECT * FROM t3;.
2390: 20 20 20 20 7d 0a 20 20 7d 20 7b 39 7d 0a 7d 0a      }.  } {9}.}.
23a0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 39 39  .do_test lock-99
23b0: 39 2e 31 20 7b 0a 20 20 72 65 6e 61 6d 65 20 64  9.1 {.  rename d
23c0: 62 32 20 7b 7d 0a 7d 20 7b 7d 0a 0a 66 69 6e 69  b2 {}.} {}..fini
23d0: 73 68 5f 74 65 73 74 0a                          sh_test.