/ Hex Artifact Content
Login

Artifact 19593689260c419efe7ced55b1418653a4b7bcd1:


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 31 33 20 32  ck.test,v 1.13 2
01f0: 30 30 31 2f 31 30 2f 30 39 20 30 34 3a 31 39 3a  001/10/09 04:19:
0200: 34 37 20 64 72 68 20 45 78 70 20 24 0a 0a 0a 73  47 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 73 71 6c 69 74 65 20 64 62  .0 {.  sqlite db
02a0: 32 20 2e 2f 74 65 73 74 2e 64 62 0a 7d 20 7b 7d  2 ./test.db.} {}
02b0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e  .do_test lock-1.
02c0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  1 {.  execsql {S
02d0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
02e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
02f0: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
0300: 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a   ORDER BY name}.
0310: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63  } {}.do_test loc
0320: 6b 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  k-1.2 {.  execsq
0330: 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  l {SELECT name F
0340: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0350: 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  r WHERE type='ta
0360: 62 6c 65 27 20 4f 52 44 45 52 20 42 59 20 6e 61  ble' ORDER BY na
0370: 6d 65 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f  me} db2.} {}.do_
0380: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 33 20 7b 0a  test lock-1.3 {.
0390: 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54    execsql {CREAT
03a0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 69 6e 74  E TABLE t1(a int
03b0: 2c 20 62 20 69 6e 74 29 7d 0a 20 20 65 78 65 63  , b int)}.  exec
03c0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65  sql {SELECT name
03d0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
03e0: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
03f0: 74 61 62 6c 65 27 20 4f 52 44 45 52 20 42 59 20  table' ORDER BY 
0400: 6e 61 6d 65 7d 0a 7d 20 7b 74 31 7d 0a 64 6f 5f  name}.} {t1}.do_
0410: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 34 20 7b 0a  test lock-1.4 {.
0420: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0430: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
0440: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
0450: 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
0460: 65 27 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65  e' ORDER BY name
0470: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  .  } db2.} {1 {d
0480: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
0490: 61 73 20 63 68 61 6e 67 65 64 7d 7d 0a 64 6f 5f  as changed}}.do_
04a0: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 35 20 7b 0a  test lock-1.5 {.
04b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
04c0: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
04d0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
04e0: 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
04f0: 6c 65 27 20 4f 52 44 45 52 20 42 59 20 6e 61 6d  le' ORDER BY nam
0500: 65 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 30 20 74  e.  } db2.} {0 t
0510: 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  1}..do_test lock
0520: 2d 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.6 {.  execsql
0530: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   {INSERT INTO t1
0540: 20 56 41 4c 55 45 53 28 31 2c 32 29 7d 0a 20 20   VALUES(1,2)}.  
0550: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0560: 2a 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 31 20  * FROM t1}.} {1 
0570: 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d  2}.do_test lock-
0580: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
0590: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
05a0: 31 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64  1} db2.} {1 2}.d
05b0: 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 38 20  o_test lock-1.8 
05c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 55 50 44  {.  execsql {UPD
05d0: 41 54 45 20 74 31 20 53 45 54 20 61 3d 62 2c 20  ATE t1 SET a=b, 
05e0: 62 3d 61 7d 20 64 62 32 0a 20 20 65 78 65 63 73  b=a} db2.  execs
05f0: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
0600: 4d 20 74 31 7d 20 64 62 32 0a 7d 20 7b 32 20 31  M t1} db2.} {2 1
0610: 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31  }.do_test lock-1
0620: 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .9 {.  execsql {
0630: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0640: 7d 0a 7d 20 7b 32 20 31 7d 0a 64 6f 5f 74 65 73  }.} {2 1}.do_tes
0650: 74 20 6c 6f 63 6b 2d 31 2e 31 30 20 7b 0a 20 20  t lock-1.10 {.  
0660: 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e 20 54  execsql {BEGIN T
0670: 52 41 4e 53 41 43 54 49 4f 4e 7d 0a 20 20 65 78  RANSACTION}.  ex
0680: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
0690: 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 32 20 31 7d  FROM t1}.} {2 1}
06a0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e  .do_test lock-1.
06b0: 31 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  11 {.  catchsql 
06c0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
06d0: 31 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74  1} db2.} {1 {dat
06e0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
06f0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31  }.do_test lock-1
0700: 2e 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .12 {.  execsql 
0710: 7b 52 4f 4c 4c 42 41 43 4b 7d 0a 20 20 63 61 74  {ROLLBACK}.  cat
0720: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  chsql {SELECT * 
0730: 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 30 20 7b 32  FROM t1}.} {0 {2
0740: 20 31 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f   1}}..do_test lo
0750: 63 6b 2d 31 2e 31 33 20 7b 0a 20 20 65 78 65 63  ck-1.13 {.  exec
0760: 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  sql {CREATE TABL
0770: 45 20 74 32 28 78 20 69 6e 74 2c 20 79 20 69 6e  E t2(x int, y in
0780: 74 29 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 49  t)}.  execsql {I
0790: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
07a0: 4c 55 45 53 28 38 2c 39 29 7d 0a 20 20 65 78 65  LUES(8,9)}.  exe
07b0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  csql {SELECT * F
07c0: 52 4f 4d 20 74 32 7d 0a 7d 20 7b 38 20 39 7d 0a  ROM t2}.} {8 9}.
07d0: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31  do_test lock-1.1
07e0: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
07f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0800: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
0810: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
0820: 63 68 61 6e 67 65 64 7d 7d 0a 64 6f 5f 74 65 73  changed}}.do_tes
0830: 74 20 6c 6f 63 6b 2d 31 2e 31 35 20 7b 0a 20 20  t lock-1.15 {.  
0840: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
0850: 20 2a 20 46 52 4f 4d 20 74 32 7d 20 64 62 32 0a   * FROM t2} db2.
0860: 7d 20 7b 30 20 7b 38 20 39 7d 7d 0a 0a 64 6f 5f  } {0 {8 9}}..do_
0870: 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 36 20 7b  test lock-1.16 {
0880: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
0890: 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 71 76  CT * FROM t1} qv
08a0: 20 7b 0a 20 20 20 20 73 65 74 20 78 20 5b 64 62   {.    set x [db
08b0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20   eval {SELECT * 
08c0: 46 52 4f 4d 20 74 31 7d 5d 0a 20 20 7d 0a 20 20  FROM t1}].  }.  
08d0: 73 65 74 20 78 0a 7d 20 7b 32 20 31 7d 0a 64 6f  set x.} {2 1}.do
08e0: 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e 31 37 20  _test lock-1.17 
08f0: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  {.  db eval {SEL
0900: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 71  ECT * FROM t1} q
0910: 76 20 7b 0a 20 20 20 20 73 65 74 20 78 20 5b 64  v {.    set x [d
0920: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a  b eval {SELECT *
0930: 20 46 52 4f 4d 20 74 32 7d 5d 0a 20 20 7d 0a 20   FROM t2}].  }. 
0940: 20 73 65 74 20 78 0a 7d 20 7b 38 20 39 7d 0a 0a   set x.} {8 9}..
0950: 23 20 59 6f 75 20 63 61 6e 6e 6f 74 20 55 50 44  # You cannot UPD
0960: 41 54 45 20 61 20 74 61 62 6c 65 20 66 72 6f 6d  ATE a table from
0970: 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
0980: 62 61 63 6b 20 6f 66 20 61 20 53 45 4c 45 43 54  back of a SELECT
0990: 0a 23 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 20  .# on that same 
09a0: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 74 68  table because th
09b0: 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65  e SELECT has the
09c0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 2e 0a 23   table locked..#
09d0: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31 2e  .do_test lock-1.
09e0: 31 38 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  18 {.  db eval {
09f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0a00: 7d 20 71 76 20 7b 0a 20 20 20 20 73 65 74 20 72  } qv {.    set r
0a10: 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76 61 6c   [catch {db eval
0a20: 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20   {UPDATE t1 SET 
0a30: 61 3d 62 2c 20 62 3d 61 7d 7d 20 6d 73 67 5d 0a  a=b, b=a}} msg].
0a40: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 20 24 6d      lappend r $m
0a50: 73 67 0a 20 20 7d 0a 20 20 73 65 74 20 72 0a 7d  sg.  }.  set r.}
0a60: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 74 61   {1 {database ta
0a70: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ble is locked}}.
0a80: 0a 23 20 42 75 74 20 79 6f 75 20 63 61 6e 20 55  .# But you can U
0a90: 50 44 41 54 45 20 61 20 64 69 66 66 65 72 65 6e  PDATE a differen
0aa0: 74 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  t table from the
0ab0: 20 6f 6e 65 20 74 68 61 74 20 69 73 20 75 73 65   one that is use
0ac0: 64 20 69 6e 0a 23 20 74 68 65 20 53 45 4c 45 43  d in.# the SELEC
0ad0: 54 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63  T..#.do_test loc
0ae0: 6b 2d 31 2e 31 39 20 7b 0a 20 20 64 62 20 65 76  k-1.19 {.  db ev
0af0: 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  al {SELECT * FRO
0b00: 4d 20 74 31 7d 20 71 76 20 7b 0a 20 20 20 20 73  M t1} qv {.    s
0b10: 65 74 20 72 20 5b 63 61 74 63 68 20 7b 64 62 20  et r [catch {db 
0b20: 65 76 61 6c 20 7b 55 50 44 41 54 45 20 74 32 20  eval {UPDATE t2 
0b30: 53 45 54 20 78 3d 79 2c 20 79 3d 78 7d 7d 20 6d  SET x=y, y=x}} m
0b40: 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  sg].    lappend 
0b50: 72 20 24 6d 73 67 0a 20 20 7d 0a 20 20 73 65 74  r $msg.  }.  set
0b60: 20 72 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74   r.} {0 {}}.do_t
0b70: 65 73 74 20 6c 6f 63 6b 2d 31 2e 32 30 20 7b 0a  est lock-1.20 {.
0b80: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0b90: 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b  T * FROM t2}.} {
0ba0: 39 20 38 7d 0a 0a 23 20 49 74 20 69 73 20 70 6f  9 8}..# It is po
0bb0: 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 53  ssible to do a S
0bc0: 45 4c 45 43 54 20 6f 66 20 74 68 65 20 73 61 6d  ELECT of the sam
0bd0: 65 20 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74  e table within t
0be0: 68 65 0a 23 20 63 61 6c 6c 62 61 63 6b 20 6f 66  he.# callback of
0bf0: 20 61 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   another SELECT 
0c00: 6f 6e 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  on that same tab
0c10: 6c 65 20 62 65 63 61 75 73 65 20 74 77 6f 0a 23  le because two.#
0c20: 20 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e   or more read-on
0c30: 6c 79 20 63 75 72 73 6f 72 73 20 63 61 6e 20 62  ly cursors can b
0c40: 65 20 6f 70 65 6e 20 61 74 20 6f 6e 63 65 2e 0a  e open at once..
0c50: 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 31  #.do_test lock-1
0c60: 2e 32 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  .21 {.  db eval 
0c70: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
0c80: 31 7d 20 71 76 20 7b 0a 20 20 20 20 73 65 74 20  1} qv {.    set 
0c90: 72 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76 61  r [catch {db eva
0ca0: 6c 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  l {SELECT a FROM
0cb0: 20 74 31 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 6c   t1}} 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 32  }.  set r.} {0 2
0ce0: 7d 0a 0a 23 20 55 6e 64 65 72 20 55 4e 49 58 20  }..# Under UNIX 
0cf0: 79 6f 75 20 63 61 6e 20 64 6f 20 74 77 6f 20 53  you can do two S
0d00: 45 4c 45 43 54 73 20 61 74 20 6f 6e 63 65 20 77  ELECTs at once w
0d10: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 64 61  ith different da
0d20: 74 61 62 61 73 65 0a 23 20 63 6f 6e 6e 65 63 74  tabase.# connect
0d30: 69 6f 6e 73 2c 20 62 65 63 61 75 73 65 20 55 4e  ions, because UN
0d40: 49 58 20 73 75 70 70 6f 72 74 73 20 72 65 61 64  IX supports read
0d50: 65 72 2f 77 72 69 74 65 72 20 6c 6f 63 6b 73 2e  er/writer locks.
0d60: 20 20 55 6e 64 65 72 20 77 69 6e 64 6f 77 73 2c    Under windows,
0d70: 0a 23 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70  .# this is not p
0d80: 6f 73 73 69 62 6c 65 2e 0a 23 0a 69 66 20 7b 24  ossible..#.if {$
0d90: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  ::tcl_platform(p
0da0: 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22  latform)=="unix"
0db0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 6c 6f  } {.  do_test lo
0dc0: 63 6b 2d 31 2e 32 32 20 7b 0a 20 20 20 20 64 62  ck-1.22 {.    db
0dd0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20   eval {SELECT * 
0de0: 46 52 4f 4d 20 74 31 7d 20 71 76 20 7b 0a 20 20  FROM t1} qv {.  
0df0: 20 20 20 20 73 65 74 20 72 20 5b 63 61 74 63 68      set r [catch
0e00: 20 7b 64 62 32 20 65 76 61 6c 20 7b 53 45 4c 45   {db2 eval {SELE
0e10: 43 54 20 61 20 46 52 4f 4d 20 74 31 7d 7d 20 6d  CT a FROM t1}} m
0e20: 73 67 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  sg].      lappen
0e30: 64 20 72 20 24 6d 73 67 0a 20 20 20 20 7d 0a 20  d r $msg.    }. 
0e40: 20 20 20 73 65 74 20 72 0a 20 20 7d 20 7b 30 20     set r.  } {0 
0e50: 32 7d 0a 7d 0a 0a 23 20 49 66 20 6f 6e 65 20 74  2}.}..# If one t
0e60: 68 72 65 61 64 20 68 61 73 20 61 20 74 72 61 6e  hread has a tran
0e70: 73 61 63 74 69 6f 6e 20 61 6e 6f 74 68 65 72 20  saction another 
0e80: 74 68 72 65 61 64 20 63 61 6e 6e 6f 74 20 73 74  thread cannot st
0e90: 61 72 74 0a 23 20 61 20 74 72 61 6e 73 61 63 74  art.# a transact
0ea0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c  ion..#.do_test l
0eb0: 6f 63 6b 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63  ock-2.1 {.  exec
0ec0: 73 71 6c 20 7b 42 45 47 49 4e 20 54 52 41 4e 53  sql {BEGIN TRANS
0ed0: 41 43 54 49 4f 4e 7d 0a 20 20 73 65 74 20 72 20  ACTION}.  set r 
0ee0: 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20  [catch {execsql 
0ef0: 7b 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49  {BEGIN TRANSACTI
0f00: 4f 4e 7d 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20  ON} db2} msg].  
0f10: 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 7d  lappend r $msg.}
0f20: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
0f30: 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 23 20 4e 6f 72   locked}}..# Nor
0f40: 20 63 61 6e 20 74 68 65 20 6f 74 68 65 72 20 74   can the other t
0f50: 68 72 65 61 64 20 64 6f 20 61 20 71 75 65 72 79  hread do a query
0f60: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  ..#.do_test lock
0f70: 2d 32 2e 32 20 7b 0a 20 20 73 65 74 20 72 20 5b  -2.2 {.  set r [
0f80: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
0f90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
0fa0: 7d 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20 6c 61  } db2} msg].  la
0fb0: 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b  ppend r $msg.} {
0fc0: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0fd0: 6f 63 6b 65 64 7d 7d 0a 0a 23 20 49 66 20 74 68  ocked}}..# If th
0fe0: 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 20 28  e other thread (
0ff0: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 64 6f 65  the one that doe
1000: 73 20 6e 6f 74 20 68 6f 6c 64 20 74 68 65 20 74  s not hold the t
1010: 72 61 6e 73 61 63 74 69 6f 6e 29 0a 23 20 74 72  ransaction).# tr
1020: 69 65 73 20 74 6f 20 73 74 61 72 74 20 61 20 74  ies to start a t
1030: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 77 65 20 67  ransaction, we g
1040: 65 74 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61  et a busy callba
1050: 63 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 6f  ck..#.do_test lo
1060: 63 6b 2d 32 2e 33 20 7b 0a 20 20 70 72 6f 63 20  ck-2.3 {.  proc 
1070: 63 61 6c 6c 62 61 63 6b 20 7b 61 72 67 73 7d 20  callback {args} 
1080: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 63 61 6c 6c  {.    set ::call
1090: 62 61 63 6b 5f 76 61 6c 75 65 20 24 61 72 67 73  back_value $args
10a0: 0a 20 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a 20  .    break.  }. 
10b0: 20 73 65 74 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f   set ::callback_
10c0: 76 61 6c 75 65 20 7b 7d 0a 20 20 64 62 32 20 62  value {}.  db2 b
10d0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 20 20 73  usy callback.  s
10e0: 65 74 20 72 20 5b 63 61 74 63 68 20 7b 65 78 65  et r [catch {exe
10f0: 63 73 71 6c 20 7b 42 45 47 49 4e 20 54 52 41 4e  csql {BEGIN TRAN
1100: 53 41 43 54 49 4f 4e 7d 20 64 62 32 7d 20 6d 73  SACTION} db2} ms
1110: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 20 24  g].  lappend r $
1120: 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20 72 20  msg.  lappend r 
1130: 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75  $::callback_valu
1140: 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  e.} {1 {database
1150: 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b 7b 7d 20   is locked} {{} 
1160: 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b  1}}.do_test lock
1170: 2d 32 2e 34 20 7b 0a 20 20 70 72 6f 63 20 63 61  -2.4 {.  proc ca
1180: 6c 6c 62 61 63 6b 20 7b 66 69 6c 65 20 63 6f 75  llback {file cou
1190: 6e 74 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  nt} {.    lappen
11a0: 64 20 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61 6c  d ::callback_val
11b0: 75 65 20 24 63 6f 75 6e 74 0a 20 20 20 20 69 66  ue $count.    if
11c0: 20 7b 24 63 6f 75 6e 74 3e 34 7d 20 62 72 65 61   {$count>4} brea
11d0: 6b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63 61  k.  }.  set ::ca
11e0: 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 7b 7d 0a  llback_value {}.
11f0: 20 20 64 62 32 20 62 75 73 79 20 63 61 6c 6c 62    db2 busy callb
1200: 61 63 6b 0a 20 20 73 65 74 20 72 20 5b 63 61 74  ack.  set r [cat
1210: 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 42 45 47  ch {execsql {BEG
1220: 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d 20  IN TRANSACTION} 
1230: 64 62 32 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  db2} msg].  lapp
1240: 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 6c 61 70  end r $msg.  lap
1250: 70 65 6e 64 20 72 20 24 3a 3a 63 61 6c 6c 62 61  pend r $::callba
1260: 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b 31 20 7b 64  ck_value.} {1 {d
1270: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
1280: 64 7d 20 7b 31 20 32 20 33 20 34 20 35 7d 7d 0a  d} {1 2 3 4 5}}.
1290: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 32 2e 35  do_test lock-2.5
12a0: 20 7b 0a 20 20 70 72 6f 63 20 63 61 6c 6c 62 61   {.  proc callba
12b0: 63 6b 20 7b 66 69 6c 65 20 63 6f 75 6e 74 7d 20  ck {file count} 
12c0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a  {.    lappend ::
12d0: 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 24  callback_value $
12e0: 63 6f 75 6e 74 0a 20 20 20 20 69 66 20 7b 24 63  count.    if {$c
12f0: 6f 75 6e 74 3e 34 7d 20 62 72 65 61 6b 0a 20 20  ount>4} break.  
1300: 7d 0a 20 20 73 65 74 20 3a 3a 63 61 6c 6c 62 61  }.  set ::callba
1310: 63 6b 5f 76 61 6c 75 65 20 7b 7d 0a 20 20 64 62  ck_value {}.  db
1320: 32 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  2 busy callback.
1330: 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b    set r [catch {
1340: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1350: 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32 7d 20  * FROM t1} db2} 
1360: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72  msg].  lappend r
1370: 20 24 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20   $msg.  lappend 
1380: 72 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61  r $::callback_va
1390: 6c 75 65 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  lue.} {1 {databa
13a0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 20 7b 31  se is locked} {1
13b0: 20 32 20 33 20 34 20 35 7d 7d 0a 0a 23 20 49 6e   2 3 4 5}}..# In
13c0: 20 74 68 69 73 20 74 65 73 74 2c 20 74 68 65 20   this test, the 
13d0: 33 72 64 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  3rd invocation o
13e0: 66 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  f the busy callb
13f0: 61 63 6b 20 63 61 75 73 65 73 0a 23 20 74 68 65  ack causes.# the
1400: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f   first thread to
1410: 20 72 65 6c 65 61 73 65 20 69 74 73 20 74 72 61   release its tra
1420: 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 61 74 20  nsaction.  That 
1430: 61 6c 6c 6f 77 73 20 74 68 65 0a 23 20 73 65 63  allows the.# sec
1440: 6f 6e 64 20 74 68 72 65 61 64 20 74 6f 20 63 6f  ond thread to co
1450: 6e 74 69 6e 75 65 2e 0a 23 0a 64 6f 5f 74 65 73  ntinue..#.do_tes
1460: 74 20 6c 6f 63 6b 2d 32 2e 36 20 7b 0a 20 20 70  t lock-2.6 {.  p
1470: 72 6f 63 20 63 61 6c 6c 62 61 63 6b 20 7b 66 69  roc callback {fi
1480: 6c 65 20 63 6f 75 6e 74 7d 20 7b 0a 20 20 20 20  le count} {.    
1490: 6c 61 70 70 65 6e 64 20 3a 3a 63 61 6c 6c 62 61  lappend ::callba
14a0: 63 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e 74 0a  ck_value $count.
14b0: 20 20 20 20 69 66 20 7b 24 63 6f 75 6e 74 3e 32      if {$count>2
14c0: 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  } {.      execsq
14d0: 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 0a 20 20 20  l {ROLLBACK}.   
14e0: 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63   }.  }.  set ::c
14f0: 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 7b 7d  allback_value {}
1500: 0a 20 20 64 62 32 20 62 75 73 79 20 63 61 6c 6c  .  db2 busy call
1510: 62 61 63 6b 0a 20 20 73 65 74 20 72 20 5b 63 61  back.  set r [ca
1520: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 53 45  tch {execsql {SE
1530: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20  LECT * FROM t2} 
1540: 64 62 32 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  db2} msg].  lapp
1550: 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 6c 61 70  end r $msg.  lap
1560: 70 65 6e 64 20 72 20 24 3a 3a 63 61 6c 6c 62 61  pend r $::callba
1570: 63 6b 5f 76 61 6c 75 65 0a 7d 20 7b 30 20 7b 39  ck_value.} {0 {9
1580: 20 38 7d 20 7b 31 20 32 20 33 7d 7d 0a 64 6f 5f   8} {1 2 3}}.do_
1590: 74 65 73 74 20 6c 6f 63 6b 2d 32 2e 37 20 7b 0a  test lock-2.7 {.
15a0: 20 20 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e    execsql {BEGIN
15b0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d 0a 20 20   TRANSACTION}.  
15c0: 70 72 6f 63 20 63 61 6c 6c 62 61 63 6b 20 7b 66  proc callback {f
15d0: 69 6c 65 20 63 6f 75 6e 74 7d 20 7b 0a 20 20 20  ile count} {.   
15e0: 20 6c 61 70 70 65 6e 64 20 3a 3a 63 61 6c 6c 62   lappend ::callb
15f0: 61 63 6b 5f 76 61 6c 75 65 20 24 63 6f 75 6e 74  ack_value $count
1600: 0a 20 20 20 20 69 66 20 7b 24 63 6f 75 6e 74 3e  .    if {$count>
1610: 32 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73  2} {.      execs
1620: 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d 0a 20 20  ql {ROLLBACK}.  
1630: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a    }.  }.  set ::
1640: 63 61 6c 6c 62 61 63 6b 5f 76 61 6c 75 65 20 7b  callback_value {
1650: 7d 0a 20 20 64 62 32 20 62 75 73 79 20 63 61 6c  }.  db2 busy cal
1660: 6c 62 61 63 6b 0a 20 20 73 65 74 20 72 20 5b 63  lback.  set r [c
1670: 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 42  atch {execsql {B
1680: 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
1690: 7d 20 64 62 32 7d 20 6d 73 67 5d 0a 20 20 65 78  } db2} msg].  ex
16a0: 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d  ecsql {ROLLBACK}
16b0: 20 64 62 32 0a 20 20 6c 61 70 70 65 6e 64 20 72   db2.  lappend r
16c0: 20 24 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20   $msg.  lappend 
16d0: 72 20 24 3a 3a 63 61 6c 6c 62 61 63 6b 5f 76 61  r $::callback_va
16e0: 6c 75 65 0a 7d 20 7b 30 20 7b 7d 20 7b 31 20 32  lue.} {0 {} {1 2
16f0: 20 33 7d 7d 0a 0a 23 20 54 72 79 20 74 6f 20 73   3}}..# Try to s
1700: 74 61 72 74 20 74 77 6f 20 74 72 61 6e 73 61 63  tart two transac
1710: 74 69 6f 6e 73 20 69 6e 20 61 20 72 6f 77 0a 23  tions in a row.#
1720: 0a 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 2d 33 2e  .do_test lock-3.
1730: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 42  1 {.  execsql {B
1740: 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
1750: 7d 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63 68  }.  set r [catch
1760: 20 7b 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e   {execsql {BEGIN
1770: 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d 7d 20 6d   TRANSACTION}} m
1780: 73 67 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 52  sg].  execsql {R
1790: 4f 4c 4c 42 41 43 4b 7d 0a 20 20 6c 61 70 70 65  OLLBACK}.  lappe
17a0: 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b 30 20 7b  nd r $msg.} {0 {
17b0: 7d 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 6c 6f 63  }}...do_test loc
17c0: 6b 2d 39 39 39 2e 31 20 7b 0a 20 20 72 65 6e 61  k-999.1 {.  rena
17d0: 6d 65 20 64 62 32 20 7b 7d 0a 7d 20 7b 7d 0a 0a  me db2 {}.} {}..
17e0: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.