/ Hex Artifact Content
Login

Artifact 5b71777fc127509cd257910c8db799de557a02de:


0000: 23 20 32 30 30 38 20 4a 75 6e 65 20 31 37 0a 23  # 2008 June 17.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 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 0a 23 0a 23 20 24 49 64 3a 20 6d 75  ****.#.# $Id: mu
0170: 74 65 78 31 2e 74 65 73 74 2c 76 20 31 2e 32 30  tex1.test,v 1.20
0180: 20 32 30 30 39 2f 30 34 2f 32 33 20 31 34 3a 35   2009/04/23 14:5
0190: 38 3a 34 30 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:40 danielk1977
01a0: 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74   Exp $..set test
01b0: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
01c0: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
01d0: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01e0: 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c 65 20  .tcl..ifcapable 
01f0: 21 6d 75 74 65 78 20 7b 0a 20 20 66 69 6e 69 73  !mutex {.  finis
0200: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
0210: 7d 0a 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  }.if {[info exis
0220: 74 73 20 74 65 73 74 65 72 5f 64 6f 5f 62 69 6e  ts tester_do_bin
0230: 61 72 79 6c 6f 67 5d 7d 20 7b 0a 20 20 66 69 6e  arylog]} {.  fin
0240: 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72  ish_test.  retur
0250: 6e 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 72 65 73  n.}..sqlite3_res
0260: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
0270: 6e 0a 63 6c 65 61 72 5f 6d 75 74 65 78 5f 63 6f  n.clear_mutex_co
0280: 75 6e 74 65 72 73 0a 0a 70 72 6f 63 20 6d 75 74  unters..proc mut
0290: 65 78 5f 63 6f 75 6e 74 65 72 73 20 7b 76 61 72  ex_counters {var
02a0: 6e 61 6d 65 7d 20 7b 0a 20 20 75 70 76 61 72 20  name} {.  upvar 
02b0: 24 76 61 72 6e 61 6d 65 20 76 61 72 0a 20 20 73  $varname var.  s
02c0: 65 74 20 76 61 72 28 74 6f 74 61 6c 29 20 30 0a  et var(total) 0.
02d0: 20 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20    foreach {name 
02e0: 76 61 6c 75 65 7d 20 5b 72 65 61 64 5f 6d 75 74  value} [read_mut
02f0: 65 78 5f 63 6f 75 6e 74 65 72 73 5d 20 7b 0a 20  ex_counters] {. 
0300: 20 20 20 73 65 74 20 76 61 72 28 24 6e 61 6d 65     set var($name
0310: 29 20 24 76 61 6c 75 65 0a 20 20 20 20 69 6e 63  ) $value.    inc
0320: 72 20 76 61 72 28 74 6f 74 61 6c 29 20 24 76 61  r var(total) $va
0330: 6c 75 65 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  lue.  }.}..#----
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 6d 75  -----.# Tests mu
0390: 74 65 78 31 2d 31 2e 2a 20 74 65 73 74 20 74 68  tex1-1.* test th
03a0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  at sqlite3_confi
03b0: 67 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c 49  g() returns SQLI
03c0: 54 45 5f 4d 49 53 55 53 45 20 69 66 0a 23 20 69  TE_MISUSE if.# i
03d0: 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
03e0: 77 72 6f 6e 67 20 74 69 6d 65 2e 20 41 6e 64 20  wrong time. And 
03f0: 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 74  that the first t
0400: 69 6d 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  ime sqlite3_init
0410: 69 61 6c 69 7a 65 20 0a 23 20 69 73 20 63 61 6c  ialize .# is cal
0420: 6c 65 64 20 69 74 20 6f 62 74 61 69 6e 73 20 74  led it obtains t
0430: 68 65 20 27 73 74 61 74 69 63 5f 6d 61 73 74 65  he 'static_maste
0440: 72 27 20 6d 75 74 65 78 20 33 20 74 69 6d 65 73  r' mutex 3 times
0450: 20 61 6e 64 20 61 20 72 65 63 75 72 73 69 76 65   and a recursive
0460: 0a 23 20 6d 75 74 65 78 20 28 73 71 6c 69 74 65  .# mutex (sqlite
0470: 33 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  3Config.pInitMut
0480: 65 78 29 20 74 77 69 63 65 2e 20 53 75 62 73 65  ex) twice. Subse
0490: 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 65 20  quent calls are 
04a0: 6e 6f 2d 6f 70 73 20 0a 23 20 74 68 61 74 20 64  no-ops .# that d
04b0: 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  o not require an
04c0: 79 20 6d 75 74 65 78 65 73 2e 0a 23 0a 64 6f 5f  y mutexes..#.do_
04d0: 74 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 30 20  test mutex1-1.0 
04e0: 7b 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d 75 74 65  {.  install_mute
04f0: 78 5f 63 6f 75 6e 74 65 72 73 20 31 0a 7d 20 7b  x_counters 1.} {
0500: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 7d 0a 0a  SQLITE_MISUSE}..
0510: 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 31  do_test mutex1-1
0520: 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
0530: 20 20 69 6e 73 74 61 6c 6c 5f 6d 75 74 65 78 5f    install_mutex_
0540: 63 6f 75 6e 74 65 72 73 20 31 0a 7d 20 7b 53 51  counters 1.} {SQ
0550: 4c 49 54 45 5f 4d 49 53 55 53 45 7d 0a 0a 64 6f  LITE_MISUSE}..do
0560: 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 32  _test mutex1-1.2
0570: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75   {.  sqlite3_shu
0580: 74 64 6f 77 6e 0a 20 20 69 6e 73 74 61 6c 6c 5f  tdown.  install_
0590: 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 20 31  mutex_counters 1
05a0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a  .} {SQLITE_OK}..
05b0: 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 31  do_test mutex1-1
05c0: 2e 33 20 7b 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d  .3 {.  install_m
05d0: 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 20 30 0a  utex_counters 0.
05e0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64  } {SQLITE_OK}..d
05f0: 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 31 2e  o_test mutex1-1.
0600: 34 20 7b 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d 75  4 {.  install_mu
0610: 74 65 78 5f 63 6f 75 6e 74 65 72 73 20 31 0a 7d  tex_counters 1.}
0620: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f   {SQLITE_OK}..do
0630: 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 35  _test mutex1-1.5
0640: 20 7b 0a 20 20 6d 75 74 65 78 5f 63 6f 75 6e 74   {.  mutex_count
0650: 65 72 73 20 63 6f 75 6e 74 65 72 73 0a 20 20 73  ers counters.  s
0660: 65 74 20 63 6f 75 6e 74 65 72 73 28 74 6f 74 61  et counters(tota
0670: 6c 29 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73  l).} {0}..do_tes
0680: 74 20 6d 75 74 65 78 31 2d 31 2e 36 20 7b 0a 20  t mutex1-1.6 {. 
0690: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
06a0: 69 7a 65 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b  ize.} {SQLITE_OK
06b0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 74 65 78  }..do_test mutex
06c0: 31 2d 31 2e 37 20 7b 0a 20 20 6d 75 74 65 78 5f  1-1.7 {.  mutex_
06d0: 63 6f 75 6e 74 65 72 73 20 63 6f 75 6e 74 65 72  counters counter
06e0: 73 0a 20 20 23 20 6c 69 73 74 20 24 63 6f 75 6e  s.  # list $coun
06f0: 74 65 72 73 28 74 6f 74 61 6c 29 20 24 63 6f 75  ters(total) $cou
0700: 6e 74 65 72 73 28 73 74 61 74 69 63 5f 6d 61 73  nters(static_mas
0710: 74 65 72 29 0a 20 20 65 78 70 72 20 7b 24 63 6f  ter).  expr {$co
0720: 75 6e 74 65 72 73 28 74 6f 74 61 6c 29 3e 30 7d  unters(total)>0}
0730: 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {1}..do_test 
0740: 6d 75 74 65 78 31 2d 31 2e 38 20 7b 0a 20 20 63  mutex1-1.8 {.  c
0750: 6c 65 61 72 5f 6d 75 74 65 78 5f 63 6f 75 6e 74  lear_mutex_count
0760: 65 72 73 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ers.  sqlite3_in
0770: 69 74 69 61 6c 69 7a 65 0a 7d 20 7b 53 51 4c 49  itialize.} {SQLI
0780: 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20  TE_OK}..do_test 
0790: 6d 75 74 65 78 31 2d 31 2e 39 20 7b 0a 20 20 6d  mutex1-1.9 {.  m
07a0: 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 20 63 6f  utex_counters co
07b0: 75 6e 74 65 72 73 0a 20 20 6c 69 73 74 20 24 63  unters.  list $c
07c0: 6f 75 6e 74 65 72 73 28 74 6f 74 61 6c 29 20 24  ounters(total) $
07d0: 63 6f 75 6e 74 65 72 73 28 73 74 61 74 69 63 5f  counters(static_
07e0: 6d 61 73 74 65 72 29 0a 7d 20 7b 30 20 30 7d 0a  master).} {0 0}.
07f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0840: 73 74 73 20 6d 75 74 65 78 31 2d 32 2e 2a 20 74  sts mutex1-2.* t
0850: 65 73 74 20 74 68 65 20 74 68 72 65 65 20 74 68  est the three th
0860: 72 65 61 64 2d 73 61 66 65 74 79 20 72 65 6c 61  read-safety rela
0870: 74 65 64 20 6d 6f 64 65 73 20 74 68 61 74 0a 23  ted modes that.#
0880: 20 63 61 6e 20 62 65 20 73 65 6c 65 63 74 65 64   can be selected
0890: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 63   using sqlite3_c
08a0: 6f 6e 66 69 67 3a 0a 23 0a 23 20 20 20 2a 20 53  onfig:.#.#   * S
08b0: 65 72 69 61 6c 69 7a 65 64 20 6d 6f 64 65 2c 0a  erialized mode,.
08c0: 23 20 20 20 2a 20 4d 75 6c 74 69 2d 74 68 72 65  #   * Multi-thre
08d0: 61 64 65 64 20 6d 6f 64 65 2c 0a 23 20 20 20 2a  aded mode,.#   *
08e0: 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   Single-threaded
08f0: 20 6d 6f 64 65 2e 0a 23 0a 69 66 63 61 70 61 62   mode..#.ifcapab
0900: 6c 65 20 74 68 72 65 61 64 73 61 66 65 26 26 73  le threadsafe&&s
0910: 68 61 72 65 64 5f 63 61 63 68 65 20 7b 0a 20 20  hared_cache {.  
0920: 73 65 74 20 65 6e 61 62 6c 65 5f 73 68 61 72 65  set enable_share
0930: 64 5f 63 61 63 68 65 20 5b 73 71 6c 69 74 65 33  d_cache [sqlite3
0940: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
0950: 61 63 68 65 20 31 5d 0a 20 20 66 6f 72 65 61 63  ache 1].  foreac
0960: 68 20 7b 6d 6f 64 65 20 6d 75 74 65 78 65 73 7d  h {mode mutexes}
0970: 20 7b 0a 20 20 20 20 73 69 6e 67 6c 65 74 68 72   {.    singlethr
0980: 65 61 64 20 7b 7d 0a 20 20 20 20 6d 75 6c 74 69  ead {}.    multi
0990: 74 68 72 65 61 64 20 20 7b 66 61 73 74 20 73 74  thread  {fast st
09a0: 61 74 69 63 5f 6c 72 75 20 73 74 61 74 69 63 5f  atic_lru static_
09b0: 6d 61 73 74 65 72 20 73 74 61 74 69 63 5f 6d 65  master static_me
09c0: 6d 20 73 74 61 74 69 63 5f 6f 70 65 6e 20 73 74  m static_open st
09d0: 61 74 69 63 5f 70 72 6e 67 20 7d 0a 20 20 20 20  atic_prng }.    
09e0: 73 65 72 69 61 6c 69 7a 65 64 20 20 7b 66 61 73  serialized  {fas
09f0: 74 20 72 65 63 75 72 73 69 76 65 20 73 74 61 74  t recursive stat
0a00: 69 63 5f 6c 72 75 20 73 74 61 74 69 63 5f 6d 61  ic_lru static_ma
0a10: 73 74 65 72 20 73 74 61 74 69 63 5f 6d 65 6d 20  ster static_mem 
0a20: 73 74 61 74 69 63 5f 6f 70 65 6e 20 73 74 61 74  static_open stat
0a30: 69 63 5f 70 72 6e 67 7d 0a 20 20 7d 20 7b 0a 0a  ic_prng}.  } {..
0a40: 20 20 20 20 64 6f 5f 74 65 73 74 20 6d 75 74 65      do_test mute
0a50: 78 31 2e 32 2e 24 6d 6f 64 65 2e 31 20 7b 0a 20  x1.2.$mode.1 {. 
0a60: 20 20 20 20 20 63 61 74 63 68 20 7b 64 62 20 63       catch {db c
0a70: 6c 6f 73 65 7d 0a 20 20 20 20 20 20 73 71 6c 69  lose}.      sqli
0a80: 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20 20  te3_shutdown.   
0a90: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69     sqlite3_confi
0aa0: 67 20 24 6d 6f 64 65 0a 20 20 20 20 7d 20 53 51  g $mode.    } SQ
0ab0: 4c 49 54 45 5f 4f 4b 0a 0a 20 20 20 20 64 6f 5f  LITE_OK..    do_
0ac0: 74 65 73 74 20 6d 75 74 65 78 31 2e 32 2e 24 6d  test mutex1.2.$m
0ad0: 6f 64 65 2e 32 20 7b 0a 20 20 20 20 20 20 73 71  ode.2 {.      sq
0ae0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
0af0: 0a 20 20 20 20 20 20 63 6c 65 61 72 5f 6d 75 74  .      clear_mut
0b00: 65 78 5f 63 6f 75 6e 74 65 72 73 0a 20 20 20 20  ex_counters.    
0b10: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
0b20: 74 2e 64 62 20 2d 6e 6f 6d 75 74 65 78 20 30 20  t.db -nomutex 0 
0b30: 2d 66 75 6c 6c 6d 75 74 65 78 20 30 0a 20 20 20  -fullmutex 0.   
0b40: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 43 52     catchsql { CR
0b50: 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61  EATE TABLE abc(a
0b60: 2c 20 62 2c 20 63 29 20 7d 0a 20 20 20 20 20 20  , b, c) }.      
0b70: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20  db eval {.      
0b80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
0b90: 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  c VALUES(1, 2, 3
0ba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
0bb0: 20 7b 7d 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65   {}.  .    do_te
0bc0: 73 74 20 6d 75 74 65 78 31 2e 32 2e 24 6d 6f 64  st mutex1.2.$mod
0bd0: 65 2e 33 20 7b 0a 20 20 20 20 20 20 6d 75 74 65  e.3 {.      mute
0be0: 78 5f 63 6f 75 6e 74 65 72 73 20 63 6f 75 6e 74  x_counters count
0bf0: 65 72 73 0a 20 20 0a 20 20 20 20 20 20 73 65 74  ers.  .      set
0c00: 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 20 20   res [list].    
0c10: 20 20 66 6f 72 65 61 63 68 20 7b 6b 65 79 20 76    foreach {key v
0c20: 61 6c 75 65 7d 20 5b 61 72 72 61 79 20 67 65 74  alue} [array get
0c30: 20 63 6f 75 6e 74 65 72 73 5d 20 7b 0a 20 20 20   counters] {.   
0c40: 20 20 20 20 20 69 66 20 7b 24 6b 65 79 20 6e 65       if {$key ne
0c50: 20 22 74 6f 74 61 6c 22 20 26 26 20 24 76 61 6c   "total" && $val
0c60: 75 65 20 3e 20 30 7d 20 7b 0a 20 20 20 20 20 20  ue > 0} {.      
0c70: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20      lappend res 
0c80: 24 6b 65 79 0a 20 20 20 20 20 20 20 20 7d 0a 20  $key.        }. 
0c90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 73 6f       }.      lso
0ca0: 72 74 20 24 72 65 73 0a 20 20 20 20 7d 20 5b 6c  rt $res.    } [l
0cb0: 73 6f 72 74 20 24 6d 75 74 65 78 65 73 5d 0a 20  sort $mutexes]. 
0cc0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61   }.  sqlite3_ena
0cd0: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
0ce0: 20 24 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f   $enable_shared_
0cf0: 63 61 63 68 65 0a 0a 20 20 23 20 4f 70 65 6e 20  cache..  # Open 
0d00: 61 6e 64 20 75 73 65 20 61 20 63 6f 6e 6e 65 63  and use a connec
0d10: 74 69 6f 6e 20 69 6e 20 22 6e 6f 6d 75 74 65 78  tion in "nomutex
0d20: 22 20 6d 6f 64 65 2e 20 54 65 73 74 20 74 68 61  " mode. Test tha
0d30: 74 20 6e 6f 20 72 65 63 75 72 73 69 76 65 0a 20  t no recursive. 
0d40: 20 23 20 6d 75 74 65 78 65 73 20 61 72 65 20 6f   # mutexes are o
0d50: 62 74 61 69 6e 65 64 2e 0a 20 20 64 6f 5f 74 65  btained..  do_te
0d60: 73 74 20 6d 75 74 65 78 31 2e 33 2e 31 20 7b 0a  st mutex1.3.1 {.
0d70: 20 20 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c      catch {db cl
0d80: 6f 73 65 7d 0a 20 20 20 20 63 6c 65 61 72 5f 6d  ose}.    clear_m
0d90: 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 0a 20 20  utex_counters.  
0da0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
0db0: 74 2e 64 62 20 2d 6e 6f 6d 75 74 65 78 20 31 0a  t.db -nomutex 1.
0dc0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
0dd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20  LECT * FROM abc 
0de0: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 31 20 32  }.  } {1 2 3 1 2
0df0: 20 33 20 31 20 32 20 33 7d 0a 20 20 64 6f 5f 74   3 1 2 3}.  do_t
0e00: 65 73 74 20 6d 75 74 65 78 31 2e 33 2e 32 20 7b  est mutex1.3.2 {
0e10: 0a 20 20 20 20 6d 75 74 65 78 5f 63 6f 75 6e 74  .    mutex_count
0e20: 65 72 73 20 63 6f 75 6e 74 65 72 73 0a 20 20 20  ers counters.   
0e30: 20 73 65 74 20 63 6f 75 6e 74 65 72 73 28 72 65   set counters(re
0e40: 63 75 72 73 69 76 65 29 0a 20 20 7d 20 7b 30 7d  cursive).  } {0}
0e50: 0a 7d 0a 0a 23 20 54 65 73 74 20 74 68 65 20 73  .}..# Test the s
0e60: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
0e70: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f  ) function..#.do
0e80: 5f 74 65 73 74 20 6d 75 74 65 78 31 2e 34 2e 31  _test mutex1.4.1
0e90: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   {.  catch {db c
0ea0: 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20  lose}.  sqlite3 
0eb0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 6e 74  db test.db.  ent
0ec0: 65 72 5f 64 62 5f 6d 75 74 65 78 20 64 62 0a 20  er_db_mutex db. 
0ed0: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
0ee0: 20 31 2c 20 32 2c 20 33 7d 0a 7d 20 7b 31 20 32   1, 2, 3}.} {1 2
0ef0: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 74 65   3}.do_test mute
0f00: 78 31 2e 34 2e 32 20 7b 0a 20 20 6c 65 61 76 65  x1.4.2 {.  leave
0f10: 5f 64 62 5f 6d 75 74 65 78 20 64 62 0a 20 20 64  _db_mutex db.  d
0f20: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 31  b eval {SELECT 1
0f30: 2c 20 32 2c 20 33 7d 0a 7d 20 7b 31 20 32 20 33  , 2, 3}.} {1 2 3
0f40: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31  }.do_test mutex1
0f50: 2e 34 2e 33 20 7b 0a 20 20 63 61 74 63 68 20 7b  .4.3 {.  catch {
0f60: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69  db close}.  sqli
0f70: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
0f80: 6e 6f 6d 75 74 65 78 20 31 0a 20 20 65 6e 74 65  nomutex 1.  ente
0f90: 72 5f 64 62 5f 6d 75 74 65 78 20 64 62 0a 20 20  r_db_mutex db.  
0fa0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
0fb0: 31 2c 20 32 2c 20 33 7d 0a 7d 20 7b 31 20 32 20  1, 2, 3}.} {1 2 
0fc0: 33 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 74 65 78  3}.do_test mutex
0fd0: 31 2e 34 2e 34 20 7b 0a 20 20 6c 65 61 76 65 5f  1.4.4 {.  leave_
0fe0: 64 62 5f 6d 75 74 65 78 20 64 62 0a 20 20 64 62  db_mutex db.  db
0ff0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 31 2c   eval {SELECT 1,
1000: 20 32 2c 20 33 7d 0a 7d 20 7b 31 20 32 20 33 7d   2, 3}.} {1 2 3}
1010: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31  ..do_test mutex1
1020: 2d 58 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62  -X {.  catch {db
1030: 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65   close}.  sqlite
1040: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20 63 6c 65  3_shutdown.  cle
1050: 61 72 5f 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72  ar_mutex_counter
1060: 73 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d 75 74 65  s.  install_mute
1070: 78 5f 63 6f 75 6e 74 65 72 73 20 30 0a 20 20 73  x_counters 0.  s
1080: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1090: 65 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  e.} {SQLITE_OK}.
10a0: 0a 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73  .autoinstall_tes
10b0: 74 5f 66 75 6e 63 74 69 6f 6e 73 0a 66 69 6e 69  t_functions.fini
10c0: 73 68 5f 74 65 73 74 0a                          sh_test.