/ Hex Artifact Content
Login

Artifact b9114eaea7e748a3a4c8ff7b9ca806c8f95cef3e:


0000: 23 20 32 30 30 35 20 44 65 63 65 6d 62 65 72 20  # 2005 December 
0010: 33 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  30.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 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 2a 2a 2a 2a 0a 23 0a 23 20 24 49 64  ********.#.# $Id
0170: 3a 20 73 68 61 72 65 64 2e 74 65 73 74 2c 76 20  : shared.test,v 
0180: 31 2e 33 36 20 32 30 30 39 2f 30 33 2f 31 36 20  1.36 2009/03/16 
0190: 31 33 3a 31 39 3a 33 36 20 64 61 6e 69 65 6c 6b  13:19:36 danielk
01a0: 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74 20  1977 Exp $..set 
01b0: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
01c0: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
01d0: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
01e0: 73 74 65 72 2e 74 63 6c 0a 64 62 20 63 6c 6f 73  ster.tcl.db clos
01f0: 65 0a 0a 23 20 54 68 65 73 65 20 74 65 73 74 73  e..# These tests
0200: 20 63 61 6e 6e 6f 74 20 62 65 20 72 75 6e 20 77   cannot be run w
0210: 69 74 68 6f 75 74 20 74 68 65 20 41 54 54 41 43  ithout the ATTAC
0220: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 23 0a 69 66 63  H command..#.ifc
0230: 61 70 61 62 6c 65 20 21 73 68 61 72 65 64 5f 63  apable !shared_c
0240: 61 63 68 65 7c 7c 21 61 74 74 61 63 68 20 7b 0a  ache||!attach {.
0250: 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20    finish_test.  
0260: 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 74 20 3a 3a  return.}..set ::
0270: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
0280: 63 68 65 20 5b 73 71 6c 69 74 65 33 5f 65 6e 61  che [sqlite3_ena
0290: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
02a0: 20 31 5d 0a 0a 66 6f 72 65 61 63 68 20 61 76 20   1]..foreach av 
02b0: 5b 6c 69 73 74 20 30 20 31 5d 20 7b 0a 0a 23 20  [list 0 1] {..# 
02c0: 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
02d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
02e0: 20 65 78 65 63 75 74 65 20 74 68 65 20 61 75 74   execute the aut
02f0: 6f 2d 76 61 63 75 75 6d 20 70 72 61 67 6d 61 0a  o-vacuum pragma.
0300: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
0310: 63 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74  ce test.db.sqlit
0320: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 69  e3 db test.db..i
0330: 66 63 61 70 61 62 6c 65 20 61 75 74 6f 76 61 63  fcapable autovac
0340: 75 75 6d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  uum {.  do_test 
0350: 73 68 61 72 65 64 2d 5b 65 78 70 72 20 24 61 76  shared-[expr $av
0360: 2b 31 5d 2e 31 2e 30 20 7b 0a 20 20 20 20 65 78  +1].1.0 {.    ex
0370: 65 63 73 71 6c 20 22 70 72 61 67 6d 61 20 61 75  ecsql "pragma au
0380: 74 6f 5f 76 61 63 75 75 6d 3d 24 3a 3a 61 76 22  to_vacuum=$::av"
0390: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 70 72  .    execsql {pr
03a0: 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d  agma auto_vacuum
03b0: 7d 0a 20 20 7d 20 22 24 61 76 22 0a 7d 20 65 6c  }.  } "$av".} el
03c0: 73 65 20 7b 0a 20 20 69 66 20 7b 24 61 76 7d 20  se {.  if {$av} 
03d0: 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20  {.    db close. 
03e0: 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a 7d 0a 0a     break.  }.}..
03f0: 23 20 69 66 20 77 65 27 72 65 20 75 73 69 6e 67  # if we're using
0400: 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2c 20 77 65   proxy locks, we
0410: 20 75 73 65 20 32 20 66 69 6c 65 64 65 73 63 72   use 2 filedescr
0420: 69 70 74 6f 72 73 20 66 6f 72 20 61 20 64 62 0a  iptors for a db.
0430: 23 20 74 68 61 74 20 69 73 20 6f 70 65 6e 20 62  # that is open b
0440: 75 74 20 4e 4f 54 20 79 65 74 20 6c 6f 63 6b 65  ut NOT yet locke
0450: 64 2c 20 61 66 74 65 72 20 61 20 6c 6f 63 6b 20  d, after a lock 
0460: 69 73 20 74 61 6b 65 6e 20 77 65 27 6c 6c 20 68  is taken we'll h
0470: 61 76 65 20 33 2c 20 0a 23 20 6e 6f 72 6d 61 6c  ave 3, .# normal
0480: 6c 79 20 73 71 6c 69 74 65 20 75 73 65 73 20 31  ly sqlite uses 1
0490: 20 28 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20   (proxy locking 
04a0: 61 64 64 73 20 74 68 65 20 63 6f 6e 63 68 20 61  adds the conch a
04b0: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  nd the local loc
04c0: 6b 29 0a 73 65 74 20 75 73 69 6e 67 5f 70 72 6f  k).set using_pro
04d0: 78 79 20 30 0a 66 6f 72 65 61 63 68 20 7b 6e 61  xy 0.foreach {na
04e0: 6d 65 20 76 61 6c 75 65 7d 20 5b 61 72 72 61 79  me value} [array
04f0: 20 67 65 74 20 65 6e 76 20 53 51 4c 49 54 45 5f   get env SQLITE_
0500: 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
0510: 49 4e 47 5d 20 7b 0a 20 20 73 65 74 20 75 73 69  ING] {.  set usi
0520: 6e 67 5f 70 72 6f 78 79 20 24 76 61 6c 75 65 0a  ng_proxy $value.
0530: 7d 0a 73 65 74 20 65 78 74 72 61 66 64 73 5f 70  }.set extrafds_p
0540: 72 65 6c 6f 63 6b 20 30 0a 73 65 74 20 65 78 74  relock 0.set ext
0550: 72 61 66 64 73 5f 70 6f 73 74 6c 6f 63 6b 20 30  rafds_postlock 0
0560: 0a 69 66 20 7b 24 75 73 69 6e 67 5f 70 72 6f 78  .if {$using_prox
0570: 79 3e 30 7d 20 7b 0a 20 20 73 65 74 20 65 78 74  y>0} {.  set ext
0580: 72 61 66 64 73 5f 70 72 65 6c 6f 63 6b 20 31 0a  rafds_prelock 1.
0590: 20 20 73 65 74 20 65 78 74 72 61 66 64 73 5f 70    set extrafds_p
05a0: 6f 73 74 6c 6f 63 6b 20 32 0a 7d 20 0a 0a 23 20  ostlock 2.} ..# 
05b0: 24 61 76 20 69 73 20 63 75 72 72 65 6e 74 6c 79  $av is currently
05c0: 20 30 20 69 66 20 74 68 69 73 20 6c 6f 6f 70 20   0 if this loop 
05d0: 69 74 65 72 61 74 69 6f 6e 20 69 73 20 74 6f 20  iteration is to 
05e0: 74 65 73 74 20 77 69 74 68 20 61 75 74 6f 2d 76  test with auto-v
05f0: 61 63 75 75 6d 20 74 75 72 6e 65 64 0a 23 20 6f  acuum turned.# o
0600: 66 66 2c 20 61 6e 64 20 31 20 69 66 20 69 74 20  ff, and 1 if it 
0610: 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 20 49 6e  is turned on. In
0620: 63 72 65 6d 65 6e 74 20 69 74 20 73 6f 20 74 68  crement it so th
0630: 61 74 20 28 31 20 2d 3e 20 6e 6f 20 61 75 74 6f  at (1 -> no auto
0640: 2d 76 61 63 75 75 6d 29 20 0a 23 20 61 6e 64 20  -vacuum) .# and 
0650: 28 32 20 2d 3e 20 61 75 74 6f 2d 76 61 63 75 75  (2 -> auto-vacuu
0660: 6d 29 2e 20 54 68 65 20 73 6f 6c 65 20 72 65 61  m). The sole rea
0670: 73 6f 6e 20 66 6f 72 20 74 68 69 73 20 69 73 20  son for this is 
0680: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
0690: 20 6e 69 63 65 72 0a 23 20 77 68 65 6e 20 77 65   nicer.# when we
06a0: 20 75 73 65 20 74 68 69 73 20 76 61 72 69 61 62   use this variab
06b0: 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 65  le as part of te
06c0: 73 74 2d 63 61 73 65 20 6e 61 6d 65 73 2e 0a 23  st-case names..#
06d0: 0a 69 6e 63 72 20 61 76 0a 0a 23 20 54 65 73 74  .incr av..# Test
06e0: 20 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 3a 0a 23   organization:.#
06f0: 0a 23 20 73 68 61 72 65 64 2d 31 2e 2a 3a 20 53  .# shared-1.*: S
0700: 69 6d 70 6c 65 20 74 65 73 74 20 74 6f 20 76 65  imple test to ve
0710: 72 69 66 79 20 62 61 73 69 63 20 73 61 6e 69 74  rify basic sanit
0720: 79 20 6f 66 20 74 61 62 6c 65 20 6c 65 76 65 6c  y of table level
0730: 20 6c 6f 63 6b 69 6e 67 20 77 68 65 6e 0a 23 20   locking when.# 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 74 77 6f 20              two 
0750: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 73 68 61 72  connections shar
0760: 65 20 61 20 70 61 67 65 72 20 63 61 63 68 65 2e  e a pager cache.
0770: 0a 23 20 73 68 61 72 65 64 2d 32 2e 2a 3a 20 54  .# shared-2.*: T
0780: 65 73 74 20 74 68 61 74 20 61 20 72 65 61 64 20  est that a read 
0790: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
07a0: 63 6f 2d 65 78 69 73 74 20 77 69 74 68 20 61 20  co-exist with a 
07b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .#             w
07c0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
07d0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 20 73 69  , including a si
07e0: 6d 70 6c 65 20 74 65 73 74 20 74 6f 20 65 6e 73  mple test to ens
07f0: 75 72 65 20 74 68 65 20 0a 23 20 20 20 20 20 20  ure the .#      
0800: 20 20 20 20 20 20 20 65 78 74 65 72 6e 61 6c 20         external 
0810: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
0820: 20 69 73 20 73 74 69 6c 6c 20 77 6f 72 6b 69 6e   is still workin
0830: 67 2e 0a 23 20 73 68 61 72 65 64 2d 33 2e 2a 3a  g..# shared-3.*:
0840: 20 53 69 6d 70 6c 65 20 74 65 73 74 20 6f 66 20   Simple test of 
0850: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
0860: 20 6d 6f 64 65 2e 0a 23 20 73 68 61 72 65 64 2d   mode..# shared-
0870: 34 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20  4.*: Check that 
0880: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  the schema is lo
0890: 63 6b 65 64 20 61 6e 64 20 75 6e 6c 6f 63 6b 65  cked and unlocke
08a0: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 20 73  d correctly..# s
08b0: 68 61 72 65 64 2d 35 2e 2a 3a 20 54 65 73 74 20  hared-5.*: Test 
08c0: 74 68 61 74 20 63 72 65 61 74 69 6e 67 2f 64 72  that creating/dr
08d0: 6f 70 70 69 6e 67 20 73 63 68 65 6d 61 20 69 74  opping schema it
08e0: 65 6d 73 20 77 6f 72 6b 73 20 77 68 65 6e 20 64  ems works when d
08f0: 61 74 61 62 61 73 65 73 0a 23 20 20 20 20 20 20  atabases.#      
0900: 20 20 20 20 20 20 20 61 72 65 20 61 74 74 61 63         are attac
0910: 68 65 64 20 69 6e 20 64 69 66 66 65 72 65 6e 74  hed in different
0920: 20 6f 72 64 65 72 73 20 74 6f 20 64 69 66 66 65   orders to diffe
0930: 72 65 6e 74 20 68 61 6e 64 6c 65 73 2e 0a 23 20  rent handles..# 
0940: 73 68 61 72 65 64 2d 36 2e 2a 3a 20 4c 6f 63 6b  shared-6.*: Lock
0950: 69 6e 67 2c 20 55 4e 49 4f 4e 20 41 4c 4c 20 71  ing, UNION ALL q
0960: 75 65 72 69 65 73 20 61 6e 64 20 73 75 62 2d 71  ueries and sub-q
0970: 75 65 72 69 65 73 2e 0a 23 20 73 68 61 72 65 64  ueries..# shared
0980: 2d 37 2e 2a 3a 20 41 75 74 6f 76 61 63 75 75 6d  -7.*: Autovacuum
0990: 20 61 6e 64 20 73 68 61 72 65 64 2d 63 61 63 68   and shared-cach
09a0: 65 2e 0a 23 20 73 68 61 72 65 64 2d 38 2e 2a 3a  e..# shared-8.*:
09b0: 20 54 65 73 74 73 20 72 65 6c 61 74 65 64 20 74   Tests related t
09c0: 6f 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64  o the text encod
09d0: 69 6e 67 20 6f 66 20 73 68 61 72 65 64 2d 63 61  ing of shared-ca
09e0: 63 68 65 20 64 61 74 61 62 61 73 65 73 2e 0a 23  che databases..#
09f0: 20 73 68 61 72 65 64 2d 39 2e 2a 3a 20 54 45 4d   shared-9.*: TEM
0a00: 50 20 74 72 69 67 67 65 72 73 20 61 6e 64 20 73  P triggers and s
0a10: 68 61 72 65 64 2d 63 61 63 68 65 20 64 61 74 61  hared-cache data
0a20: 62 61 73 65 73 2e 0a 23 20 73 68 61 72 65 64 2d  bases..# shared-
0a30: 31 30 2e 2a 3a 20 54 65 73 74 73 20 6f 66 20 73  10.*: Tests of s
0a40: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 0a  qlite3_close()..
0a50: 23 20 73 68 61 72 65 64 2d 31 31 2e 2a 3a 20 54  # shared-11.*: T
0a60: 65 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  est transaction 
0a70: 6c 6f 63 6b 69 6e 67 2e 0a 23 0a 0a 64 6f 5f 74  locking..#..do_t
0a80: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
0a90: 2e 31 20 7b 0a 20 20 23 20 4f 70 65 6e 20 61 20  .1 {.  # Open a 
0aa0: 73 65 63 6f 6e 64 20 64 61 74 61 62 61 73 65 20  second database 
0ab0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 74 65 73 74  on the file test
0ac0: 2e 64 62 2e 20 49 74 20 73 68 6f 75 6c 64 20 75  .db. It should u
0ad0: 73 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  se the same page
0ae0: 72 0a 20 20 23 20 63 61 63 68 65 20 61 6e 64 20  r.  # cache and 
0af0: 73 63 68 65 6d 61 20 61 73 20 74 68 65 20 6f 72  schema as the or
0b00: 69 67 69 6e 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  iginal connectio
0b10: 6e 2e 20 56 65 72 69 66 79 20 74 68 61 74 20 6f  n. Verify that o
0b20: 6e 6c 79 20 31 20 66 69 6c 65 20 69 73 20 0a 20  nly 1 file is . 
0b30: 20 23 20 6f 70 65 6e 65 64 2e 0a 20 20 73 71 6c   # opened..  sql
0b40: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
0b50: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  .  set ::sqlite_
0b60: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a  open_file_count.
0b70: 20 20 65 78 70 72 20 24 73 71 6c 69 74 65 5f 6f    expr $sqlite_o
0b80: 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2d 24  pen_file_count-$
0b90: 65 78 74 72 61 66 64 73 5f 70 6f 73 74 6c 6f 63  extrafds_postloc
0ba0: 6b 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  k.} {1}.do_test 
0bb0: 73 68 61 72 65 64 2d 24 61 76 2e 31 2e 32 20 7b  shared-$av.1.2 {
0bc0: 0a 20 20 23 20 41 64 64 20 61 20 74 61 62 6c 65  .  # Add a table
0bd0: 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 72 6f   and a single ro
0be0: 77 20 6f 66 20 64 61 74 61 20 76 69 61 20 74 68  w of data via th
0bf0: 65 20 66 69 72 73 74 20 63 6f 6e 6e 65 63 74 69  e first connecti
0c00: 6f 6e 2e 20 0a 20 20 23 20 45 6e 73 75 72 65 20  on. .  # Ensure 
0c10: 74 68 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20  that the second 
0c20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 73  connection can s
0c30: 65 65 20 74 68 65 6d 2e 0a 20 20 65 78 65 63 73  ee them..  execs
0c40: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
0c50: 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20  TABLE abc(a, b, 
0c60: 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  c);.    INSERT I
0c70: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 31  NTO abc VALUES(1
0c80: 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 20 64 62 0a  , 2, 3);.  } db.
0c90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ca0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
0cb0: 63 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  c;.  } db2.} {1 
0cc0: 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  2 3}.do_test sha
0cd0: 72 65 64 2d 24 61 76 2e 31 2e 33 20 7b 0a 20 20  red-$av.1.3 {.  
0ce0: 23 20 48 61 76 65 20 74 68 65 20 66 69 72 73 74  # Have the first
0cf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 65 67 69   connection begi
0d00: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
0d10: 61 6e 64 20 6f 62 74 61 69 6e 20 61 20 72 65 61  and obtain a rea
0d20: 64 2d 6c 6f 63 6b 0a 20 20 23 20 6f 6e 20 74 61  d-lock.  # on ta
0d30: 62 6c 65 20 61 62 63 2e 20 54 68 69 73 20 73 68  ble abc. This sh
0d40: 6f 75 6c 64 20 6e 6f 74 20 70 72 65 76 65 6e 74  ould not prevent
0d50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e   the second conn
0d60: 65 63 74 69 6f 6e 20 66 72 6f 6d 20 0a 20 20 23  ection from .  #
0d70: 20 71 75 65 72 79 69 6e 67 20 61 62 63 2e 0a 20   querying abc.. 
0d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0d90: 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54  EGIN;.    SELECT
0da0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d   * FROM abc;.  }
0db0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0dc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
0dd0: 62 63 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31  bc;.  } db2.} {1
0de0: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 68   2 3}.do_test sh
0df0: 61 72 65 64 2d 24 61 76 2e 31 2e 34 20 7b 0a 20  ared-$av.1.4 {. 
0e00: 20 23 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74   # Try to insert
0e10: 20 61 20 72 6f 77 20 69 6e 74 6f 20 61 62 63 20   a row into abc 
0e20: 76 69 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32  via connection 2
0e30: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
0e40: 69 6c 20 62 65 63 61 75 73 65 0a 20 20 23 20 6f  il because.  # o
0e50: 66 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  f the read-lock 
0e60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 69 73 20  connection 1 is 
0e70: 68 6f 6c 64 69 6e 67 20 6f 6e 20 74 61 62 6c 65  holding on table
0e80: 20 61 62 63 20 28 6f 62 74 61 69 6e 65 64 20 69   abc (obtained i
0e90: 6e 20 74 68 65 0a 20 20 23 20 70 72 65 76 69 6f  n the.  # previo
0ea0: 75 73 20 74 65 73 74 20 63 61 73 65 29 2e 0a 20  us test case).. 
0eb0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0ec0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0ed0: 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b  VALUES(4, 5, 6);
0ee0: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  .  } db2.} {1 {d
0ef0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
0f00: 20 6c 6f 63 6b 65 64 3a 20 61 62 63 7d 7d 0a 64   locked: abc}}.d
0f10: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
0f20: 76 2e 31 2e 35 20 7b 0a 20 20 23 20 55 73 69 6e  v.1.5 {.  # Usin
0f30: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28  g connection 2 (
0f40: 74 68 65 20 6f 6e 65 20 77 69 74 68 6f 75 74 20  the one without 
0f50: 74 68 65 20 6f 70 65 6e 20 74 72 61 6e 73 61 63  the open transac
0f60: 74 69 6f 6e 29 2c 20 74 72 79 20 74 6f 20 63 72  tion), try to cr
0f70: 65 61 74 65 0a 20 20 23 20 61 20 6e 65 77 20 74  eate.  # a new t
0f80: 61 62 6c 65 2e 20 54 68 69 73 20 73 68 6f 75 6c  able. This shoul
0f90: 64 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 6f  d fail because o
0fa0: 66 20 74 68 65 20 6f 70 65 6e 20 72 65 61 64 20  f the open read 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 23  transaction .  #
0fc0: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
0fd0: 69 6f 6e 20 31 2e 0a 20 20 63 61 74 63 68 73 71  ion 1..  catchsq
0fe0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0ff0: 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66  ABLE def(d, e, f
1000: 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  );.  } db2.} {1 
1010: 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  {database table 
1020: 69 73 20 6c 6f 63 6b 65 64 3a 20 73 71 6c 69 74  is locked: sqlit
1030: 65 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65  e_master}}.do_te
1040: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 2e  st shared-$av.1.
1050: 36 20 7b 0a 20 20 23 20 55 70 67 72 61 64 65 20  6 {.  # Upgrade 
1060: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 27 73 20 74  connection 1's t
1070: 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 61 20  ransaction to a 
1080: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1090: 6e 2e 20 43 72 65 61 74 65 0a 20 20 23 20 61 20  n. Create.  # a 
10a0: 6e 65 77 20 74 61 62 6c 65 20 2d 20 64 65 66 20  new table - def 
10b0: 2d 20 61 6e 64 20 69 6e 73 65 72 74 20 61 20 72  - and insert a r
10c0: 6f 77 20 69 6e 74 6f 20 69 74 2e 20 42 65 63 61  ow into it. Beca
10d0: 75 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  use the connecti
10e0: 6f 6e 20 31 0a 20 20 23 20 74 72 61 6e 73 61 63  on 1.  # transac
10f0: 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74 68  tion modifies th
1100: 65 20 73 63 68 65 6d 61 2c 20 69 74 20 73 68 6f  e schema, it sho
1110: 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
1120: 62 6c 65 20 66 6f 72 20 0a 20 20 23 20 63 6f 6e  ble for .  # con
1130: 6e 65 63 74 69 6f 6e 20 32 20 74 6f 20 61 63 63  nection 2 to acc
1140: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
1150: 20 61 74 20 61 6c 6c 20 75 6e 74 69 6c 20 74 68   at all until th
1160: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 0a  e connection 1 .
1170: 20 20 23 20 68 61 73 20 66 69 6e 69 73 68 65 64    # has finished
1180: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1190: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
11a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
11b0: 65 66 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20  ef(d, e, f);.   
11c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66   INSERT INTO def
11d0: 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 56   VALUES('IV', 'V
11e0: 27 2c 20 27 56 49 27 29 3b 0a 20 20 7d 0a 7d 20  ', 'VI');.  }.} 
11f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  {}.do_test share
1200: 64 2d 24 61 76 2e 31 2e 37 20 7b 0a 20 20 23 20  d-$av.1.7 {.  # 
1210: 52 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 71  Read from the sq
1220: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1230: 65 20 77 69 74 68 20 63 6f 6e 6e 65 63 74 69 6f  e with connectio
1240: 6e 20 31 20 28 69 6e 73 69 64 65 20 74 68 65 20  n 1 (inside the 
1250: 0a 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  # transaction
1260: 29 2e 20 54 68 65 6e 20 74 65 73 74 20 74 68 61  ). Then test tha
1270: 74 20 77 65 20 63 61 6e 20 6e 6f 74 20 64 6f 20  t we can not do 
1280: 74 68 69 73 20 77 69 74 68 20 63 6f 6e 6e 65 63  this with connec
1290: 74 69 6f 6e 20 32 2e 20 54 68 69 73 0a 20 20 23  tion 2. This.  #
12a0: 20 69 73 20 62 65 63 61 75 73 65 20 6f 66 20 74   is because of t
12b0: 68 65 20 73 63 68 65 6d 61 2d 6d 6f 64 69 66 69  he schema-modifi
12c0: 65 64 20 6c 6f 63 6b 20 65 73 74 61 62 6c 69 73  ed lock establis
12d0: 68 65 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  hed by connectio
12e0: 6e 20 31 20 0a 20 20 23 20 69 6e 20 74 68 65 20  n 1 .  # in the 
12f0: 70 72 65 76 69 6f 75 73 20 74 65 73 74 20 63 61  previous test ca
1300: 73 65 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  se..  execsql {.
1310: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1320: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
1330: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
1340: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
1350: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1360: 72 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  r;.  } db2.} {1 
1370: 7b 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  {database schema
1380: 20 69 73 20 6c 6f 63 6b 65 64 3a 20 6d 61 69 6e   is locked: main
1390: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
13a0: 64 2d 24 61 76 2e 31 2e 38 20 7b 0a 20 20 23 20  d-$av.1.8 {.  # 
13b0: 43 6f 6d 6d 69 74 20 74 68 65 20 63 6f 6e 6e 65  Commit the conne
13c0: 63 74 69 6f 6e 20 31 20 74 72 61 6e 73 61 63 74  ction 1 transact
13d0: 69 6f 6e 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b  ion..  execsql {
13e0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
13f0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 73  .} {}..do_test s
1400: 68 61 72 65 64 2d 24 61 76 2e 32 2e 31 20 7b 0a  hared-$av.2.1 {.
1410: 20 20 23 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74    # Open connect
1420: 69 6f 6e 20 64 62 33 20 74 6f 20 74 68 65 20 64  ion db3 to the d
1430: 61 74 61 62 61 73 65 2e 20 55 73 65 20 61 20 64  atabase. Use a d
1440: 69 66 66 65 72 65 6e 74 20 70 61 74 68 20 74 6f  ifferent path to
1450: 20 74 68 65 20 73 61 6d 65 0a 20 20 23 20 66 69   the same.  # fi
1460: 6c 65 20 73 6f 20 74 68 61 74 20 64 62 33 20 64  le so that db3 d
1470: 6f 65 73 20 2a 6e 6f 74 2a 20 73 68 61 72 65 20  oes *not* share 
1480: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
1490: 61 63 68 65 20 61 73 20 64 62 20 61 6e 64 20 64  ache as db and d
14a0: 62 32 0a 20 20 23 20 28 74 68 65 72 65 20 73 68  b2.  # (there sh
14b0: 6f 75 6c 64 20 62 65 20 74 77 6f 20 6f 70 65 6e  ould be two open
14c0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 73 29 2e 0a   file handles)..
14d0: 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61    if {$::tcl_pla
14e0: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d  tform(platform)=
14f0: 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20 20 20 73  ="unix"} {.    s
1500: 71 6c 69 74 65 33 20 64 62 33 20 2e 2f 74 65 73  qlite3 db3 ./tes
1510: 74 2e 64 62 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  t.db.  } else {.
1520: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 33 20      sqlite3 db3 
1530: 54 45 53 54 2e 44 42 0a 20 20 7d 0a 20 20 73 65  TEST.DB.  }.  se
1540: 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  t ::sqlite_open_
1550: 66 69 6c 65 5f 63 6f 75 6e 74 0a 20 20 65 78 70  file_count.  exp
1560: 72 20 24 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  r $sqlite_open_f
1570: 69 6c 65 5f 63 6f 75 6e 74 2d 28 24 65 78 74 72  ile_count-($extr
1580: 61 66 64 73 5f 70 72 65 6c 6f 63 6b 2b 24 65 78  afds_prelock+$ex
1590: 74 72 61 66 64 73 5f 70 6f 73 74 6c 6f 63 6b 29  trafds_postlock)
15a0: 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73  .} {2}.do_test s
15b0: 68 61 72 65 64 2d 24 61 76 2e 32 2e 32 20 7b 0a  hared-$av.2.2 {.
15c0: 20 20 23 20 53 74 61 72 74 20 72 65 61 64 20 74    # Start read t
15d0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 6e 20 64  ransactions on d
15e0: 62 20 61 6e 64 20 64 62 32 20 28 74 68 65 20 73  b and db2 (the s
15f0: 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
1600: 65 29 2e 20 45 6e 73 75 72 65 0a 20 20 23 20 64  e). Ensure.  # d
1610: 62 33 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20  b3 cannot write 
1620: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1630: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1640: 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45   BEGIN;.    SELE
1650: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
1660: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
1670: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45     BEGIN;.    SE
1680: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
1690: 0a 20 20 7d 20 64 62 32 0a 20 20 63 61 74 63 68  .  } db2.  catch
16a0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
16b0: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
16c0: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 20 64  (1, 2, 3);.  } d
16d0: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
16e0: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
16f0: 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65 73 74  d: abc}}.do_test
1700: 20 73 68 61 72 65 64 2d 24 61 76 2e 32 2e 33 20   shared-$av.2.3 
1710: 7b 0a 20 20 23 20 54 75 72 6e 20 64 62 27 73 20  {.  # Turn db's 
1720: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
1730: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1740: 74 69 6f 6e 2e 20 64 62 33 20 73 68 6f 75 6c 64  tion. db3 should
1750: 20 73 74 69 6c 6c 20 62 65 0a 20 20 23 20 61 62   still be.  # ab
1760: 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
1770: 74 61 62 6c 65 20 64 65 66 20 28 62 75 74 20 77  table def (but w
1780: 69 6c 6c 20 6e 6f 74 20 73 65 65 20 74 68 65 20  ill not see the 
1790: 6e 65 77 20 72 6f 77 29 2e 20 43 6f 6e 6e 65 63  new row). Connec
17a0: 74 69 6f 6e 0a 20 20 23 20 64 62 32 20 73 68 6f  tion.  # db2 sho
17b0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  uld not be able 
17c0: 74 6f 20 72 65 61 64 20 64 65 66 20 28 62 65 63  to read def (bec
17d0: 61 75 73 65 20 6f 66 20 74 68 65 20 77 72 69 74  ause of the writ
17e0: 65 2d 6c 6f 63 6b 29 2e 0a 0a 23 20 54 6f 64 6f  e-lock)...# Todo
17f0: 3a 20 54 68 65 20 66 61 69 6c 65 64 20 22 49 4e  : The failed "IN
1800: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 2e 2e  SERT INTO abc ..
1810: 2e 22 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ." statement in 
1820: 74 68 65 20 61 62 6f 76 65 20 74 65 73 74 0a 23  the above test.#
1830: 20 68 61 73 20 73 74 61 72 74 65 64 20 61 20 77   has started a w
1840: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1850: 20 6f 6e 20 64 62 32 20 28 73 68 6f 75 6c 64 20   on db2 (should 
1860: 74 68 69 73 20 62 65 20 73 6f 3f 29 2e 20 54 68  this be so?). Th
1870: 69 73 20 0a 23 20 77 6f 75 6c 64 20 70 72 65 76  is .# would prev
1880: 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ent connection d
1890: 62 20 66 72 6f 6d 20 73 74 61 72 74 69 6e 67 20  b from starting 
18a0: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
18b0: 69 6f 6e 2e 20 53 6f 20 72 6f 6c 6c 20 74 68 65  ion. So roll the
18c0: 0a 23 20 64 62 32 20 74 72 61 6e 73 61 63 74 69  .# db2 transacti
18d0: 6f 6e 20 62 61 63 6b 20 61 6e 64 20 72 65 70 6c  on back and repl
18e0: 61 63 65 20 69 74 20 77 69 74 68 20 61 20 6e 65  ace it with a ne
18f0: 77 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  w read transacti
1900: 6f 6e 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  on..  execsql {.
1910: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
1920: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c    BEGIN;.    SEL
1930: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
1940: 20 20 7d 20 64 62 32 0a 0a 20 20 65 78 65 63 73    } db2..  execs
1950: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
1960: 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28  INTO def VALUES(
1970: 27 56 49 49 27 2c 20 27 56 49 49 49 27 2c 20 27  'VII', 'VIII', '
1980: 49 58 27 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 63  IX');.  }.  conc
1990: 61 74 20 5b 0a 20 20 20 20 63 61 74 63 68 73 71  at [.    catchsq
19a0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
19b0: 4d 20 64 65 66 3b 20 7d 20 64 62 33 0a 20 20 5d  M def; } db3.  ]
19c0: 20 5b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   [.    catchsql 
19d0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
19e0: 64 65 66 3b 20 7d 20 64 62 32 0a 20 20 5d 0a 7d  def; } db2.  ].}
19f0: 20 7b 30 20 7b 49 56 20 56 20 56 49 7d 20 31 20   {0 {IV V VI} 1 
1a00: 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  {database table 
1a10: 69 73 20 6c 6f 63 6b 65 64 3a 20 64 65 66 7d 7d  is locked: def}}
1a20: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
1a30: 24 61 76 2e 32 2e 34 20 7b 0a 20 20 23 20 43 6f  $av.2.4 {.  # Co
1a40: 6d 6d 69 74 20 74 68 65 20 6f 70 65 6e 20 74 72  mmit the open tr
1a50: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64 62 2e  ansaction on db.
1a60: 20 64 62 32 20 73 74 69 6c 6c 20 68 6f 6c 64 73   db2 still holds
1a70: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1a80: 69 6f 6e 2e 0a 20 20 23 20 54 68 69 73 20 73 68  ion..  # This sh
1a90: 6f 75 6c 64 20 70 72 65 76 65 6e 74 20 64 62 33  ould prevent db3
1aa0: 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f   from writing to
1ab0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 62   the database, b
1ac0: 75 74 20 6e 6f 74 20 66 72 6f 6d 20 0a 20 20 23  ut not from .  #
1ad0: 20 72 65 61 64 69 6e 67 2e 0a 20 20 65 78 65 63   reading..  exec
1ae0: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
1af0: 3b 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b  ;.  }.  concat [
1b00: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
1b10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65  SELECT * FROM de
1b20: 66 3b 20 7d 20 64 62 33 0a 20 20 5d 20 5b 0a 20  f; } db3.  ] [. 
1b30: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
1b40: 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41  SERT INTO def VA
1b50: 4c 55 45 53 28 27 58 27 2c 20 27 58 49 27 2c 20  LUES('X', 'XI', 
1b60: 27 58 49 49 27 29 3b 20 7d 20 64 62 33 0a 20 20  'XII'); } db3.  
1b70: 5d 0a 7d 20 7b 30 20 7b 49 56 20 56 20 56 49 20  ].} {0 {IV V VI 
1b80: 56 49 49 20 56 49 49 49 20 49 58 7d 20 31 20 7b  VII VIII IX} 1 {
1b90: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1ba0: 65 64 7d 7d 0a 0a 63 61 74 63 68 73 71 6c 20 43  ed}}..catchsql C
1bb0: 4f 4d 4d 49 54 20 64 62 32 0a 0a 64 6f 5f 74 65  OMMIT db2..do_te
1bc0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 33 2e  st shared-$av.3.
1bd0: 31 2e 31 20 7b 0a 20 20 23 20 54 68 69 73 20 74  1.1 {.  # This t
1be0: 65 73 74 20 63 61 73 65 20 73 74 61 72 74 73 20  est case starts 
1bf0: 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  a linear scan of
1c00: 20 74 61 62 6c 65 20 27 73 65 71 27 20 75 73 69   table 'seq' usi
1c10: 6e 67 20 61 20 0a 20 20 23 20 72 65 61 64 2d 75  ng a .  # read-u
1c20: 6e 63 6f 6d 6d 69 74 74 65 64 20 63 6f 6e 6e 65  ncommitted conne
1c30: 63 74 69 6f 6e 2e 20 49 6e 20 74 68 65 20 6d 69  ction. In the mi
1c40: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 63 61 6e  ddle of the scan
1c50: 2c 20 72 6f 77 73 20 61 72 65 20 61 64 64 65 64  , rows are added
1c60: 0a 20 20 23 20 74 6f 20 74 68 65 20 65 6e 64 20  .  # to the end 
1c70: 6f 66 20 74 68 65 20 73 65 71 20 74 61 62 6c 65  of the seq table
1c80: 20 28 61 68 65 61 64 20 6f 66 20 74 68 65 20 63   (ahead of the c
1c90: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
1ca0: 73 69 74 69 6f 6e 29 2e 0a 20 20 23 20 54 68 65  sition)..  # The
1cb0: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 72 6f 77   uncommitted row
1cc0: 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c  s should be incl
1cd0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75  uded in the resu
1ce0: 6c 74 73 20 6f 66 20 74 68 65 20 73 63 61 6e 2e  lts of the scan.
1cf0: 0a 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20  .  execsql ".   
1d00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 65   CREATE TABLE se
1d10: 71 28 69 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  q(i PRIMARY KEY,
1d20: 20 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x);.    INSERT 
1d30: 49 4e 54 4f 20 73 65 71 20 56 41 4c 55 45 53 28  INTO seq VALUES(
1d40: 31 2c 20 27 5b 73 74 72 69 6e 67 20 72 65 70 65  1, '[string repe
1d50: 61 74 20 58 20 35 30 30 5d 27 29 3b 0a 20 20 20  at X 500]');.   
1d60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 71   INSERT INTO seq
1d70: 20 56 41 4c 55 45 53 28 32 2c 20 27 5b 73 74 72   VALUES(2, '[str
1d80: 69 6e 67 20 72 65 70 65 61 74 20 58 20 35 30 30  ing repeat X 500
1d90: 5d 27 29 3b 0a 20 20 22 0a 20 20 65 78 65 63 73  ]');.  ".  execs
1da0: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
1db0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d  M sqlite_master}
1dc0: 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b   db2.  execsql {
1dd0: 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e 63 6f  PRAGMA read_unco
1de0: 6d 6d 69 74 74 65 64 20 3d 20 31 7d 20 64 62 32  mmitted = 1} db2
1df0: 0a 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73  ..  set ret [lis
1e00: 74 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53  t].  db2 eval {S
1e10: 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 73 65 71  ELECT i FROM seq
1e20: 20 4f 52 44 45 52 20 42 59 20 69 7d 20 7b 0a 20   ORDER BY i} {. 
1e30: 20 20 20 69 66 20 7b 24 69 20 3c 20 34 7d 20 7b     if {$i < 4} {
1e40: 0a 20 20 20 20 20 20 73 65 74 20 6d 61 78 20 5b  .      set max [
1e50: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1e60: 6d 61 78 28 69 29 20 46 52 4f 4d 20 73 65 71 7d  max(i) FROM seq}
1e70: 5d 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20  ].      db eval 
1e80: 7b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  {.        INSERT
1e90: 20 49 4e 54 4f 20 73 65 71 20 53 45 4c 45 43 54   INTO seq SELECT
1ea0: 20 69 20 2b 20 3a 6d 61 78 2c 20 78 20 46 52 4f   i + :max, x FRO
1eb0: 4d 20 73 65 71 3b 0a 20 20 20 20 20 20 7d 0a 20  M seq;.      }. 
1ec0: 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64     }.    lappend
1ed0: 20 72 65 74 20 24 69 0a 20 20 7d 0a 20 20 73 65   ret $i.  }.  se
1ee0: 74 20 72 65 74 0a 7d 20 7b 31 20 32 20 33 20 34  t ret.} {1 2 3 4
1ef0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
1f00: 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36 7d   12 13 14 15 16}
1f10: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
1f20: 24 61 76 2e 33 2e 31 2e 32 20 7b 0a 20 20 23 20  $av.3.1.2 {.  # 
1f30: 41 6e 6f 74 68 65 72 20 6c 69 6e 65 61 72 20 73  Another linear s
1f40: 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c  can through tabl
1f50: 65 20 73 65 71 20 75 73 69 6e 67 20 61 20 72 65  e seq using a re
1f60: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63  ad-uncommitted c
1f70: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 23 20 54  onnection..  # T
1f80: 68 69 73 20 74 69 6d 65 2c 20 64 65 6c 65 74 65  his time, delete
1f90: 20 65 61 63 68 20 72 6f 77 20 61 73 20 69 74 20   each row as it 
1fa0: 69 73 20 72 65 61 64 2e 20 53 68 6f 75 6c 64 20  is read. Should 
1fb0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 72  not affect the r
1fc0: 65 73 75 6c 74 73 20 6f 66 0a 20 20 23 20 74 68  esults of.  # th
1fd0: 65 20 73 63 61 6e 2c 20 62 75 74 20 74 68 65 20  e scan, but the 
1fe0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
1ff0: 65 6d 70 74 79 20 61 66 74 65 72 20 74 68 65 20  empty after the 
2000: 73 63 61 6e 20 69 73 20 63 6f 6e 63 6c 75 64 65  scan is conclude
2010: 64 20 0a 20 20 23 20 28 74 65 73 74 20 33 2e 31  d .  # (test 3.1
2020: 2e 33 20 76 65 72 69 66 69 65 73 20 74 68 69 73  .3 verifies this
2030: 29 2e 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69  )..  set ret [li
2040: 73 74 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b  st].  db2 eval {
2050: 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 73 65  SELECT i FROM se
2060: 71 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  q} {.    db eval
2070: 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 65   {DELETE FROM se
2080: 71 20 57 48 45 52 45 20 69 20 3d 20 3a 69 7d 0a  q WHERE i = :i}.
2090: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20      lappend ret 
20a0: 24 69 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74  $i.  }.  set ret
20b0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
20c0: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
20d0: 33 20 31 34 20 31 35 20 31 36 7d 0a 64 6f 5f 74  3 14 15 16}.do_t
20e0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 33  est shared-$av.3
20f0: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
2100: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2110: 46 52 4f 4d 20 73 65 71 3b 0a 20 20 7d 0a 7d 20  FROM seq;.  }.} 
2120: 7b 7d 0a 0a 63 61 74 63 68 20 7b 64 62 20 63 6c  {}..catch {db cl
2130: 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 32 20  ose}.catch {db2 
2140: 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62  close}.catch {db
2150: 33 20 63 6c 6f 73 65 7d 0a 0a 23 2d 2d 2d 2d 2d  3 close}..#-----
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 73 68  -----.# Tests sh
21b0: 61 72 65 64 2d 34 2e 2a 20 74 65 73 74 20 74 68  ared-4.* test th
21c0: 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f  at the schema lo
21d0: 63 6b 69 6e 67 20 72 75 6c 65 73 20 61 72 65 20  cking rules are 
21e0: 61 70 70 6c 69 65 64 20 0a 23 20 63 6f 72 72 65  applied .# corre
21f0: 63 74 6c 79 2e 20 69 2e 65 2e 3a 0a 23 0a 23 20  ctly. i.e.:.#.# 
2200: 31 2e 20 41 6c 6c 20 74 72 61 6e 73 61 63 74 69  1. All transacti
2210: 6f 6e 73 20 72 65 71 75 69 72 65 20 61 20 72 65  ons require a re
2220: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  ad-lock on the s
2230: 63 68 65 6d 61 73 20 6f 66 20 64 61 74 61 62 61  chemas of databa
2240: 73 65 73 20 74 68 65 79 0a 23 20 20 20 20 61 63  ses they.#    ac
2250: 63 65 73 73 2e 0a 23 20 32 2e 20 54 72 61 6e 73  cess..# 2. Trans
2260: 61 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 6f 64  actions that mod
2270: 69 66 79 20 61 20 64 61 74 61 62 61 73 65 20 73  ify a database s
2280: 63 68 65 6d 61 20 72 65 71 75 69 72 65 20 61 20  chema require a 
2290: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
22a0: 61 74 0a 23 20 20 20 20 73 63 68 65 6d 61 2e 0a  at.#    schema..
22b0: 23 20 33 2e 20 49 74 20 69 73 20 6e 6f 74 20 70  # 3. It is not p
22c0: 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6d 70 69  ossible to compi
22d0: 6c 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 77  le a statement w
22e0: 68 69 6c 65 20 61 6e 6f 74 68 65 72 20 68 61 6e  hile another han
22f0: 64 6c 65 20 68 61 73 20 61 20 0a 23 20 20 20 20  dle has a .#    
2300: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
2310: 65 20 73 63 68 65 6d 61 2e 0a 23 0a 0a 23 20 4f  e schema..#..# O
2320: 70 65 6e 20 74 77 6f 20 64 61 74 61 62 61 73 65  pen two database
2330: 20 68 61 6e 64 6c 65 73 20 64 62 20 61 6e 64 20   handles db and 
2340: 64 62 32 2e 20 45 61 63 68 20 68 61 73 20 61 20  db2. Each has a 
2350: 73 69 6e 67 6c 65 20 61 74 74 61 63 68 20 64 61  single attach da
2360: 74 61 62 61 73 65 0a 23 20 28 61 73 20 77 65 6c  tabase.# (as wel
2370: 6c 20 61 73 20 6d 61 69 6e 29 3a 0a 23 0a 23 20  l as main):.#.# 
2380: 20 20 20 20 64 62 2e 6d 61 69 6e 20 20 20 2d 3e      db.main   ->
2390: 20 20 20 2e 2f 74 65 73 74 2e 64 62 0a 23 20 20     ./test.db.#  
23a0: 20 20 20 64 62 2e 74 65 73 74 32 20 20 2d 3e 20     db.test2  -> 
23b0: 20 20 2e 2f 74 65 73 74 32 2e 64 62 0a 23 20 20    ./test2.db.#  
23c0: 20 20 20 64 62 32 2e 6d 61 69 6e 20 20 2d 3e 20     db2.main  -> 
23d0: 20 20 2e 2f 74 65 73 74 32 2e 64 62 0a 23 20 20    ./test2.db.#  
23e0: 20 20 20 64 62 32 2e 74 65 73 74 20 20 2d 3e 20     db2.test  -> 
23f0: 20 20 2e 2f 74 65 73 74 2e 64 62 0a 23 0a 66 69    ./test.db.#.fi
2400: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
2410: 20 74 65 73 74 2e 64 62 0a 66 69 6c 65 20 64 65   test.db.file de
2420: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
2430: 32 2e 64 62 0a 66 69 6c 65 20 64 65 6c 65 74 65  2.db.file delete
2440: 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62   -force test2.db
2450: 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74 65 33  -journal.sqlite3
2460: 20 64 62 20 20 74 65 73 74 2e 64 62 0a 73 71 6c   db  test.db.sql
2470: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
2480: 62 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  b.do_test shared
2490: 2d 24 61 76 2e 34 2e 31 2e 31 20 7b 0a 20 20 73  -$av.4.1.1 {.  s
24a0: 65 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  et sqlite_open_f
24b0: 69 6c 65 5f 63 6f 75 6e 74 0a 20 20 65 78 70 72  ile_count.  expr
24c0: 20 24 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69   $sqlite_open_fi
24d0: 6c 65 5f 63 6f 75 6e 74 2d 28 24 65 78 74 72 61  le_count-($extra
24e0: 66 64 73 5f 70 72 65 6c 6f 63 6b 2a 32 29 0a 7d  fds_prelock*2).}
24f0: 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61   {2}.do_test sha
2500: 72 65 64 2d 24 61 76 2e 34 2e 31 2e 32 20 7b 0a  red-$av.4.1.2 {.
2510: 20 20 65 78 65 63 73 71 6c 20 7b 41 54 54 41 43    execsql {ATTAC
2520: 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20  H 'test2.db' AS 
2530: 74 65 73 74 32 7d 0a 20 20 73 65 74 20 73 71 6c  test2}.  set sql
2540: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
2550: 75 6e 74 0a 20 20 65 78 70 72 20 24 73 71 6c 69  unt.  expr $sqli
2560: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
2570: 6e 74 2d 28 24 65 78 74 72 61 66 64 73 5f 70 6f  nt-($extrafds_po
2580: 73 74 6c 6f 63 6b 2a 32 29 0a 7d 20 7b 32 7d 0a  stlock*2).} {2}.
2590: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
25a0: 61 76 2e 34 2e 31 2e 33 20 7b 0a 20 20 65 78 65  av.4.1.3 {.  exe
25b0: 63 73 71 6c 20 7b 41 54 54 41 43 48 20 27 74 65  csql {ATTACH 'te
25c0: 73 74 2e 64 62 27 20 41 53 20 74 65 73 74 7d 20  st.db' AS test} 
25d0: 64 62 32 0a 20 20 73 65 74 20 73 71 6c 69 74 65  db2.  set sqlite
25e0: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
25f0: 0a 20 20 65 78 70 72 20 24 73 71 6c 69 74 65 5f  .  expr $sqlite_
2600: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2d  open_file_count-
2610: 28 24 65 78 74 72 61 66 64 73 5f 70 6f 73 74 6c  ($extrafds_postl
2620: 6f 63 6b 2a 32 29 0a 7d 20 7b 32 7d 0a 0a 23 20  ock*2).} {2}..# 
2630: 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 43 72  Sanity check: Cr
2640: 65 61 74 65 20 61 20 74 61 62 6c 65 20 69 6e 20  eate a table in 
2650: 2e 2f 74 65 73 74 2e 64 62 20 76 69 61 20 68 61  ./test.db via ha
2660: 6e 64 6c 65 20 64 62 2c 20 61 6e 64 20 74 65 73  ndle db, and tes
2670: 74 20 74 68 61 74 20 68 61 6e 64 6c 65 0a 23 20  t that handle.# 
2680: 64 62 32 20 63 61 6e 20 22 73 65 65 22 20 74 68  db2 can "see" th
2690: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6d 6d 65  e new table imme
26a0: 64 69 61 74 65 6c 79 2e 20 41 20 68 61 6e 64 6c  diately. A handl
26b0: 65 20 75 73 69 6e 67 20 61 20 73 65 70 65 72 61  e using a sepera
26c0: 74 65 20 70 61 67 65 72 0a 23 20 63 61 63 68 65  te pager.# cache
26d0: 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 72   would have to r
26e0: 65 6c 6f 61 64 20 74 68 65 20 64 61 74 61 62 61  eload the databa
26f0: 73 65 20 73 63 68 65 6d 61 20 62 65 66 6f 72 65  se schema before
2700: 20 74 68 69 73 20 77 65 72 65 20 70 6f 73 73 69   this were possi
2710: 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73  ble..#.do_test s
2720: 68 61 72 65 64 2d 24 61 76 2e 34 2e 32 2e 31 20  hared-$av.4.2.1 
2730: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2740: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
2750: 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  bc(a, b, c);.   
2760: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 65   CREATE TABLE de
2770: 66 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20  f(d, e, f);.    
2780: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
2790: 56 41 4c 55 45 53 28 27 69 27 2c 20 27 69 69 27  VALUES('i', 'ii'
27a0: 2c 20 27 69 69 69 27 29 3b 0a 20 20 20 20 49 4e  , 'iii');.    IN
27b0: 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41  SERT INTO def VA
27c0: 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 2c 20  LUES('I', 'II', 
27d0: 27 49 49 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  'III');.  }.} {}
27e0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
27f0: 24 61 76 2e 34 2e 32 2e 32 20 7b 0a 20 20 65 78  $av.4.2.2 {.  ex
2800: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2810: 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74 2e 61  CT * FROM test.a
2820: 62 63 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 69  bc;.  } db2.} {i
2830: 20 69 69 20 69 69 69 7d 0a 0a 23 20 4f 70 65 6e   ii iii}..# Open
2840: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
2850: 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 66 72 6f  ion and read fro
2860: 6d 20 74 61 62 6c 65 20 61 62 63 20 76 69 61 20  m table abc via 
2870: 68 61 6e 64 6c 65 20 32 2e 20 43 68 65 63 6b 20  handle 2. Check 
2880: 74 68 61 74 0a 23 20 68 61 6e 64 6c 65 20 31 20  that.# handle 1 
2890: 63 61 6e 20 72 65 61 64 20 74 61 62 6c 65 20 61  can read table a
28a0: 62 63 2e 20 43 68 65 63 6b 20 74 68 61 74 20 68  bc. Check that h
28b0: 61 6e 64 6c 65 20 31 20 63 61 6e 6e 6f 74 20 6d  andle 1 cannot m
28c0: 6f 64 69 66 79 20 74 61 62 6c 65 20 61 62 63 0a  odify table abc.
28d0: 23 20 6f 72 20 74 68 65 20 64 61 74 61 62 61 73  # or the databas
28e0: 65 20 73 63 68 65 6d 61 2e 20 54 68 65 6e 20 63  e schema. Then c
28f0: 68 65 63 6b 20 74 68 61 74 20 68 61 6e 64 6c 65  heck that handle
2900: 20 31 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 61   1 can modify ta
2910: 62 6c 65 20 64 65 66 2e 0a 23 0a 64 6f 5f 74 65  ble def..#.do_te
2920: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e  st shared-$av.4.
2930: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
2940: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2950: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2960: 65 73 74 2e 61 62 63 3b 0a 20 20 7d 20 64 62 32  est.abc;.  } db2
2970: 0a 7d 20 7b 69 20 69 69 20 69 69 69 7d 0a 64 6f  .} {i ii iii}.do
2980: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
2990: 2e 34 2e 33 2e 32 20 7b 0a 20 20 63 61 74 63 68  .4.3.2 {.  catch
29a0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
29b0: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
29c0: 28 27 69 76 27 2c 20 27 76 27 2c 20 27 76 69 27  ('iv', 'v', 'vi'
29d0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  );.  }.} {1 {dat
29e0: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
29f0: 6f 63 6b 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f  ocked: abc}}.do_
2a00: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
2a10: 34 2e 33 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  4.3.3 {.  catchs
2a20: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2a30: 54 41 42 4c 45 20 67 68 69 28 67 2c 20 68 2c 20  TABLE ghi(g, h, 
2a40: 69 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61  i);.  }.} {1 {da
2a50: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
2a60: 6c 6f 63 6b 65 64 3a 20 73 71 6c 69 74 65 5f 6d  locked: sqlite_m
2a70: 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65 73 74 20  aster}}.do_test 
2a80: 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 33 2e 33  shared-$av.4.3.3
2a90: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
2aa0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ab0: 64 65 66 20 56 41 4c 55 45 53 28 27 49 56 27 2c  def VALUES('IV',
2ac0: 20 27 56 27 2c 20 27 56 49 27 29 3b 0a 20 20 7d   'V', 'VI');.  }
2ad0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
2ae0: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 33  t shared-$av.4.3
2af0: 2e 34 20 7b 0a 20 20 23 20 43 6c 65 61 6e 75 70  .4 {.  # Cleanup
2b00: 3a 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  : commit the tra
2b10: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
2b20: 62 79 20 64 62 32 2e 0a 20 20 65 78 65 63 73 71  by db2..  execsq
2b30: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 0a 20  l {.    COMMIT. 
2b40: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 0a 23 20 4f   } db2.} {}..# O
2b50: 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  pen a write-tran
2b60: 73 61 63 74 69 6f 6e 20 75 73 69 6e 67 20 68 61  saction using ha
2b70: 6e 64 6c 65 20 31 20 61 6e 64 20 6d 6f 64 69 66  ndle 1 and modif
2b80: 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  y the database s
2b90: 63 68 65 6d 61 2e 0a 23 20 54 68 65 6e 20 74 72  chema..# Then tr
2ba0: 79 20 74 6f 20 65 78 65 63 75 74 65 20 61 20 63  y to execute a c
2bb0: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
2bc0: 74 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74  t to read from t
2bd0: 68 65 20 73 61 6d 65 20 0a 23 20 64 61 74 61 62  he same .# datab
2be0: 61 73 65 20 76 69 61 20 68 61 6e 64 6c 65 20 32  ase via handle 2
2bf0: 20 28 66 61 69 6c 73 20 74 6f 20 67 65 74 20 74   (fails to get t
2c00: 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 71 6c 69 74  he lock on sqlit
2c10: 65 5f 6d 61 73 74 65 72 29 2e 20 41 6c 73 6f 0a  e_master). Also.
2c20: 23 20 74 72 79 20 74 6f 20 63 6f 6d 70 69 6c 65  # try to compile
2c30: 20 61 20 72 65 61 64 20 6f 66 20 74 68 65 20 73   a read of the s
2c40: 61 6d 65 20 64 61 74 61 62 61 73 65 20 75 73 69  ame database usi
2c50: 6e 67 20 68 61 6e 64 6c 65 20 32 20 28 61 6c 73  ng handle 2 (als
2c60: 6f 20 66 61 69 6c 73 29 2e 0a 23 20 46 69 6e 61  o fails)..# Fina
2c70: 6c 6c 79 2c 20 63 6f 6d 70 69 6c 65 20 61 20 72  lly, compile a r
2c80: 65 61 64 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ead of the other
2c90: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
2ca0: 68 61 6e 64 6c 65 20 32 2e 20 54 68 69 73 0a 23  handle 2. This.#
2cb0: 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 66 61 69   should also fai
2cc0: 6c 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 63  l..#.ifcapable c
2cd0: 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f 74  ompound {.  do_t
2ce0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34  est shared-$av.4
2cf0: 2e 34 2e 31 2e 32 20 7b 0a 20 20 20 20 23 20 53  .4.1.2 {.    # S
2d00: 61 6e 69 74 79 20 63 68 65 63 6b 20 31 3a 20 43  anity check 1: C
2d10: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 63  heck that the sc
2d20: 68 65 6d 61 20 69 73 20 77 68 61 74 20 77 65 20  hema is what we 
2d30: 74 68 69 6e 6b 20 69 74 20 69 73 20 77 68 65 6e  think it is when
2d40: 20 76 69 65 77 65 64 0a 20 20 20 20 23 20 76 69   viewed.    # vi
2d50: 61 20 68 61 6e 64 6c 65 20 31 2e 0a 20 20 20 20  a handle 1..    
2d60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
2d70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73  CREATE TABLE tes
2d80: 74 32 2e 67 68 69 28 67 2c 20 68 2c 20 69 29 3b  t2.ghi(g, h, i);
2d90: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 74  .      SELECT 't
2da0: 65 73 74 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20 46  est.db:'||name F
2db0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2dc0: 72 20 0a 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  r .      UNION A
2dd0: 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  LL.      SELECT 
2de0: 27 74 65 73 74 32 2e 64 62 3a 27 7c 7c 6e 61 6d  'test2.db:'||nam
2df0: 65 20 46 52 4f 4d 20 74 65 73 74 32 2e 73 71 6c  e FROM test2.sql
2e00: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
2e10: 7d 0a 20 20 7d 20 7b 74 65 73 74 2e 64 62 3a 61  }.  } {test.db:a
2e20: 62 63 20 74 65 73 74 2e 64 62 3a 64 65 66 20 74  bc test.db:def t
2e30: 65 73 74 32 2e 64 62 3a 67 68 69 7d 0a 20 20 64  est2.db:ghi}.  d
2e40: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
2e50: 76 2e 34 2e 34 2e 31 2e 32 20 7b 0a 20 20 20 20  v.4.4.1.2 {.    
2e60: 23 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20 32  # Sanity check 2
2e70: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  : Check that the
2e80: 20 73 63 68 65 6d 61 20 69 73 20 77 68 61 74 20   schema is what 
2e90: 77 65 20 74 68 69 6e 6b 20 69 74 20 69 73 20 77  we think it is w
2ea0: 68 65 6e 20 76 69 65 77 65 64 0a 20 20 20 20 23  hen viewed.    #
2eb0: 20 76 69 61 20 68 61 6e 64 6c 65 20 32 2e 0a 20   via handle 2.. 
2ec0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2ed0: 20 20 20 53 45 4c 45 43 54 20 27 74 65 73 74 32     SELECT 'test2
2ee0: 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d  .db:'||name FROM
2ef0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2f00: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
2f10: 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 74 65        SELECT 'te
2f20: 73 74 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20 46 52  st.db:'||name FR
2f30: 4f 4d 20 74 65 73 74 2e 73 71 6c 69 74 65 5f 6d  OM test.sqlite_m
2f40: 61 73 74 65 72 3b 0a 20 20 20 20 7d 20 64 62 32  aster;.    } db2
2f50: 0a 20 20 7d 20 7b 74 65 73 74 32 2e 64 62 3a 67  .  } {test2.db:g
2f60: 68 69 20 74 65 73 74 2e 64 62 3a 61 62 63 20 74  hi test.db:abc t
2f70: 65 73 74 2e 64 62 3a 64 65 66 7d 0a 7d 0a 0a 64  est.db:def}.}..d
2f80: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
2f90: 76 2e 34 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20  v.4.4.2 {.  set 
2fa0: 3a 3a 44 42 32 20 5b 73 71 6c 69 74 65 33 5f 63  ::DB2 [sqlite3_c
2fb0: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
2fc0: 72 20 64 62 32 5d 0a 20 20 73 65 74 20 73 71 6c  r db2].  set sql
2fd0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
2fe0: 61 62 63 7d 0a 20 20 73 65 74 20 3a 3a 53 54 4d  abc}.  set ::STM
2ff0: 54 31 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  T1 [sqlite3_prep
3000: 61 72 65 20 24 3a 3a 44 42 32 20 24 73 71 6c 20  are $::DB2 $sql 
3010: 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 65 78 65 63  -1 DUMMY].  exec
3020: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
3030: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3040: 45 20 6a 6b 6c 28 6a 2c 20 6b 2c 20 6c 29 3b 0a  E jkl(j, k, l);.
3050: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74    }.  sqlite3_st
3060: 65 70 20 24 3a 3a 53 54 4d 54 31 0a 7d 20 7b 53  ep $::STMT1.} {S
3070: 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f  QLITE_ERROR}.do_
3080: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
3090: 34 2e 34 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65  4.4.3 {.  sqlite
30a0: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54  3_finalize $::ST
30b0: 4d 54 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f  MT1.} {SQLITE_LO
30c0: 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20 73 68  CKED}.do_test sh
30d0: 61 72 65 64 2d 24 61 76 2e 34 2e 34 2e 34 20 7b  ared-$av.4.4.4 {
30e0: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
30f0: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 53 54 4d   {.    set ::STM
3100: 54 31 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  T1 [sqlite3_prep
3110: 61 72 65 20 24 3a 3a 44 42 32 20 24 73 71 6c 20  are $::DB2 $sql 
3120: 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 7d 20 6d 73  -1 DUMMY].  } ms
3130: 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d  g].  list $rc $m
3140: 73 67 0a 7d 20 7b 31 20 7b 28 36 29 20 64 61 74  sg.} {1 {(6) dat
3150: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
3160: 6c 6f 63 6b 65 64 3a 20 74 65 73 74 7d 7d 0a 64  locked: test}}.d
3170: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
3180: 76 2e 34 2e 34 2e 35 20 7b 0a 20 20 73 65 74 20  v.4.4.5 {.  set 
3190: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
31a0: 73 65 74 20 3a 3a 53 54 4d 54 31 20 5b 73 71 6c  set ::STMT1 [sql
31b0: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a  ite3_prepare $::
31c0: 44 42 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52  DB2 "SELECT * FR
31d0: 4f 4d 20 67 68 69 22 20 2d 31 20 44 55 4d 4d 59  OM ghi" -1 DUMMY
31e0: 5d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73  ].  } msg].  lis
31f0: 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20  t $rc $msg.} {1 
3200: 7b 28 36 29 20 64 61 74 61 62 61 73 65 20 73 63  {(6) database sc
3210: 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 3a 20  hema is locked: 
3220: 74 65 73 74 7d 7d 0a 0a 0a 63 61 74 63 68 20 7b  test}}...catch {
3230: 64 62 32 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68  db2 close}.catch
3240: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 0a 23 2d 2d   {db close}..#--
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73  --------.# Tests
32a0: 20 73 68 61 72 65 64 2d 35 2e 2a 20 0a 23 0a 66   shared-5.* .#.f
32b0: 6f 72 65 61 63 68 20 64 62 20 5b 6c 69 73 74 20  oreach db [list 
32c0: 74 65 73 74 2e 64 62 20 74 65 73 74 31 2e 64 62  test.db test1.db
32d0: 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 33 2e   test2.db test3.
32e0: 64 62 5d 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c  db] {.  file del
32f0: 65 74 65 20 2d 66 6f 72 63 65 20 24 64 62 20 24  ete -force $db $
3300: 7b 64 62 7d 2d 6a 6f 75 72 6e 61 6c 0a 7d 0a 64  {db}-journal.}.d
3310: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
3320: 76 2e 35 2e 31 2e 31 20 7b 0a 20 20 73 71 6c 69  v.5.1.1 {.  sqli
3330: 74 65 33 20 64 62 31 20 74 65 73 74 2e 64 62 0a  te3 db1 test.db.
3340: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
3350: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
3360: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
3370: 73 74 31 2e 64 62 27 20 41 53 20 74 65 73 74 31  st1.db' AS test1
3380: 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  ;.    ATTACH 'te
3390: 73 74 32 2e 64 62 27 20 41 53 20 74 65 73 74 32  st2.db' AS test2
33a0: 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  ;.    ATTACH 'te
33b0: 73 74 33 2e 64 62 27 20 41 53 20 74 65 73 74 33  st3.db' AS test3
33c0: 3b 0a 20 20 7d 20 64 62 31 0a 20 20 65 78 65 63  ;.  } db1.  exec
33d0: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
33e0: 20 27 74 65 73 74 33 2e 64 62 27 20 41 53 20 74   'test3.db' AS t
33f0: 65 73 74 33 3b 0a 20 20 20 20 41 54 54 41 43 48  est3;.    ATTACH
3400: 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 74   'test2.db' AS t
3410: 65 73 74 32 3b 0a 20 20 20 20 41 54 54 41 43 48  est2;.    ATTACH
3420: 20 27 74 65 73 74 31 2e 64 62 27 20 41 53 20 74   'test1.db' AS t
3430: 65 73 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  est1;.  } db2.} 
3440: 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  {}.do_test share
3450: 64 2d 24 61 76 2e 35 2e 31 2e 32 20 7b 0a 20 20  d-$av.5.1.2 {.  
3460: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
3470: 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74 31  EATE TABLE test1
3480: 2e 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43  .t1(a, b);.    C
3490: 52 45 41 54 45 20 49 4e 44 45 58 20 74 65 73 74  REATE INDEX test
34a0: 31 2e 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29  1.i1 ON t1(a, b)
34b0: 3b 0a 20 20 7d 20 64 62 31 0a 7d 20 7b 7d 0a 69  ;.  } db1.} {}.i
34c0: 66 63 61 70 61 62 6c 65 20 76 69 65 77 20 7b 0a  fcapable view {.
34d0: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
34e0: 2d 24 61 76 2e 35 2e 31 2e 33 20 7b 0a 20 20 20  -$av.5.1.3 {.   
34f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3500: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 65 73   CREATE VIEW tes
3510: 74 31 2e 76 31 20 41 53 20 53 45 4c 45 43 54 20  t1.v1 AS SELECT 
3520: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d  * FROM t1;.    }
3530: 20 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66   db1.  } {}.}.if
3540: 63 61 70 61 62 6c 65 20 74 72 69 67 67 65 72 20  capable trigger 
3550: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  {.  do_test shar
3560: 65 64 2d 24 61 76 2e 35 2e 31 2e 34 20 7b 0a 20  ed-$av.5.1.4 {. 
3570: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3580: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
3590: 52 20 74 65 73 74 31 2e 74 72 69 67 31 20 41 46  R test1.trig1 AF
35a0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
35b0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49   BEGIN.        I
35c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
35d0: 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e  LUES(new.a, new.
35e0: 62 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20  b);.      END;. 
35f0: 20 20 20 7d 20 64 62 31 0a 20 20 7d 20 7b 7d 0a     } db1.  } {}.
3600: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
3610: 2d 24 61 76 2e 35 2e 31 2e 35 20 7b 0a 20 20 65  -$av.5.1.5 {.  e
3620: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
3630: 50 20 49 4e 44 45 58 20 69 31 3b 0a 20 20 7d 20  P INDEX i1;.  } 
3640: 64 62 32 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62  db2.} {}.ifcapab
3650: 6c 65 20 76 69 65 77 20 7b 0a 20 20 64 6f 5f 74  le view {.  do_t
3660: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 35  est shared-$av.5
3670: 2e 31 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73  .1.6 {.    execs
3680: 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20  ql {.      DROP 
3690: 56 49 45 57 20 76 31 3b 0a 20 20 20 20 7d 20 64  VIEW v1;.    } d
36a0: 62 32 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61  b2.  } {}.}.ifca
36b0: 70 61 62 6c 65 20 74 72 69 67 67 65 72 20 7b 0a  pable trigger {.
36c0: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
36d0: 2d 24 61 76 2e 35 2e 31 2e 37 20 7b 0a 20 20 20  -$av.5.1.7 {.   
36e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
36f0: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 72   DROP TRIGGER tr
3700: 69 67 31 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20  ig1;.    } db2. 
3710: 20 7d 20 7b 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20   } {}.}.do_test 
3720: 73 68 61 72 65 64 2d 24 61 76 2e 35 2e 31 2e 38  shared-$av.5.1.8
3730: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3740: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
3750: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 69  ;.  } db2.} {}.i
3760: 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e  fcapable compoun
3770: 64 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68  d {.  do_test sh
3780: 61 72 65 64 2d 24 61 76 2e 35 2e 31 2e 39 20 7b  ared-$av.5.1.9 {
3790: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
37a0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
37b0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
37c0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
37d0: 54 20 2a 20 46 52 4f 4d 20 74 65 73 74 31 2e 73  T * FROM test1.s
37e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20  qlite_master.   
37f0: 20 7d 20 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a   } db1.  } {}.}.
3800: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
3850: 65 73 74 73 20 73 68 61 72 65 64 2d 36 2e 2a 20  ests shared-6.* 
3860: 74 65 73 74 20 74 68 61 74 20 61 20 71 75 65 72  test that a quer
3870: 79 20 6f 62 74 61 69 6e 73 20 61 6c 6c 20 74 68  y obtains all th
3880: 65 20 72 65 61 64 2d 6c 6f 63 6b 73 20 69 74 20  e read-locks it 
3890: 6e 65 65 64 73 0a 23 20 62 65 66 6f 72 65 20 73  needs.# before s
38a0: 74 61 72 74 69 6e 67 20 65 78 65 63 75 74 69 6f  tarting executio
38b0: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20  n of the query. 
38c0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
38d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
38e0: 63 65 0a 23 20 73 6f 6d 65 20 72 6f 77 73 20 6f  ce.# some rows o
38f0: 66 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 72  f data will be r
3900: 65 74 75 72 6e 65 64 20 62 65 66 6f 72 65 20 61  eturned before a
3910: 20 6c 6f 63 6b 20 66 61 69 6c 73 20 61 6e 64 20   lock fails and 
3920: 53 51 4c 49 54 45 5f 4c 4f 43 4b 0a 23 20 69 73  SQLITE_LOCK.# is
3930: 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f   returned..#.do_
3940: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
3950: 36 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  6.1.1 {.  execsq
3960: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
3970: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3980: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3990: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t2(a, b);.    IN
39a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
39b0: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49  UES(1, 2);.    I
39c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
39d0: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 20  LUES(3, 4);.  } 
39e0: 64 62 31 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62  db1.} {}.ifcapab
39f0: 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20  le compound {.  
3a00: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
3a10: 61 76 2e 36 2e 31 2e 32 20 7b 0a 20 20 20 20 65  av.6.1.2 {.    e
3a20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
3a30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3a40: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
3a50: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
3a60: 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 32 20 33  } db2.  } {1 2 3
3a70: 20 34 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68   4}.}.do_test sh
3a80: 61 72 65 64 2d 24 61 76 2e 36 2e 31 2e 33 20 7b  ared-$av.6.1.3 {
3a90: 0a 20 20 23 20 45 73 74 61 62 6c 69 73 68 20 61  .  # Establish a
3aa0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
3ab0: 61 62 6c 65 20 74 32 20 76 69 61 20 63 6f 6e 6e  able t2 via conn
3ac0: 65 63 74 69 6f 6e 20 64 62 32 2e 20 54 68 65 6e  ection db2. Then
3ad0: 20 6d 61 6b 65 20 61 20 0a 20 20 23 20 55 4e 49   make a .  # UNI
3ae0: 4f 4e 20 61 6c 6c 20 71 75 65 72 79 20 75 73 69  ON all query usi
3af0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ng connection db
3b00: 31 20 74 68 61 74 20 66 69 72 73 74 20 61 63 63  1 that first acc
3b10: 65 73 73 65 73 20 74 31 2c 20 66 6f 6c 6c 6f 77  esses t1, follow
3b20: 65 64 20 0a 20 20 23 20 62 79 20 74 32 2e 20 49  ed .  # by t2. I
3b30: 66 20 74 68 65 20 6c 6f 63 6b 73 20 61 72 65 20  f the locks are 
3b40: 67 72 61 62 62 65 64 20 61 74 20 74 68 65 20 73  grabbed at the s
3b50: 74 61 72 74 20 6f 66 20 74 68 65 20 73 74 61 74  tart of the stat
3b60: 65 6d 65 6e 74 20 28 61 73 20 0a 20 20 23 20 74  ement (as .  # t
3b70: 68 65 79 20 73 68 6f 75 6c 64 20 62 65 29 2c 20  hey should be), 
3b80: 6e 6f 20 72 6f 77 73 20 61 72 65 20 72 65 74 75  no rows are retu
3b90: 72 6e 65 64 2e 20 49 66 20 28 61 73 20 77 61 73  rned. If (as was
3ba0: 20 70 72 65 76 69 6f 75 73 6c 79 20 74 68 65 20   previously the 
3bb0: 63 61 73 65 29 0a 20 20 23 20 74 68 65 79 20 61  case).  # they a
3bc0: 72 65 20 67 72 61 62 62 65 64 20 61 73 20 74 68  re grabbed as th
3bd0: 65 20 74 61 62 6c 65 73 20 61 72 65 20 61 63 63  e tables are acc
3be0: 65 73 73 65 64 2c 20 74 68 65 20 74 31 20 72 6f  essed, the t1 ro
3bf0: 77 73 20 77 69 6c 6c 20 62 65 20 0a 20 20 23 20  ws will be .  # 
3c00: 72 65 74 75 72 6e 65 64 20 62 65 66 6f 72 65 20  returned before 
3c10: 74 68 65 20 71 75 65 72 79 20 66 61 69 6c 73 2e  the query fails.
3c20: 0a 20 20 23 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  #.  execsql {
3c30: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
3c40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
3c50: 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 7d  ALUES(5, 6);.  }
3c60: 20 64 62 32 0a 20 20 73 65 74 20 72 65 74 20 5b   db2.  set ret [
3c70: 6c 69 73 74 5d 0a 20 20 63 61 74 63 68 20 7b 0a  list].  catch {.
3c80: 20 20 20 20 64 62 31 20 65 76 61 6c 20 7b 53 45      db1 eval {SE
3c90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55  LECT * FROM t1 U
3ca0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
3cb0: 2a 20 46 52 4f 4d 20 74 32 7d 20 7b 0a 20 20 20  * FROM t2} {.   
3cc0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 24     lappend ret $
3cd0: 61 20 24 62 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  a $b.    }.  }. 
3ce0: 20 73 65 74 20 72 65 74 0a 7d 20 7b 7d 0a 64 6f   set ret.} {}.do
3cf0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
3d00: 2e 36 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  .6.1.4 {.  execs
3d10: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
3d20: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
3d30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3d40: 41 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d  ALUES(7, 8);.  }
3d50: 20 64 62 32 0a 20 20 73 65 74 20 72 65 74 20 5b   db2.  set ret [
3d60: 6c 69 73 74 5d 0a 20 20 63 61 74 63 68 20 7b 0a  list].  catch {.
3d70: 20 20 20 20 64 62 31 20 65 76 61 6c 20 7b 0a 20      db1 eval {. 
3d80: 20 20 20 20 20 53 45 4c 45 43 54 20 28 43 41 53       SELECT (CAS
3d90: 45 20 57 48 45 4e 20 61 3e 34 20 54 48 45 4e 20  E WHEN a>4 THEN 
3da0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74  (SELECT a FROM t
3db0: 31 29 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41  1) ELSE 0 END) A
3dc0: 53 20 64 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  S d FROM t2;.   
3dd0: 20 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65   } {.      lappe
3de0: 6e 64 20 72 65 74 20 24 64 0a 20 20 20 20 7d 0a  nd ret $d.    }.
3df0: 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d 20    }.  set ret.} 
3e00: 7b 7d 0a 0a 63 61 74 63 68 20 7b 64 62 31 20 63  {}..catch {db1 c
3e10: 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 32  lose}.catch {db2
3e20: 20 63 6c 6f 73 65 7d 0a 66 6f 72 65 61 63 68 20   close}.foreach 
3e30: 66 20 5b 6c 69 73 74 20 74 65 73 74 2e 64 62 20  f [list test.db 
3e40: 74 65 73 74 32 2e 64 62 5d 20 7b 0a 20 20 66 69  test2.db] {.  fi
3e50: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
3e60: 20 24 66 20 24 7b 66 7d 2d 6a 6f 75 72 6e 61 6c   $f ${f}-journal
3e70: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3ec0: 23 20 54 65 73 74 73 20 73 68 61 72 65 64 2d 37  # Tests shared-7
3ed0: 2e 2a 20 74 65 73 74 20 61 75 74 6f 2d 76 61 63  .* test auto-vac
3ee0: 75 75 6d 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76  uum does not inv
3ef0: 61 6c 69 64 61 74 65 20 63 75 72 73 6f 72 73 20  alidate cursors 
3f00: 66 72 6f 6d 0a 23 20 6f 74 68 65 72 20 73 68 61  from.# other sha
3f10: 72 65 64 2d 63 61 63 68 65 20 75 73 65 72 73 20  red-cache users 
3f20: 77 68 65 6e 20 69 74 20 72 65 6f 72 67 61 6e 69  when it reorgani
3f30: 7a 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  zes the database
3f40: 20 6f 6e 20 0a 23 20 43 4f 4d 4d 49 54 2e 0a 23   on .# COMMIT..#
3f50: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
3f60: 24 61 76 2e 37 2e 31 20 7b 0a 20 20 23 20 54 68  $av.7.1 {.  # Th
3f70: 69 73 20 74 65 73 74 20 63 61 73 65 20 73 65 74  is test case set
3f80: 73 20 75 70 20 61 20 74 65 73 74 20 64 61 74 61  s up a test data
3f90: 62 61 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  base in auto-vac
3fa0: 75 75 6d 20 6d 6f 64 65 20 63 6f 6e 73 69 73 74  uum mode consist
3fb0: 69 6e 67 20 0a 20 20 23 20 6f 66 20 74 77 6f 20  ing .  # of two 
3fc0: 74 61 62 6c 65 73 2c 20 74 31 20 61 6e 64 20 74  tables, t1 and t
3fd0: 32 2e 20 42 6f 74 68 20 68 61 76 65 20 61 20 73  2. Both have a s
3fe0: 69 6e 67 6c 65 20 69 6e 64 65 78 2e 20 54 61 62  ingle index. Tab
3ff0: 6c 65 20 74 31 20 69 73 20 0a 20 20 23 20 70 6f  le t1 is .  # po
4000: 70 75 6c 61 74 65 64 20 66 69 72 73 74 20 28 73  pulated first (s
4010: 6f 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  o consists of pa
4020: 67 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 73  ges toward the s
4030: 74 61 72 74 20 6f 66 20 74 68 65 20 64 62 20 66  tart of the db f
4040: 69 6c 65 29 2c 20 0a 20 20 23 20 74 32 20 73 65  ile), .  # t2 se
4050: 63 6f 6e 64 20 28 70 61 67 65 73 20 74 6f 77 61  cond (pages towa
4060: 72 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  rd the end of th
4070: 65 20 66 69 6c 65 29 2e 20 0a 20 20 73 71 6c 69  e file). .  sqli
4080: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
4090: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
40a0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
40b0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
40c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
40d0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
40e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
40f0: 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52 59  BLE t2(a PRIMARY
4100: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 7d 0a 20 20   KEY, b);.  }.  
4110: 73 65 74 20 3a 3a 63 6f 6e 74 65 6e 74 73 20 7b  set ::contents {
4120: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
4130: 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e  } {$i < 100} {in
4140: 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20  cr i} {.    set 
4150: 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  a [string repeat
4160: 20 22 24 69 20 22 20 32 30 5d 0a 20 20 20 20 73   "$i " 20].    s
4170: 65 74 20 62 20 5b 73 74 72 69 6e 67 20 72 65 70  et b [string rep
4180: 65 61 74 20 22 24 69 20 22 20 32 30 5d 0a 20 20  eat "$i " 20].  
4190: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
41a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
41b0: 20 56 41 4c 55 45 53 28 3a 61 2c 20 3a 62 29 3b   VALUES(:a, :b);
41c0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65  .    }.    lappe
41d0: 6e 64 20 3a 3a 63 6f 6e 74 65 6e 74 73 20 5b 6c  nd ::contents [l
41e0: 69 73 74 20 5b 65 78 70 72 20 24 69 2b 31 5d 20  ist [expr $i+1] 
41f0: 24 61 20 24 62 5d 0a 20 20 7d 0a 20 20 65 78 65  $a $b].  }.  exe
4200: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
4210: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
4220: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
4230: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
4240: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
4250: 24 61 76 2e 37 2e 32 20 7b 0a 20 20 23 20 54 68  $av.7.2 {.  # Th
4260: 69 73 20 74 65 73 74 20 63 61 73 65 20 64 65 6c  is test case del
4270: 65 74 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  etes the content
4280: 73 20 6f 66 20 74 61 62 6c 65 20 74 31 20 28 74  s of table t1 (t
4290: 68 65 20 6f 6e 65 20 61 74 20 74 68 65 20 73 74  he one at the st
42a0: 61 72 74 20 6f 66 0a 20 20 23 20 74 68 65 20 66  art of.  # the f
42b0: 69 6c 65 29 20 77 68 69 6c 65 20 6d 61 6e 79 20  ile) while many 
42c0: 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
42d0: 20 6f 6e 20 74 61 62 6c 65 20 74 32 20 61 6e 64   on table t2 and
42e0: 20 69 74 73 20 69 6e 64 65 78 2e 20 41 6c 6c 20   its index. All 
42f0: 6f 66 0a 20 20 23 20 74 68 65 20 6e 6f 6e 2d 72  of.  # the non-r
4300: 6f 6f 74 20 70 61 67 65 73 20 77 69 6c 6c 20 62  oot pages will b
4310: 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  e moved from the
4320: 20 65 6e 64 20 74 6f 20 74 68 65 20 73 74 61 72   end to the star
4330: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  t of the file.  
4340: 23 20 77 68 65 6e 20 74 68 65 20 44 45 4c 45 54  # when the DELET
4350: 45 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 2d  E is committed -
4360: 20 74 68 69 73 20 74 65 73 74 20 76 65 72 69 66   this test verif
4370: 69 65 73 20 74 68 61 74 20 6d 6f 76 69 6e 67 20  ies that moving 
4380: 74 68 65 20 70 61 67 65 73 0a 20 20 23 20 64 6f  the pages.  # do
4390: 65 73 20 6e 6f 74 20 64 69 73 74 75 72 62 20 74  es not disturb t
43a0: 68 65 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  he open cursors.
43b0: 0a 20 20 23 0a 0a 20 20 70 72 6f 63 20 6c 6f 63  .  #..  proc loc
43c0: 6b 72 6f 77 20 7b 64 62 20 74 62 6c 20 6f 69 64  krow {db tbl oid
43d0: 73 20 62 6f 64 79 7d 20 7b 0a 20 20 20 20 73 65  s body} {.    se
43e0: 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 20  t ret [list].   
43f0: 20 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54   db eval "SELECT
4400: 20 6f 69 64 20 41 53 20 69 2c 20 61 2c 20 62 20   oid AS i, a, b 
4410: 46 52 4f 4d 20 24 74 62 6c 20 4f 52 44 45 52 20  FROM $tbl ORDER 
4420: 42 59 20 61 22 20 7b 0a 20 20 20 20 20 20 69 66  BY a" {.      if
4430: 20 7b 24 69 3d 3d 5b 6c 69 6e 64 65 78 20 24 6f   {$i==[lindex $o
4440: 69 64 73 20 30 5d 7d 20 7b 0a 20 20 20 20 20 20  ids 0]} {.      
4450: 20 20 73 65 74 20 6e 6f 69 64 73 20 5b 6c 72 61    set noids [lra
4460: 6e 67 65 20 24 6f 69 64 73 20 31 20 65 6e 64 5d  nge $oids 1 end]
4470: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  .        if {[ll
4480: 65 6e 67 74 68 20 24 6e 6f 69 64 73 5d 3d 3d 30  ength $noids]==0
4490: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65  } {.          se
44a0: 74 20 73 75 62 72 65 74 20 5b 65 76 61 6c 20 24  t subret [eval $
44b0: 62 6f 64 79 5d 0a 20 20 20 20 20 20 20 20 7d 20  body].        } 
44c0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
44d0: 20 73 65 74 20 73 75 62 72 65 74 20 5b 6c 6f 63   set subret [loc
44e0: 6b 72 6f 77 20 24 64 62 20 24 74 62 6c 20 24 6e  krow $db $tbl $n
44f0: 6f 69 64 73 20 24 62 6f 64 79 5d 0a 20 20 20 20  oids $body].    
4500: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4510: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20      lappend ret 
4520: 5b 6c 69 73 74 20 24 69 20 24 61 20 24 62 5d 0a  [list $i $a $b].
4530: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4540: 20 5b 6c 69 6e 73 65 72 74 20 24 73 75 62 72 65   [linsert $subre
4550: 74 20 30 20 24 72 65 74 5d 0a 20 20 7d 0a 20 20  t 0 $ret].  }.  
4560: 70 72 6f 63 20 6c 6f 63 6b 74 62 6c 72 6f 77 73  proc locktblrows
4570: 20 7b 64 62 20 74 62 6c 20 62 6f 64 79 7d 20 7b   {db tbl body} {
4580: 0a 20 20 20 20 73 65 74 20 6f 69 64 73 20 5b 64  .    set oids [d
4590: 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 6f  b eval "SELECT o
45a0: 69 64 20 46 52 4f 4d 20 24 74 62 6c 22 5d 0a 20  id FROM $tbl"]. 
45b0: 20 20 20 6c 6f 63 6b 72 6f 77 20 24 64 62 20 24     lockrow $db $
45c0: 74 62 6c 20 24 6f 69 64 73 20 24 62 6f 64 79 0a  tbl $oids $body.
45d0: 20 20 7d 0a 0a 20 20 73 65 74 20 73 63 61 6e 73    }..  set scans
45e0: 20 5b 6c 6f 63 6b 74 62 6c 72 6f 77 73 20 64 62   [locktblrows db
45f0: 20 74 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71   t2 {.    execsq
4600: 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  l {.      DELETE
4610: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20   FROM t1;.    } 
4620: 64 62 32 0a 20 20 7d 5d 0a 20 20 73 65 74 20 65  db2.  }].  set e
4630: 72 72 6f 72 20 30 0a 0a 20 20 23 20 54 65 73 74  rror 0..  # Test
4640: 20 74 68 61 74 20 65 61 63 68 20 53 45 4c 45 43   that each SELEC
4650: 54 20 71 75 65 72 79 20 72 65 74 75 72 6e 65 64  T query returned
4660: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 63 6f   the expected co
4670: 6e 74 65 6e 74 73 20 6f 66 20 74 32 2e 0a 20 20  ntents of t2..  
4680: 66 6f 72 65 61 63 68 20 73 20 24 73 63 61 6e 73  foreach s $scans
4690: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 73 6f 72   {.    if {[lsor
46a0: 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 64 65  t -integer -inde
46b0: 78 20 30 20 24 73 5d 21 3d 24 3a 3a 63 6f 6e 74  x 0 $s]!=$::cont
46c0: 65 6e 74 73 7d 20 7b 0a 20 20 20 20 20 20 73 65  ents} {.      se
46d0: 74 20 65 72 72 6f 72 20 31 0a 20 20 20 20 7d 0a  t error 1.    }.
46e0: 20 20 7d 0a 20 20 73 65 74 20 65 72 72 6f 72 0a    }.  set error.
46f0: 7d 20 7b 30 7d 0a 0a 63 61 74 63 68 20 7b 64 62  } {0}..catch {db
4700: 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64   close}.catch {d
4710: 62 32 20 63 6c 6f 73 65 7d 0a 75 6e 73 65 74 20  b2 close}.unset 
4720: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 63 6f 6e 74  -nocomplain cont
4730: 65 6e 74 73 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ents..#---------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
4790: 67 20 74 65 73 74 73 20 74 72 79 20 74 6f 20 74  g tests try to t
47a0: 72 69 63 6b 20 74 68 65 20 73 68 61 72 65 64 2d  rick the shared-
47b0: 63 61 63 68 65 20 63 6f 64 65 20 69 6e 74 6f 20  cache code into 
47c0: 61 73 73 75 6d 69 6e 67 0a 23 20 74 68 65 20 77  assuming.# the w
47d0: 72 6f 6e 67 20 65 6e 63 6f 64 69 6e 67 20 66 6f  rong encoding fo
47e0: 72 20 61 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  r a database..#.
47f0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
4800: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  ce test.db test.
4810: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 69 66 63 61 70  db-journal.ifcap
4820: 61 62 6c 65 20 75 74 66 31 36 20 7b 0a 20 20 64  able utf16 {.  d
4830: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
4840: 76 2e 38 2e 31 2e 31 20 7b 0a 20 20 20 20 73 71  v.8.1.1 {.    sq
4850: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
4860: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
4870: 20 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f       PRAGMA enco
4880: 64 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27 3b  ding = 'UTF-16';
4890: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
48a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
48b0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  er;.    }.  } {}
48c0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
48d0: 64 2d 24 61 76 2e 38 2e 31 2e 32 20 7b 0a 20 20  d-$av.8.1.2 {.  
48e0: 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b    string range [
48f0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
4900: 65 6e 63 6f 64 69 6e 67 3b 7d 5d 20 30 20 65 6e  encoding;}] 0 en
4910: 64 2d 32 0a 20 20 7d 20 7b 55 54 46 2d 31 36 7d  d-2.  } {UTF-16}
4920: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  ..  do_test shar
4930: 65 64 2d 24 61 76 2e 38 2e 31 2e 33 20 7b 0a 20  ed-$av.8.1.3 {. 
4940: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
4950: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
4960: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
4970: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 55 54  A encoding = 'UT
4980: 46 2d 38 27 3b 0a 20 20 20 20 20 20 43 52 45 41  F-8';.      CREA
4990: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20  TE TABLE abc(a, 
49a0: 62 2c 20 63 29 3b 0a 20 20 20 20 7d 20 64 62 32  b, c);.    } db2
49b0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
49c0: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 38 2e 31  t shared-$av.8.1
49d0: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
49e0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
49f0: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
4a00: 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  ster;.    }.  } 
4a10: 22 74 61 62 6c 65 20 61 62 63 20 61 62 63 20 5b  "table abc abc [
4a20: 65 78 70 72 20 24 41 55 54 4f 56 41 43 55 55 4d  expr $AUTOVACUUM
4a30: 3f 33 3a 32 5d 20 7b 43 52 45 41 54 45 20 54 41  ?3:2] {CREATE TA
4a40: 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29  BLE abc(a, b, c)
4a50: 7d 22 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61  }".  do_test sha
4a60: 72 65 64 2d 24 61 76 2e 38 2e 31 2e 35 20 7b 0a  red-$av.8.1.5 {.
4a70: 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20      db2 close.  
4a80: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4a90: 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e    PRAGMA encodin
4aa0: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 55 54  g;.    }.  } {UT
4ab0: 46 2d 38 7d 0a 0a 20 20 66 69 6c 65 20 64 65 6c  F-8}..  file del
4ac0: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32  ete -force test2
4ad0: 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75  .db test2.db-jou
4ae0: 72 6e 61 6c 0a 20 20 64 6f 5f 74 65 73 74 20 73  rnal.  do_test s
4af0: 68 61 72 65 64 2d 24 61 76 2e 38 2e 32 2e 31 20  hared-$av.8.2.1 
4b00: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
4b10: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
4b20: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
4b30: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4b40: 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d  ROM aux.sqlite_m
4b50: 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  aster;.    }.  }
4b60: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 68   {}.  do_test sh
4b70: 61 72 65 64 2d 24 61 76 2e 38 2e 32 2e 32 20 7b  ared-$av.8.2.2 {
4b80: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
4b90: 20 74 65 73 74 32 2e 64 62 0a 20 20 20 20 65 78   test2.db.    ex
4ba0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
4bb0: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
4bc0: 27 55 54 46 2d 31 36 27 3b 0a 20 20 20 20 20 20  'UTF-16';.      
4bd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 65 66  CREATE TABLE def
4be0: 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 7d  (d, e, f);.    }
4bf0: 20 64 62 32 0a 20 20 20 20 73 74 72 69 6e 67 20   db2.    string 
4c00: 72 61 6e 67 65 20 5b 65 78 65 63 73 71 6c 20 7b  range [execsql {
4c10: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 3b  PRAGMA encoding;
4c20: 7d 20 64 62 32 5d 20 30 20 65 6e 64 2d 32 0a 20  } db2] 0 end-2. 
4c30: 20 7d 20 7b 55 54 46 2d 31 36 7d 0a 0a 20 20 63   } {UTF-16}..  c
4c40: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
4c50: 20 20 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f    catch {db2 clo
4c60: 73 65 7d 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  se}.  file delet
4c70: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
4c80: 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 64 6f 5f   test2.db..  do_
4c90: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
4ca0: 38 2e 33 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  8.3.2 {.    sqli
4cb0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
4cc0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45     execsql { CRE
4cd0: 41 54 45 20 54 41 42 4c 45 20 64 65 66 28 64 2c  ATE TABLE def(d,
4ce0: 20 65 2c 20 66 29 20 7d 0a 20 20 20 20 65 78 65   e, f) }.    exe
4cf0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  csql { PRAGMA en
4d00: 63 6f 64 69 6e 67 20 7d 0a 20 20 7d 20 7b 55 54  coding }.  } {UT
4d10: 46 2d 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  F-8}.  do_test s
4d20: 68 61 72 65 64 2d 24 61 76 2e 38 2e 33 2e 33 20  hared-$av.8.3.3 
4d30: 7b 0a 20 20 20 20 73 65 74 20 7a 44 62 31 36 20  {.    set zDb16 
4d40: 22 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65  "[encoding conve
4d50: 72 74 74 6f 20 75 6e 69 63 6f 64 65 20 74 65 73  rtto unicode tes
4d60: 74 2e 64 62 5d 5c 78 30 30 5c 78 30 30 22 0a 20  t.db]\x00\x00". 
4d70: 20 20 20 73 65 74 20 64 62 31 36 20 5b 73 71 6c     set db16 [sql
4d80: 69 74 65 33 5f 6f 70 65 6e 31 36 20 24 7a 44 62  ite3_open16 $zDb
4d90: 31 36 20 7b 7d 5d 0a 0a 20 20 20 20 73 65 74 20  16 {}]..    set 
4da0: 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72  stmt [sqlite3_pr
4db0: 65 70 61 72 65 20 24 64 62 31 36 20 22 53 45 4c  epare $db16 "SEL
4dc0: 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
4dd0: 69 74 65 5f 6d 61 73 74 65 72 22 20 2d 31 20 44  ite_master" -1 D
4de0: 55 4d 4d 59 5d 0a 20 20 20 20 73 71 6c 69 74 65  UMMY].    sqlite
4df0: 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 20 20 20  3_step $stmt.   
4e00: 20 73 65 74 20 73 71 6c 20 5b 73 71 6c 69 74 65   set sql [sqlite
4e10: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 73  3_column_text $s
4e20: 74 6d 74 20 30 5d 0a 20 20 20 20 73 71 6c 69 74  tmt 0].    sqlit
4e30: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d  e3_finalize $stm
4e40: 74 0a 20 20 20 20 73 65 74 20 73 71 6c 0a 20 20  t.    set sql.  
4e50: 7d 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  } {CREATE TABLE 
4e60: 64 65 66 28 64 2c 20 65 2c 20 66 29 7d 0a 20 20  def(d, e, f)}.  
4e70: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
4e80: 61 76 2e 38 2e 33 2e 34 20 7b 0a 20 20 20 20 73  av.8.3.4 {.    s
4e90: 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33  et stmt [sqlite3
4ea0: 5f 70 72 65 70 61 72 65 20 24 64 62 31 36 20 22  _prepare $db16 "
4eb0: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22  PRAGMA encoding"
4ec0: 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 20 20 73   -1 DUMMY].    s
4ed0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74 6d  qlite3_step $stm
4ee0: 74 0a 20 20 20 20 73 65 74 20 65 6e 63 20 5b 73  t.    set enc [s
4ef0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4f00: 78 74 20 24 73 74 6d 74 20 30 5d 0a 20 20 20 20  xt $stmt 0].    
4f10: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4f20: 20 24 73 74 6d 74 0a 20 20 20 20 73 65 74 20 65   $stmt.    set e
4f30: 6e 63 0a 20 20 7d 20 7b 55 54 46 2d 38 7d 0a 0a  nc.  } {UTF-8}..
4f40: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
4f50: 24 64 62 31 36 0a 0a 23 20 42 75 67 20 23 32 35  $db16..# Bug #25
4f60: 34 37 20 69 73 20 63 61 75 73 69 6e 67 20 74 68  47 is causing th
4f70: 69 73 20 74 6f 20 66 61 69 6c 2e 0a 69 66 20 30  is to fail..if 0
4f80: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61   {.  do_test sha
4f90: 72 65 64 2d 24 61 76 2e 38 2e 32 2e 33 20 7b 0a  red-$av.8.2.3 {.
4fa0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20      catchsql {. 
4fb0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4fc0: 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61  OM aux.sqlite_ma
4fd0: 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  ster;.    }.  } 
4fe0: 7b 31 20 7b 61 74 74 61 63 68 65 64 20 64 61 74  {1 {attached dat
4ff0: 61 62 61 73 65 73 20 6d 75 73 74 20 75 73 65 20  abases must use 
5000: 74 68 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e  the same text en
5010: 63 6f 64 69 6e 67 20 61 73 20 6d 61 69 6e 20 64  coding as main d
5020: 61 74 61 62 61 73 65 7d 7d 0a 7d 0a 7d 0a 0a 63  atabase}}.}.}..c
5030: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
5040: 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65  catch {db2 close
5050: 7d 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66  }.file delete -f
5060: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
5070: 74 32 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  t2.db..#--------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
50d0: 69 6e 67 20 74 65 73 74 73 20 2d 20 73 68 61 72  ing tests - shar
50e0: 65 64 2d 39 2e 2a 20 2d 20 74 65 73 74 20 69 6e  ed-9.* - test in
50f0: 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74 77 65  teractions betwe
5100: 65 6e 20 54 45 4d 50 20 74 72 69 67 67 65 72 73  en TEMP triggers
5110: 0a 23 20 61 6e 64 20 73 68 61 72 65 64 2d 73 63  .# and shared-sc
5120: 68 65 6d 61 73 2e 0a 23 0a 69 66 63 61 70 61 62  hemas..#.ifcapab
5130: 6c 65 20 74 72 69 67 67 65 72 26 26 74 65 6d 70  le trigger&&temp
5140: 64 62 20 7b 0a 0a 64 6f 5f 74 65 73 74 20 73 68  db {..do_test sh
5150: 61 72 65 64 2d 24 61 76 2e 39 2e 31 20 7b 0a 20  ared-$av.9.1 {. 
5160: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
5170: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
5180: 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  2 test.db.  exec
5190: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
51a0: 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c   TABLE abc(a, b,
51b0: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
51c0: 54 41 42 4c 45 20 61 62 63 5f 6d 69 72 72 6f 72  TABLE abc_mirror
51d0: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  (a, b, c);.    C
51e0: 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
51f0: 45 52 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  ER BEFORE INSERT
5200: 20 4f 4e 20 61 62 63 20 42 45 47 49 4e 20 0a 20   ON abc BEGIN . 
5210: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5220: 20 61 62 63 5f 6d 69 72 72 6f 72 28 61 2c 20 62   abc_mirror(a, b
5230: 2c 20 63 29 20 56 41 4c 55 45 53 28 6e 65 77 2e  , c) VALUES(new.
5240: 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29  a, new.b, new.c)
5250: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 49  ;.    END;.    I
5260: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
5270: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
5280: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5290: 4d 20 61 62 63 5f 6d 69 72 72 6f 72 3b 0a 20 20  M abc_mirror;.  
52a0: 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74  }.} {1 2 3}.do_t
52b0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 39  est shared-$av.9
52c0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
52d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
52e0: 20 61 62 63 20 56 41 4c 55 45 53 28 34 2c 20 35   abc VALUES(4, 5
52f0: 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 6);.    SELECT
5300: 20 2a 20 46 52 4f 4d 20 61 62 63 5f 6d 69 72 72   * FROM abc_mirr
5310: 6f 72 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31  or;.  } db2.} {1
5320: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 68   2 3}.do_test sh
5330: 61 72 65 64 2d 24 61 76 2e 39 2e 33 20 7b 0a 20  ared-$av.9.3 {. 
5340: 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32 20   db close.  db2 
5350: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 7d 20 3b 20  close.} {}..} ; 
5360: 23 20 45 6e 64 20 73 68 61 72 65 64 2d 39 2e 2a  # End shared-9.*
5370: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
53c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
53d0: 65 73 74 73 20 2d 20 73 68 61 72 65 64 2d 31 30  ests - shared-10
53e0: 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 74  .* - test that t
53f0: 68 65 20 6c 69 62 72 61 72 79 20 62 65 68 61 76  he library behav
5400: 65 73 20 0a 23 20 63 6f 72 72 65 63 74 6c 79 20  es .# correctly 
5410: 77 68 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f  when a connectio
5420: 6e 20 74 6f 20 61 20 73 68 61 72 65 64 2d 63 61  n to a shared-ca
5430: 63 68 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a  che is closed. .
5440: 23 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  #.do_test shared
5450: 2d 24 61 76 2e 31 30 2e 31 20 7b 0a 20 20 23 20  -$av.10.1 {.  # 
5460: 43 72 65 61 74 65 20 61 20 73 6d 61 6c 6c 20 73  Create a small s
5470: 61 6d 70 6c 65 20 64 61 74 61 62 61 73 65 20 77  ample database w
5480: 69 74 68 20 74 77 6f 20 63 6f 6e 6e 65 63 74 69  ith two connecti
5490: 6f 6e 73 20 74 6f 20 69 74 20 28 64 62 20 61 6e  ons to it (db an
54a0: 64 20 64 62 32 29 2e 0a 20 20 66 69 6c 65 20 64  d db2)..  file d
54b0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
54c0: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
54d0: 62 20 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  b  test.db.  sql
54e0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
54f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5500: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
5510: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
5520: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
5530: 41 42 4c 45 20 64 65 28 64 20 50 52 49 4d 41 52  ABLE de(d PRIMAR
5540: 59 20 4b 45 59 2c 20 65 29 3b 0a 20 20 20 20 49  Y KEY, e);.    I
5550: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41  NSERT INTO ab VA
5560: 4c 55 45 53 28 27 43 68 69 61 6e 67 20 4d 61 69  LUES('Chiang Mai
5570: 27 2c 20 31 30 30 30 30 30 29 3b 0a 20 20 20 20  ', 100000);.    
5580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
5590: 41 4c 55 45 53 28 27 42 61 6e 67 6b 6f 6b 27 2c  ALUES('Bangkok',
55a0: 20 38 30 30 30 30 30 30 29 3b 0a 20 20 20 20 49   8000000);.    I
55b0: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41  NSERT INTO de VA
55c0: 4c 55 45 53 28 27 55 62 6f 6e 27 2c 20 31 32 30  LUES('Ubon', 120
55d0: 30 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  000);.    INSERT
55e0: 20 49 4e 54 4f 20 64 65 20 56 41 4c 55 45 53 28   INTO de VALUES(
55f0: 27 4b 68 6f 6e 20 4b 61 65 6e 27 2c 20 32 30 30  'Khon Kaen', 200
5600: 30 30 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  000);.  }.} {}.d
5610: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
5620: 76 2e 31 30 2e 32 20 7b 0a 20 20 23 20 4f 70 65  v.10.2 {.  # Ope
5630: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
5640: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 66 69  tion with the fi
5650: 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  rst connection, 
5660: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
5670: 69 6f 6e 0a 20 20 23 20 77 69 74 68 20 74 68 65  ion.  # with the
5680: 20 73 65 63 6f 6e 64 2e 0a 20 20 65 78 65 63 73   second..  execs
5690: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
56a0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
56b0: 4d 20 61 62 3b 0a 20 20 7d 0a 20 20 65 78 65 63  M ab;.  }.  exec
56c0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
56d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
56e0: 20 64 65 20 56 41 4c 55 45 53 28 27 50 61 74 61   de VALUES('Pata
56f0: 79 61 27 2c 20 33 30 30 30 30 29 3b 0a 20 20 7d  ya', 30000);.  }
5700: 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73   db2.} {}.do_tes
5710: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e  t shared-$av.10.
5720: 33 20 7b 0a 20 20 23 20 41 6e 20 65 78 74 65 72  3 {.  # An exter
5730: 6e 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  nal connection s
5740: 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f  hould be able to
5750: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
5760: 73 65 2c 20 62 75 74 20 6e 6f 74 0a 20 20 23 20  se, but not.  # 
5770: 70 72 65 70 61 72 65 20 61 20 77 72 69 74 65 20  prepare a write 
5780: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 69 66 20  operation..  if 
5790: 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  {$::tcl_platform
57a0: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69  (platform)=="uni
57b0: 78 22 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  x"} {.    sqlite
57c0: 33 20 64 62 33 20 2e 2f 74 65 73 74 2e 64 62 0a  3 db3 ./test.db.
57d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
57e0: 71 6c 69 74 65 33 20 64 62 33 20 54 45 53 54 2e  qlite3 db3 TEST.
57f0: 44 42 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  DB.  }.  execsql
5800: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
5810: 46 52 4f 4d 20 61 62 3b 0a 20 20 7d 20 64 62 33  FROM ab;.  } db3
5820: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
5830: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
5840: 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41 4c 55  ERT INTO de VALU
5850: 45 53 28 27 50 61 74 61 79 61 27 2c 20 33 30 30  ES('Pataya', 300
5860: 30 30 29 3b 0a 20 20 7d 20 64 62 33 0a 7d 20 7b  00);.  } db3.} {
5870: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
5880: 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ocked}}.do_test 
5890: 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e 34 20  shared-$av.10.4 
58a0: 7b 0a 20 20 23 20 43 6c 6f 73 65 20 74 68 65 20  {.  # Close the 
58b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
58c0: 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
58d0: 63 74 69 6f 6e 20 6f 70 65 6e 0a 20 20 64 62 32  ction open.  db2
58e0: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74   close.} {}.do_t
58f0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5900: 30 2e 35 20 7b 0a 20 20 23 20 54 65 73 74 20 74  0.5 {.  # Test t
5910: 68 61 74 20 74 68 65 20 64 62 32 20 74 72 61 6e  hat the db2 tran
5920: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
5930: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72   automatically r
5940: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 23 20  olled back..  # 
5950: 49 66 20 69 74 20 68 61 73 20 6e 6f 74 20 74 68  If it has not th
5960: 65 20 28 27 50 61 74 61 79 61 27 2c 20 33 30 30  e ('Pataya', 300
5970: 30 30 29 20 65 6e 74 72 79 20 77 69 6c 6c 20 73  00) entry will s
5980: 74 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 20 74  till be in the t
5990: 61 62 6c 65 2e 0a 20 20 65 78 65 63 73 71 6c 20  able..  execsql 
59a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
59b0: 52 4f 4d 20 64 65 3b 0a 20 20 7d 0a 7d 20 7b 55  ROM de;.  }.} {U
59c0: 62 6f 6e 20 31 32 30 30 30 30 20 7b 4b 68 6f 6e  bon 120000 {Khon
59d0: 20 4b 61 65 6e 7d 20 32 30 30 30 30 30 7d 0a 64   Kaen} 200000}.d
59e0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
59f0: 76 2e 31 30 2e 35 20 7b 0a 20 20 23 20 43 6c 6f  v.10.5 {.  # Clo
5a00: 73 69 6e 67 20 64 62 32 20 73 68 6f 75 6c 64 20  sing db2 should 
5a10: 68 61 76 65 20 64 72 6f 70 70 65 64 20 74 68 65  have dropped the
5a20: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 62 61   shared-cache ba
5a30: 63 6b 20 74 6f 20 61 20 72 65 61 64 2d 6c 6f 63  ck to a read-loc
5a40: 6b 2e 0a 20 20 23 20 53 6f 20 64 62 33 20 73 68  k..  # So db3 sh
5a50: 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f 20  ould be able to 
5a60: 70 72 65 70 61 72 65 20 61 20 77 72 69 74 65 2e  prepare a write.
5a70: 2e 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 49  ...  catchsql {I
5a80: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41  NSERT INTO de VA
5a90: 4c 55 45 53 28 27 50 61 74 61 79 61 27 2c 20 33  LUES('Pataya', 3
5aa0: 30 30 30 30 29 3b 7d 20 64 62 33 0a 7d 20 7b 30  0000);} db3.} {0
5ab0: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61   {}}.do_test sha
5ac0: 72 65 64 2d 24 61 76 2e 31 30 2e 36 20 7b 0a 20  red-$av.10.6 {. 
5ad0: 20 23 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 63   # ... but not c
5ae0: 6f 6d 6d 69 74 20 69 74 2e 0a 20 20 63 61 74 63  ommit it..  catc
5af0: 68 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20 64 62  hsql {COMMIT} db
5b00: 33 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  3.} {1 {database
5b10: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
5b20: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
5b30: 31 30 2e 37 20 7b 0a 20 20 23 20 43 6f 6d 6d 69  10.7 {.  # Commi
5b40: 74 20 74 68 65 20 28 72 65 61 64 2d 6f 6e 6c 79  t the (read-only
5b50: 29 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e  ) db transaction
5b60: 2e 20 43 68 65 63 6b 20 76 69 61 20 64 62 33 20  . Check via db3 
5b70: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
5b80: 20 0a 20 20 23 20 63 6f 6e 74 65 6e 74 73 20 6f   .  # contents o
5b90: 66 20 74 61 62 6c 65 20 22 64 65 22 20 61 72 65  f table "de" are
5ba0: 20 73 74 69 6c 6c 20 61 73 20 74 68 65 79 20 73   still as they s
5bb0: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 65 78 65 63  hould be..  exec
5bc0: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
5bd0: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
5be0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
5bf0: 52 4f 4d 20 64 65 3b 0a 20 20 7d 20 64 62 33 0a  ROM de;.  } db3.
5c00: 7d 20 7b 55 62 6f 6e 20 31 32 30 30 30 30 20 7b  } {Ubon 120000 {
5c10: 4b 68 6f 6e 20 4b 61 65 6e 7d 20 32 30 30 30 30  Khon Kaen} 20000
5c20: 30 20 50 61 74 61 79 61 20 33 30 30 30 30 7d 0a  0 Pataya 30000}.
5c30: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5c40: 61 76 2e 31 30 2e 39 20 7b 0a 20 20 23 20 43 6f  av.10.9 {.  # Co
5c50: 6d 6d 69 74 20 74 68 65 20 65 78 74 65 72 6e 61  mmit the externa
5c60: 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  l transaction.. 
5c70: 20 63 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d 49   catchsql {COMMI
5c80: 54 7d 20 64 62 33 0a 7d 20 7b 30 20 7b 7d 7d 0a  T} db3.} {0 {}}.
5c90: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
5ca0: 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e 31 30  shared-$av.10.10
5cb0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
5cc0: 24 61 76 2e 31 30 2e 31 31 20 7b 0a 20 20 64 62  $av.10.11 {.  db
5cd0: 20 63 6c 6f 73 65 0a 20 20 64 62 33 20 63 6c 6f   close.  db3 clo
5ce0: 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  se.} {}..do_test
5cf0: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 31   shared-$av.11.1
5d00: 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65   {.  file delete
5d10: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a   -force test.db.
5d20: 20 20 73 71 6c 69 74 65 33 20 64 62 20 20 74 65    sqlite3 db  te
5d30: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  st.db.  sqlite3 
5d40: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
5d50: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
5d60: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20  TE TABLE abc(a, 
5d70: 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54  b, c);.    CREAT
5d80: 45 20 54 41 42 4c 45 20 61 62 63 32 28 61 2c 20  E TABLE abc2(a, 
5d90: 62 2c 20 63 29 3b 0a 20 20 20 20 42 45 47 49 4e  b, c);.    BEGIN
5da0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5db0: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20  O abc VALUES(1, 
5dc0: 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  2, 3);.  }.} {}.
5dd0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5de0: 61 76 2e 31 31 2e 32 20 7b 0a 20 20 63 61 74 63  av.11.2 {.  catc
5df0: 68 73 71 6c 20 7b 42 45 47 49 4e 3b 7d 20 64 62  hsql {BEGIN;} db
5e00: 32 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45  2.  catchsql {SE
5e10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
5e20: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
5e30: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
5e40: 63 6b 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74  cked: abc}}.do_t
5e50: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5e60: 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.3 {.  catchsql
5e70: 20 7b 42 45 47 49 4e 7d 20 64 62 32 0a 7d 20 7b   {BEGIN} db2.} {
5e80: 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72 74 20  1 {cannot start 
5e90: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  a transaction wi
5ea0: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
5eb0: 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  on}}.do_test sha
5ec0: 72 65 64 2d 24 61 76 2e 31 31 2e 34 20 7b 0a 20  red-$av.11.4 {. 
5ed0: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
5ee0: 54 20 2a 20 46 52 4f 4d 20 61 62 63 32 3b 7d 20  T * FROM abc2;} 
5ef0: 64 62 32 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f  db2.} {0 {}}.do_
5f00: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
5f10: 31 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71  11.5 {.  catchsq
5f20: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  l {INSERT INTO a
5f30: 62 63 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  bc2 VALUES(1, 2,
5f40: 20 33 29 3b 7d 20 64 62 32 0a 7d 20 7b 31 20 7b   3);} db2.} {1 {
5f50: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
5f60: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
5f70: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31  st shared-$av.11
5f80: 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .6 {.  catchsql 
5f90: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61  {SELECT * FROM a
5fa0: 62 63 32 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  bc2}.} {0 {}}.do
5fb0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
5fc0: 2e 31 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  .11.6 {.  execsq
5fd0: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
5fe0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 72 65 61  ;.    PRAGMA rea
5ff0: 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20  d_uncommitted = 
6000: 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a  1;.  } db2.} {}.
6010: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
6020: 61 76 2e 31 31 2e 37 20 7b 0a 20 20 65 78 65 63  av.11.7 {.  exec
6030: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
6040: 20 49 4e 54 4f 20 61 62 63 32 20 56 41 4c 55 45   INTO abc2 VALUE
6050: 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20  S(4, 5, 6);.    
6060: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 32  INSERT INTO abc2
6070: 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29   VALUES(7, 8, 9)
6080: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
6090: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31  st shared-$av.11
60a0: 2e 38 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b  .8 {.  set res [
60b0: 6c 69 73 74 5d 0a 20 20 64 62 32 20 65 76 61 6c  list].  db2 eval
60c0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 62   {.    SELECT ab
60d0: 63 2e 61 20 61 73 20 49 2c 20 61 62 63 32 2e 61  c.a as I, abc2.a
60e0: 20 61 73 20 49 49 20 46 52 4f 4d 20 61 62 63 2c   as II FROM abc,
60f0: 20 61 62 63 32 3b 0a 20 20 7d 20 7b 0a 20 20 20   abc2;.  } {.   
6100: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
6110: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63   DELETE FROM abc
6120: 20 57 48 45 52 45 20 31 3b 0a 20 20 20 20 7d 0a   WHERE 1;.    }.
6130: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20      lappend res 
6140: 24 49 20 24 49 49 0a 20 20 7d 0a 20 20 73 65 74  $I $II.  }.  set
6150: 20 72 65 73 0a 7d 20 7b 31 20 34 20 7b 7d 20 37   res.} {1 4 {} 7
6160: 7d 0a 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b  }.if {[llength [
6170: 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 20 73 71 6c  info command sql
6180: 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68  ite3_shared_cach
6190: 65 5f 72 65 70 6f 72 74 5d 5d 3d 3d 31 7d 20 7b  e_report]]==1} {
61a0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
61b0: 64 2d 24 61 76 2e 31 31 2e 39 20 7b 0a 20 20 20  d-$av.11.9 {.   
61c0: 20 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20   string tolower 
61d0: 5b 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f  [sqlite3_shared_
61e0: 63 61 63 68 65 5f 72 65 70 6f 72 74 5d 0a 20 20  cache_report].  
61f0: 7d 20 5b 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65  } [string tolowe
6200: 72 20 5b 6c 69 73 74 20 5b 66 69 6c 65 20 6e 61  r [list [file na
6210: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6e  tivename [file n
6220: 6f 72 6d 61 6c 69 7a 65 20 74 65 73 74 2e 64 62  ormalize test.db
6230: 5d 5d 20 32 5d 5d 0a 7d 0a 0a 64 6f 5f 74 65 73  ]] 2]].}..do_tes
6240: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e  t shared-$av.11.
6250: 31 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  11 {.  db close.
6260: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d    db2 close.} {}
6270: 0a 0a 23 20 54 68 69 73 20 74 65 73 74 73 20 74  ..# This tests t
6280: 68 61 74 20 69 66 20 69 74 20 69 73 20 69 6d 70  hat if it is imp
6290: 6f 73 73 69 62 6c 65 20 74 6f 20 66 72 65 65 20  ossible to free 
62a0: 61 6e 79 20 70 61 67 65 73 2c 20 53 51 4c 69 74  any pages, SQLit
62b0: 65 20 77 69 6c 6c 0a 23 20 65 78 63 65 65 64 20  e will.# exceed 
62c0: 74 68 65 20 6c 69 6d 69 74 20 73 65 74 20 62 79  the limit set by
62d0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
62e0: 7a 65 2e 0a 66 69 6c 65 20 64 65 6c 65 74 65 20  ze..file delete 
62f0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74  -force test.db t
6300: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73  est.db-journal.s
6310: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
6320: 62 20 0a 69 66 63 61 70 61 62 6c 65 20 70 61 67  b .ifcapable pag
6330: 65 72 5f 70 72 61 67 6d 61 73 20 7b 0a 20 20 64  er_pragmas {.  d
6340: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
6350: 76 2e 31 32 2e 31 20 7b 0a 20 20 20 20 65 78 65  v.12.1 {.    exe
6360: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
6370: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
6380: 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d   10;.      PRAGM
6390: 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20  A cache_size;.  
63a0: 20 20 7d 0a 20 20 7d 20 7b 31 30 7d 0a 7d 0a 64    }.  } {10}.}.d
63b0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
63c0: 76 2e 31 32 2e 32 20 7b 0a 20 20 73 65 74 20 3a  v.12.2 {.  set :
63d0: 3a 64 62 5f 68 61 6e 64 6c 65 73 20 5b 6c 69 73  :db_handles [lis
63e0: 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20  t].  for {set i 
63f0: 31 7d 20 7b 24 69 20 3c 20 31 35 7d 20 7b 69 6e  1} {$i < 15} {in
6400: 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70 70  cr i} {.    lapp
6410: 65 6e 64 20 3a 3a 64 62 5f 68 61 6e 64 6c 65 73  end ::db_handles
6420: 20 64 62 24 69 0a 20 20 20 20 73 71 6c 69 74 65   db$i.    sqlite
6430: 33 20 64 62 24 69 20 74 65 73 74 2e 64 62 20 0a  3 db$i test.db .
6440: 20 20 20 20 65 78 65 63 73 71 6c 20 22 43 52 45      execsql "CRE
6450: 41 54 45 20 54 41 42 4c 45 20 64 62 24 7b 69 7d  ATE TABLE db${i}
6460: 28 61 2c 20 62 2c 20 63 29 22 20 64 62 24 69 20  (a, b, c)" db$i 
6470: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 49 4e  .    execsql "IN
6480: 53 45 52 54 20 49 4e 54 4f 20 64 62 24 7b 69 7d  SERT INTO db${i}
6490: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
64a0: 22 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20  ".  }.} {}.proc 
64b0: 6e 65 73 74 65 64 5f 73 65 6c 65 63 74 20 7b 68  nested_select {h
64c0: 61 6e 64 6c 65 73 7d 20 7b 0a 20 20 5b 6c 69 6e  andles} {.  [lin
64d0: 64 65 78 20 24 68 61 6e 64 6c 65 73 20 30 5d 20  dex $handles 0] 
64e0: 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a 20 46  eval "SELECT * F
64f0: 52 4f 4d 20 5b 6c 69 6e 64 65 78 20 24 68 61 6e  ROM [lindex $han
6500: 64 6c 65 73 20 30 5d 22 20 7b 0a 20 20 20 20 6c  dles 0]" {.    l
6510: 61 70 70 65 6e 64 20 3a 3a 72 65 73 20 24 61 20  append ::res $a 
6520: 24 62 20 24 63 0a 20 20 20 20 69 66 20 7b 5b 6c  $b $c.    if {[l
6530: 6c 65 6e 67 74 68 20 24 68 61 6e 64 6c 65 73 5d  length $handles]
6540: 3e 31 7d 20 7b 0a 20 20 20 20 20 20 6e 65 73 74  >1} {.      nest
6550: 65 64 5f 73 65 6c 65 63 74 20 5b 6c 72 61 6e 67  ed_select [lrang
6560: 65 20 24 68 61 6e 64 6c 65 73 20 31 20 65 6e 64  e $handles 1 end
6570: 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 64 6f  ].    }.  }.}.do
6580: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
6590: 2e 31 32 2e 33 20 7b 0a 20 20 73 65 74 20 3a 3a  .12.3 {.  set ::
65a0: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 6e 65 73  res [list].  nes
65b0: 74 65 64 5f 73 65 6c 65 63 74 20 24 3a 3a 64 62  ted_select $::db
65c0: 5f 68 61 6e 64 6c 65 73 0a 20 20 73 65 74 20 3a  _handles.  set :
65d0: 3a 72 65 73 0a 7d 20 5b 73 74 72 69 6e 67 20 72  :res.} [string r
65e0: 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70  ange [string rep
65f0: 65 61 74 20 22 31 20 32 20 33 20 22 20 5b 6c 6c  eat "1 2 3 " [ll
6600: 65 6e 67 74 68 20 24 3a 3a 64 62 5f 68 61 6e 64  ength $::db_hand
6610: 6c 65 73 5d 5d 20 30 20 65 6e 64 2d 31 5d 0a 0a  les]] 0 end-1]..
6620: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
6630: 61 76 2e 31 32 2e 58 20 7b 0a 20 20 64 62 20 63  av.12.X {.  db c
6640: 6c 6f 73 65 0a 20 20 66 6f 72 65 61 63 68 20 68  lose.  foreach h
6650: 20 24 3a 3a 64 62 5f 68 61 6e 64 6c 65 73 20 7b   $::db_handles {
6660: 20 0a 20 20 20 20 24 68 20 63 6c 6f 73 65 0a 20   .    $h close. 
6670: 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 49 6e 74 65 72   }.} {}..# Inter
6680: 6e 61 6c 6c 79 2c 20 6c 6f 63 6b 73 20 61 72 65  nally, locks are
6690: 20 61 63 71 75 69 72 65 64 20 6f 6e 20 73 68 61   acquired on sha
66a0: 72 65 64 20 42 2d 54 72 65 65 20 73 74 72 75 63  red B-Tree struc
66b0: 74 75 72 65 73 20 69 6e 20 74 68 65 20 6f 72 64  tures in the ord
66c0: 65 72 0a 23 20 74 68 61 74 20 74 68 65 20 73 74  er.# that the st
66d0: 72 75 63 74 75 72 65 73 20 61 70 70 65 61 72 20  ructures appear 
66e0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
66f0: 65 6d 6f 72 79 20 61 64 64 72 65 73 73 20 73 70  emory address sp
6700: 61 63 65 2e 20 54 68 69 73 0a 23 20 74 65 73 74  ace. This.# test
6710: 20 63 61 73 65 20 61 74 74 65 6d 70 74 73 20 74   case attempts t
6720: 6f 20 63 61 75 73 65 20 74 68 65 20 6f 72 64 65  o cause the orde
6730: 72 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  r of the structu
6740: 72 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 0a 23  res in memory .#
6750: 20 74 6f 20 62 65 20 64 69 66 66 65 72 65 6e 74   to be different
6760: 20 66 72 6f 6d 20 74 68 65 20 6f 72 64 65 72 20   from the order 
6770: 69 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 72  in which they ar
6780: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 61 20  e attached to a 
6790: 67 69 76 65 6e 0a 23 20 64 61 74 61 62 61 73 65  given.# database
67a0: 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 63 6f   handle. This co
67b0: 76 65 72 73 20 61 6e 20 65 78 74 72 61 20 6c 69  vers an extra li
67c0: 6e 65 20 6f 72 20 74 77 6f 2e 0a 23 0a 64 6f 5f  ne or two..#.do_
67d0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
67e0: 31 33 2e 31 20 7b 0a 20 20 66 69 6c 65 20 64 65  13.1 {.  file de
67f0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
6800: 32 2e 64 62 20 74 65 73 74 33 2e 64 62 20 74 65  2.db test3.db te
6810: 73 74 34 2e 64 62 20 74 65 73 74 35 2e 64 62 0a  st4.db test5.db.
6820: 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65    sqlite3 db :me
6830: 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20  mory:.  execsql 
6840: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
6850: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 32 3b  st2.db' AS aux2;
6860: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
6870: 74 33 2e 64 62 27 20 41 53 20 61 75 78 33 3b 0a  t3.db' AS aux3;.
6880: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
6890: 34 2e 64 62 27 20 41 53 20 61 75 78 34 3b 0a 20  4.db' AS aux4;. 
68a0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 35     ATTACH 'test5
68b0: 2e 64 62 27 20 41 53 20 61 75 78 35 3b 0a 20 20  .db' AS aux5;.  
68c0: 20 20 44 45 54 41 43 48 20 61 75 78 32 3b 0a 20    DETACH aux2;. 
68d0: 20 20 20 44 45 54 41 43 48 20 61 75 78 33 3b 0a     DETACH aux3;.
68e0: 20 20 20 20 44 45 54 41 43 48 20 61 75 78 34 3b      DETACH aux4;
68f0: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
6900: 74 32 2e 64 62 27 20 41 53 20 61 75 78 32 3b 0a  t2.db' AS aux2;.
6910: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
6920: 33 2e 64 62 27 20 41 53 20 61 75 78 33 3b 0a 20  3.db' AS aux3;. 
6930: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 34     ATTACH 'test4
6940: 2e 64 62 27 20 41 53 20 61 75 78 34 3b 0a 20 20  .db' AS aux4;.  
6950: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73  }.} {}.do_test s
6960: 68 61 72 65 64 2d 24 61 76 2e 31 33 2e 32 20 7b  hared-$av.13.2 {
6970: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6980: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6990: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  (a, b, c);.    C
69a0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 32  REATE TABLE aux2
69b0: 2e 74 32 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  .t2(a, b, c);.  
69c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
69d0: 75 78 33 2e 74 33 28 61 2c 20 62 2c 20 63 29 3b  ux3.t3(a, b, c);
69e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
69f0: 45 20 61 75 78 34 2e 74 34 28 61 2c 20 62 2c 20  E aux4.t4(a, b, 
6a00: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  c);.    CREATE T
6a10: 41 42 4c 45 20 61 75 78 35 2e 74 35 28 61 2c 20  ABLE aux5.t5(a, 
6a20: 62 2c 20 63 29 3b 0a 20 20 20 20 53 45 4c 45 43  b, c);.    SELEC
6a30: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
6a40: 0a 20 20 20 20 20 20 61 75 78 32 2e 73 71 6c 69  .      aux2.sqli
6a50: 74 65 5f 6d 61 73 74 65 72 2c 20 0a 20 20 20 20  te_master, .    
6a60: 20 20 61 75 78 33 2e 73 71 6c 69 74 65 5f 6d 61    aux3.sqlite_ma
6a70: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 61 75 78  ster, .      aux
6a80: 34 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2c  4.sqlite_master,
6a90: 20 0a 20 20 20 20 20 20 61 75 78 35 2e 73 71 6c   .      aux5.sql
6aa0: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 7d 0a 7d  ite_master.  }.}
6ab0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61   {1}.do_test sha
6ac0: 72 65 64 2d 24 61 76 2e 31 33 2e 33 20 7b 0a 20  red-$av.13.3 {. 
6ad0: 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a   db close.} {}..
6ae0: 23 20 54 65 73 74 20 74 68 61 74 20 6e 6f 74 68  # Test that noth
6af0: 69 6e 67 20 68 6f 72 72 69 62 6c 65 20 68 61 70  ing horrible hap
6b00: 70 65 6e 73 20 69 66 20 61 20 63 6f 6e 6e 65 63  pens if a connec
6b10: 74 69 6f 6e 20 74 6f 20 61 20 73 68 61 72 65 64  tion to a shared
6b20: 20 42 2d 54 72 65 65 20 0a 23 20 73 74 72 75 63   B-Tree .# struc
6b30: 74 75 72 65 20 69 73 20 63 6c 6f 73 65 64 20 77  ture is closed w
6b40: 68 69 6c 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  hile some other 
6b50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
6b60: 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 0a 23  n open cursor..#
6b70: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
6b80: 24 61 76 2e 31 34 2e 31 20 7b 0a 20 20 73 71 6c  $av.14.1 {.  sql
6b90: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
6ba0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
6bb0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
6bc0: 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  {SELECT name FRO
6bd0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d  M sqlite_master}
6be0: 0a 7d 20 7b 64 62 31 20 64 62 32 20 64 62 33 20  .} {db1 db2 db3 
6bf0: 64 62 34 20 64 62 35 20 64 62 36 20 64 62 37 20  db4 db5 db6 db7 
6c00: 64 62 38 20 64 62 39 20 64 62 31 30 20 64 62 31  db8 db9 db10 db1
6c10: 31 20 64 62 31 32 20 64 62 31 33 20 64 62 31 34  1 db12 db13 db14
6c20: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
6c30: 2d 24 61 76 2e 31 34 2e 32 20 7b 0a 20 20 73 65  -$av.14.2 {.  se
6c40: 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 64  t res [list].  d
6c50: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 6e  b eval {SELECT n
6c60: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
6c70: 6d 61 73 74 65 72 7d 20 7b 0a 20 20 20 20 69 66  master} {.    if
6c80: 20 7b 24 6e 61 6d 65 20 65 71 20 22 64 62 37 22   {$name eq "db7"
6c90: 7d 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c  } {.      db2 cl
6ca0: 6f 73 65 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61  ose.    }.    la
6cb0: 70 70 65 6e 64 20 72 65 73 20 24 6e 61 6d 65 0a  ppend res $name.
6cc0: 20 20 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 20    }.  set res.} 
6cd0: 7b 64 62 31 20 64 62 32 20 64 62 33 20 64 62 34  {db1 db2 db3 db4
6ce0: 20 64 62 35 20 64 62 36 20 64 62 37 20 64 62 38   db5 db6 db7 db8
6cf0: 20 64 62 39 20 64 62 31 30 20 64 62 31 31 20 64   db9 db10 db11 d
6d00: 62 31 32 20 64 62 31 33 20 64 62 31 34 7d 0a 64  b12 db13 db14}.d
6d10: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
6d20: 76 2e 31 34 2e 33 20 7b 0a 20 20 64 62 20 63 6c  v.14.3 {.  db cl
6d30: 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 20 50 6f 70 75  ose.} {}..# Popu
6d40: 6c 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  late a database 
6d50: 73 63 68 65 6d 61 20 75 73 69 6e 67 20 63 6f 6e  schema using con
6d60: 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 20 54 68  nection [db]. Th
6d70: 65 6e 20 64 72 6f 70 20 69 74 20 75 73 69 6e 67  en drop it using
6d80: 0a 23 20 5b 64 62 32 5d 2e 20 54 68 69 73 20 69  .# [db2]. This i
6d90: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
6da0: 20 61 6e 79 20 70 6f 69 6e 74 73 20 77 68 65 72   any points wher
6db0: 65 20 73 68 61 72 65 64 2d 73 63 68 65 6d 61 20  e shared-schema 
6dc0: 65 6c 65 6d 65 6e 74 73 0a 23 20 61 72 65 20 61  elements.# are a
6dd0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
6de0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66  he lookaside buf
6df0: 66 65 72 20 6f 66 20 5b 64 62 5d 2e 0a 23 20 0a  fer of [db]..# .
6e00: 23 20 4d 75 74 65 78 65 73 20 61 72 65 20 65 6e  # Mutexes are en
6e10: 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 74  abled for this t
6e20: 65 73 74 20 61 73 20 74 68 61 74 20 61 63 74 69  est as that acti
6e30: 76 61 74 65 73 20 61 20 63 6f 75 70 6c 65 20 6f  vates a couple o
6e40: 66 20 75 73 65 66 75 6c 0a 23 20 61 73 73 65 72  f useful.# asser
6e50: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
6e60: 6e 20 74 68 65 20 43 20 63 6f 64 65 2e 0a 23 0a  n the C code..#.
6e70: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
6e80: 61 76 2d 31 35 2e 31 20 7b 0a 20 20 66 69 6c 65  av-15.1 {.  file
6e90: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74   delete -force t
6ea0: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
6eb0: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 66 75 6c   db test.db -ful
6ec0: 6c 6d 75 74 65 78 20 31 0a 20 20 73 71 6c 69 74  lmutex 1.  sqlit
6ed0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d  e3 db2 test.db -
6ee0: 66 75 6c 6c 6d 75 74 65 78 20 31 0a 20 20 65 78  fullmutex 1.  ex
6ef0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
6f00: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
6f10: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
6f20: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
6f30: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
6f40: 45 20 56 49 45 57 20 76 31 20 41 53 20 53 45 4c  E VIEW v1 AS SEL
6f50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 0a  ECT * FROM t1; .
6f60: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
6f70: 76 32 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  v2 AS SELECT * F
6f80: 52 4f 4d 20 74 31 2c 20 76 31 20 0a 20 20 20 20  ROM t1, v1 .    
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 57 48 45 52 45 20 74 31 2e 63 3d 76 31 2e    WHERE t1.c=v1.
6fb0: 63 20 47 52 4f 55 50 20 42 59 20 74 31 2e 61 20  c GROUP BY t1.a 
6fc0: 4f 52 44 45 52 20 42 59 20 76 31 2e 62 3b 20 0a  ORDER BY v1.b; .
6fd0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
6fe0: 45 52 20 74 72 31 20 41 46 54 45 52 20 49 4e 53  ER tr1 AFTER INS
6ff0: 45 52 54 20 4f 4e 20 74 31 20 0a 20 20 20 20 20  ERT ON t1 .     
7000: 20 57 48 45 4e 20 6e 65 77 2e 61 21 3d 31 0a 20   WHEN new.a!=1. 
7010: 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 44     BEGIN.      D
7020: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
7030: 45 52 45 20 61 3d 35 3b 0a 20 20 20 20 20 20 49  ERE a=5;.      I
7040: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7050: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
7060: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
7070: 45 54 20 63 3d 63 2b 31 3b 0a 20 20 20 20 45 4e  ET c=c+1;.    EN
7080: 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  D;..    INSERT I
7090: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
70a0: 20 36 2c 20 37 29 3b 0a 20 20 20 20 49 4e 53 45   6, 7);.    INSE
70b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
70c0: 53 28 38 2c 20 39 2c 20 31 30 29 3b 0a 20 20 20  S(8, 9, 10);.   
70d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
70e0: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 2c 20 31  VALUES(11, 12, 1
70f0: 33 29 3b 0a 20 20 20 20 41 4e 41 4c 59 5a 45 3b  3);.    ANALYZE;
7100: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
7110: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
7120: 32 20 36 20 38 20 39 20 31 32 20 31 20 32 20 35  2 6 8 9 12 1 2 5
7130: 20 31 31 20 31 32 20 31 34 20 31 20 32 20 34 7d   11 12 14 1 2 4}
7140: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
7150: 24 61 76 2d 31 35 2e 32 20 7b 0a 20 20 65 78 65  $av-15.2 {.  exe
7160: 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c  csql { DROP TABL
7170: 45 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a  E t1 } db2.} {}.
7180: 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f  db close.db2 clo
7190: 73 65 0a 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 65  se..}..sqlite3_e
71a0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
71b0: 68 65 20 24 3a 3a 65 6e 61 62 6c 65 5f 73 68 61  he $::enable_sha
71c0: 72 65 64 5f 63 61 63 68 65 0a 66 69 6e 69 73 68  red_cache.finish
71d0: 5f 74 65 73 74 0a                                _test.