/ Hex Artifact Content
Login

Artifact e630504f8a06c00bf8bbe68528774dd96aeb2e58:


0000: 23 20 32 30 30 37 20 53 65 70 74 65 6d 62 65 72  # 2007 September
0010: 20 31 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68   10.#.# 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 0a 23 20 20 20  *********.#.#   
0170: 54 68 69 73 20 74 65 73 74 20 61 74 74 65 6d 70  This test attemp
0180: 74 73 20 74 6f 20 64 65 61 64 6c 6f 63 6b 20 53  ts to deadlock S
0190: 51 4c 69 74 65 20 69 6e 20 73 68 61 72 65 64 2d  QLite in shared-
01a0: 63 61 63 68 65 20 6d 6f 64 65 2e 0a 23 20 20 20  cache mode..#   
01b0: 20 20 0a 23 0a 23 20 24 49 64 3a 20 74 68 72 65    .#.# $Id: thre
01c0: 61 64 30 30 32 2e 74 65 73 74 2c 76 20 31 2e 39  ad002.test,v 1.9
01d0: 20 32 30 30 39 2f 30 33 2f 32 36 20 31 34 3a 34   2009/03/26 14:4
01e0: 38 3a 30 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:07 danielk1977
01f0: 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74   Exp $..set test
0200: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0210: 65 20 24 61 72 67 76 30 5d 0a 0a 73 65 74 20 64  e $argv0]..set d
0220: 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63 20  o_not_use_codec 
0230: 31 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  1.source $testdi
0240: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69 66 20  r/tester.tcl.if 
0250: 7b 5b 72 75 6e 5f 74 68 72 65 61 64 5f 74 65 73  {[run_thread_tes
0260: 74 73 5d 3d 3d 30 7d 20 7b 20 66 69 6e 69 73 68  ts]==0} { finish
0270: 5f 74 65 73 74 20 3b 20 72 65 74 75 72 6e 20 7d  _test ; return }
0280: 0a 0a 0a 64 62 20 63 6c 6f 73 65 0a 73 65 74 20  ...db close.set 
0290: 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  ::enable_shared_
02a0: 63 61 63 68 65 20 5b 73 71 6c 69 74 65 33 5f 65  cache [sqlite3_e
02b0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
02c0: 68 65 20 31 5d 0a 0a 73 65 74 20 3a 3a 4e 54 48  he 1]..set ::NTH
02d0: 52 45 41 44 20 31 30 0a 0a 64 6f 5f 74 65 73 74  READ 10..do_test
02e0: 20 74 68 72 65 61 64 30 30 32 2e 31 20 7b 0a 20   thread002.1 {. 
02f0: 20 23 20 43 72 65 61 74 65 20 33 20 64 61 74 61   # Create 3 data
0300: 62 61 73 65 73 20 77 69 74 68 20 69 64 65 6e 74  bases with ident
0310: 69 63 61 6c 20 73 63 68 65 6d 61 73 3a 0a 20 20  ical schemas:.  
0320: 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b  for {set ii 0} {
0330: 24 69 69 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69  $ii < 3} {incr i
0340: 69 7d 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65  i} {.    forcede
0350: 6c 65 74 65 20 74 65 73 74 24 7b 69 69 7d 2e 64  lete test${ii}.d
0360: 62 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  b.    sqlite3 db
0370: 20 74 65 73 74 24 7b 69 69 7d 2e 64 62 0a 20 20   test${ii}.db.  
0380: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0390: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
03a0: 31 28 6b 2c 20 76 29 3b 0a 20 20 20 20 20 20 43  1(k, v);.      C
03b0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 5f 69  REATE INDEX t1_i
03c0: 20 4f 4e 20 74 31 28 76 29 3b 0a 20 20 20 20 20   ON t1(v);.     
03d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
03e0: 76 29 20 56 41 4c 55 45 53 28 31 2e 30 29 3b 0a  v) VALUES(1.0);.
03f0: 20 20 20 20 7d 0a 20 20 20 20 64 62 20 63 6c 6f      }.    db clo
0400: 73 65 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 73 65 74  se.  }.} {}..set
0410: 20 74 68 72 65 61 64 5f 70 72 6f 67 72 61 6d 20   thread_program 
0420: 7b 0a 20 20 73 65 74 20 3a 3a 44 42 20 5b 73 71  {.  set ::DB [sq
0430: 6c 69 74 65 33 5f 6f 70 65 6e 20 74 65 73 74 2e  lite3_open test.
0440: 64 62 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  db].  for {set i
0450: 69 20 31 7d 20 7b 24 69 69 20 3c 3d 20 33 7d 20  i 1} {$ii <= 3} 
0460: 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20  {incr ii} {.    
0470: 73 65 74 20 54 20 5b 6c 69 6e 64 65 78 20 24 6f  set T [lindex $o
0480: 72 64 65 72 20 5b 65 78 70 72 20 24 69 69 2d 31  rder [expr $ii-1
0490: 5d 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  ]].    execsql "
04a0: 41 54 54 41 43 48 20 27 74 65 73 74 24 7b 54 7d  ATTACH 'test${T}
04b0: 2e 64 62 27 20 41 53 20 61 75 78 24 7b 69 69 7d  .db' AS aux${ii}
04c0: 22 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65  ".  }..  for {se
04d0: 74 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 31  t ii 0} {$ii < 1
04e0: 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a  00} {incr ii} {.
04f0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
0500: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 75 78 31  LECT * FROM aux1
0510: 2e 74 31 20 7d 0a 20 20 20 20 65 78 65 63 73 71  .t1 }.    execsq
0520: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0530: 61 75 78 31 2e 74 31 28 76 29 20 53 45 4c 45 43  aux1.t1(v) SELEC
0540: 54 20 73 75 6d 28 76 29 20 46 52 4f 4d 20 61 75  T sum(v) FROM au
0550: 78 32 2e 74 31 20 7d 0a 20 20 0a 20 20 20 20 65  x2.t1 }.  .    e
0560: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0570: 2a 20 46 52 4f 4d 20 61 75 78 32 2e 74 31 20 7d  * FROM aux2.t1 }
0580: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
0590: 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 32 2e  NSERT INTO aux2.
05a0: 74 31 28 76 29 20 53 45 4c 45 43 54 20 73 75 6d  t1(v) SELECT sum
05b0: 28 76 29 20 46 52 4f 4d 20 61 75 78 33 2e 74 31  (v) FROM aux3.t1
05c0: 20 7d 0a 20 20 0a 20 20 20 20 65 78 65 63 73 71   }.  .    execsq
05d0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
05e0: 4d 20 61 75 78 33 2e 74 31 20 7d 0a 20 20 20 20  M aux3.t1 }.    
05f0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0600: 20 49 4e 54 4f 20 61 75 78 33 2e 74 31 28 76 29   INTO aux3.t1(v)
0610: 20 53 45 4c 45 43 54 20 73 75 6d 28 76 29 20 46   SELECT sum(v) F
0620: 52 4f 4d 20 61 75 78 31 2e 74 31 20 7d 0a 0a 20  ROM aux1.t1 }.. 
0630: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45     execsql { CRE
0640: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
0650: 20 45 58 49 53 54 53 20 61 75 78 31 2e 74 32 28   EXISTS aux1.t2(
0660: 61 2c 62 29 20 7d 0a 20 20 20 20 65 78 65 63 73  a,b) }.    execs
0670: 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20  ql { DROP TABLE 
0680: 49 46 20 45 58 49 53 54 53 20 61 75 78 31 2e 74  IF EXISTS aux1.t
0690: 32 20 7d 0a 0a 20 20 20 20 23 20 69 66 20 7b 28  2 }..    # if {(
06a0: 24 69 69 25 31 30 29 3d 3d 30 7d 20 7b 70 75 74  $ii%10)==0} {put
06b0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 2e 20 3b  s -nonewline . ;
06c0: 20 66 6c 75 73 68 20 73 74 64 6f 75 74 7d 0a 20   flush stdout}. 
06d0: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
06e0: 6e 65 20 2e 20 3b 20 66 6c 75 73 68 20 73 74 64  ne . ; flush std
06f0: 6f 75 74 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  out.  }..  sqlit
0700: 65 33 5f 63 6c 6f 73 65 20 24 3a 3a 44 42 0a 20  e3_close $::DB. 
0710: 20 6c 69 73 74 20 4f 4b 0a 7d 0a 0a 73 65 74 20   list OK.}..set 
0720: 6f 72 64 65 72 5f 6c 69 73 74 20 5b 6c 69 73 74  order_list [list
0730: 20 7b 30 20 31 20 32 7d 20 7b 30 20 32 20 31 7d   {0 1 2} {0 2 1}
0740: 20 7b 31 20 30 20 32 7d 20 7b 31 20 32 20 30 7d   {1 0 2} {1 2 0}
0750: 20 7b 32 20 30 20 31 7d 20 7b 32 20 31 20 30 7d   {2 0 1} {2 1 0}
0760: 5d 0a 0a 61 72 72 61 79 20 75 6e 73 65 74 20 66  ]..array unset f
0770: 69 6e 69 73 68 65 64 0a 66 6f 72 20 7b 73 65 74  inished.for {set
0780: 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 24 3a   ii 0} {$ii < $:
0790: 3a 4e 54 48 52 45 41 44 7d 20 7b 69 6e 63 72 20  :NTHREAD} {incr 
07a0: 69 69 7d 20 7b 0a 20 20 73 65 74 20 6f 72 64 65  ii} {.  set orde
07b0: 72 20 5b 6c 69 6e 64 65 78 20 24 6f 72 64 65 72  r [lindex $order
07c0: 5f 6c 69 73 74 20 5b 65 78 70 72 20 24 69 69 25  _list [expr $ii%
07d0: 36 5d 5d 0a 20 20 74 68 72 65 61 64 5f 73 70 61  6]].  thread_spa
07e0: 77 6e 20 66 69 6e 69 73 68 65 64 28 24 69 69 29  wn finished($ii)
07f0: 20 24 74 68 72 65 61 64 5f 70 72 6f 63 73 20 22   $thread_procs "
0800: 73 65 74 20 6f 72 64 65 72 20 7b 24 6f 72 64 65  set order {$orde
0810: 72 7d 22 20 24 74 68 72 65 61 64 5f 70 72 6f 67  r}" $thread_prog
0820: 72 61 6d 0a 7d 0a 0a 23 20 57 61 69 74 20 66 6f  ram.}..# Wait fo
0830: 72 20 61 6c 6c 20 74 68 72 65 61 64 73 20 74 6f  r all threads to
0840: 20 66 69 6e 69 73 68 2c 20 20 74 68 65 6e 20 63   finish,  then c
0850: 68 65 63 6b 20 74 68 65 79 20 61 6c 6c 20 72 65  heck they all re
0860: 74 75 72 6e 65 64 20 22 4f 4b 22 2e 0a 23 0a 66  turned "OK"..#.f
0870: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
0880: 20 3c 20 24 3a 3a 4e 54 48 52 45 41 44 7d 20 7b   < $::NTHREAD} {
0890: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 69 66 20 7b  incr i} {.  if {
08a0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69  ![info exists fi
08b0: 6e 69 73 68 65 64 28 24 69 29 5d 7d 20 7b 0a 20  nished($i)]} {. 
08c0: 20 20 20 76 77 61 69 74 20 66 69 6e 69 73 68 65     vwait finishe
08d0: 64 28 24 69 29 0a 20 20 7d 0a 20 20 64 6f 5f 74  d($i).  }.  do_t
08e0: 65 73 74 20 74 68 72 65 61 64 30 30 32 2e 32 2e  est thread002.2.
08f0: 24 69 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 66  $i {.    set ::f
0900: 69 6e 69 73 68 65 64 28 24 69 29 0a 20 20 7d 20  inished($i).  } 
0910: 4f 4b 0a 7d 0a 0a 23 20 43 68 65 63 6b 20 61 6c  OK.}..# Check al
0920: 6c 20 74 68 72 65 65 20 64 61 74 61 62 61 73 65  l three database
0930: 73 20 61 72 65 20 4f 6b 2e 0a 66 6f 72 20 7b 73  s are Ok..for {s
0940: 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20  et ii 0} {$ii < 
0950: 33 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  3} {incr ii} {. 
0960: 20 64 6f 5f 74 65 73 74 20 74 68 72 65 61 64 30   do_test thread0
0970: 30 32 2e 33 2e 24 69 69 20 7b 0a 20 20 20 20 73  02.3.$ii {.    s
0980: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 24 7b  qlite3 db test${
0990: 69 69 7d 2e 64 62 0a 20 20 20 20 73 65 74 20 72  ii}.db.    set r
09a0: 65 73 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  es [list        
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 5c 0a 20 20 20 20 20 20 5b 65 78 65 63 73 71   \.      [execsq
09d0: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  l {SELECT count(
09e0: 2a 29 20 46 52 4f 4d 20 74 31 7d 5d 20 5c 0a 20  *) FROM t1}] \. 
09f0: 20 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b 50       [execsql {P
0a00: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
0a10: 63 68 65 63 6b 7d 5d 20 20 5c 0a 20 20 20 20 5d  check}]  \.    ]
0a20: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
0a30: 20 20 73 65 74 20 72 65 73 0a 20 20 7d 20 5b 6c    set res.  } [l
0a40: 69 73 74 20 5b 65 78 70 72 20 31 20 2b 20 24 3a  ist [expr 1 + $:
0a50: 3a 4e 54 48 52 45 41 44 2a 31 30 30 5d 20 6f 6b  :NTHREAD*100] ok
0a60: 5d 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 65 6e 61  ].}..sqlite3_ena
0a70: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
0a80: 20 24 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72 65   $::enable_share
0a90: 64 5f 63 61 63 68 65 0a 73 65 74 20 73 71 6c 69  d_cache.set sqli
0aa0: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
0ab0: 6e 74 20 30 0a 66 69 6e 69 73 68 5f 74 65 73 74  nt 0.finish_test
0ac0: 0a                                               .