/ Hex Artifact Content
Login

Artifact 56d006ab6a9f1ed9a0dcc642e34ed6d366c3c90f:


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 32 38 20 32 30 30 37 2f 31 30 2f 30 39 20  1.28 2007/10/09 
0190: 30 38 3a 32 39 3a 33 33 20 64 61 6e 69 65 6c 6b  08:29:33 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 24 61 76 20 69 73 20 63 75 72 72 65 6e 74  # $av is current
0400: 6c 79 20 30 20 69 66 20 74 68 69 73 20 6c 6f 6f  ly 0 if this loo
0410: 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 74  p iteration is t
0420: 6f 20 74 65 73 74 20 77 69 74 68 20 61 75 74 6f  o test with auto
0430: 2d 76 61 63 75 75 6d 20 74 75 72 6e 65 64 0a 23  -vacuum turned.#
0440: 20 6f 66 66 2c 20 61 6e 64 20 31 20 69 66 20 69   off, and 1 if i
0450: 74 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 20  t is turned on. 
0460: 49 6e 63 72 65 6d 65 6e 74 20 69 74 20 73 6f 20  Increment it so 
0470: 74 68 61 74 20 28 31 20 2d 3e 20 6e 6f 20 61 75  that (1 -> no au
0480: 74 6f 2d 76 61 63 75 75 6d 29 20 0a 23 20 61 6e  to-vacuum) .# an
0490: 64 20 28 32 20 2d 3e 20 61 75 74 6f 2d 76 61 63  d (2 -> auto-vac
04a0: 75 75 6d 29 2e 20 54 68 65 20 73 6f 6c 65 20 72  uum). The sole r
04b0: 65 61 73 6f 6e 20 66 6f 72 20 74 68 69 73 20 69  eason for this i
04c0: 73 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  s so that it loo
04d0: 6b 73 20 6e 69 63 65 72 0a 23 20 77 68 65 6e 20  ks nicer.# when 
04e0: 77 65 20 75 73 65 20 74 68 69 73 20 76 61 72 69  we use this vari
04f0: 61 62 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  able as part of 
0500: 74 65 73 74 2d 63 61 73 65 20 6e 61 6d 65 73 2e  test-case names.
0510: 0a 23 0a 69 6e 63 72 20 61 76 0a 0a 23 20 54 65  .#.incr av..# Te
0520: 73 74 20 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 3a  st organization:
0530: 0a 23 0a 23 20 73 68 61 72 65 64 2d 31 2e 2a 3a  .#.# shared-1.*:
0540: 20 53 69 6d 70 6c 65 20 74 65 73 74 20 74 6f 20   Simple test to 
0550: 76 65 72 69 66 79 20 62 61 73 69 63 20 73 61 6e  verify basic san
0560: 69 74 79 20 6f 66 20 74 61 62 6c 65 20 6c 65 76  ity of table lev
0570: 65 6c 20 6c 6f 63 6b 69 6e 67 20 77 68 65 6e 0a  el locking when.
0580: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 74 77  #             tw
0590: 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 73 68  o connections sh
05a0: 61 72 65 20 61 20 70 61 67 65 72 20 63 61 63 68  are a pager cach
05b0: 65 2e 0a 23 20 73 68 61 72 65 64 2d 32 2e 2a 3a  e..# shared-2.*:
05c0: 20 54 65 73 74 20 74 68 61 74 20 61 20 72 65 61   Test that a rea
05d0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  d transaction ca
05e0: 6e 20 63 6f 2d 65 78 69 73 74 20 77 69 74 68 20  n co-exist with 
05f0: 61 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  a .#            
0600: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
0610: 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 20  on, including a 
0620: 73 69 6d 70 6c 65 20 74 65 73 74 20 74 6f 20 65  simple test to e
0630: 6e 73 75 72 65 20 74 68 65 20 0a 23 20 20 20 20  nsure the .#    
0640: 20 20 20 20 20 20 20 20 20 65 78 74 65 72 6e 61           externa
0650: 6c 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  l locking protoc
0660: 6f 6c 20 69 73 20 73 74 69 6c 6c 20 77 6f 72 6b  ol is still work
0670: 69 6e 67 2e 0a 23 20 73 68 61 72 65 64 2d 33 2e  ing..# shared-3.
0680: 2a 3a 20 53 69 6d 70 6c 65 20 74 65 73 74 20 6f  *: Simple test o
0690: 66 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  f read-uncommitt
06a0: 65 64 20 6d 6f 64 65 2e 0a 23 20 73 68 61 72 65  ed mode..# share
06b0: 64 2d 34 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  d-4.*: Check tha
06c0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  t the schema is 
06d0: 6c 6f 63 6b 65 64 20 61 6e 64 20 75 6e 6c 6f 63  locked and unloc
06e0: 6b 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23  ked correctly..#
06f0: 20 73 68 61 72 65 64 2d 35 2e 2a 3a 20 54 65 73   shared-5.*: Tes
0700: 74 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 2f  t that creating/
0710: 64 72 6f 70 70 69 6e 67 20 73 63 68 65 6d 61 20  dropping schema 
0720: 69 74 65 6d 73 20 77 6f 72 6b 73 20 77 68 65 6e  items works when
0730: 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20 20   databases.#    
0740: 20 20 20 20 20 20 20 20 20 61 72 65 20 61 74 74           are att
0750: 61 63 68 65 64 20 69 6e 20 64 69 66 66 65 72 65  ached in differe
0760: 6e 74 20 6f 72 64 65 72 73 20 74 6f 20 64 69 66  nt orders to dif
0770: 66 65 72 65 6e 74 20 68 61 6e 64 6c 65 73 2e 0a  ferent handles..
0780: 23 20 73 68 61 72 65 64 2d 36 2e 2a 3a 20 4c 6f  # shared-6.*: Lo
0790: 63 6b 69 6e 67 2c 20 55 4e 49 4f 4e 20 41 4c 4c  cking, UNION ALL
07a0: 20 71 75 65 72 69 65 73 20 61 6e 64 20 73 75 62   queries and sub
07b0: 2d 71 75 65 72 69 65 73 2e 0a 23 20 73 68 61 72  -queries..# shar
07c0: 65 64 2d 37 2e 2a 3a 20 41 75 74 6f 76 61 63 75  ed-7.*: Autovacu
07d0: 75 6d 20 61 6e 64 20 73 68 61 72 65 64 2d 63 61  um and shared-ca
07e0: 63 68 65 2e 0a 23 20 73 68 61 72 65 64 2d 38 2e  che..# shared-8.
07f0: 2a 3a 20 54 65 73 74 73 20 72 65 6c 61 74 65 64  *: Tests related
0800: 20 74 6f 20 74 68 65 20 74 65 78 74 20 65 6e 63   to the text enc
0810: 6f 64 69 6e 67 20 6f 66 20 73 68 61 72 65 64 2d  oding of shared-
0820: 63 61 63 68 65 20 64 61 74 61 62 61 73 65 73 2e  cache databases.
0830: 0a 23 20 73 68 61 72 65 64 2d 39 2e 2a 3a 20 54  .# shared-9.*: T
0840: 45 4d 50 20 74 72 69 67 67 65 72 73 20 61 6e 64  EMP triggers and
0850: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 64 61   shared-cache da
0860: 74 61 62 61 73 65 73 2e 0a 23 20 73 68 61 72 65  tabases..# share
0870: 64 2d 31 30 2e 2a 3a 20 54 65 73 74 73 20 6f 66  d-10.*: Tests of
0880: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
0890: 2e 0a 23 20 73 68 61 72 65 64 2d 31 31 2e 2a 3a  ..# shared-11.*:
08a0: 20 54 65 73 74 20 74 72 61 6e 73 61 63 74 69 6f   Test transactio
08b0: 6e 20 6c 6f 63 6b 69 6e 67 2e 0a 23 0a 0a 64 6f  n locking..#..do
08c0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
08d0: 2e 31 2e 31 20 7b 0a 20 20 23 20 4f 70 65 6e 20  .1.1 {.  # Open 
08e0: 61 20 73 65 63 6f 6e 64 20 64 61 74 61 62 61 73  a second databas
08f0: 65 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 74 65  e on the file te
0900: 73 74 2e 64 62 2e 20 49 74 20 73 68 6f 75 6c 64  st.db. It should
0910: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 70 61   use the same pa
0920: 67 65 72 0a 20 20 23 20 63 61 63 68 65 20 61 6e  ger.  # cache an
0930: 64 20 73 63 68 65 6d 61 20 61 73 20 74 68 65 20  d schema as the 
0940: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 6e 65 63 74  original connect
0950: 69 6f 6e 2e 20 56 65 72 69 66 79 20 74 68 61 74  ion. Verify that
0960: 20 6f 6e 6c 79 20 31 20 66 69 6c 65 20 69 73 20   only 1 file is 
0970: 0a 20 20 23 20 6f 70 65 6e 65 64 2e 0a 20 20 73  .  # opened..  s
0980: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
0990: 64 62 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  db.  set ::sqlit
09a0: 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
09b0: 74 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  t.} {1}.do_test 
09c0: 73 68 61 72 65 64 2d 24 61 76 2e 31 2e 32 20 7b  shared-$av.1.2 {
09d0: 0a 20 20 23 20 41 64 64 20 61 20 74 61 62 6c 65  .  # Add a table
09e0: 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 72 6f   and a single ro
09f0: 77 20 6f 66 20 64 61 74 61 20 76 69 61 20 74 68  w of data via th
0a00: 65 20 66 69 72 73 74 20 63 6f 6e 6e 65 63 74 69  e first connecti
0a10: 6f 6e 2e 20 0a 20 20 23 20 45 6e 73 75 72 65 20  on. .  # Ensure 
0a20: 74 68 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20  that the second 
0a30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 73  connection can s
0a40: 65 65 20 74 68 65 6d 2e 0a 20 20 65 78 65 63 73  ee them..  execs
0a50: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
0a60: 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20  TABLE abc(a, b, 
0a70: 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  c);.    INSERT I
0a80: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 31  NTO abc VALUES(1
0a90: 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 20 64 62 0a  , 2, 3);.  } db.
0aa0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ab0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
0ac0: 63 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  c;.  } db2.} {1 
0ad0: 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  2 3}.do_test sha
0ae0: 72 65 64 2d 24 61 76 2e 31 2e 33 20 7b 0a 20 20  red-$av.1.3 {.  
0af0: 23 20 48 61 76 65 20 74 68 65 20 66 69 72 73 74  # Have the first
0b00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 65 67 69   connection begi
0b10: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
0b20: 61 6e 64 20 6f 62 74 61 69 6e 20 61 20 72 65 61  and obtain a rea
0b30: 64 2d 6c 6f 63 6b 0a 20 20 23 20 6f 6e 20 74 61  d-lock.  # on ta
0b40: 62 6c 65 20 61 62 63 2e 20 54 68 69 73 20 73 68  ble abc. This sh
0b50: 6f 75 6c 64 20 6e 6f 74 20 70 72 65 76 65 6e 74  ould not prevent
0b60: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e   the second conn
0b70: 65 63 74 69 6f 6e 20 66 72 6f 6d 20 0a 20 20 23  ection from .  #
0b80: 20 71 75 65 72 79 69 6e 67 20 61 62 63 2e 0a 20   querying abc.. 
0b90: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0ba0: 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54  EGIN;.    SELECT
0bb0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d   * FROM abc;.  }
0bc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0bd0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
0be0: 62 63 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31  bc;.  } db2.} {1
0bf0: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 68   2 3}.do_test sh
0c00: 61 72 65 64 2d 24 61 76 2e 31 2e 34 20 7b 0a 20  ared-$av.1.4 {. 
0c10: 20 23 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74   # Try to insert
0c20: 20 61 20 72 6f 77 20 69 6e 74 6f 20 61 62 63 20   a row into abc 
0c30: 76 69 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32  via connection 2
0c40: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
0c50: 69 6c 20 62 65 63 61 75 73 65 0a 20 20 23 20 6f  il because.  # o
0c60: 66 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  f the read-lock 
0c70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 69 73 20  connection 1 is 
0c80: 68 6f 6c 64 69 6e 67 20 6f 6e 20 74 61 62 6c 65  holding on table
0c90: 20 61 62 63 20 28 6f 62 74 61 69 6e 65 64 20 69   abc (obtained i
0ca0: 6e 20 74 68 65 0a 20 20 23 20 70 72 65 76 69 6f  n the.  # previo
0cb0: 75 73 20 74 65 73 74 20 63 61 73 65 29 2e 0a 20  us test case).. 
0cc0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0cd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0ce0: 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b  VALUES(4, 5, 6);
0cf0: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  .  } db2.} {1 {d
0d00: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
0d10: 20 6c 6f 63 6b 65 64 3a 20 61 62 63 7d 7d 0a 64   locked: abc}}.d
0d20: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
0d30: 76 2e 31 2e 35 20 7b 0a 20 20 23 20 55 73 69 6e  v.1.5 {.  # Usin
0d40: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28  g connection 2 (
0d50: 74 68 65 20 6f 6e 65 20 77 69 74 68 6f 75 74 20  the one without 
0d60: 74 68 65 20 6f 70 65 6e 20 74 72 61 6e 73 61 63  the open transac
0d70: 74 69 6f 6e 29 2c 20 74 72 79 20 74 6f 20 63 72  tion), try to cr
0d80: 65 61 74 65 0a 20 20 23 20 61 20 6e 65 77 20 74  eate.  # a new t
0d90: 61 62 6c 65 2e 20 54 68 69 73 20 73 68 6f 75 6c  able. This shoul
0da0: 64 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 6f  d fail because o
0db0: 66 20 74 68 65 20 6f 70 65 6e 20 72 65 61 64 20  f the open read 
0dc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 23  transaction .  #
0dd0: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
0de0: 69 6f 6e 20 31 2e 0a 20 20 63 61 74 63 68 73 71  ion 1..  catchsq
0df0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0e00: 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66  ABLE def(d, e, f
0e10: 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  );.  } db2.} {1 
0e20: 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  {database table 
0e30: 69 73 20 6c 6f 63 6b 65 64 3a 20 73 71 6c 69 74  is locked: sqlit
0e40: 65 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65  e_master}}.do_te
0e50: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 2e  st shared-$av.1.
0e60: 36 20 7b 0a 20 20 23 20 55 70 67 72 61 64 65 20  6 {.  # Upgrade 
0e70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 27 73 20 74  connection 1's t
0e80: 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 61 20  ransaction to a 
0e90: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
0ea0: 6e 2e 20 43 72 65 61 74 65 0a 20 20 23 20 61 20  n. Create.  # a 
0eb0: 6e 65 77 20 74 61 62 6c 65 20 2d 20 64 65 66 20  new table - def 
0ec0: 2d 20 61 6e 64 20 69 6e 73 65 72 74 20 61 20 72  - and insert a r
0ed0: 6f 77 20 69 6e 74 6f 20 69 74 2e 20 42 65 63 61  ow into it. Beca
0ee0: 75 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  use the connecti
0ef0: 6f 6e 20 31 0a 20 20 23 20 74 72 61 6e 73 61 63  on 1.  # transac
0f00: 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74 68  tion modifies th
0f10: 65 20 73 63 68 65 6d 61 2c 20 69 74 20 73 68 6f  e schema, it sho
0f20: 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
0f30: 62 6c 65 20 66 6f 72 20 0a 20 20 23 20 63 6f 6e  ble for .  # con
0f40: 6e 65 63 74 69 6f 6e 20 32 20 74 6f 20 61 63 63  nection 2 to acc
0f50: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
0f60: 20 61 74 20 61 6c 6c 20 75 6e 74 69 6c 20 74 68   at all until th
0f70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 0a  e connection 1 .
0f80: 20 20 23 20 68 61 73 20 66 69 6e 69 73 68 65 64    # has finished
0f90: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0fa0: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
0fb0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
0fc0: 65 66 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20  ef(d, e, f);.   
0fd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66   INSERT INTO def
0fe0: 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 56   VALUES('IV', 'V
0ff0: 27 2c 20 27 56 49 27 29 3b 0a 20 20 7d 0a 7d 20  ', 'VI');.  }.} 
1000: 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  {}.do_test share
1010: 64 2d 24 61 76 2e 31 2e 37 20 7b 0a 20 20 23 20  d-$av.1.7 {.  # 
1020: 52 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 71  Read from the sq
1030: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1040: 65 20 77 69 74 68 20 63 6f 6e 6e 65 63 74 69 6f  e with connectio
1050: 6e 20 31 20 28 69 6e 73 69 64 65 20 74 68 65 20  n 1 (inside the 
1060: 0a 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  # transaction
1070: 29 2e 20 54 68 65 6e 20 74 65 73 74 20 74 68 61  ). Then test tha
1080: 74 20 77 65 20 63 61 6e 20 6e 6f 74 20 64 6f 20  t we can not do 
1090: 74 68 69 73 20 77 69 74 68 20 63 6f 6e 6e 65 63  this with connec
10a0: 74 69 6f 6e 20 32 2e 20 54 68 69 73 0a 20 20 23  tion 2. This.  #
10b0: 20 69 73 20 62 65 63 61 75 73 65 20 6f 66 20 74   is because of t
10c0: 68 65 20 73 63 68 65 6d 61 2d 6d 6f 64 69 66 69  he schema-modifi
10d0: 65 64 20 6c 6f 63 6b 20 65 73 74 61 62 6c 69 73  ed lock establis
10e0: 68 65 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  hed by connectio
10f0: 6e 20 31 20 0a 20 20 23 20 69 6e 20 74 68 65 20  n 1 .  # in the 
1100: 70 72 65 76 69 6f 75 73 20 74 65 73 74 20 63 61  previous test ca
1110: 73 65 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  se..  execsql {.
1120: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1130: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
1140: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
1150: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
1160: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1170: 72 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  r;.  } db2.} {1 
1180: 7b 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  {database schema
1190: 20 69 73 20 6c 6f 63 6b 65 64 3a 20 6d 61 69 6e   is locked: main
11a0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
11b0: 64 2d 24 61 76 2e 31 2e 38 20 7b 0a 20 20 23 20  d-$av.1.8 {.  # 
11c0: 43 6f 6d 6d 69 74 20 74 68 65 20 63 6f 6e 6e 65  Commit the conne
11d0: 63 74 69 6f 6e 20 31 20 74 72 61 6e 73 61 63 74  ction 1 transact
11e0: 69 6f 6e 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b  ion..  execsql {
11f0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
1200: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 73  .} {}..do_test s
1210: 68 61 72 65 64 2d 24 61 76 2e 32 2e 31 20 7b 0a  hared-$av.2.1 {.
1220: 20 20 23 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74    # Open connect
1230: 69 6f 6e 20 64 62 33 20 74 6f 20 74 68 65 20 64  ion db3 to the d
1240: 61 74 61 62 61 73 65 2e 20 55 73 65 20 61 20 64  atabase. Use a d
1250: 69 66 66 65 72 65 6e 74 20 70 61 74 68 20 74 6f  ifferent path to
1260: 20 74 68 65 20 73 61 6d 65 0a 20 20 23 20 66 69   the same.  # fi
1270: 6c 65 20 73 6f 20 74 68 61 74 20 64 62 33 20 64  le so that db3 d
1280: 6f 65 73 20 2a 6e 6f 74 2a 20 73 68 61 72 65 20  oes *not* share 
1290: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
12a0: 61 63 68 65 20 61 73 20 64 62 20 61 6e 64 20 64  ache as db and d
12b0: 62 32 0a 20 20 23 20 28 74 68 65 72 65 20 73 68  b2.  # (there sh
12c0: 6f 75 6c 64 20 62 65 20 74 77 6f 20 6f 70 65 6e  ould be two open
12d0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 73 29 2e 0a   file handles)..
12e0: 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61    if {$::tcl_pla
12f0: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d  tform(platform)=
1300: 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20 20 20 73  ="unix"} {.    s
1310: 71 6c 69 74 65 33 20 64 62 33 20 2e 2f 74 65 73  qlite3 db3 ./tes
1320: 74 2e 64 62 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  t.db.  } else {.
1330: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 33 20      sqlite3 db3 
1340: 54 45 53 54 2e 44 42 0a 20 20 7d 0a 20 20 73 65  TEST.DB.  }.  se
1350: 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  t ::sqlite_open_
1360: 66 69 6c 65 5f 63 6f 75 6e 74 0a 7d 20 7b 32 7d  file_count.} {2}
1370: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
1380: 24 61 76 2e 32 2e 32 20 7b 0a 20 20 23 20 53 74  $av.2.2 {.  # St
1390: 61 72 74 20 72 65 61 64 20 74 72 61 6e 73 61 63  art read transac
13a0: 74 69 6f 6e 73 20 6f 6e 20 64 62 20 61 6e 64 20  tions on db and 
13b0: 64 62 32 20 28 74 68 65 20 73 68 61 72 65 64 20  db2 (the shared 
13c0: 70 61 67 65 72 20 63 61 63 68 65 29 2e 20 45 6e  pager cache). En
13d0: 73 75 72 65 0a 20 20 23 20 64 62 33 20 63 61 6e  sure.  # db3 can
13e0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
13f0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 65 78 65   database..  exe
1400: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
1410: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1420: 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 20 20 65  ROM abc;.  }.  e
1430: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
1440: 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  IN;.    SELECT *
1450: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64   FROM abc;.  } d
1460: 62 32 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  b2.  catchsql {.
1470: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1480: 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  abc VALUES(1, 2,
1490: 20 33 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b   3);.  } db2.} {
14a0: 31 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c  1 {database tabl
14b0: 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 61 62 63  e is locked: abc
14c0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
14d0: 64 2d 24 61 76 2e 32 2e 33 20 7b 0a 20 20 23 20  d-$av.2.3 {.  # 
14e0: 54 75 72 6e 20 64 62 27 73 20 74 72 61 6e 73 61  Turn db's transa
14f0: 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 77 72 69  ction into a wri
1500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te-transaction. 
1510: 64 62 33 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c  db3 should still
1520: 20 62 65 0a 20 20 23 20 61 62 6c 65 20 74 6f 20   be.  # able to 
1530: 72 65 61 64 20 66 72 6f 6d 20 74 61 62 6c 65 20  read from table 
1540: 64 65 66 20 28 62 75 74 20 77 69 6c 6c 20 6e 6f  def (but will no
1550: 74 20 73 65 65 20 74 68 65 20 6e 65 77 20 72 6f  t see the new ro
1560: 77 29 2e 20 43 6f 6e 6e 65 63 74 69 6f 6e 0a 20  w). Connection. 
1570: 20 23 20 64 62 32 20 73 68 6f 75 6c 64 20 6e 6f   # db2 should no
1580: 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61  t be able to rea
1590: 64 20 64 65 66 20 28 62 65 63 61 75 73 65 20 6f  d def (because o
15a0: 66 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  f the write-lock
15b0: 29 2e 0a 0a 23 20 54 6f 64 6f 3a 20 54 68 65 20  )...# Todo: The 
15c0: 66 61 69 6c 65 64 20 22 49 4e 53 45 52 54 20 49  failed "INSERT I
15d0: 4e 54 4f 20 61 62 63 20 2e 2e 2e 22 20 73 74 61  NTO abc ..." sta
15e0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62  tement in the ab
15f0: 6f 76 65 20 74 65 73 74 0a 23 20 68 61 73 20 73  ove test.# has s
1600: 74 61 72 74 65 64 20 61 20 77 72 69 74 65 2d 74  tarted a write-t
1610: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64 62  ransaction on db
1620: 32 20 28 73 68 6f 75 6c 64 20 74 68 69 73 20 62  2 (should this b
1630: 65 20 73 6f 3f 29 2e 20 54 68 69 73 20 0a 23 20  e so?). This .# 
1640: 77 6f 75 6c 64 20 70 72 65 76 65 6e 74 20 63 6f  would prevent co
1650: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 66 72 6f 6d  nnection db from
1660: 20 73 74 61 72 74 69 6e 67 20 61 20 77 72 69 74   starting a writ
1670: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  e-transaction. S
1680: 6f 20 72 6f 6c 6c 20 74 68 65 0a 23 20 64 62 32  o roll the.# db2
1690: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 61 63   transaction bac
16a0: 6b 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  k and replace it
16b0: 20 77 69 74 68 20 61 20 6e 65 77 20 72 65 61 64   with a new read
16c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
16d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f  execsql {.    RO
16e0: 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 42 45 47 49  LLBACK;.    BEGI
16f0: 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  N;.    SELECT * 
1700: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62  FROM abc;.  } db
1710: 32 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  2..  execsql {. 
1720: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
1730: 65 66 20 56 41 4c 55 45 53 28 27 56 49 49 27 2c  ef VALUES('VII',
1740: 20 27 56 49 49 49 27 2c 20 27 49 58 27 29 3b 0a   'VIII', 'IX');.
1750: 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b 0a 20    }.  concat [. 
1760: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
1770: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 3b  LECT * FROM def;
1780: 20 7d 20 64 62 33 0a 20 20 5d 20 5b 0a 20 20 20   } db3.  ] [.   
1790: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
17a0: 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 3b 20 7d  CT * FROM def; }
17b0: 20 64 62 32 0a 20 20 5d 0a 7d 20 7b 30 20 7b 49   db2.  ].} {0 {I
17c0: 56 20 56 20 56 49 7d 20 31 20 7b 64 61 74 61 62  V V VI} 1 {datab
17d0: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
17e0: 6b 65 64 3a 20 64 65 66 7d 7d 0a 64 6f 5f 74 65  ked: def}}.do_te
17f0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 32 2e  st shared-$av.2.
1800: 34 20 7b 0a 20 20 23 20 43 6f 6d 6d 69 74 20 74  4 {.  # Commit t
1810: 68 65 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  he open transact
1820: 69 6f 6e 20 6f 6e 20 64 62 2e 20 64 62 32 20 73  ion on db. db2 s
1830: 74 69 6c 6c 20 68 6f 6c 64 73 20 61 20 72 65 61  till holds a rea
1840: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  d-transaction.. 
1850: 20 23 20 54 68 69 73 20 73 68 6f 75 6c 64 20 70   # This should p
1860: 72 65 76 65 6e 74 20 64 62 33 20 66 72 6f 6d 20  revent db3 from 
1870: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
1880: 61 74 61 62 61 73 65 2c 20 62 75 74 20 6e 6f 74  atabase, but not
1890: 20 66 72 6f 6d 20 0a 20 20 23 20 72 65 61 64 69   from .  # readi
18a0: 6e 67 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ng..  execsql {.
18b0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
18c0: 20 20 63 6f 6e 63 61 74 20 5b 0a 20 20 20 20 63    concat [.    c
18d0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
18e0: 20 2a 20 46 52 4f 4d 20 64 65 66 3b 20 7d 20 64   * FROM def; } d
18f0: 62 33 0a 20 20 5d 20 5b 0a 20 20 20 20 63 61 74  b3.  ] [.    cat
1900: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
1910: 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27  NTO def VALUES('
1920: 58 27 2c 20 27 58 49 27 2c 20 27 58 49 49 27 29  X', 'XI', 'XII')
1930: 3b 20 7d 20 64 62 33 0a 20 20 5d 0a 7d 20 7b 30  ; } db3.  ].} {0
1940: 20 7b 49 56 20 56 20 56 49 20 56 49 49 20 56 49   {IV V VI VII VI
1950: 49 49 20 49 58 7d 20 31 20 7b 64 61 74 61 62 61  II IX} 1 {databa
1960: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1970: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 20  catchsql COMMIT 
1980: 64 62 32 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61  db2..do_test sha
1990: 72 65 64 2d 24 61 76 2e 33 2e 31 2e 31 20 7b 0a  red-$av.3.1.1 {.
19a0: 20 20 23 20 54 68 69 73 20 74 65 73 74 20 63 61    # This test ca
19b0: 73 65 20 73 74 61 72 74 73 20 61 20 6c 69 6e 65  se starts a line
19c0: 61 72 20 73 63 61 6e 20 6f 66 20 74 61 62 6c 65  ar scan of table
19d0: 20 27 73 65 71 27 20 75 73 69 6e 67 20 61 20 0a   'seq' using a .
19e0: 20 20 23 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69    # read-uncommi
19f0: 74 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  tted connection.
1a00: 20 49 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   In the middle o
1a10: 66 20 74 68 65 20 73 63 61 6e 2c 20 72 6f 77 73  f the scan, rows
1a20: 20 61 72 65 20 61 64 64 65 64 0a 20 20 23 20 74   are added.  # t
1a30: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1a40: 20 73 65 71 20 74 61 62 6c 65 20 28 61 68 65 61   seq table (ahea
1a50: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
1a60: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1a70: 29 2e 0a 20 20 23 20 54 68 65 20 75 6e 63 6f 6d  )..  # The uncom
1a80: 6d 69 74 74 65 64 20 72 6f 77 73 20 73 68 6f 75  mitted rows shou
1a90: 6c 64 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  ld be included i
1aa0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  n the results of
1ab0: 20 74 68 65 20 73 63 61 6e 2e 0a 20 20 65 78 65   the scan..  exe
1ac0: 63 73 71 6c 20 22 0a 20 20 20 20 43 52 45 41 54  csql ".    CREAT
1ad0: 45 20 54 41 42 4c 45 20 73 65 71 28 69 20 50 52  E TABLE seq(i PR
1ae0: 49 4d 41 52 59 20 4b 45 59 2c 20 78 29 3b 0a 20  IMARY KEY, x);. 
1af0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73     INSERT INTO s
1b00: 65 71 20 56 41 4c 55 45 53 28 31 2c 20 27 5b 73  eq VALUES(1, '[s
1b10: 74 72 69 6e 67 20 72 65 70 65 61 74 20 58 20 35  tring repeat X 5
1b20: 30 30 5d 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  00]');.    INSER
1b30: 54 20 49 4e 54 4f 20 73 65 71 20 56 41 4c 55 45  T INTO seq VALUE
1b40: 53 28 32 2c 20 27 5b 73 74 72 69 6e 67 20 72 65  S(2, '[string re
1b50: 70 65 61 74 20 58 20 35 30 30 5d 27 29 3b 0a 20  peat X 500]');. 
1b60: 20 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   ".  execsql {SE
1b70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
1b80: 74 65 5f 6d 61 73 74 65 72 7d 20 64 62 32 0a 20  te_master} db2. 
1b90: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
1ba0: 20 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65   read_uncommitte
1bb0: 64 20 3d 20 31 7d 20 64 62 32 0a 0a 20 20 73 65  d = 1} db2..  se
1bc0: 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 64  t ret [list].  d
1bd0: 62 32 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  b2 eval {SELECT 
1be0: 69 20 46 52 4f 4d 20 73 65 71 20 4f 52 44 45 52  i FROM seq ORDER
1bf0: 20 42 59 20 69 7d 20 7b 0a 20 20 20 20 69 66 20   BY i} {.    if 
1c00: 7b 24 69 20 3c 20 34 7d 20 7b 0a 20 20 20 20 20  {$i < 4} {.     
1c10: 20 73 65 74 20 6d 61 78 20 5b 65 78 65 63 73 71   set max [execsq
1c20: 6c 20 7b 53 45 4c 45 43 54 20 6d 61 78 28 69 29  l {SELECT max(i)
1c30: 20 46 52 4f 4d 20 73 65 71 7d 5d 0a 20 20 20 20   FROM seq}].    
1c40: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
1c50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1c60: 73 65 71 20 53 45 4c 45 43 54 20 69 20 2b 20 3a  seq SELECT i + :
1c70: 6d 61 78 2c 20 78 20 46 52 4f 4d 20 73 65 71 3b  max, x FROM seq;
1c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c90: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 24     lappend ret $
1ca0: 69 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a  i.  }.  set ret.
1cb0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
1cc0: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
1cd0: 20 31 34 20 31 35 20 31 36 7d 0a 64 6f 5f 74 65   14 15 16}.do_te
1ce0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 33 2e  st shared-$av.3.
1cf0: 31 2e 32 20 7b 0a 20 20 23 20 41 6e 6f 74 68 65  1.2 {.  # Anothe
1d00: 72 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  r linear scan th
1d10: 72 6f 75 67 68 20 74 61 62 6c 65 20 73 65 71 20  rough table seq 
1d20: 75 73 69 6e 67 20 61 20 72 65 61 64 2d 75 6e 63  using a read-unc
1d30: 6f 6d 6d 69 74 74 65 64 20 63 6f 6e 6e 65 63 74  ommitted connect
1d40: 69 6f 6e 2e 0a 20 20 23 20 54 68 69 73 20 74 69  ion..  # This ti
1d50: 6d 65 2c 20 64 65 6c 65 74 65 20 65 61 63 68 20  me, delete each 
1d60: 72 6f 77 20 61 73 20 69 74 20 69 73 20 72 65 61  row as it is rea
1d70: 64 2e 20 53 68 6f 75 6c 64 20 6e 6f 74 20 61 66  d. Should not af
1d80: 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 73  fect the results
1d90: 20 6f 66 0a 20 20 23 20 74 68 65 20 73 63 61 6e   of.  # the scan
1da0: 2c 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20  , but the table 
1db0: 73 68 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 20  should be empty 
1dc0: 61 66 74 65 72 20 74 68 65 20 73 63 61 6e 20 69  after the scan i
1dd0: 73 20 63 6f 6e 63 6c 75 64 65 64 20 0a 20 20 23  s concluded .  #
1de0: 20 28 74 65 73 74 20 33 2e 31 2e 33 20 76 65 72   (test 3.1.3 ver
1df0: 69 66 69 65 73 20 74 68 69 73 29 2e 0a 20 20 73  ifies this)..  s
1e00: 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20  et ret [list].  
1e10: 64 62 32 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  db2 eval {SELECT
1e20: 20 69 20 46 52 4f 4d 20 73 65 71 7d 20 7b 0a 20   i FROM seq} {. 
1e30: 20 20 20 64 62 20 65 76 61 6c 20 7b 44 45 4c 45     db eval {DELE
1e40: 54 45 20 46 52 4f 4d 20 73 65 71 20 57 48 45 52  TE FROM seq WHER
1e50: 45 20 69 20 3d 20 3a 69 7d 0a 20 20 20 20 6c 61  E i = :i}.    la
1e60: 70 70 65 6e 64 20 72 65 74 20 24 69 0a 20 20 7d  ppend ret $i.  }
1e70: 0a 20 20 73 65 74 20 72 65 74 0a 7d 20 7b 31 20  .  set ret.} {1 
1e80: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
1e90: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31  10 11 12 13 14 1
1ea0: 35 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 73 68  5 16}.do_test sh
1eb0: 61 72 65 64 2d 24 61 76 2e 33 2e 31 2e 33 20 7b  ared-$av.3.1.3 {
1ec0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1ed0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
1ee0: 65 71 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 63 61  eq;.  }.} {}..ca
1ef0: 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 63  tch {db close}.c
1f00: 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d  atch {db2 close}
1f10: 0a 63 61 74 63 68 20 7b 64 62 33 20 63 6c 6f 73  .catch {db3 clos
1f20: 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e}..#-----------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1f70: 23 20 54 65 73 74 73 20 73 68 61 72 65 64 2d 34  # Tests shared-4
1f80: 2e 2a 20 74 65 73 74 20 74 68 61 74 20 74 68 65  .* test that the
1f90: 20 73 63 68 65 6d 61 20 6c 6f 63 6b 69 6e 67 20   schema locking 
1fa0: 72 75 6c 65 73 20 61 72 65 20 61 70 70 6c 69 65  rules are applie
1fb0: 64 20 0a 23 20 63 6f 72 72 65 63 74 6c 79 2e 20  d .# correctly. 
1fc0: 69 2e 65 2e 3a 0a 23 0a 23 20 31 2e 20 41 6c 6c  i.e.:.#.# 1. All
1fd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 72 65   transactions re
1fe0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
1ff0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 73  k on the schemas
2000: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
2010: 65 79 0a 23 20 20 20 20 61 63 63 65 73 73 2e 0a  ey.#    access..
2020: 23 20 32 2e 20 54 72 61 6e 73 61 63 74 69 6f 6e  # 2. Transaction
2030: 73 20 74 68 61 74 20 6d 6f 64 69 66 79 20 61 20  s that modify a 
2040: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
2050: 72 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  require a write-
2060: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 0a 23 20 20  lock on that.#  
2070: 20 20 73 63 68 65 6d 61 2e 0a 23 20 33 2e 20 49    schema..# 3. I
2080: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
2090: 65 20 74 6f 20 63 6f 6d 70 69 6c 65 20 61 20 73  e to compile a s
20a0: 74 61 74 65 6d 65 6e 74 20 77 68 69 6c 65 20 61  tatement while a
20b0: 6e 6f 74 68 65 72 20 68 61 6e 64 6c 65 20 68 61  nother handle ha
20c0: 73 20 61 20 0a 23 20 20 20 20 77 72 69 74 65 2d  s a .#    write-
20d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65  lock on the sche
20e0: 6d 61 2e 0a 23 0a 0a 23 20 4f 70 65 6e 20 74 77  ma..#..# Open tw
20f0: 6f 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  o database handl
2100: 65 73 20 64 62 20 61 6e 64 20 64 62 32 2e 20 45  es db and db2. E
2110: 61 63 68 20 68 61 73 20 61 20 73 69 6e 67 6c 65  ach has a single
2120: 20 61 74 74 61 63 68 20 64 61 74 61 62 61 73 65   attach database
2130: 0a 23 20 28 61 73 20 77 65 6c 6c 20 61 73 20 6d  .# (as well as m
2140: 61 69 6e 29 3a 0a 23 0a 23 20 20 20 20 20 64 62  ain):.#.#     db
2150: 2e 6d 61 69 6e 20 20 20 2d 3e 20 20 20 2e 2f 74  .main   ->   ./t
2160: 65 73 74 2e 64 62 0a 23 20 20 20 20 20 64 62 2e  est.db.#     db.
2170: 74 65 73 74 32 20 20 2d 3e 20 20 20 2e 2f 74 65  test2  ->   ./te
2180: 73 74 32 2e 64 62 0a 23 20 20 20 20 20 64 62 32  st2.db.#     db2
2190: 2e 6d 61 69 6e 20 20 2d 3e 20 20 20 2e 2f 74 65  .main  ->   ./te
21a0: 73 74 32 2e 64 62 0a 23 20 20 20 20 20 64 62 32  st2.db.#     db2
21b0: 2e 74 65 73 74 20 20 2d 3e 20 20 20 2e 2f 74 65  .test  ->   ./te
21c0: 73 74 2e 64 62 0a 23 0a 66 69 6c 65 20 64 65 6c  st.db.#.file del
21d0: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
21e0: 64 62 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  db.file delete -
21f0: 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 0a 66  force test2.db.f
2200: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
2210: 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  e test2.db-journ
2220: 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20 20 74  al.sqlite3 db  t
2230: 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33 20 64  est.db.sqlite3 d
2240: 62 32 20 74 65 73 74 32 2e 64 62 0a 64 6f 5f 74  b2 test2.db.do_t
2250: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34  est shared-$av.4
2260: 2e 31 2e 31 20 7b 0a 20 20 73 65 74 20 73 71 6c  .1.1 {.  set sql
2270: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
2280: 75 6e 74 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73  unt.} {2}.do_tes
2290: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 31  t shared-$av.4.1
22a0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
22b0: 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62  ATTACH 'test2.db
22c0: 27 20 41 53 20 74 65 73 74 32 7d 0a 20 20 73 65  ' AS test2}.  se
22d0: 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69  t sqlite_open_fi
22e0: 6c 65 5f 63 6f 75 6e 74 0a 7d 20 7b 32 7d 0a 64  le_count.} {2}.d
22f0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
2300: 76 2e 34 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63  v.4.1.3 {.  exec
2310: 73 71 6c 20 7b 41 54 54 41 43 48 20 27 74 65 73  sql {ATTACH 'tes
2320: 74 2e 64 62 27 20 41 53 20 74 65 73 74 7d 20 64  t.db' AS test} d
2330: 62 32 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f  b2.  set sqlite_
2340: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a  open_file_count.
2350: 7d 20 7b 32 7d 0a 0a 23 20 53 61 6e 69 74 79 20  } {2}..# Sanity 
2360: 63 68 65 63 6b 3a 20 43 72 65 61 74 65 20 61 20  check: Create a 
2370: 74 61 62 6c 65 20 69 6e 20 2e 2f 74 65 73 74 2e  table in ./test.
2380: 64 62 20 76 69 61 20 68 61 6e 64 6c 65 20 64 62  db via handle db
2390: 2c 20 61 6e 64 20 74 65 73 74 20 74 68 61 74 20  , and test that 
23a0: 68 61 6e 64 6c 65 0a 23 20 64 62 32 20 63 61 6e  handle.# db2 can
23b0: 20 22 73 65 65 22 20 74 68 65 20 6e 65 77 20 74   "see" the new t
23c0: 61 62 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  able immediately
23d0: 2e 20 41 20 68 61 6e 64 6c 65 20 75 73 69 6e 67  . A handle using
23e0: 20 61 20 73 65 70 65 72 61 74 65 20 70 61 67 65   a seperate page
23f0: 72 0a 23 20 63 61 63 68 65 20 77 6f 75 6c 64 20  r.# cache would 
2400: 68 61 76 65 20 74 6f 20 72 65 6c 6f 61 64 20 74  have to reload t
2410: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
2420: 6d 61 20 62 65 66 6f 72 65 20 74 68 69 73 20 77  ma before this w
2430: 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 23 0a  ere possible..#.
2440: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
2450: 61 76 2e 34 2e 32 2e 31 20 7b 0a 20 20 65 78 65  av.4.2.1 {.  exe
2460: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
2470: 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62  E TABLE abc(a, b
2480: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
2490: 20 54 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c   TABLE def(d, e,
24a0: 20 66 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   f);.    INSERT 
24b0: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
24c0: 27 69 27 2c 20 27 69 69 27 2c 20 27 69 69 69 27  'i', 'ii', 'iii'
24d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
24e0: 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27 49  TO def VALUES('I
24f0: 27 2c 20 27 49 49 27 2c 20 27 49 49 49 27 29 3b  ', 'II', 'III');
2500: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
2510: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 32  t shared-$av.4.2
2520: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
2530: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2540: 4f 4d 20 74 65 73 74 2e 61 62 63 3b 0a 20 20 7d  OM test.abc;.  }
2550: 20 64 62 32 0a 7d 20 7b 69 20 69 69 20 69 69 69   db2.} {i ii iii
2560: 7d 0a 0a 23 20 4f 70 65 6e 20 61 20 72 65 61 64  }..# Open a read
2570: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
2580: 20 72 65 61 64 20 66 72 6f 6d 20 74 61 62 6c 65   read from table
2590: 20 61 62 63 20 76 69 61 20 68 61 6e 64 6c 65 20   abc via handle 
25a0: 32 2e 20 43 68 65 63 6b 20 74 68 61 74 0a 23 20  2. Check that.# 
25b0: 68 61 6e 64 6c 65 20 31 20 63 61 6e 20 72 65 61  handle 1 can rea
25c0: 64 20 74 61 62 6c 65 20 61 62 63 2e 20 43 68 65  d table abc. Che
25d0: 63 6b 20 74 68 61 74 20 68 61 6e 64 6c 65 20 31  ck that handle 1
25e0: 20 63 61 6e 6e 6f 74 20 6d 6f 64 69 66 79 20 74   cannot modify t
25f0: 61 62 6c 65 20 61 62 63 0a 23 20 6f 72 20 74 68  able abc.# or th
2600: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2610: 61 2e 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  a. Then check th
2620: 61 74 20 68 61 6e 64 6c 65 20 31 20 63 61 6e 20  at handle 1 can 
2630: 6d 6f 64 69 66 79 20 74 61 62 6c 65 20 64 65 66  modify table def
2640: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  ..#.do_test shar
2650: 65 64 2d 24 61 76 2e 34 2e 33 2e 31 20 7b 0a 20  ed-$av.4.3.1 {. 
2660: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
2670: 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54  EGIN;.    SELECT
2680: 20 2a 20 46 52 4f 4d 20 74 65 73 74 2e 61 62 63   * FROM test.abc
2690: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 69 20 69  ;.  } db2.} {i i
26a0: 69 20 69 69 69 7d 0a 64 6f 5f 74 65 73 74 20 73  i iii}.do_test s
26b0: 68 61 72 65 64 2d 24 61 76 2e 34 2e 33 2e 32 20  hared-$av.4.3.2 
26c0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
26d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
26e0: 62 63 20 56 41 4c 55 45 53 28 27 69 76 27 2c 20  bc VALUES('iv', 
26f0: 27 76 27 2c 20 27 76 69 27 29 3b 0a 20 20 7d 0a  'v', 'vi');.  }.
2700: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 74  } {1 {database t
2710: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20  able is locked: 
2720: 61 62 63 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  abc}}.do_test sh
2730: 61 72 65 64 2d 24 61 76 2e 34 2e 33 2e 33 20 7b  ared-$av.4.3.3 {
2740: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
2750: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 67    CREATE TABLE g
2760: 68 69 28 67 2c 20 68 2c 20 69 29 3b 0a 20 20 7d  hi(g, h, i);.  }
2770: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
2780: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a  table is locked:
2790: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 7d   sqlite_master}}
27a0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
27b0: 24 61 76 2e 34 2e 33 2e 33 20 7b 0a 20 20 63 61  $av.4.3.3 {.  ca
27c0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  tchsql {.    INS
27d0: 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c  ERT INTO def VAL
27e0: 55 45 53 28 27 49 56 27 2c 20 27 56 27 2c 20 27  UES('IV', 'V', '
27f0: 56 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b  VI');.  }.} {0 {
2800: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
2810: 64 2d 24 61 76 2e 34 2e 33 2e 34 20 7b 0a 20 20  d-$av.4.3.4 {.  
2820: 23 20 43 6c 65 61 6e 75 70 3a 20 63 6f 6d 6d 69  # Cleanup: commi
2830: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
2840: 6e 20 6f 70 65 6e 65 64 20 62 79 20 64 62 32 2e  n opened by db2.
2850: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2860: 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 64 62 32 0a   COMMIT.  } db2.
2870: 7d 20 7b 7d 0a 0a 23 20 4f 70 65 6e 20 61 20 77  } {}..# Open a w
2880: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
2890: 20 75 73 69 6e 67 20 68 61 6e 64 6c 65 20 31 20   using handle 1 
28a0: 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 64  and modify the d
28b0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
28c0: 23 20 54 68 65 6e 20 74 72 79 20 74 6f 20 65 78  # Then try to ex
28d0: 65 63 75 74 65 20 61 20 63 6f 6d 70 69 6c 65 64  ecute a compiled
28e0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
28f0: 61 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ad from the same
2900: 20 0a 23 20 64 61 74 61 62 61 73 65 20 76 69 61   .# database via
2910: 20 68 61 6e 64 6c 65 20 32 20 28 66 61 69 6c 73   handle 2 (fails
2920: 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
2930: 20 6f 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   on sqlite_maste
2940: 72 29 2e 20 41 6c 73 6f 0a 23 20 74 72 79 20 74  r). Also.# try t
2950: 6f 20 63 6f 6d 70 69 6c 65 20 61 20 72 65 61 64  o compile a read
2960: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
2970: 61 62 61 73 65 20 75 73 69 6e 67 20 68 61 6e 64  abase using hand
2980: 6c 65 20 32 20 28 61 6c 73 6f 20 66 61 69 6c 73  le 2 (also fails
2990: 29 2e 0a 23 20 46 69 6e 61 6c 6c 79 2c 20 63 6f  )..# Finally, co
29a0: 6d 70 69 6c 65 20 61 20 72 65 61 64 20 6f 66 20  mpile a read of 
29b0: 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
29c0: 73 65 20 75 73 69 6e 67 20 68 61 6e 64 6c 65 20  se using handle 
29d0: 32 2e 20 54 68 69 73 0a 23 20 73 68 6f 75 6c 64  2. This.# should
29e0: 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 23 0a 69 66   also fail..#.if
29f0: 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64  capable compound
2a00: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61   {.  do_test sha
2a10: 72 65 64 2d 24 61 76 2e 34 2e 34 2e 31 2e 32 20  red-$av.4.4.1.2 
2a20: 7b 0a 20 20 20 20 23 20 53 61 6e 69 74 79 20 63  {.    # Sanity c
2a30: 68 65 63 6b 20 31 3a 20 43 68 65 63 6b 20 74 68  heck 1: Check th
2a40: 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  at the schema is
2a50: 20 77 68 61 74 20 77 65 20 74 68 69 6e 6b 20 69   what we think i
2a60: 74 20 69 73 20 77 68 65 6e 20 76 69 65 77 65 64  t is when viewed
2a70: 0a 20 20 20 20 23 20 76 69 61 20 68 61 6e 64 6c  .    # via handl
2a80: 65 20 31 2e 0a 20 20 20 20 65 78 65 63 73 71 6c  e 1..    execsql
2a90: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
2aa0: 54 41 42 4c 45 20 74 65 73 74 32 2e 67 68 69 28  TABLE test2.ghi(
2ab0: 67 2c 20 68 2c 20 69 29 3b 0a 20 20 20 20 20 20  g, h, i);.      
2ac0: 53 45 4c 45 43 54 20 27 74 65 73 74 2e 64 62 3a  SELECT 'test.db:
2ad0: 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  '||name FROM sql
2ae0: 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 20 20  ite_master .    
2af0: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20    UNION ALL.    
2b00: 20 20 53 45 4c 45 43 54 20 27 74 65 73 74 32 2e    SELECT 'test2.
2b10: 64 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20  db:'||name FROM 
2b20: 74 65 73 74 32 2e 73 71 6c 69 74 65 5f 6d 61 73  test2.sqlite_mas
2b30: 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ter;.    }.  } {
2b40: 74 65 73 74 2e 64 62 3a 61 62 63 20 74 65 73 74  test.db:abc test
2b50: 2e 64 62 3a 64 65 66 20 74 65 73 74 32 2e 64 62  .db:def test2.db
2b60: 3a 67 68 69 7d 0a 20 20 64 6f 5f 74 65 73 74 20  :ghi}.  do_test 
2b70: 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 34 2e 31  shared-$av.4.4.1
2b80: 2e 32 20 7b 0a 20 20 20 20 23 20 53 61 6e 69 74  .2 {.    # Sanit
2b90: 79 20 63 68 65 63 6b 20 32 3a 20 43 68 65 63 6b  y check 2: Check
2ba0: 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61   that the schema
2bb0: 20 69 73 20 77 68 61 74 20 77 65 20 74 68 69 6e   is what we thin
2bc0: 6b 20 69 74 20 69 73 20 77 68 65 6e 20 76 69 65  k it is when vie
2bd0: 77 65 64 0a 20 20 20 20 23 20 76 69 61 20 68 61  wed.    # via ha
2be0: 6e 64 6c 65 20 32 2e 0a 20 20 20 20 65 78 65 63  ndle 2..    exec
2bf0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
2c00: 43 54 20 27 74 65 73 74 32 2e 64 62 3a 27 7c 7c  CT 'test2.db:'||
2c10: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
2c20: 5f 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 55  _master .      U
2c30: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53  NION ALL.      S
2c40: 45 4c 45 43 54 20 27 74 65 73 74 2e 64 62 3a 27  ELECT 'test.db:'
2c50: 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73 74  ||name FROM test
2c60: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a  .sqlite_master;.
2c70: 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 7b 74      } db2.  } {t
2c80: 65 73 74 32 2e 64 62 3a 67 68 69 20 74 65 73 74  est2.db:ghi test
2c90: 2e 64 62 3a 61 62 63 20 74 65 73 74 2e 64 62 3a  .db:abc test.db:
2ca0: 64 65 66 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  def}.}..do_test 
2cb0: 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 34 2e 32  shared-$av.4.4.2
2cc0: 20 7b 0a 20 20 73 65 74 20 3a 3a 44 42 32 20 5b   {.  set ::DB2 [
2cd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69  sqlite3_connecti
2ce0: 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d 0a  on_pointer db2].
2cf0: 20 20 73 65 74 20 73 71 6c 20 7b 53 45 4c 45 43    set sql {SELEC
2d00: 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d 0a 20 20  T * FROM abc}.  
2d10: 73 65 74 20 3a 3a 53 54 4d 54 31 20 5b 73 71 6c  set ::STMT1 [sql
2d20: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a  ite3_prepare $::
2d30: 44 42 32 20 24 73 71 6c 20 2d 31 20 44 55 4d 4d  DB2 $sql -1 DUMM
2d40: 59 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  Y].  execsql {. 
2d50: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52     BEGIN;.    CR
2d60: 45 41 54 45 20 54 41 42 4c 45 20 6a 6b 6c 28 6a  EATE TABLE jkl(j
2d70: 2c 20 6b 2c 20 6c 29 3b 0a 20 20 7d 0a 20 20 73  , k, l);.  }.  s
2d80: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53  qlite3_step $::S
2d90: 54 4d 54 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 45  TMT1.} {SQLITE_E
2da0: 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 73 68  RROR}.do_test sh
2db0: 61 72 65 64 2d 24 61 76 2e 34 2e 34 2e 33 20 7b  ared-$av.4.4.3 {
2dc0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
2dd0: 69 7a 65 20 24 3a 3a 53 54 4d 54 31 0a 7d 20 7b  ize $::STMT1.} {
2de0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64  SQLITE_LOCKED}.d
2df0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
2e00: 76 2e 34 2e 34 2e 34 20 7b 0a 20 20 73 65 74 20  v.4.4.4 {.  set 
2e10: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
2e20: 73 65 74 20 3a 3a 53 54 4d 54 31 20 5b 73 71 6c  set ::STMT1 [sql
2e30: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a  ite3_prepare $::
2e40: 44 42 32 20 24 73 71 6c 20 2d 31 20 44 55 4d 4d  DB2 $sql -1 DUMM
2e50: 59 5d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69  Y].  } msg].  li
2e60: 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31  st $rc $msg.} {1
2e70: 20 7b 28 36 29 20 64 61 74 61 62 61 73 65 20 73   {(6) database s
2e80: 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 3a  chema is locked:
2e90: 20 74 65 73 74 7d 7d 0a 64 6f 5f 74 65 73 74 20   test}}.do_test 
2ea0: 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 34 2e 35  shared-$av.4.4.5
2eb0: 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74   {.  set rc [cat
2ec0: 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 53  ch {.    set ::S
2ed0: 54 4d 54 31 20 5b 73 71 6c 69 74 65 33 5f 70 72  TMT1 [sqlite3_pr
2ee0: 65 70 61 72 65 20 24 3a 3a 44 42 32 20 22 53 45  epare $::DB2 "SE
2ef0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 67 68 69 22  LECT * FROM ghi"
2f00: 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 7d 20 6d   -1 DUMMY].  } m
2f10: 73 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24  sg].  list $rc $
2f20: 6d 73 67 0a 7d 20 7b 31 20 7b 28 36 29 20 64 61  msg.} {1 {(6) da
2f30: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
2f40: 20 6c 6f 63 6b 65 64 3a 20 74 65 73 74 7d 7d 0a   locked: test}}.
2f50: 0a 0a 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f  ..catch {db2 clo
2f60: 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 20 63 6c  se}.catch {db cl
2f70: 6f 73 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose}..#---------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 0a 23 20 54 65 73 74 73 20 73 68 61 72 65 64  -.# Tests shared
2fd0: 2d 35 2e 2a 20 0a 23 0a 66 6f 72 65 61 63 68 20  -5.* .#.foreach 
2fe0: 64 62 20 5b 6c 69 73 74 20 74 65 73 74 2e 64 62  db [list test.db
2ff0: 20 74 65 73 74 31 2e 64 62 20 74 65 73 74 32 2e   test1.db test2.
3000: 64 62 20 74 65 73 74 33 2e 64 62 5d 20 7b 0a 20  db test3.db] {. 
3010: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
3020: 72 63 65 20 24 64 62 20 24 7b 64 62 7d 2d 6a 6f  rce $db ${db}-jo
3030: 75 72 6e 61 6c 0a 7d 0a 64 6f 5f 74 65 73 74 20  urnal.}.do_test 
3040: 73 68 61 72 65 64 2d 24 61 76 2e 35 2e 31 2e 31  shared-$av.5.1.1
3050: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 31   {.  sqlite3 db1
3060: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
3070: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
3080: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41   execsql {.    A
3090: 54 54 41 43 48 20 27 74 65 73 74 31 2e 64 62 27  TTACH 'test1.db'
30a0: 20 41 53 20 74 65 73 74 31 3b 0a 20 20 20 20 41   AS test1;.    A
30b0: 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27  TTACH 'test2.db'
30c0: 20 41 53 20 74 65 73 74 32 3b 0a 20 20 20 20 41   AS test2;.    A
30d0: 54 54 41 43 48 20 27 74 65 73 74 33 2e 64 62 27  TTACH 'test3.db'
30e0: 20 41 53 20 74 65 73 74 33 3b 0a 20 20 7d 20 64   AS test3;.  } d
30f0: 62 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b1.  execsql {. 
3100: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 33     ATTACH 'test3
3110: 2e 64 62 27 20 41 53 20 74 65 73 74 33 3b 0a 20  .db' AS test3;. 
3120: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
3130: 2e 64 62 27 20 41 53 20 74 65 73 74 32 3b 0a 20  .db' AS test2;. 
3140: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 31     ATTACH 'test1
3150: 2e 64 62 27 20 41 53 20 74 65 73 74 31 3b 0a 20  .db' AS test1;. 
3160: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74   } db2.} {}.do_t
3170: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 35  est shared-$av.5
3180: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
3190: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
31a0: 42 4c 45 20 74 65 73 74 31 2e 74 31 28 61 2c 20  BLE test1.t1(a, 
31b0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  b);.    CREATE I
31c0: 4e 44 45 58 20 74 65 73 74 31 2e 69 31 20 4f 4e  NDEX test1.i1 ON
31d0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64   t1(a, b);.  } d
31e0: 62 31 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c  b1.} {}.ifcapabl
31f0: 65 20 76 69 65 77 20 7b 0a 20 20 64 6f 5f 74 65  e view {.  do_te
3200: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 35 2e  st shared-$av.5.
3210: 31 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  1.3 {.    execsq
3220: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
3230: 20 56 49 45 57 20 74 65 73 74 31 2e 76 31 20 41   VIEW test1.v1 A
3240: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
3250: 74 31 3b 0a 20 20 20 20 7d 20 64 62 31 0a 20 20  t1;.    } db1.  
3260: 7d 20 7b 7d 0a 7d 0a 69 66 63 61 70 61 62 6c 65  } {}.}.ifcapable
3270: 20 74 72 69 67 67 65 72 20 7b 0a 20 20 64 6f 5f   trigger {.  do_
3280: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
3290: 35 2e 31 2e 34 20 7b 0a 20 20 20 20 65 78 65 63  5.1.4 {.    exec
32a0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
32b0: 54 45 20 54 52 49 47 47 45 52 20 74 65 73 74 31  TE TRIGGER test1
32c0: 2e 74 72 69 67 31 20 41 46 54 45 52 20 49 4e 53  .trig1 AFTER INS
32d0: 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a  ERT ON t1 BEGIN.
32e0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
32f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 6e 65  NTO t1 VALUES(ne
3300: 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20  w.a, new.b);.   
3310: 20 20 20 45 4e 44 3b 0a 20 20 20 20 7d 20 64 62     END;.    } db
3320: 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 64 6f 5f 74 65  1.  } {}.}.do_te
3330: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 35 2e  st shared-$av.5.
3340: 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
3350: 7b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58  {.    DROP INDEX
3360: 20 69 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b   i1;.  } db2.} {
3370: 7d 0a 69 66 63 61 70 61 62 6c 65 20 76 69 65 77  }.ifcapable view
3380: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61   {.  do_test sha
3390: 72 65 64 2d 24 61 76 2e 35 2e 31 2e 36 20 7b 0a  red-$av.5.1.6 {.
33a0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
33b0: 20 20 20 20 44 52 4f 50 20 56 49 45 57 20 76 31      DROP VIEW v1
33c0: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20  ;.    } db2.  } 
33d0: 7b 7d 0a 7d 0a 69 66 63 61 70 61 62 6c 65 20 74  {}.}.ifcapable t
33e0: 72 69 67 67 65 72 20 7b 0a 20 20 64 6f 5f 74 65  rigger {.  do_te
33f0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 35 2e  st shared-$av.5.
3400: 31 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71  1.7 {.    execsq
3410: 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  l {.      DROP T
3420: 52 49 47 47 45 52 20 74 72 69 67 31 3b 0a 20 20  RIGGER trig1;.  
3430: 20 20 7d 20 64 62 32 0a 20 20 7d 20 7b 7d 0a 7d    } db2.  } {}.}
3440: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
3450: 24 61 76 2e 35 2e 31 2e 38 20 7b 0a 20 20 65 78  $av.5.1.8 {.  ex
3460: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
3470: 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d 20 64   TABLE t1;.  } d
3480: 62 32 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c  b2.} {}.ifcapabl
3490: 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 64  e compound {.  d
34a0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
34b0: 76 2e 35 2e 31 2e 39 20 7b 0a 20 20 20 20 65 78  v.5.1.9 {.    ex
34c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
34d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
34e0: 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20  te_master UNION 
34f0: 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ALL SELECT * FRO
3500: 4d 20 74 65 73 74 31 2e 73 71 6c 69 74 65 5f 6d  M test1.sqlite_m
3510: 61 73 74 65 72 0a 20 20 20 20 7d 20 64 62 31 0a  aster.    } db1.
3520: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    } {}.}..#-----
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 73 68  -----.# Tests sh
3580: 61 72 65 64 2d 36 2e 2a 20 74 65 73 74 20 74 68  ared-6.* test th
3590: 61 74 20 61 20 71 75 65 72 79 20 6f 62 74 61 69  at a query obtai
35a0: 6e 73 20 61 6c 6c 20 74 68 65 20 72 65 61 64 2d  ns all the read-
35b0: 6c 6f 63 6b 73 20 69 74 20 6e 65 65 64 73 0a 23  locks it needs.#
35c0: 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
35d0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
35e0: 65 20 71 75 65 72 79 2e 20 54 68 69 73 20 6d 65  e query. This me
35f0: 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
3600: 73 20 6e 6f 20 63 68 61 6e 63 65 0a 23 20 73 6f  s no chance.# so
3610: 6d 65 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20  me rows of data 
3620: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
3630: 20 62 65 66 6f 72 65 20 61 20 6c 6f 63 6b 20 66   before a lock f
3640: 61 69 6c 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  ails and SQLITE_
3650: 4c 4f 43 4b 0a 23 20 69 73 20 72 65 74 75 72 6e  LOCK.# is return
3660: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 68  ed..#.do_test sh
3670: 61 72 65 64 2d 24 61 76 2e 36 2e 31 2e 31 20 7b  ared-$av.6.1.1 {
3680: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3690: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
36a0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
36b0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
36c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
36d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
36e0: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
36f0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
3700: 20 34 29 3b 0a 20 20 7d 20 64 62 31 0a 7d 20 7b   4);.  } db1.} {
3710: 7d 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70  }.ifcapable comp
3720: 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ound {.  do_test
3730: 20 73 68 61 72 65 64 2d 24 61 76 2e 36 2e 31 2e   shared-$av.6.1.
3740: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
3750: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
3760: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
3770: 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  LL SELECT * FROM
3780: 20 74 32 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20   t2;.    } db2. 
3790: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 7d 0a 64   } {1 2 3 4}.}.d
37a0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
37b0: 76 2e 36 2e 31 2e 33 20 7b 0a 20 20 23 20 45 73  v.6.1.3 {.  # Es
37c0: 74 61 62 6c 69 73 68 20 61 20 77 72 69 74 65 20  tablish a write 
37d0: 6c 6f 63 6b 20 6f 6e 20 74 61 62 6c 65 20 74 32  lock on table t2
37e0: 20 76 69 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   via connection 
37f0: 64 62 32 2e 20 54 68 65 6e 20 6d 61 6b 65 20 61  db2. Then make a
3800: 20 0a 20 20 23 20 55 4e 49 4f 4e 20 61 6c 6c 20   .  # UNION all 
3810: 71 75 65 72 79 20 75 73 69 6e 67 20 63 6f 6e 6e  query using conn
3820: 65 63 74 69 6f 6e 20 64 62 31 20 74 68 61 74 20  ection db1 that 
3830: 66 69 72 73 74 20 61 63 63 65 73 73 65 73 20 74  first accesses t
3840: 31 2c 20 66 6f 6c 6c 6f 77 65 64 20 0a 20 20 23  1, followed .  #
3850: 20 62 79 20 74 32 2e 20 49 66 20 74 68 65 20 6c   by t2. If the l
3860: 6f 63 6b 73 20 61 72 65 20 67 72 61 62 62 65 64  ocks are grabbed
3870: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
3880: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 28   the statement (
3890: 61 73 20 0a 20 20 23 20 74 68 65 79 20 73 68 6f  as .  # they sho
38a0: 75 6c 64 20 62 65 29 2c 20 6e 6f 20 72 6f 77 73  uld be), no rows
38b0: 20 61 72 65 20 72 65 74 75 72 6e 65 64 2e 20 49   are returned. I
38c0: 66 20 28 61 73 20 77 61 73 20 70 72 65 76 69 6f  f (as was previo
38d0: 75 73 6c 79 20 74 68 65 20 63 61 73 65 29 0a 20  usly the case). 
38e0: 20 23 20 74 68 65 79 20 61 72 65 20 67 72 61 62   # they are grab
38f0: 62 65 64 20 61 73 20 74 68 65 20 74 61 62 6c 65  bed as the table
3900: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 2c 20  s are accessed, 
3910: 74 68 65 20 74 31 20 72 6f 77 73 20 77 69 6c 6c  the t1 rows will
3920: 20 62 65 20 0a 20 20 23 20 72 65 74 75 72 6e 65   be .  # returne
3930: 64 20 62 65 66 6f 72 65 20 74 68 65 20 71 75 65  d before the que
3940: 72 79 20 66 61 69 6c 73 2e 0a 20 20 23 0a 20 20  ry fails..  #.  
3950: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
3960: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
3970: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 35  INTO t2 VALUES(5
3980: 2c 20 36 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20  , 6);.  } db2.  
3990: 73 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20  set ret [list]. 
39a0: 20 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62 31   catch {.    db1
39b0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20   eval {SELECT * 
39c0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c  FROM t1 UNION AL
39d0: 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  L SELECT * FROM 
39e0: 74 32 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70  t2} {.      lapp
39f0: 65 6e 64 20 72 65 74 20 24 61 20 24 62 0a 20 20  end ret $a $b.  
3a00: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 72 65    }.  }.  set re
3a10: 74 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73  t.} {}.do_test s
3a20: 68 61 72 65 64 2d 24 61 76 2e 36 2e 31 2e 34 20  hared-$av.6.1.4 
3a30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3a40: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 42 45    COMMIT;.    BE
3a50: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
3a60: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
3a70: 2c 20 38 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20  , 8);.  } db2.  
3a80: 73 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20  set ret [list]. 
3a90: 20 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62 31   catch {.    db1
3aa0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45   eval {.      SE
3ab0: 4c 45 43 54 20 28 43 41 53 45 20 57 48 45 4e 20  LECT (CASE WHEN 
3ac0: 61 3e 34 20 54 48 45 4e 20 28 53 45 4c 45 43 54  a>4 THEN (SELECT
3ad0: 20 61 20 46 52 4f 4d 20 74 31 29 20 45 4c 53 45   a FROM t1) ELSE
3ae0: 20 30 20 45 4e 44 29 20 41 53 20 64 20 46 52 4f   0 END) AS d FRO
3af0: 4d 20 74 32 3b 0a 20 20 20 20 7d 20 7b 0a 20 20  M t2;.    } {.  
3b00: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20      lappend ret 
3b10: 24 64 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  $d.    }.  }.  s
3b20: 65 74 20 72 65 74 0a 7d 20 7b 7d 0a 0a 63 61 74  et ret.} {}..cat
3b30: 63 68 20 7b 64 62 31 20 63 6c 6f 73 65 7d 0a 63  ch {db1 close}.c
3b40: 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d  atch {db2 close}
3b50: 0a 66 6f 72 65 61 63 68 20 66 20 5b 6c 69 73 74  .foreach f [list
3b60: 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64   test.db test2.d
3b70: 62 5d 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65  b] {.  file dele
3b80: 74 65 20 2d 66 6f 72 63 65 20 24 66 20 24 7b 66  te -force $f ${f
3b90: 7d 2d 6a 6f 75 72 6e 61 6c 0a 7d 0a 0a 23 2d 2d  }-journal.}..#--
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73  --------.# Tests
3bf0: 20 73 68 61 72 65 64 2d 37 2e 2a 20 74 65 73 74   shared-7.* test
3c00: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 6f 65   auto-vacuum doe
3c10: 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65  s not invalidate
3c20: 20 63 75 72 73 6f 72 73 20 66 72 6f 6d 0a 23 20   cursors from.# 
3c30: 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
3c40: 68 65 20 75 73 65 72 73 20 77 68 65 6e 20 69 74  he users when it
3c50: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 74 68 65   reorganizes the
3c60: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 0a 23 20   database on .# 
3c70: 43 4f 4d 4d 49 54 2e 0a 23 0a 64 6f 5f 74 65 73  COMMIT..#.do_tes
3c80: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 37 2e 31  t shared-$av.7.1
3c90: 20 7b 0a 20 20 23 20 54 68 69 73 20 74 65 73 74   {.  # This test
3ca0: 20 63 61 73 65 20 73 65 74 73 20 75 70 20 61 20   case sets up a 
3cb0: 74 65 73 74 20 64 61 74 61 62 61 73 65 20 69 6e  test database in
3cc0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
3cd0: 65 20 63 6f 6e 73 69 73 74 69 6e 67 20 0a 20 20  e consisting .  
3ce0: 23 20 6f 66 20 74 77 6f 20 74 61 62 6c 65 73 2c  # of two tables,
3cf0: 20 74 31 20 61 6e 64 20 74 32 2e 20 42 6f 74 68   t1 and t2. Both
3d00: 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 69   have a single i
3d10: 6e 64 65 78 2e 20 54 61 62 6c 65 20 74 31 20 69  ndex. Table t1 i
3d20: 73 20 0a 20 20 23 20 70 6f 70 75 6c 61 74 65 64  s .  # populated
3d30: 20 66 69 72 73 74 20 28 73 6f 20 63 6f 6e 73 69   first (so consi
3d40: 73 74 73 20 6f 66 20 70 61 67 65 73 20 74 6f 77  sts of pages tow
3d50: 61 72 64 20 74 68 65 20 73 74 61 72 74 20 6f 66  ard the start of
3d60: 20 74 68 65 20 64 62 20 66 69 6c 65 29 2c 20 0a   the db file), .
3d70: 20 20 23 20 74 32 20 73 65 63 6f 6e 64 20 28 70    # t2 second (p
3d80: 61 67 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ages toward the 
3d90: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 29  end of the file)
3da0: 2e 20 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  . .  sqlite3 db 
3db0: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
3dc0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
3dd0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
3de0: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
3df0: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
3e00: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
3e10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3e20: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
3e30: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63  );.  }.  set ::c
3e40: 6f 6e 74 65 6e 74 73 20 7b 7d 0a 20 20 66 6f 72  ontents {}.  for
3e50: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
3e60: 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b   100} {incr i} {
3e70: 0a 20 20 20 20 73 65 74 20 61 20 5b 73 74 72 69  .    set a [stri
3e80: 6e 67 20 72 65 70 65 61 74 20 22 24 69 20 22 20  ng repeat "$i " 
3e90: 32 30 5d 0a 20 20 20 20 73 65 74 20 62 20 5b 73  20].    set b [s
3ea0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 24 69  tring repeat "$i
3eb0: 20 22 20 32 30 5d 0a 20 20 20 20 64 62 20 65 76   " 20].    db ev
3ec0: 61 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  al {.      INSER
3ed0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3ee0: 28 3a 61 2c 20 3a 62 29 3b 0a 20 20 20 20 7d 0a  (:a, :b);.    }.
3ef0: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 63 6f      lappend ::co
3f00: 6e 74 65 6e 74 73 20 5b 6c 69 73 74 20 5b 65 78  ntents [list [ex
3f10: 70 72 20 24 69 2b 31 5d 20 24 61 20 24 62 5d 0a  pr $i+1] $a $b].
3f20: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
3f30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3f40: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3f50: 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   t1;.    COMMIT;
3f60: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
3f70: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 37 2e 32  t shared-$av.7.2
3f80: 20 7b 0a 20 20 23 20 54 68 69 73 20 74 65 73 74   {.  # This test
3f90: 20 63 61 73 65 20 64 65 6c 65 74 65 73 20 74 68   case deletes th
3fa0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 61  e contents of ta
3fb0: 62 6c 65 20 74 31 20 28 74 68 65 20 6f 6e 65 20  ble t1 (the one 
3fc0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
3fd0: 20 20 23 20 74 68 65 20 66 69 6c 65 29 20 77 68    # the file) wh
3fe0: 69 6c 65 20 6d 61 6e 79 20 63 75 72 73 6f 72 73  ile many cursors
3ff0: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 61 62   are open on tab
4000: 6c 65 20 74 32 20 61 6e 64 20 69 74 27 73 20 69  le t2 and it's i
4010: 6e 64 65 78 2e 20 41 6c 6c 20 6f 66 0a 20 20 23  ndex. All of.  #
4020: 20 74 68 65 20 6e 6f 6e 2d 72 6f 6f 74 20 70 61   the non-root pa
4030: 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 6f 76 65  ges will be move
4040: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74  d from the end t
4050: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
4060: 68 65 20 66 69 6c 65 0a 20 20 23 20 77 68 65 6e  he file.  # when
4070: 20 74 68 65 20 44 45 4c 45 54 45 20 69 73 20 63   the DELETE is c
4080: 6f 6d 6d 69 74 74 65 64 20 2d 20 74 68 69 73 20  ommitted - this 
4090: 74 65 73 74 20 76 65 72 69 66 69 65 73 20 74 68  test verifies th
40a0: 61 74 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  at moving the pa
40b0: 67 65 73 0a 20 20 23 20 64 6f 65 73 20 6e 6f 74  ges.  # does not
40c0: 20 64 69 73 74 75 72 62 20 74 68 65 20 6f 70 65   disturb the ope
40d0: 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 23 0a 0a  n cursors..  #..
40e0: 20 20 70 72 6f 63 20 6c 6f 63 6b 72 6f 77 20 7b    proc lockrow {
40f0: 64 62 20 74 62 6c 20 6f 69 64 73 20 62 6f 64 79  db tbl oids body
4100: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 74 20  } {.    set ret 
4110: 5b 6c 69 73 74 5d 0a 20 20 20 20 64 62 20 65 76  [list].    db ev
4120: 61 6c 20 22 53 45 4c 45 43 54 20 6f 69 64 20 41  al "SELECT oid A
4130: 53 20 69 2c 20 61 2c 20 62 20 46 52 4f 4d 20 24  S i, a, b FROM $
4140: 74 62 6c 20 4f 52 44 45 52 20 42 59 20 61 22 20  tbl ORDER BY a" 
4150: 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 69 3d 3d  {.      if {$i==
4160: 5b 6c 69 6e 64 65 78 20 24 6f 69 64 73 20 30 5d  [lindex $oids 0]
4170: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
4180: 6e 6f 69 64 73 20 5b 6c 72 61 6e 67 65 20 24 6f  noids [lrange $o
4190: 69 64 73 20 31 20 65 6e 64 5d 0a 20 20 20 20 20  ids 1 end].     
41a0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
41b0: 24 6e 6f 69 64 73 5d 3d 3d 30 7d 20 7b 0a 20 20  $noids]==0} {.  
41c0: 20 20 20 20 20 20 20 20 73 65 74 20 73 75 62 72          set subr
41d0: 65 74 20 5b 65 76 61 6c 20 24 62 6f 64 79 5d 0a  et [eval $body].
41e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
41f0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
4200: 75 62 72 65 74 20 5b 6c 6f 63 6b 72 6f 77 20 24  ubret [lockrow $
4210: 64 62 20 24 74 62 6c 20 24 6e 6f 69 64 73 20 24  db $tbl $noids $
4220: 62 6f 64 79 5d 0a 20 20 20 20 20 20 20 20 7d 0a  body].        }.
4230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 61        }.      la
4240: 70 70 65 6e 64 20 72 65 74 20 5b 6c 69 73 74 20  ppend ret [list 
4250: 24 69 20 24 61 20 24 62 5d 0a 20 20 20 20 7d 0a  $i $a $b].    }.
4260: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e 73      return [lins
4270: 65 72 74 20 24 73 75 62 72 65 74 20 30 20 24 72  ert $subret 0 $r
4280: 65 74 5d 0a 20 20 7d 0a 20 20 70 72 6f 63 20 6c  et].  }.  proc l
4290: 6f 63 6b 74 62 6c 72 6f 77 73 20 7b 64 62 20 74  ocktblrows {db t
42a0: 62 6c 20 62 6f 64 79 7d 20 7b 0a 20 20 20 20 73  bl body} {.    s
42b0: 65 74 20 6f 69 64 73 20 5b 64 62 20 65 76 61 6c  et oids [db eval
42c0: 20 22 53 45 4c 45 43 54 20 6f 69 64 20 46 52 4f   "SELECT oid FRO
42d0: 4d 20 24 74 62 6c 22 5d 0a 20 20 20 20 6c 6f 63  M $tbl"].    loc
42e0: 6b 72 6f 77 20 24 64 62 20 24 74 62 6c 20 24 6f  krow $db $tbl $o
42f0: 69 64 73 20 24 62 6f 64 79 0a 20 20 7d 0a 0a 20  ids $body.  }.. 
4300: 20 73 65 74 20 73 63 61 6e 73 20 5b 6c 6f 63 6b   set scans [lock
4310: 74 62 6c 72 6f 77 73 20 64 62 20 74 32 20 7b 0a  tblrows db t2 {.
4320: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4330: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
4340: 74 31 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20  t1;.    } db2.  
4350: 7d 5d 0a 20 20 73 65 74 20 65 72 72 6f 72 20 30  }].  set error 0
4360: 0a 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20  ..  # Test that 
4370: 65 61 63 68 20 53 45 4c 45 43 54 20 71 75 65 72  each SELECT quer
4380: 79 20 72 65 74 75 72 6e 65 64 20 74 68 65 20 65  y returned the e
4390: 78 70 65 63 74 65 64 20 63 6f 6e 74 65 6e 74 73  xpected contents
43a0: 20 6f 66 20 74 32 2e 0a 20 20 66 6f 72 65 61 63   of t2..  foreac
43b0: 68 20 73 20 24 73 63 61 6e 73 20 7b 0a 20 20 20  h s $scans {.   
43c0: 20 69 66 20 7b 5b 6c 73 6f 72 74 20 2d 69 6e 74   if {[lsort -int
43d0: 65 67 65 72 20 2d 69 6e 64 65 78 20 30 20 24 73  eger -index 0 $s
43e0: 5d 21 3d 24 3a 3a 63 6f 6e 74 65 6e 74 73 7d 20  ]!=$::contents} 
43f0: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 72 72 6f  {.      set erro
4400: 72 20 31 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r 1.    }.  }.  
4410: 73 65 74 20 65 72 72 6f 72 0a 7d 20 7b 30 7d 0a  set error.} {0}.
4420: 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65  .catch {db close
4430: 7d 0a 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f  }.catch {db2 clo
4440: 73 65 7d 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  se}.unset -nocom
4450: 70 6c 61 69 6e 20 63 6f 6e 74 65 6e 74 73 0a 0a  plain contents..
4460: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
44b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
44c0: 73 20 74 72 79 20 74 6f 20 74 72 69 63 6b 20 74  s try to trick t
44d0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
44e0: 63 6f 64 65 20 69 6e 74 6f 20 61 73 73 75 6d 69  code into assumi
44f0: 6e 67 0a 23 20 74 68 65 20 77 72 6f 6e 67 20 65  ng.# the wrong e
4500: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 61 20 64 61  ncoding for a da
4510: 74 61 62 61 73 65 2e 0a 23 0a 66 69 6c 65 20 64  tabase..#.file d
4520: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
4530: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
4540: 72 6e 61 6c 0a 69 66 63 61 70 61 62 6c 65 20 75  rnal.ifcapable u
4550: 74 66 31 36 20 7b 0a 20 20 64 6f 5f 74 65 73 74  tf16 {.  do_test
4560: 20 73 68 61 72 65 64 2d 24 61 76 2e 38 2e 31 2e   shared-$av.8.1.
4570: 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  1 {.    sqlite3 
4580: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
4590: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
45a0: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
45b0: 20 27 55 54 46 2d 31 36 27 3b 0a 20 20 20 20 20   'UTF-16';.     
45c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
45d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
45e0: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
45f0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
4600: 38 2e 31 2e 32 20 7b 0a 20 20 20 20 73 74 72 69  8.1.2 {.    stri
4610: 6e 67 20 72 61 6e 67 65 20 5b 65 78 65 63 73 71  ng range [execsq
4620: 6c 20 7b 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  l {PRAGMA encodi
4630: 6e 67 3b 7d 5d 20 30 20 65 6e 64 2d 32 0a 20 20  ng;}] 0 end-2.  
4640: 7d 20 7b 55 54 46 2d 31 36 7d 0a 20 20 64 6f 5f  } {UTF-16}.  do_
4650: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
4660: 38 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69  8.1.3 {.    sqli
4670: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
4680: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4690: 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64      PRAGMA encod
46a0: 69 6e 67 20 3d 20 27 55 54 46 2d 38 27 3b 0a 20  ing = 'UTF-8';. 
46b0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
46c0: 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a  E abc(a, b, c);.
46d0: 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 7b 7d      } db2.  } {}
46e0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
46f0: 64 2d 24 61 76 2e 38 2e 31 2e 34 20 7b 0a 20 20  d-$av.8.1.4 {.  
4700: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4710: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4720: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
4730: 20 20 20 7d 0a 20 20 7d 20 22 74 61 62 6c 65 20     }.  } "table 
4740: 61 62 63 20 61 62 63 20 5b 65 78 70 72 20 24 41  abc abc [expr $A
4750: 55 54 4f 56 41 43 55 55 4d 3f 33 3a 32 5d 20 7b  UTOVACUUM?3:2] {
4760: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
4770: 28 61 2c 20 62 2c 20 63 29 7d 22 0a 20 20 64 6f  (a, b, c)}".  do
4780: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
4790: 2e 38 2e 31 2e 35 20 7b 0a 20 20 20 20 64 62 32  .8.1.5 {.    db2
47a0: 20 63 6c 6f 73 65 0a 20 20 20 20 65 78 65 63 73   close.    execs
47b0: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
47c0: 41 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20  A encoding;.    
47d0: 7d 0a 20 20 7d 20 7b 55 54 46 2d 38 7d 0a 20 20  }.  } {UTF-8}.  
47e0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
47f0: 63 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74  ce test2.db test
4800: 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 64  2.db-journal.  d
4810: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
4820: 76 2e 38 2e 32 2e 31 20 7b 0a 20 20 20 20 65 78  v.8.2.1 {.    ex
4830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54  ecsql {.      AT
4840: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
4850: 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 53 45  AS aux;.      SE
4860: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 75 78 2e  LECT * FROM aux.
4870: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
4880: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
4890: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
48a0: 2e 38 2e 32 2e 32 20 7b 0a 20 20 20 20 73 71 6c  .8.2.2 {.    sql
48b0: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
48c0: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
48d0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63        PRAGMA enc
48e0: 6f 64 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27  oding = 'UTF-16'
48f0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
4900: 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66  ABLE def(d, e, f
4910: 29 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 20  );.    } db2.   
4920: 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 65   string range [e
4930: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 65  xecsql {PRAGMA e
4940: 6e 63 6f 64 69 6e 67 3b 7d 20 64 62 32 5d 20 30  ncoding;} db2] 0
4950: 20 65 6e 64 2d 32 0a 20 20 7d 20 7b 55 54 46 2d   end-2.  } {UTF-
4960: 31 36 7d 0a 0a 23 20 42 75 67 20 23 32 35 34 37  16}..# Bug #2547
4970: 20 69 73 20 63 61 75 73 69 6e 67 20 74 68 69 73   is causing this
4980: 20 74 6f 20 66 61 69 6c 2e 0a 69 66 20 30 20 7b   to fail..if 0 {
4990: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
49a0: 64 2d 24 61 76 2e 38 2e 32 2e 33 20 7b 0a 20 20  d-$av.8.2.3 {.  
49b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
49c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
49d0: 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74   aux.sqlite_mast
49e0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  er;.    }.  } {1
49f0: 20 7b 61 74 74 61 63 68 65 64 20 64 61 74 61 62   {attached datab
4a00: 61 73 65 73 20 6d 75 73 74 20 75 73 65 20 74 68  ases must use th
4a10: 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e 63 6f  e same text enco
4a20: 64 69 6e 67 20 61 73 20 6d 61 69 6e 20 64 61 74  ding as main dat
4a30: 61 62 61 73 65 7d 7d 0a 7d 0a 7d 0a 0a 63 61 74  abase}}.}.}..cat
4a40: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 63 61  ch {db close}.ca
4a50: 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a  tch {db2 close}.
4a60: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
4a70: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32  ce test.db test2
4a80: 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .db..#----------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
4ae0: 67 20 74 65 73 74 73 20 2d 20 73 68 61 72 65 64  g tests - shared
4af0: 2d 39 2e 2a 20 2d 20 74 65 73 74 20 69 6e 74 65  -9.* - test inte
4b00: 72 61 63 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  ractions between
4b10: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 0a 23   TEMP triggers.#
4b20: 20 61 6e 64 20 73 68 61 72 65 64 2d 73 63 68 65   and shared-sche
4b30: 6d 61 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  mas..#.ifcapable
4b40: 20 74 72 69 67 67 65 72 26 26 74 65 6d 70 64 62   trigger&&tempdb
4b50: 20 7b 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61 72   {..do_test shar
4b60: 65 64 2d 24 61 76 2e 39 2e 31 20 7b 0a 20 20 73  ed-$av.9.1 {.  s
4b70: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
4b80: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  b.  sqlite3 db2 
4b90: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
4ba0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
4bb0: 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63  ABLE abc(a, b, c
4bc0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
4bd0: 42 4c 45 20 61 62 63 5f 6d 69 72 72 6f 72 28 61  BLE abc_mirror(a
4be0: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
4bf0: 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52  ATE TEMP TRIGGER
4c00: 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f   BEFORE INSERT O
4c10: 4e 20 61 62 63 20 42 45 47 49 4e 20 0a 20 20 20  N abc BEGIN .   
4c20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4c30: 62 63 5f 6d 69 72 72 6f 72 28 61 2c 20 62 2c 20  bc_mirror(a, b, 
4c40: 63 29 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c  c) VALUES(new.a,
4c50: 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a   new.b, new.c);.
4c60: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 49 4e 53      END;.    INS
4c70: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
4c80: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
4c90: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4ca0: 61 62 63 5f 6d 69 72 72 6f 72 3b 0a 20 20 7d 0a  abc_mirror;.  }.
4cb0: 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73  } {1 2 3}.do_tes
4cc0: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 39 2e 32  t shared-$av.9.2
4cd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4ce0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4cf0: 62 63 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  bc VALUES(4, 5, 
4d00: 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  6);.    SELECT *
4d10: 20 46 52 4f 4d 20 61 62 63 5f 6d 69 72 72 6f 72   FROM abc_mirror
4d20: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32  ;.  } db2.} {1 2
4d30: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72   3}.do_test shar
4d40: 65 64 2d 24 61 76 2e 39 2e 33 20 7b 0a 20 20 64  ed-$av.9.3 {.  d
4d50: 62 20 63 6c 6f 73 65 0a 20 20 64 62 32 20 63 6c  b close.  db2 cl
4d60: 6f 73 65 0a 7d 20 7b 7d 0a 0a 7d 20 3b 20 23 20  ose.} {}..} ; # 
4d70: 45 6e 64 20 73 68 61 72 65 64 2d 39 2e 2a 0a 0a  End shared-9.*..
4d80: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
4d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
4dd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
4de0: 74 73 20 2d 20 73 68 61 72 65 64 2d 31 30 2e 2a  ts - shared-10.*
4df0: 20 2d 20 74 65 73 74 20 74 68 61 74 20 74 68 65   - test that the
4e00: 20 6c 69 62 72 61 72 79 20 62 65 68 61 76 65 73   library behaves
4e10: 20 0a 23 20 63 6f 72 72 65 63 74 6c 79 20 77 68   .# correctly wh
4e20: 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  en a connection 
4e30: 74 6f 20 61 20 73 68 61 72 65 64 2d 63 61 63 68  to a shared-cach
4e40: 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 23 0a  e is closed. .#.
4e50: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
4e60: 61 76 2e 31 30 2e 31 20 7b 0a 20 20 23 20 43 72  av.10.1 {.  # Cr
4e70: 65 61 74 65 20 61 20 73 6d 61 6c 6c 20 73 61 6d  eate a small sam
4e80: 70 6c 65 20 64 61 74 61 62 61 73 65 20 77 69 74  ple database wit
4e90: 68 20 74 77 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e  h two connection
4ea0: 73 20 74 6f 20 69 74 20 28 64 62 20 61 6e 64 20  s to it (db and 
4eb0: 64 62 32 29 2e 0a 20 20 66 69 6c 65 20 64 65 6c  db2)..  file del
4ec0: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
4ed0: 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  db.  sqlite3 db 
4ee0: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
4ef0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
4f00: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4f10: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 28 61  REATE TABLE ab(a
4f20: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
4f30: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
4f40: 4c 45 20 64 65 28 64 20 50 52 49 4d 41 52 59 20  LE de(d PRIMARY 
4f50: 4b 45 59 2c 20 65 29 3b 0a 20 20 20 20 49 4e 53  KEY, e);.    INS
4f60: 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55  ERT INTO ab VALU
4f70: 45 53 28 27 43 68 69 61 6e 67 20 4d 61 69 27 2c  ES('Chiang Mai',
4f80: 20 31 30 30 30 30 30 29 3b 0a 20 20 20 20 49 4e   100000);.    IN
4f90: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c  SERT INTO ab VAL
4fa0: 55 45 53 28 27 42 61 6e 67 6b 6f 6b 27 2c 20 38  UES('Bangkok', 8
4fb0: 30 30 30 30 30 30 29 3b 0a 20 20 20 20 49 4e 53  000000);.    INS
4fc0: 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41 4c 55  ERT INTO de VALU
4fd0: 45 53 28 27 55 62 6f 6e 27 2c 20 31 32 30 30 30  ES('Ubon', 12000
4fe0: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
4ff0: 4e 54 4f 20 64 65 20 56 41 4c 55 45 53 28 27 4b  NTO de VALUES('K
5000: 68 6f 6e 20 4b 61 65 6e 27 2c 20 32 30 30 30 30  hon Kaen', 20000
5010: 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  0);.  }.} {}.do_
5020: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
5030: 31 30 2e 32 20 7b 0a 20 20 23 20 4f 70 65 6e 20  10.2 {.  # Open 
5040: 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
5050: 6f 6e 20 77 69 74 68 20 74 68 65 20 66 69 72 73  on with the firs
5060: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 61 20  t connection, a 
5070: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
5080: 6e 0a 20 20 23 20 77 69 74 68 20 74 68 65 20 73  n.  # with the s
5090: 65 63 6f 6e 64 2e 0a 20 20 65 78 65 63 73 71 6c  econd..  execsql
50a0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
50b0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
50c0: 61 62 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ab;.  }.  execsq
50d0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
50e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
50f0: 65 20 56 41 4c 55 45 53 28 27 50 61 74 61 79 61  e VALUES('Pataya
5100: 27 2c 20 33 30 30 30 30 29 3b 0a 20 20 7d 20 64  ', 30000);.  } d
5110: 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  b2.} {}.do_test 
5120: 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e 33 20  shared-$av.10.3 
5130: 7b 0a 20 20 23 20 41 6e 20 65 78 74 65 72 6e 61  {.  # An externa
5140: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f  l connection sho
5150: 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f 20 72  uld be able to r
5160: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
5170: 2c 20 62 75 74 20 6e 6f 74 0a 20 20 23 20 70 72  , but not.  # pr
5180: 65 70 61 72 65 20 61 20 77 72 69 74 65 20 6f 70  epare a write op
5190: 65 72 61 74 69 6f 6e 2e 0a 20 20 69 66 20 7b 24  eration..  if {$
51a0: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  ::tcl_platform(p
51b0: 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22  latform)=="unix"
51c0: 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  } {.    sqlite3 
51d0: 64 62 33 20 2e 2f 74 65 73 74 2e 64 62 0a 20 20  db3 ./test.db.  
51e0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c  } else {.    sql
51f0: 69 74 65 33 20 64 62 33 20 54 45 53 54 2e 44 42  ite3 db3 TEST.DB
5200: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
5210: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
5220: 4f 4d 20 61 62 3b 0a 20 20 7d 20 64 62 33 0a 20  OM ab;.  } db3. 
5230: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
5240: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
5250: 54 20 49 4e 54 4f 20 64 65 20 56 41 4c 55 45 53  T INTO de VALUES
5260: 28 27 50 61 74 61 79 61 27 2c 20 33 30 30 30 30  ('Pataya', 30000
5270: 29 3b 0a 20 20 7d 20 64 62 33 0a 7d 20 7b 31 20  );.  } db3.} {1 
5280: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
5290: 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  ked}}.do_test sh
52a0: 61 72 65 64 2d 24 61 76 2e 31 30 2e 34 20 7b 0a  ared-$av.10.4 {.
52b0: 20 20 23 20 43 6c 6f 73 65 20 74 68 65 20 63 6f    # Close the co
52c0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
52d0: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
52e0: 69 6f 6e 20 6f 70 65 6e 0a 20 20 64 62 32 20 63  ion open.  db2 c
52f0: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  lose.} {}.do_tes
5300: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e  t shared-$av.10.
5310: 35 20 7b 0a 20 20 23 20 54 65 73 74 20 74 68 61  5 {.  # Test tha
5320: 74 20 74 68 65 20 64 62 32 20 74 72 61 6e 73 61  t the db2 transa
5330: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61  ction has been a
5340: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 6f 6c  utomatically rol
5350: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 23 20 49 66  led back..  # If
5360: 20 69 74 20 68 61 73 20 6e 6f 74 20 74 68 65 20   it has not the 
5370: 28 27 50 61 74 61 79 61 27 2c 20 33 30 30 30 30  ('Pataya', 30000
5380: 29 20 65 6e 74 72 79 20 77 69 6c 6c 20 73 74 69  ) entry will sti
5390: 6c 6c 20 62 65 20 69 6e 20 74 68 65 20 74 61 62  ll be in the tab
53a0: 6c 65 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  le..  execsql {.
53b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
53c0: 4d 20 64 65 3b 0a 20 20 7d 0a 7d 20 7b 55 62 6f  M de;.  }.} {Ubo
53d0: 6e 20 31 32 30 30 30 30 20 7b 4b 68 6f 6e 20 4b  n 120000 {Khon K
53e0: 61 65 6e 7d 20 32 30 30 30 30 30 7d 0a 64 6f 5f  aen} 200000}.do_
53f0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
5400: 31 30 2e 35 20 7b 0a 20 20 23 20 43 6c 6f 73 69  10.5 {.  # Closi
5410: 6e 67 20 64 62 32 20 73 68 6f 75 6c 64 20 68 61  ng db2 should ha
5420: 76 65 20 64 72 6f 70 70 65 64 20 74 68 65 20 73  ve dropped the s
5430: 68 61 72 65 64 2d 63 61 63 68 65 20 62 61 63 6b  hared-cache back
5440: 20 74 6f 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2e   to a read-lock.
5450: 0a 20 20 23 20 53 6f 20 64 62 33 20 73 68 6f 75  .  # So db3 shou
5460: 6c 64 20 62 65 20 61 62 6c 65 20 74 6f 20 70 72  ld be able to pr
5470: 65 70 61 72 65 20 61 20 77 72 69 74 65 2e 2e 2e  epare a write...
5480: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 49 4e 53  .  catchsql {INS
5490: 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41 4c 55  ERT INTO de VALU
54a0: 45 53 28 27 50 61 74 61 79 61 27 2c 20 33 30 30  ES('Pataya', 300
54b0: 30 30 29 3b 7d 20 64 62 33 0a 7d 20 7b 30 20 7b  00);} db3.} {0 {
54c0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
54d0: 64 2d 24 61 76 2e 31 30 2e 36 20 7b 0a 20 20 23  d-$av.10.6 {.  #
54e0: 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 63 6f 6d   ... but not com
54f0: 6d 69 74 20 69 74 2e 0a 20 20 63 61 74 63 68 73  mit it..  catchs
5500: 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20 64 62 33 0a  ql {COMMIT} db3.
5510: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
5520: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
5530: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30  st shared-$av.10
5540: 2e 37 20 7b 0a 20 20 23 20 43 6f 6d 6d 69 74 20  .7 {.  # Commit 
5550: 74 68 65 20 28 72 65 61 64 2d 6f 6e 6c 79 29 20  the (read-only) 
5560: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  db transaction. 
5570: 43 68 65 63 6b 20 76 69 61 20 64 62 33 20 74 6f  Check via db3 to
5580: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 0a   make sure the .
5590: 20 20 23 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20    # contents of 
55a0: 74 61 62 6c 65 20 22 64 65 22 20 61 72 65 20 73  table "de" are s
55b0: 74 69 6c 6c 20 61 73 20 74 68 65 79 20 73 68 6f  till as they sho
55c0: 75 6c 64 20 62 65 2e 0a 20 20 65 78 65 63 73 71  uld be..  execsq
55d0: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
55e0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
55f0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5600: 4d 20 64 65 3b 0a 20 20 7d 20 64 62 33 0a 7d 20  M de;.  } db3.} 
5610: 7b 55 62 6f 6e 20 31 32 30 30 30 30 20 7b 4b 68  {Ubon 120000 {Kh
5620: 6f 6e 20 4b 61 65 6e 7d 20 32 30 30 30 30 30 20  on Kaen} 200000 
5630: 50 61 74 61 79 61 20 33 30 30 30 30 7d 0a 64 6f  Pataya 30000}.do
5640: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
5650: 2e 31 30 2e 39 20 7b 0a 20 20 23 20 43 6f 6d 6d  .10.9 {.  # Comm
5660: 69 74 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  it the external 
5670: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 63  transaction..  c
5680: 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d  atchsql {COMMIT}
5690: 20 64 62 33 0a 7d 20 7b 30 20 7b 7d 7d 0a 69 6e   db3.} {0 {}}.in
56a0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 73 68  tegrity_check sh
56b0: 61 72 65 64 2d 24 61 76 2e 31 30 2e 31 30 0a 64  ared-$av.10.10.d
56c0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
56d0: 76 2e 31 30 2e 31 31 20 7b 0a 20 20 64 62 20 63  v.10.11 {.  db c
56e0: 6c 6f 73 65 0a 20 20 64 62 33 20 63 6c 6f 73 65  lose.  db3 close
56f0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 73  .} {}..do_test s
5700: 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 31 20 7b  hared-$av.11.1 {
5710: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
5720: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a 20 20  force test.db.  
5730: 73 71 6c 69 74 65 33 20 64 62 20 20 74 65 73 74  sqlite3 db  test
5740: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
5750: 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  2 test.db.  exec
5760: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
5770: 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c   TABLE abc(a, b,
5780: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
5790: 54 41 42 4c 45 20 61 62 63 32 28 61 2c 20 62 2c  TABLE abc2(a, b,
57a0: 20 63 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   c);.    BEGIN;.
57b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
57c0: 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  abc VALUES(1, 2,
57d0: 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   3);.  }.} {}.do
57e0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
57f0: 2e 31 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  .11.2 {.  catchs
5800: 71 6c 20 7b 42 45 47 49 4e 3b 7d 20 64 62 32 0a  ql {BEGIN;} db2.
5810: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
5820: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 7d 20  CT * FROM abc;} 
5830: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
5840: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
5850: 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65 73  ed: abc}}.do_tes
5860: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e  t shared-$av.11.
5870: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
5880: 42 45 47 49 4e 7d 20 64 62 32 0a 7d 20 7b 31 20  BEGIN} db2.} {1 
5890: 7b 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  {cannot start a 
58a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
58b0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
58c0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
58d0: 64 2d 24 61 76 2e 31 31 2e 34 20 7b 0a 20 20 63  d-$av.11.4 {.  c
58e0: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
58f0: 2a 20 46 52 4f 4d 20 61 62 63 32 3b 7d 20 64 62  * FROM abc2;} db
5900: 32 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65  2.} {0 {}}.do_te
5910: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31  st shared-$av.11
5920: 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .5 {.  catchsql 
5930: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63  {INSERT INTO abc
5940: 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  2 VALUES(1, 2, 3
5950: 29 3b 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61  );} db2.} {1 {da
5960: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
5970: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
5980: 64 2d 24 61 76 2e 31 31 2e 36 20 7b 0a 20 20 63  d-$av.11.6 {.  c
5990: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
59a0: 2a 20 46 52 4f 4d 20 61 62 63 32 7d 0a 7d 20 7b  * FROM abc2}.} {
59b0: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  0 {}}.do_test sh
59c0: 61 72 65 64 2d 24 61 76 2e 31 31 2e 36 20 7b 0a  ared-$av.11.6 {.
59d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
59e0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 50 52  ROLLBACK;.    PR
59f0: 41 47 4d 41 20 72 65 61 64 5f 75 6e 63 6f 6d 6d  AGMA read_uncomm
5a00: 69 74 74 65 64 20 3d 20 31 3b 0a 20 20 7d 20 64  itted = 1;.  } d
5a10: 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  b2.} {}.do_test 
5a20: 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 37 20  shared-$av.11.7 
5a30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5a40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
5a50: 63 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  c2 VALUES(4, 5, 
5a60: 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  6);.    INSERT I
5a70: 4e 54 4f 20 61 62 63 32 20 56 41 4c 55 45 53 28  NTO abc2 VALUES(
5a80: 37 2c 20 38 2c 20 39 29 3b 0a 20 20 7d 0a 7d 20  7, 8, 9);.  }.} 
5a90: 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  {}.do_test share
5aa0: 64 2d 24 61 76 2e 31 31 2e 38 20 7b 0a 20 20 73  d-$av.11.8 {.  s
5ab0: 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20  et res [list].  
5ac0: 62 72 65 61 6b 70 6f 69 6e 74 0a 20 20 64 62 32  breakpoint.  db2
5ad0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45   eval {.    SELE
5ae0: 43 54 20 61 62 63 2e 61 20 61 73 20 49 2c 20 61  CT abc.a as I, a
5af0: 62 63 32 2e 61 20 61 73 20 49 49 20 46 52 4f 4d  bc2.a as II FROM
5b00: 20 61 62 63 2c 20 61 62 63 32 3b 0a 20 20 7d 20   abc, abc2;.  } 
5b10: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
5b20: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
5b30: 4d 20 61 62 63 20 57 48 45 52 45 20 31 3b 0a 20  M abc WHERE 1;. 
5b40: 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64     }.    lappend
5b50: 20 72 65 73 20 24 49 20 24 49 49 0a 20 20 7d 0a   res $I $II.  }.
5b60: 20 20 73 65 74 20 72 65 73 0a 7d 20 7b 31 20 34    set res.} {1 4
5b70: 20 7b 7d 20 37 7d 0a 69 66 20 7b 5b 6c 6c 65 6e   {} 7}.if {[llen
5b80: 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e  gth [info comman
5b90: 64 20 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64  d sqlite3_shared
5ba0: 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 5d 5d 3d  _cache_report]]=
5bb0: 3d 31 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  =1} {.  do_test 
5bc0: 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 39 20  shared-$av.11.9 
5bd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68  {.    sqlite3_sh
5be0: 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72  ared_cache_repor
5bf0: 74 20 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 66 69  t .  } [list [fi
5c00: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 74 65 73  le normalize tes
5c10: 74 2e 64 62 5d 20 32 5d 0a 7d 0a 0a 64 6f 5f 74  t.db] 2].}..do_t
5c20: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5c30: 31 2e 31 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73  1.11 {.  db clos
5c40: 65 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 20  e.  db2 close.} 
5c50: 7b 7d 0a 0a 23 20 54 68 69 73 20 74 65 73 74 73  {}..# This tests
5c60: 20 74 68 61 74 20 69 66 20 69 74 20 69 73 20 69   that if it is i
5c70: 6d 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 72 65  mpossible to fre
5c80: 65 20 61 6e 79 20 70 61 67 65 73 2c 20 53 51 4c  e any pages, SQL
5c90: 69 74 65 20 77 69 6c 6c 0a 23 20 65 78 63 65 65  ite will.# excee
5ca0: 64 20 74 68 65 20 6c 69 6d 69 74 20 73 65 74 20  d the limit set 
5cb0: 62 79 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  by PRAGMA cache_
5cc0: 73 69 7a 65 2e 0a 66 69 6c 65 20 64 65 6c 65 74  size..file delet
5cd0: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
5ce0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
5cf0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
5d00: 2e 64 62 20 0a 69 66 63 61 70 61 62 6c 65 20 70  .db .ifcapable p
5d10: 61 67 65 72 5f 70 72 61 67 6d 61 73 20 7b 0a 20  ager_pragmas {. 
5d20: 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d   do_test shared-
5d30: 24 61 76 2e 31 32 2e 31 20 7b 0a 20 20 20 20 65  $av.12.1 {.    e
5d40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
5d50: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
5d60: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41   = 10;.      PRA
5d70: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 0a  GMA cache_size;.
5d80: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 30 7d 0a 7d      }.  } {10}.}
5d90: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
5da0: 24 61 76 2e 31 32 2e 32 20 7b 0a 20 20 73 65 74  $av.12.2 {.  set
5db0: 20 3a 3a 64 62 5f 68 61 6e 64 6c 65 73 20 5b 6c   ::db_handles [l
5dc0: 69 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20  ist].  for {set 
5dd0: 69 20 31 7d 20 7b 24 69 20 3c 20 31 35 7d 20 7b  i 1} {$i < 15} {
5de0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61  incr i} {.    la
5df0: 70 70 65 6e 64 20 3a 3a 64 62 5f 68 61 6e 64 6c  ppend ::db_handl
5e00: 65 73 20 64 62 24 69 0a 20 20 20 20 73 71 6c 69  es db$i.    sqli
5e10: 74 65 33 20 64 62 24 69 20 74 65 73 74 2e 64 62  te3 db$i test.db
5e20: 20 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 43   .    execsql "C
5e30: 52 45 41 54 45 20 54 41 42 4c 45 20 64 62 24 7b  REATE TABLE db${
5e40: 69 7d 28 61 2c 20 62 2c 20 63 29 22 20 64 62 24  i}(a, b, c)" db$
5e50: 69 20 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  i .    execsql "
5e60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 62 24 7b  INSERT INTO db${
5e70: 69 7d 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  i} VALUES(1, 2, 
5e80: 33 29 22 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f  3)".  }.} {}.pro
5e90: 63 20 6e 65 73 74 65 64 5f 73 65 6c 65 63 74 20  c nested_select 
5ea0: 7b 68 61 6e 64 6c 65 73 7d 20 7b 0a 20 20 5b 6c  {handles} {.  [l
5eb0: 69 6e 64 65 78 20 24 68 61 6e 64 6c 65 73 20 30  index $handles 0
5ec0: 5d 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a  ] eval "SELECT *
5ed0: 20 46 52 4f 4d 20 5b 6c 69 6e 64 65 78 20 24 68   FROM [lindex $h
5ee0: 61 6e 64 6c 65 73 20 30 5d 22 20 7b 0a 20 20 20  andles 0]" {.   
5ef0: 20 6c 61 70 70 65 6e 64 20 3a 3a 72 65 73 20 24   lappend ::res $
5f00: 61 20 24 62 20 24 63 0a 20 20 20 20 69 66 20 7b  a $b $c.    if {
5f10: 5b 6c 6c 65 6e 67 74 68 20 24 68 61 6e 64 6c 65  [llength $handle
5f20: 73 5d 3e 31 7d 20 7b 0a 20 20 20 20 20 20 6e 65  s]>1} {.      ne
5f30: 73 74 65 64 5f 73 65 6c 65 63 74 20 5b 6c 72 61  sted_select [lra
5f40: 6e 67 65 20 24 68 61 6e 64 6c 65 73 20 31 20 65  nge $handles 1 e
5f50: 6e 64 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  nd].    }.  }.}.
5f60: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5f70: 61 76 2e 31 32 2e 33 20 7b 0a 20 20 73 65 74 20  av.12.3 {.  set 
5f80: 3a 3a 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 6e  ::res [list].  n
5f90: 65 73 74 65 64 5f 73 65 6c 65 63 74 20 24 3a 3a  ested_select $::
5fa0: 64 62 5f 68 61 6e 64 6c 65 73 0a 20 20 73 65 74  db_handles.  set
5fb0: 20 3a 3a 72 65 73 0a 7d 20 5b 73 74 72 69 6e 67   ::res.} [string
5fc0: 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72   range [string r
5fd0: 65 70 65 61 74 20 22 31 20 32 20 33 20 22 20 5b  epeat "1 2 3 " [
5fe0: 6c 6c 65 6e 67 74 68 20 24 3a 3a 64 62 5f 68 61  llength $::db_ha
5ff0: 6e 64 6c 65 73 5d 5d 20 30 20 65 6e 64 2d 31 5d  ndles]] 0 end-1]
6000: 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  ..do_test shared
6010: 2d 24 61 76 2e 31 32 2e 58 20 7b 0a 20 20 64 62  -$av.12.X {.  db
6020: 20 63 6c 6f 73 65 0a 20 20 66 6f 72 65 61 63 68   close.  foreach
6030: 20 68 20 24 3a 3a 64 62 5f 68 61 6e 64 6c 65 73   h $::db_handles
6040: 20 7b 20 0a 20 20 20 20 24 68 20 63 6c 6f 73 65   { .    $h close
6050: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 7d 0a 0a 73 71  .  }.} {}..}..sq
6060: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
6070: 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61  red_cache $::ena
6080: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
6090: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.