/ Hex Artifact Content
Login

Artifact 0ed247941236788c255b3b29b5a82d5ca71b6432:


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 31 20 32 30 30 36 2f 30 31 2f 32 33 20  1.21 2006/01/23 
0190: 32 31 3a 33 38 3a 30 33 20 64 72 68 20 45 78 70  21:38:03 drh Exp
01a0: 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20   $..set testdir 
01b0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
01c0: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
01d0: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
01e0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 69 66 63 61 70  .db close..ifcap
01f0: 61 62 6c 65 20 21 73 68 61 72 65 64 5f 63 61 63  able !shared_cac
0200: 68 65 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  he {.  finish_te
0210: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73  st.  return.}..s
0220: 65 74 20 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72  et ::enable_shar
0230: 65 64 5f 63 61 63 68 65 20 5b 73 71 6c 69 74 65  ed_cache [sqlite
0240: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0250: 63 61 63 68 65 20 31 5d 0a 0a 66 6f 72 65 61 63  cache 1]..foreac
0260: 68 20 61 76 20 5b 6c 69 73 74 20 30 20 31 5d 20  h av [list 0 1] 
0270: 7b 0a 0a 23 20 4f 70 65 6e 20 74 68 65 20 64 61  {..# Open the da
0280: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
0290: 6e 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68  n and execute th
02a0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
02b0: 61 67 6d 61 0a 66 69 6c 65 20 64 65 6c 65 74 65  agma.file delete
02c0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a   -force test.db.
02d0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
02e0: 64 62 0a 0a 69 66 63 61 70 61 62 6c 65 20 61 75  db..ifcapable au
02f0: 74 6f 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f 5f  tovacuum {.  do_
0300: 74 65 73 74 20 73 68 61 72 65 64 2d 5b 65 78 70  test shared-[exp
0310: 72 20 24 61 76 2b 31 5d 2e 31 2e 30 20 7b 0a 20  r $av+1].1.0 {. 
0320: 20 20 20 65 78 65 63 73 71 6c 20 22 70 72 61 67     execsql "prag
0330: 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 24  ma auto_vacuum=$
0340: 3a 3a 61 76 22 0a 20 20 20 20 65 78 65 63 73 71  ::av".    execsq
0350: 6c 20 7b 70 72 61 67 6d 61 20 61 75 74 6f 5f 76  l {pragma auto_v
0360: 61 63 75 75 6d 7d 0a 20 20 7d 20 22 24 61 76 22  acuum}.  } "$av"
0370: 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 69 66 20 7b  .} else {.  if {
0380: 24 61 76 7d 20 7b 0a 20 20 20 20 64 62 20 63 6c  $av} {.    db cl
0390: 6f 73 65 0a 20 20 20 20 62 72 65 61 6b 0a 20 20  ose.    break.  
03a0: 7d 0a 7d 0a 0a 23 20 24 61 76 20 69 73 20 63 75  }.}..# $av is cu
03b0: 72 72 65 6e 74 6c 79 20 30 20 69 66 20 74 68 69  rrently 0 if thi
03c0: 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  s loop iteration
03d0: 20 69 73 20 74 6f 20 74 65 73 74 20 77 69 74 68   is to test with
03e0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 74 75 72   auto-vacuum tur
03f0: 6e 65 64 0a 23 20 6f 66 66 2c 20 61 6e 64 20 31  ned.# off, and 1
0400: 20 69 66 20 69 74 20 69 73 20 74 75 72 6e 65 64   if it is turned
0410: 20 6f 6e 2e 20 49 6e 63 72 65 6d 65 6e 74 20 69   on. Increment i
0420: 74 20 73 6f 20 74 68 61 74 20 28 31 20 2d 3e 20  t so that (1 -> 
0430: 6e 6f 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 20  no auto-vacuum) 
0440: 0a 23 20 61 6e 64 20 28 32 20 2d 3e 20 61 75 74  .# and (2 -> aut
0450: 6f 2d 76 61 63 75 75 6d 29 2e 20 54 68 65 20 73  o-vacuum). The s
0460: 6f 6c 65 20 72 65 61 73 6f 6e 20 66 6f 72 20 74  ole reason for t
0470: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 69  his is so that i
0480: 74 20 6c 6f 6f 6b 73 20 6e 69 63 65 72 0a 23 20  t looks nicer.# 
0490: 77 68 65 6e 20 77 65 20 75 73 65 20 74 68 69 73  when we use this
04a0: 20 76 61 72 69 61 62 6c 65 20 61 73 20 70 61 72   variable as par
04b0: 74 20 6f 66 20 74 65 73 74 2d 63 61 73 65 20 6e  t of test-case n
04c0: 61 6d 65 73 2e 0a 23 0a 69 6e 63 72 20 61 76 0a  ames..#.incr av.
04d0: 0a 23 20 54 65 73 74 20 6f 72 67 61 6e 69 7a 61  .# Test organiza
04e0: 74 69 6f 6e 3a 0a 23 0a 23 20 73 68 61 72 65 64  tion:.#.# shared
04f0: 2d 31 2e 2a 3a 20 53 69 6d 70 6c 65 20 74 65 73  -1.*: Simple tes
0500: 74 20 74 6f 20 76 65 72 69 66 79 20 62 61 73 69  t to verify basi
0510: 63 20 73 61 6e 69 74 79 20 6f 66 20 74 61 62 6c  c sanity of tabl
0520: 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 69 6e 67 20  e level locking 
0530: 77 68 65 6e 0a 23 20 20 20 20 20 20 20 20 20 20  when.#          
0540: 20 20 20 74 77 6f 20 63 6f 6e 6e 65 63 74 69 6f     two connectio
0550: 6e 73 20 73 68 61 72 65 20 61 20 70 61 67 65 72  ns share a pager
0560: 20 63 61 63 68 65 2e 0a 23 20 73 68 61 72 65 64   cache..# shared
0570: 2d 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  -2.*: Test that 
0580: 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
0590: 6f 6e 20 63 61 6e 20 63 6f 2d 65 78 69 73 74 20  on can co-exist 
05a0: 77 69 74 68 20 61 20 0a 23 20 20 20 20 20 20 20  with a .#       
05b0: 20 20 20 20 20 20 77 72 69 74 65 2d 74 72 61 6e        write-tran
05c0: 73 61 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69  saction, includi
05d0: 6e 67 20 61 20 73 69 6d 70 6c 65 20 74 65 73 74  ng a simple test
05e0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 0a   to ensure the .
05f0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78  #             ex
0600: 74 65 72 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 70  ternal locking p
0610: 72 6f 74 6f 63 6f 6c 20 69 73 20 73 74 69 6c 6c  rotocol is still
0620: 20 77 6f 72 6b 69 6e 67 2e 0a 23 20 73 68 61 72   working..# shar
0630: 65 64 2d 33 2e 2a 3a 20 53 69 6d 70 6c 65 20 74  ed-3.*: Simple t
0640: 65 73 74 20 6f 66 20 72 65 61 64 2d 75 6e 63 6f  est of read-unco
0650: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 2e 0a 23 20  mmitted mode..# 
0660: 73 68 61 72 65 64 2d 34 2e 2a 3a 20 43 68 65 63  shared-4.*: Chec
0670: 6b 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  k that the schem
0680: 61 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20  a is locked and 
0690: 75 6e 6c 6f 63 6b 65 64 20 63 6f 72 72 65 63 74  unlocked correct
06a0: 6c 79 2e 0a 23 20 73 68 61 72 65 64 2d 35 2e 2a  ly..# shared-5.*
06b0: 3a 20 54 65 73 74 20 74 68 61 74 20 63 72 65 61  : Test that crea
06c0: 74 69 6e 67 2f 64 72 6f 70 70 69 6e 67 20 73 63  ting/dropping sc
06d0: 68 65 6d 61 20 69 74 65 6d 73 20 77 6f 72 6b 73  hema items works
06e0: 20 77 68 65 6e 20 64 61 74 61 62 61 73 65 73 0a   when databases.
06f0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72  #             ar
0700: 65 20 61 74 74 61 63 68 65 64 20 69 6e 20 64 69  e attached in di
0710: 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 20 74  fferent orders t
0720: 6f 20 64 69 66 66 65 72 65 6e 74 20 68 61 6e 64  o different hand
0730: 6c 65 73 2e 0a 23 20 73 68 61 72 65 64 2d 36 2e  les..# shared-6.
0740: 2a 3a 20 4c 6f 63 6b 69 6e 67 2c 20 55 4e 49 4f  *: Locking, UNIO
0750: 4e 20 41 4c 4c 20 71 75 65 72 69 65 73 20 61 6e  N ALL queries an
0760: 64 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a 23  d sub-queries..#
0770: 20 73 68 61 72 65 64 2d 37 2e 2a 3a 20 41 75 74   shared-7.*: Aut
0780: 6f 76 61 63 75 75 6d 20 61 6e 64 20 73 68 61 72  ovacuum and shar
0790: 65 64 2d 63 61 63 68 65 2e 0a 23 20 73 68 61 72  ed-cache..# shar
07a0: 65 64 2d 38 2e 2a 3a 20 54 65 73 74 73 20 72 65  ed-8.*: Tests re
07b0: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 78  lated to the tex
07c0: 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 73 68  t encoding of sh
07d0: 61 72 65 64 2d 63 61 63 68 65 20 64 61 74 61 62  ared-cache datab
07e0: 61 73 65 73 2e 0a 23 20 73 68 61 72 65 64 2d 39  ases..# shared-9
07f0: 2e 2a 3a 20 54 45 4d 50 20 74 72 69 67 67 65 72  .*: TEMP trigger
0800: 73 20 61 6e 64 20 73 68 61 72 65 64 2d 63 61 63  s and shared-cac
0810: 68 65 20 64 61 74 61 62 61 73 65 73 2e 0a 23 20  he databases..# 
0820: 73 68 61 72 65 64 2d 31 30 2e 2a 3a 20 54 65 73  shared-10.*: Tes
0830: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 63 6c  ts of sqlite3_cl
0840: 6f 73 65 28 29 2e 0a 23 20 73 68 61 72 65 64 2d  ose()..# shared-
0850: 31 31 2e 2a 3a 20 54 65 73 74 20 74 72 61 6e 73  11.*: Test trans
0860: 61 63 74 69 6f 6e 20 6c 6f 63 6b 69 6e 67 2e 0a  action locking..
0870: 23 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  #..do_test share
0880: 64 2d 24 61 76 2e 31 2e 31 20 7b 0a 20 20 23 20  d-$av.1.1 {.  # 
0890: 4f 70 65 6e 20 61 20 73 65 63 6f 6e 64 20 64 61  Open a second da
08a0: 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 66 69  tabase on the fi
08b0: 6c 65 20 74 65 73 74 2e 64 62 2e 20 49 74 20 73  le test.db. It s
08c0: 68 6f 75 6c 64 20 75 73 65 20 74 68 65 20 73 61  hould use the sa
08d0: 6d 65 20 70 61 67 65 72 0a 20 20 23 20 63 61 63  me pager.  # cac
08e0: 68 65 20 61 6e 64 20 73 63 68 65 6d 61 20 61 73  he and schema as
08f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
0900: 6e 6e 65 63 74 69 6f 6e 2e 20 56 65 72 69 66 79  nnection. Verify
0910: 20 74 68 61 74 20 6f 6e 6c 79 20 31 20 66 69 6c   that only 1 fil
0920: 65 20 69 73 20 0a 20 20 23 20 6f 70 65 6e 65 64  e is .  # opened
0930: 2e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  ..  sqlite3 db2 
0940: 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20 3a 3a  test.db.  set ::
0950: 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
0960: 5f 63 6f 75 6e 74 0a 7d 20 7b 31 7d 0a 64 6f 5f  _count.} {1}.do_
0970: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
0980: 31 2e 32 20 7b 0a 20 20 23 20 41 64 64 20 61 20  1.2 {.  # Add a 
0990: 74 61 62 6c 65 20 61 6e 64 20 61 20 73 69 6e 67  table and a sing
09a0: 6c 65 20 72 6f 77 20 6f 66 20 64 61 74 61 20 76  le row of data v
09b0: 69 61 20 74 68 65 20 66 69 72 73 74 20 63 6f 6e  ia the first con
09c0: 6e 65 63 74 69 6f 6e 2e 20 0a 20 20 23 20 45 6e  nection. .  # En
09d0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 65  sure that the se
09e0: 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  cond connection 
09f0: 63 61 6e 20 73 65 65 20 74 68 65 6d 2e 0a 20 20  can see them..  
0a00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
0a10: 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61  EATE TABLE abc(a
0a20: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e 53  , b, c);.    INS
0a30: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
0a40: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
0a50: 7d 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  } db.  execsql {
0a60: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0a70: 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62 32 0a  OM abc;.  } db2.
0a80: 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73  } {1 2 3}.do_tes
0a90: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 2e 33  t shared-$av.1.3
0aa0: 20 7b 0a 20 20 23 20 48 61 76 65 20 74 68 65 20   {.  # Have the 
0ab0: 66 69 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  first connection
0ac0: 20 62 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   begin a transac
0ad0: 74 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e 20  tion and obtain 
0ae0: 61 20 72 65 61 64 2d 6c 6f 63 6b 0a 20 20 23 20  a read-lock.  # 
0af0: 6f 6e 20 74 61 62 6c 65 20 61 62 63 2e 20 54 68  on table abc. Th
0b00: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72  is should not pr
0b10: 65 76 65 6e 74 20 74 68 65 20 73 65 63 6f 6e 64  event the second
0b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d   connection from
0b30: 20 0a 20 20 23 20 71 75 65 72 79 69 6e 67 20 61   .  # querying a
0b40: 62 63 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  bc..  execsql {.
0b50: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53      BEGIN;.    S
0b60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
0b70: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
0b80: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
0b90: 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62 32  ROM abc;.  } db2
0ba0: 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65  .} {1 2 3}.do_te
0bb0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 2e  st shared-$av.1.
0bc0: 34 20 7b 0a 20 20 23 20 54 72 79 20 74 6f 20 69  4 {.  # Try to i
0bd0: 6e 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f  nsert a row into
0be0: 20 61 62 63 20 76 69 61 20 63 6f 6e 6e 65 63 74   abc via connect
0bf0: 69 6f 6e 20 32 2e 20 54 68 69 73 20 73 68 6f 75  ion 2. This shou
0c00: 6c 64 20 66 61 69 6c 20 62 65 63 61 75 73 65 0a  ld fail because.
0c10: 20 20 23 20 6f 66 20 74 68 65 20 72 65 61 64 2d    # of the read-
0c20: 6c 6f 63 6b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  lock connection 
0c30: 31 20 69 73 20 68 6f 6c 64 69 6e 67 20 6f 6e 20  1 is holding on 
0c40: 74 61 62 6c 65 20 61 62 63 20 28 6f 62 74 61 69  table abc (obtai
0c50: 6e 65 64 20 69 6e 20 74 68 65 0a 20 20 23 20 70  ned in the.  # p
0c60: 72 65 76 69 6f 75 73 20 74 65 73 74 20 63 61 73  revious test cas
0c70: 65 29 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  e)..  catchsql {
0c80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0c90: 20 61 62 63 20 56 41 4c 55 45 53 28 34 2c 20 35   abc VALUES(4, 5
0ca0: 2c 20 36 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  , 6);.  } db2.} 
0cb0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 74 61 62  {1 {database tab
0cc0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 61 62  le is locked: ab
0cd0: 63 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  c}}.do_test shar
0ce0: 65 64 2d 24 61 76 2e 31 2e 35 20 7b 0a 20 20 23  ed-$av.1.5 {.  #
0cf0: 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   Using connectio
0d00: 6e 20 32 20 28 74 68 65 20 6f 6e 65 20 77 69 74  n 2 (the one wit
0d10: 68 6f 75 74 20 74 68 65 20 6f 70 65 6e 20 74 72  hout the open tr
0d20: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 72 79 20  ansaction), try 
0d30: 74 6f 20 63 72 65 61 74 65 0a 20 20 23 20 61 20  to create.  # a 
0d40: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 69 73 20  new table. This 
0d50: 73 68 6f 75 6c 64 20 66 61 69 6c 20 62 65 63 61  should fail beca
0d60: 75 73 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  use of the open 
0d70: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
0d80: 20 0a 20 20 23 20 68 65 6c 64 20 62 79 20 63 6f   .  # held by co
0d90: 6e 6e 65 63 74 69 6f 6e 20 31 2e 0a 20 20 63 61  nnection 1..  ca
0da0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  tchsql {.    CRE
0db0: 41 54 45 20 54 41 42 4c 45 20 64 65 66 28 64 2c  ATE TABLE def(d,
0dc0: 20 65 2c 20 66 29 3b 0a 20 20 7d 20 64 62 32 0a   e, f);.  } db2.
0dd0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 74  } {1 {database t
0de0: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20  able is locked: 
0df0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 7d 0a  sqlite_master}}.
0e00: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
0e10: 61 76 2e 31 2e 36 20 7b 0a 20 20 23 20 55 70 67  av.1.6 {.  # Upg
0e20: 72 61 64 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  rade connection 
0e30: 31 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  1's transaction 
0e40: 74 6f 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  to a write trans
0e50: 61 63 74 69 6f 6e 2e 20 43 72 65 61 74 65 0a 20  action. Create. 
0e60: 20 23 20 61 20 6e 65 77 20 74 61 62 6c 65 20 2d   # a new table -
0e70: 20 64 65 66 20 2d 20 61 6e 64 20 69 6e 73 65 72   def - and inser
0e80: 74 20 61 20 72 6f 77 20 69 6e 74 6f 20 69 74 2e  t a row into it.
0e90: 20 42 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e   Because the con
0ea0: 6e 65 63 74 69 6f 6e 20 31 0a 20 20 23 20 74 72  nection 1.  # tr
0eb0: 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64 69 66 69  ansaction modifi
0ec0: 65 73 20 74 68 65 20 73 63 68 65 6d 61 2c 20 69  es the schema, i
0ed0: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
0ee0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 0a 20 20  possible for .  
0ef0: 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 74  # connection 2 t
0f00: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
0f10: 61 62 61 73 65 20 61 74 20 61 6c 6c 20 75 6e 74  abase at all unt
0f20: 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  il the connectio
0f30: 6e 20 31 20 0a 20 20 23 20 68 61 73 20 66 69 6e  n 1 .  # has fin
0f40: 69 73 68 65 64 20 74 68 65 20 74 72 61 6e 73 61  ished the transa
0f50: 63 74 69 6f 6e 2e 0a 20 20 65 78 65 63 73 71 6c  ction..  execsql
0f60: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
0f70: 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66 29  BLE def(d, e, f)
0f80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0f90: 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27 49 56  O def VALUES('IV
0fa0: 27 2c 20 27 56 27 2c 20 27 56 49 27 29 3b 0a 20  ', 'V', 'VI');. 
0fb0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
0fc0: 73 68 61 72 65 64 2d 24 61 76 2e 31 2e 37 20 7b  shared-$av.1.7 {
0fd0: 0a 20 20 23 20 52 65 61 64 20 66 72 6f 6d 20 74  .  # Read from t
0fe0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
0ff0: 20 74 61 62 6c 65 20 77 69 74 68 20 63 6f 6e 6e   table with conn
1000: 65 63 74 69 6f 6e 20 31 20 28 69 6e 73 69 64 65  ection 1 (inside
1010: 20 74 68 65 20 0a 20 20 23 20 74 72 61 6e 73 61   the .  # transa
1020: 63 74 69 6f 6e 29 2e 20 54 68 65 6e 20 74 65 73  ction). Then tes
1030: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 6e 6f  t that we can no
1040: 74 20 64 6f 20 74 68 69 73 20 77 69 74 68 20 63  t do this with c
1050: 6f 6e 6e 65 63 74 69 6f 6e 20 32 2e 20 54 68 69  onnection 2. Thi
1060: 73 0a 20 20 23 20 69 73 20 62 65 63 61 75 73 65  s.  # is because
1070: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2d 6d   of the schema-m
1080: 6f 64 69 66 69 65 64 20 6c 6f 63 6b 20 65 73 74  odified lock est
1090: 61 62 6c 69 73 68 65 64 20 62 79 20 63 6f 6e 6e  ablished by conn
10a0: 65 63 74 69 6f 6e 20 31 20 0a 20 20 23 20 69 6e  ection 1 .  # in
10b0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
10c0: 73 74 20 63 61 73 65 2e 0a 20 20 65 78 65 63 73  st case..  execs
10d0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
10e0: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
10f0: 73 74 65 72 3b 0a 20 20 7d 0a 20 20 63 61 74 63  ster;.  }.  catc
1100: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
1110: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
1120: 6d 61 73 74 65 72 3b 0a 20 20 7d 20 64 62 32 0a  master;.  } db2.
1130: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 73  } {1 {database s
1140: 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 3a  chema is locked:
1150: 20 6d 61 69 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20   main}}.do_test 
1160: 73 68 61 72 65 64 2d 24 61 76 2e 31 2e 38 20 7b  shared-$av.1.8 {
1170: 0a 20 20 23 20 43 6f 6d 6d 69 74 20 74 68 65 20  .  # Commit the 
1180: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 74 72 61  connection 1 tra
1190: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 65 78 65 63  nsaction..  exec
11a0: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
11b0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
11c0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 32  est shared-$av.2
11d0: 2e 31 20 7b 0a 20 20 23 20 4f 70 65 6e 20 63 6f  .1 {.  # Open co
11e0: 6e 6e 65 63 74 69 6f 6e 20 64 62 33 20 74 6f 20  nnection db3 to 
11f0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 55 73  the database. Us
1200: 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  e a different pa
1210: 74 68 20 74 6f 20 74 68 65 20 73 61 6d 65 0a 20  th to the same. 
1220: 20 23 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20   # file so that 
1230: 64 62 33 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 73  db3 does *not* s
1240: 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
1250: 67 65 72 20 63 61 63 68 65 20 61 73 20 64 62 20  ger cache as db 
1260: 61 6e 64 20 64 62 32 0a 20 20 23 20 28 74 68 65  and db2.  # (the
1270: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 77 6f  re should be two
1280: 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1290: 65 73 29 2e 0a 20 20 69 66 20 7b 24 3a 3a 74 63  es)..  if {$::tc
12a0: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
12b0: 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a  orm)=="unix"} {.
12c0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 33 20      sqlite3 db3 
12d0: 2e 2f 74 65 73 74 2e 64 62 0a 20 20 7d 20 65 6c  ./test.db.  } el
12e0: 73 65 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  se {.    sqlite3
12f0: 20 64 62 33 20 54 45 53 54 2e 44 42 0a 20 20 7d   db3 TEST.DB.  }
1300: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  .  set ::sqlite_
1310: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a  open_file_count.
1320: 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73 68  } {2}.do_test sh
1330: 61 72 65 64 2d 24 61 76 2e 32 2e 32 20 7b 0a 20  ared-$av.2.2 {. 
1340: 20 23 20 53 74 61 72 74 20 72 65 61 64 20 74 72   # Start read tr
1350: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 6e 20 64 62  ansactions on db
1360: 20 61 6e 64 20 64 62 32 20 28 74 68 65 20 73 68   and db2 (the sh
1370: 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
1380: 29 2e 20 45 6e 73 75 72 65 0a 20 20 23 20 64 62  ). Ensure.  # db
1390: 33 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74  3 cannot write t
13a0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
13b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
13c0: 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43  BEGIN;.    SELEC
13d0: 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20  T * FROM abc;.  
13e0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
13f0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c    BEGIN;.    SEL
1400: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
1410: 20 20 7d 20 64 62 32 0a 20 20 63 61 74 63 68 73    } db2.  catchs
1420: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
1430: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
1440: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 20 64 62  1, 2, 3);.  } db
1450: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
1460: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
1470: 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65 73 74 20  : abc}}.do_test 
1480: 73 68 61 72 65 64 2d 24 61 76 2e 32 2e 33 20 7b  shared-$av.2.3 {
1490: 0a 20 20 23 20 54 75 72 6e 20 64 62 27 73 20 74  .  # Turn db's t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
14b0: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
14c0: 69 6f 6e 2e 20 64 62 33 20 73 68 6f 75 6c 64 20  ion. db3 should 
14d0: 73 74 69 6c 6c 20 62 65 0a 20 20 23 20 61 62 6c  still be.  # abl
14e0: 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74  e to read from t
14f0: 61 62 6c 65 20 64 65 66 20 28 62 75 74 20 77 69  able def (but wi
1500: 6c 6c 20 6e 6f 74 20 73 65 65 20 74 68 65 20 6e  ll not see the n
1510: 65 77 20 72 6f 77 29 2e 20 43 6f 6e 6e 65 63 74  ew row). Connect
1520: 69 6f 6e 0a 20 20 23 20 64 62 32 20 73 68 6f 75  ion.  # db2 shou
1530: 6c 64 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ld not be able t
1540: 6f 20 72 65 61 64 20 64 65 66 20 28 62 65 63 61  o read def (beca
1550: 75 73 65 20 6f 66 20 74 68 65 20 77 72 69 74 65  use of the write
1560: 2d 6c 6f 63 6b 29 2e 0a 0a 23 20 54 6f 64 6f 3a  -lock)...# Todo:
1570: 20 54 68 65 20 66 61 69 6c 65 64 20 22 49 4e 53   The failed "INS
1580: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 2e 2e 2e  ERT INTO abc ...
1590: 22 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  " statement in t
15a0: 68 65 20 61 62 6f 76 65 20 74 65 73 74 0a 23 20  he above test.# 
15b0: 68 61 73 20 73 74 61 72 74 65 64 20 61 20 77 72  has started a wr
15c0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
15d0: 6f 6e 20 64 62 32 20 28 73 68 6f 75 6c 64 20 74  on db2 (should t
15e0: 68 69 73 20 62 65 20 73 6f 3f 29 2e 20 54 68 69  his be so?). Thi
15f0: 73 20 0a 23 20 77 6f 75 6c 64 20 70 72 65 76 65  s .# would preve
1600: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  nt connection db
1610: 20 66 72 6f 6d 20 73 74 61 72 74 69 6e 67 20 61   from starting a
1620: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1630: 6f 6e 2e 20 53 6f 20 72 6f 6c 6c 20 74 68 65 0a  on. So roll the.
1640: 23 20 64 62 32 20 74 72 61 6e 73 61 63 74 69 6f  # db2 transactio
1650: 6e 20 62 61 63 6b 20 61 6e 64 20 72 65 70 6c 61  n back and repla
1660: 63 65 20 69 74 20 77 69 74 68 20 61 20 6e 65 77  ce it with a new
1670: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1680: 6e 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  n..  execsql {. 
1690: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
16a0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45   BEGIN;.    SELE
16b0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
16c0: 20 7d 20 64 62 32 0a 0a 20 20 65 78 65 63 73 71   } db2..  execsq
16d0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
16e0: 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27  NTO def VALUES('
16f0: 56 49 49 27 2c 20 27 56 49 49 49 27 2c 20 27 49  VII', 'VIII', 'I
1700: 58 27 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 63 61  X');.  }.  conca
1710: 74 20 5b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  t [.    catchsql
1720: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1730: 20 64 65 66 3b 20 7d 20 64 62 33 0a 20 20 5d 20   def; } db3.  ] 
1740: 5b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  [.    catchsql {
1750: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
1760: 65 66 3b 20 7d 20 64 62 32 0a 20 20 5d 0a 7d 20  ef; } db2.  ].} 
1770: 7b 30 20 7b 49 56 20 56 20 56 49 7d 20 31 20 7b  {0 {IV V VI} 1 {
1780: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
1790: 73 20 6c 6f 63 6b 65 64 3a 20 64 65 66 7d 7d 0a  s locked: def}}.
17a0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
17b0: 61 76 2e 32 2e 34 20 7b 0a 20 20 23 20 43 6f 6d  av.2.4 {.  # Com
17c0: 6d 69 74 20 74 68 65 20 6f 70 65 6e 20 74 72 61  mit the open tra
17d0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64 62 2e 20  nsaction on db. 
17e0: 64 62 32 20 73 74 69 6c 6c 20 68 6f 6c 64 73 20  db2 still holds 
17f0: 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1800: 6f 6e 2e 0a 20 20 23 20 54 68 69 73 20 73 68 6f  on..  # This sho
1810: 75 6c 64 20 70 72 65 76 65 6e 74 20 64 62 33 20  uld prevent db3 
1820: 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20  from writing to 
1830: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 62 75  the database, bu
1840: 74 20 6e 6f 74 20 66 72 6f 6d 20 0a 20 20 23 20  t not from .  # 
1850: 72 65 61 64 69 6e 67 2e 0a 20 20 65 78 65 63 73  reading..  execs
1860: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
1870: 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b 0a  .  }.  concat [.
1880: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
1890: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66  ELECT * FROM def
18a0: 3b 20 7d 20 64 62 33 0a 20 20 5d 20 5b 0a 20 20  ; } db3.  ] [.  
18b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
18c0: 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c  ERT INTO def VAL
18d0: 55 45 53 28 27 58 27 2c 20 27 58 49 27 2c 20 27  UES('X', 'XI', '
18e0: 58 49 49 27 29 3b 20 7d 20 64 62 33 0a 20 20 5d  XII'); } db3.  ]
18f0: 0a 7d 20 7b 30 20 7b 49 56 20 56 20 56 49 20 56  .} {0 {IV V VI V
1900: 49 49 20 56 49 49 49 20 49 58 7d 20 31 20 7b 64  II VIII IX} 1 {d
1910: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
1920: 64 7d 7d 0a 0a 63 61 74 63 68 73 71 6c 20 43 4f  d}}..catchsql CO
1930: 4d 4d 49 54 20 64 62 32 0a 0a 64 6f 5f 74 65 73  MMIT db2..do_tes
1940: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 33 2e 31  t shared-$av.3.1
1950: 2e 31 20 7b 0a 20 20 23 20 54 68 69 73 20 74 65  .1 {.  # This te
1960: 73 74 20 63 61 73 65 20 73 74 61 72 74 73 20 61  st case starts a
1970: 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20   linear scan of 
1980: 74 61 62 6c 65 20 27 73 65 71 27 20 75 73 69 6e  table 'seq' usin
1990: 67 20 61 20 0a 20 20 23 20 72 65 61 64 2d 75 6e  g a .  # read-un
19a0: 63 6f 6d 6d 69 74 74 65 64 20 63 6f 6e 6e 65 63  committed connec
19b0: 74 69 6f 6e 2e 20 49 6e 20 74 68 65 20 6d 69 64  tion. In the mid
19c0: 64 6c 65 20 6f 66 20 74 68 65 20 73 63 61 6e 2c  dle of the scan,
19d0: 20 72 6f 77 73 20 61 72 65 20 61 64 64 65 64 0a   rows are added.
19e0: 20 20 23 20 74 6f 20 74 68 65 20 65 6e 64 20 6f    # to the end o
19f0: 66 20 74 68 65 20 73 65 71 20 74 61 62 6c 65 20  f the seq table 
1a00: 28 61 68 65 61 64 20 6f 66 20 74 68 65 20 63 75  (ahead of the cu
1a10: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1a20: 69 74 69 6f 6e 29 2e 0a 20 20 23 20 54 68 65 20  ition)..  # The 
1a30: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 72 6f 77 73  uncommitted rows
1a40: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75   should be inclu
1a50: 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ded in the resul
1a60: 74 73 20 6f 66 20 74 68 65 20 73 63 61 6e 2e 0a  ts of the scan..
1a70: 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20    execsql ".    
1a80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 65 71  CREATE TABLE seq
1a90: 28 69 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (i PRIMARY KEY, 
1aa0: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
1ab0: 4e 54 4f 20 73 65 71 20 56 41 4c 55 45 53 28 31  NTO seq VALUES(1
1ac0: 2c 20 27 5b 73 74 72 69 6e 67 20 72 65 70 65 61  , '[string repea
1ad0: 74 20 58 20 35 30 30 5d 27 29 3b 0a 20 20 20 20  t X 500]');.    
1ae0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 71 20  INSERT INTO seq 
1af0: 56 41 4c 55 45 53 28 32 2c 20 27 5b 73 74 72 69  VALUES(2, '[stri
1b00: 6e 67 20 72 65 70 65 61 74 20 58 20 35 30 30 5d  ng repeat X 500]
1b10: 27 29 3b 0a 20 20 22 0a 20 20 65 78 65 63 73 71  ');.  ".  execsq
1b20: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
1b30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 20   sqlite_master} 
1b40: 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  db2.  execsql {P
1b50: 52 41 47 4d 41 20 72 65 61 64 5f 75 6e 63 6f 6d  RAGMA read_uncom
1b60: 6d 69 74 74 65 64 20 3d 20 31 7d 20 64 62 32 0a  mitted = 1} db2.
1b70: 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73 74  .  set ret [list
1b80: 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45  ].  db2 eval {SE
1b90: 4c 45 43 54 20 69 20 46 52 4f 4d 20 73 65 71 20  LECT i FROM seq 
1ba0: 4f 52 44 45 52 20 42 59 20 69 7d 20 7b 0a 20 20  ORDER BY i} {.  
1bb0: 20 20 69 66 20 7b 24 69 20 3c 20 34 7d 20 7b 0a    if {$i < 4} {.
1bc0: 20 20 20 20 20 20 73 65 74 20 6d 61 78 20 5b 65        set max [e
1bd0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6d  xecsql {SELECT m
1be0: 61 78 28 69 29 20 46 52 4f 4d 20 73 65 71 7d 5d  ax(i) FROM seq}]
1bf0: 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b  .      db eval {
1c00: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
1c10: 49 4e 54 4f 20 73 65 71 20 53 45 4c 45 43 54 20  INTO seq SELECT 
1c20: 69 20 2b 20 3a 6d 61 78 2c 20 78 20 46 52 4f 4d  i + :max, x FROM
1c30: 20 73 65 71 3b 0a 20 20 20 20 20 20 7d 0a 20 20   seq;.      }.  
1c40: 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20    }.    lappend 
1c50: 72 65 74 20 24 69 0a 20 20 7d 0a 20 20 73 65 74  ret $i.  }.  set
1c60: 20 72 65 74 0a 7d 20 7b 31 20 32 20 33 20 34 20   ret.} {1 2 3 4 
1c70: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
1c80: 31 32 20 31 33 20 31 34 20 31 35 20 31 36 7d 0a  12 13 14 15 16}.
1c90: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
1ca0: 61 76 2e 33 2e 31 2e 32 20 7b 0a 20 20 23 20 41  av.3.1.2 {.  # A
1cb0: 6e 6f 74 68 65 72 20 6c 69 6e 65 61 72 20 73 63  nother linear sc
1cc0: 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  an through table
1cd0: 20 73 65 71 20 75 73 69 6e 67 20 61 20 72 65 61   seq using a rea
1ce0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 6f  d-uncommitted co
1cf0: 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 23 20 54 68  nnection..  # Th
1d00: 69 73 20 74 69 6d 65 2c 20 64 65 6c 65 74 65 20  is time, delete 
1d10: 65 61 63 68 20 72 6f 77 20 61 73 20 69 74 20 69  each row as it i
1d20: 73 20 72 65 61 64 2e 20 53 68 6f 75 6c 64 20 6e  s read. Should n
1d30: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 72 65  ot affect the re
1d40: 73 75 6c 74 73 20 6f 66 0a 20 20 23 20 74 68 65  sults of.  # the
1d50: 20 73 63 61 6e 2c 20 62 75 74 20 74 68 65 20 74   scan, but the t
1d60: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 65  able should be e
1d70: 6d 70 74 79 20 61 66 74 65 72 20 74 68 65 20 73  mpty after the s
1d80: 63 61 6e 20 69 73 20 63 6f 6e 63 6c 75 64 65 64  can is concluded
1d90: 20 0a 20 20 23 20 28 74 65 73 74 20 33 2e 31 2e   .  # (test 3.1.
1da0: 33 20 76 65 72 69 66 69 65 73 20 74 68 69 73 29  3 verifies this)
1db0: 2e 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73  ..  set ret [lis
1dc0: 74 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53  t].  db2 eval {S
1dd0: 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 73 65 71  ELECT i FROM seq
1de0: 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  } {.    db eval 
1df0: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 65 71  {DELETE FROM seq
1e00: 20 57 48 45 52 45 20 69 20 3d 20 3a 69 7d 0a 20   WHERE i = :i}. 
1e10: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 24     lappend ret $
1e20: 69 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a  i.  }.  set ret.
1e30: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
1e40: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
1e50: 20 31 34 20 31 35 20 31 36 7d 0a 64 6f 5f 74 65   14 15 16}.do_te
1e60: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 33 2e  st shared-$av.3.
1e70: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
1e80: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
1e90: 52 4f 4d 20 73 65 71 3b 0a 20 20 7d 0a 7d 20 7b  ROM seq;.  }.} {
1ea0: 7d 0a 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  }..catch {db clo
1eb0: 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 32 20 63  se}.catch {db2 c
1ec0: 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 33  lose}.catch {db3
1ed0: 20 63 6c 6f 73 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   close}..#------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 73 68 61  ----.# Tests sha
1f30: 72 65 64 2d 34 2e 2a 20 74 65 73 74 20 74 68 61  red-4.* test tha
1f40: 74 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f 63  t the schema loc
1f50: 6b 69 6e 67 20 72 75 6c 65 73 20 61 72 65 20 61  king rules are a
1f60: 70 70 6c 69 65 64 20 0a 23 20 63 6f 72 72 65 63  pplied .# correc
1f70: 74 6c 79 2e 20 69 2e 65 2e 3a 0a 23 0a 23 20 31  tly. i.e.:.#.# 1
1f80: 2e 20 41 6c 6c 20 74 72 61 6e 73 61 63 74 69 6f  . All transactio
1f90: 6e 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ns require a rea
1fa0: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63  d-lock on the sc
1fb0: 68 65 6d 61 73 20 6f 66 20 64 61 74 61 62 61 73  hemas of databas
1fc0: 65 73 20 74 68 65 79 0a 23 20 20 20 20 61 63 63  es they.#    acc
1fd0: 65 73 73 2e 0a 23 20 32 2e 20 54 72 61 6e 73 61  ess..# 2. Transa
1fe0: 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 6f 64 69  ctions that modi
1ff0: 66 79 20 61 20 64 61 74 61 62 61 73 65 20 73 63  fy a database sc
2000: 68 65 6d 61 20 72 65 71 75 69 72 65 20 61 20 77  hema require a w
2010: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 61  rite-lock on tha
2020: 74 0a 23 20 20 20 20 73 63 68 65 6d 61 2e 0a 23  t.#    schema..#
2030: 20 33 2e 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   3. It is not po
2040: 73 73 69 62 6c 65 20 74 6f 20 63 6f 6d 70 69 6c  ssible to compil
2050: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 77 68  e a statement wh
2060: 69 6c 65 20 61 6e 6f 74 68 65 72 20 68 61 6e 64  ile another hand
2070: 6c 65 20 68 61 73 20 61 20 0a 23 20 20 20 20 77  le has a .#    w
2080: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
2090: 20 73 63 68 65 6d 61 2e 0a 23 0a 0a 23 20 4f 70   schema..#..# Op
20a0: 65 6e 20 74 77 6f 20 64 61 74 61 62 61 73 65 20  en two database 
20b0: 68 61 6e 64 6c 65 73 20 64 62 20 61 6e 64 20 64  handles db and d
20c0: 62 32 2e 20 45 61 63 68 20 68 61 73 20 61 20 73  b2. Each has a s
20d0: 69 6e 67 6c 65 20 61 74 74 61 63 68 20 64 61 74  ingle attach dat
20e0: 61 62 61 73 65 0a 23 20 28 61 73 20 77 65 6c 6c  abase.# (as well
20f0: 20 61 73 20 6d 61 69 6e 29 3a 0a 23 0a 23 20 20   as main):.#.#  
2100: 20 20 20 64 62 2e 6d 61 69 6e 20 20 20 2d 3e 20     db.main   -> 
2110: 20 20 2e 2f 74 65 73 74 2e 64 62 0a 23 20 20 20    ./test.db.#   
2120: 20 20 64 62 2e 74 65 73 74 32 20 20 2d 3e 20 20    db.test2  ->  
2130: 20 2e 2f 74 65 73 74 32 2e 64 62 0a 23 20 20 20   ./test2.db.#   
2140: 20 20 64 62 32 2e 6d 61 69 6e 20 20 2d 3e 20 20    db2.main  ->  
2150: 20 2e 2f 74 65 73 74 32 2e 64 62 0a 23 20 20 20   ./test2.db.#   
2160: 20 20 64 62 32 2e 74 65 73 74 20 20 2d 3e 20 20    db2.test  ->  
2170: 20 2e 2f 74 65 73 74 2e 64 62 0a 23 0a 66 69 6c   ./test.db.#.fil
2180: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
2190: 74 65 73 74 2e 64 62 0a 66 69 6c 65 20 64 65 6c  test.db.file del
21a0: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32  ete -force test2
21b0: 2e 64 62 0a 66 69 6c 65 20 64 65 6c 65 74 65 20  .db.file delete 
21c0: 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 2d  -force test2.db-
21d0: 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74 65 33 20  journal.sqlite3 
21e0: 64 62 20 20 74 65 73 74 2e 64 62 0a 73 71 6c 69  db  test.db.sqli
21f0: 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64 62  te3 db2 test2.db
2200: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
2210: 24 61 76 2e 34 2e 31 2e 31 20 7b 0a 20 20 73 65  $av.4.1.1 {.  se
2220: 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69  t sqlite_open_fi
2230: 6c 65 5f 63 6f 75 6e 74 0a 7d 20 7b 32 7d 0a 64  le_count.} {2}.d
2240: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
2250: 76 2e 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  v.4.1.2 {.  exec
2260: 73 71 6c 20 7b 41 54 54 41 43 48 20 27 74 65 73  sql {ATTACH 'tes
2270: 74 32 2e 64 62 27 20 41 53 20 74 65 73 74 32 7d  t2.db' AS test2}
2280: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70  .  set sqlite_op
2290: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 7d 20  en_file_count.} 
22a0: 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  {2}.do_test shar
22b0: 65 64 2d 24 61 76 2e 34 2e 31 2e 33 20 7b 0a 20  ed-$av.4.1.3 {. 
22c0: 20 65 78 65 63 73 71 6c 20 7b 41 54 54 41 43 48   execsql {ATTACH
22d0: 20 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 65   'test.db' AS te
22e0: 73 74 7d 20 64 62 32 0a 20 20 73 65 74 20 73 71  st} db2.  set sq
22f0: 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  lite_open_file_c
2300: 6f 75 6e 74 0a 7d 20 7b 32 7d 0a 0a 23 20 53 61  ount.} {2}..# Sa
2310: 6e 69 74 79 20 63 68 65 63 6b 3a 20 43 72 65 61  nity check: Crea
2320: 74 65 20 61 20 74 61 62 6c 65 20 69 6e 20 2e 2f  te a table in ./
2330: 74 65 73 74 2e 64 62 20 76 69 61 20 68 61 6e 64  test.db via hand
2340: 6c 65 20 64 62 2c 20 61 6e 64 20 74 65 73 74 20  le db, and test 
2350: 74 68 61 74 20 68 61 6e 64 6c 65 0a 23 20 64 62  that handle.# db
2360: 32 20 63 61 6e 20 22 73 65 65 22 20 74 68 65 20  2 can "see" the 
2370: 6e 65 77 20 74 61 62 6c 65 20 69 6d 6d 65 64 69  new table immedi
2380: 61 74 65 6c 79 2e 20 41 20 68 61 6e 64 6c 65 20  ately. A handle 
2390: 75 73 69 6e 67 20 61 20 73 65 70 65 72 61 74 65  using a seperate
23a0: 20 70 61 67 65 72 0a 23 20 63 61 63 68 65 20 77   pager.# cache w
23b0: 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 72 65 6c  ould have to rel
23c0: 6f 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  oad the database
23d0: 20 73 63 68 65 6d 61 20 62 65 66 6f 72 65 20 74   schema before t
23e0: 68 69 73 20 77 65 72 65 20 70 6f 73 73 69 62 6c  his were possibl
23f0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 68 61  e..#.do_test sha
2400: 72 65 64 2d 24 61 76 2e 34 2e 32 2e 31 20 7b 0a  red-$av.4.2.1 {.
2410: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
2430: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  (a, b, c);.    C
2440: 52 45 41 54 45 20 54 41 42 4c 45 20 64 65 66 28  REATE TABLE def(
2450: 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 49 4e  d, e, f);.    IN
2460: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
2470: 4c 55 45 53 28 27 69 27 2c 20 27 69 69 27 2c 20  LUES('i', 'ii', 
2480: 27 69 69 69 27 29 3b 0a 20 20 20 20 49 4e 53 45  'iii');.    INSE
2490: 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55  RT INTO def VALU
24a0: 45 53 28 27 49 27 2c 20 27 49 49 27 2c 20 27 49  ES('I', 'II', 'I
24b0: 49 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  II');.  }.} {}.d
24c0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
24d0: 76 2e 34 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63  v.4.2.2 {.  exec
24e0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
24f0: 20 2a 20 46 52 4f 4d 20 74 65 73 74 2e 61 62 63   * FROM test.abc
2500: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 69 20 69  ;.  } db2.} {i i
2510: 69 20 69 69 69 7d 0a 0a 23 20 4f 70 65 6e 20 61  i iii}..# Open a
2520: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2530: 6e 20 61 6e 64 20 72 65 61 64 20 66 72 6f 6d 20  n and read from 
2540: 74 61 62 6c 65 20 61 62 63 20 76 69 61 20 68 61  table abc via ha
2550: 6e 64 6c 65 20 32 2e 20 43 68 65 63 6b 20 74 68  ndle 2. Check th
2560: 61 74 0a 23 20 68 61 6e 64 6c 65 20 31 20 63 61  at.# handle 1 ca
2570: 6e 20 72 65 61 64 20 74 61 62 6c 65 20 61 62 63  n read table abc
2580: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 68 61 6e  . Check that han
2590: 64 6c 65 20 31 20 63 61 6e 6e 6f 74 20 6d 6f 64  dle 1 cannot mod
25a0: 69 66 79 20 74 61 62 6c 65 20 61 62 63 0a 23 20  ify table abc.# 
25b0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
25c0: 73 63 68 65 6d 61 2e 20 54 68 65 6e 20 63 68 65  schema. Then 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 20 6d 6f 64 69 66 79 20 74 61 62 6c   can modify tabl
25f0: 65 20 64 65 66 2e 0a 23 0a 64 6f 5f 74 65 73 74  e def..#.do_test
2600: 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 33 2e   shared-$av.4.3.
2610: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
2620: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53      BEGIN;.    S
2630: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73  ELECT * FROM tes
2640: 74 2e 61 62 63 3b 0a 20 20 7d 20 64 62 32 0a 7d  t.abc;.  } db2.}
2650: 20 7b 69 20 69 69 20 69 69 69 7d 0a 64 6f 5f 74   {i ii iii}.do_t
2660: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34  est shared-$av.4
2670: 2e 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  .3.2 {.  catchsq
2680: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
2690: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27  NTO abc VALUES('
26a0: 69 76 27 2c 20 27 76 27 2c 20 27 76 69 27 29 3b  iv', 'v', 'vi');
26b0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62  .  }.} {1 {datab
26c0: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
26d0: 6b 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65  ked: abc}}.do_te
26e0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e  st shared-$av.4.
26f0: 33 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.3 {.  catchsql
2700: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
2710: 42 4c 45 20 67 68 69 28 67 2c 20 68 2c 20 69 29  BLE ghi(g, h, i)
2720: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ;.  }.} {1 {data
2730: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
2740: 63 6b 65 64 3a 20 73 71 6c 69 74 65 5f 6d 61 73  cked: sqlite_mas
2750: 74 65 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  ter}}.do_test sh
2760: 61 72 65 64 2d 24 61 76 2e 34 2e 33 2e 33 20 7b  ared-$av.4.3.3 {
2770: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
2780: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65    INSERT INTO de
2790: 66 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27  f VALUES('IV', '
27a0: 56 27 2c 20 27 56 49 27 29 3b 0a 20 20 7d 0a 7d  V', 'VI');.  }.}
27b0: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
27c0: 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 33 2e 34  shared-$av.4.3.4
27d0: 20 7b 0a 20 20 23 20 43 6c 65 61 6e 75 70 3a 20   {.  # Cleanup: 
27e0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
27f0: 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
2800: 20 64 62 32 2e 0a 20 20 65 78 65 63 73 71 6c 20   db2..  execsql 
2810: 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 0a 20 20 7d  {.    COMMIT.  }
2820: 20 64 62 32 0a 7d 20 7b 7d 0a 0a 23 20 4f 70 65   db2.} {}..# Ope
2830: 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
2840: 63 74 69 6f 6e 20 75 73 69 6e 67 20 68 61 6e 64  ction using hand
2850: 6c 65 20 31 20 61 6e 64 20 6d 6f 64 69 66 79 20  le 1 and modify 
2860: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
2870: 65 6d 61 2e 0a 23 20 54 68 65 6e 20 74 72 79 20  ema..# Then try 
2880: 74 6f 20 65 78 65 63 75 74 65 20 61 20 63 6f 6d  to execute a com
2890: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20  piled statement 
28a0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  to read from the
28b0: 20 73 61 6d 65 20 0a 23 20 64 61 74 61 62 61 73   same .# databas
28c0: 65 20 76 69 61 20 68 61 6e 64 6c 65 20 32 20 28  e via handle 2 (
28d0: 66 61 69 6c 73 20 74 6f 20 67 65 74 20 74 68 65  fails to get the
28e0: 20 6c 6f 63 6b 20 6f 6e 20 73 71 6c 69 74 65 5f   lock on sqlite_
28f0: 6d 61 73 74 65 72 29 2e 20 41 6c 73 6f 0a 23 20  master). Also.# 
2900: 74 72 79 20 74 6f 20 63 6f 6d 70 69 6c 65 20 61  try to compile a
2910: 20 72 65 61 64 20 6f 66 20 74 68 65 20 73 61 6d   read of the sam
2920: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
2930: 20 68 61 6e 64 6c 65 20 32 20 28 61 6c 73 6f 20   handle 2 (also 
2940: 66 61 69 6c 73 29 2e 0a 23 20 46 69 6e 61 6c 6c  fails)..# Finall
2950: 79 2c 20 63 6f 6d 70 69 6c 65 20 61 20 72 65 61  y, compile a rea
2960: 64 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 64  d of the other d
2970: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 68 61  atabase using ha
2980: 6e 64 6c 65 20 32 2e 20 54 68 69 73 0a 23 20 73  ndle 2. This.# s
2990: 68 6f 75 6c 64 20 61 6c 73 6f 20 66 61 69 6c 2e  hould also fail.
29a0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d  .#.ifcapable com
29b0: 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f 74 65 73  pound {.  do_tes
29c0: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 34  t shared-$av.4.4
29d0: 2e 31 2e 32 20 7b 0a 20 20 20 20 23 20 53 61 6e  .1.2 {.    # San
29e0: 69 74 79 20 63 68 65 63 6b 20 31 3a 20 43 68 65  ity check 1: Che
29f0: 63 6b 20 74 68 61 74 20 74 68 65 20 73 63 68 65  ck that the sche
2a00: 6d 61 20 69 73 20 77 68 61 74 20 77 65 20 74 68  ma is what we th
2a10: 69 6e 6b 20 69 74 20 69 73 20 77 68 65 6e 20 76  ink it is when v
2a20: 69 65 77 65 64 0a 20 20 20 20 23 20 76 69 61 20  iewed.    # via 
2a30: 68 61 6e 64 6c 65 20 31 2e 0a 20 20 20 20 65 78  handle 1..    ex
2a40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
2a50: 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74 32  EATE TABLE test2
2a60: 2e 67 68 69 28 67 2c 20 68 2c 20 69 29 3b 0a 20  .ghi(g, h, i);. 
2a70: 20 20 20 20 20 53 45 4c 45 43 54 20 27 74 65 73       SELECT 'tes
2a80: 74 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f  t.db:'||name FRO
2a90: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2aa0: 0a 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  .      UNION ALL
2ab0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 74  .      SELECT 't
2ac0: 65 73 74 32 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20  est2.db:'||name 
2ad0: 46 52 4f 4d 20 74 65 73 74 32 2e 73 71 6c 69 74  FROM test2.sqlit
2ae0: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a  e_master;.    }.
2af0: 20 20 7d 20 7b 74 65 73 74 2e 64 62 3a 61 62 63    } {test.db:abc
2b00: 20 74 65 73 74 2e 64 62 3a 64 65 66 20 74 65 73   test.db:def tes
2b10: 74 32 2e 64 62 3a 67 68 69 7d 0a 20 20 64 6f 5f  t2.db:ghi}.  do_
2b20: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
2b30: 34 2e 34 2e 31 2e 32 20 7b 0a 20 20 20 20 23 20  4.4.1.2 {.    # 
2b40: 53 61 6e 69 74 79 20 63 68 65 63 6b 20 32 3a 20  Sanity check 2: 
2b50: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73  Check that the s
2b60: 63 68 65 6d 61 20 69 73 20 77 68 61 74 20 77 65  chema is what we
2b70: 20 74 68 69 6e 6b 20 69 74 20 69 73 20 77 68 65   think it is whe
2b80: 6e 20 76 69 65 77 65 64 0a 20 20 20 20 23 20 76  n viewed.    # v
2b90: 69 61 20 68 61 6e 64 6c 65 20 32 2e 0a 20 20 20  ia handle 2..   
2ba0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2bb0: 20 53 45 4c 45 43 54 20 27 74 65 73 74 32 2e 64   SELECT 'test2.d
2bc0: 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 73  b:'||name FROM s
2bd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
2be0: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
2bf0: 20 20 20 20 53 45 4c 45 43 54 20 27 74 65 73 74      SELECT 'test
2c00: 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d  .db:'||name FROM
2c10: 20 74 65 73 74 2e 73 71 6c 69 74 65 5f 6d 61 73   test.sqlite_mas
2c20: 74 65 72 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20  ter;.    } db2. 
2c30: 20 7d 20 7b 74 65 73 74 32 2e 64 62 3a 67 68 69   } {test2.db:ghi
2c40: 20 74 65 73 74 2e 64 62 3a 61 62 63 20 74 65 73   test.db:abc tes
2c50: 74 2e 64 62 3a 64 65 66 7d 0a 7d 0a 0a 64 6f 5f  t.db:def}.}..do_
2c60: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
2c70: 34 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a  4.4.2 {.  set ::
2c80: 44 42 32 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e  DB2 [sqlite3_con
2c90: 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20  nection_pointer 
2ca0: 64 62 32 5d 0a 20 20 73 65 74 20 73 71 6c 20 7b  db2].  set sql {
2cb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
2cc0: 63 7d 0a 20 20 73 65 74 20 3a 3a 53 54 4d 54 31  c}.  set ::STMT1
2cd0: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
2ce0: 65 20 24 3a 3a 44 42 32 20 24 73 71 6c 20 2d 31  e $::DB2 $sql -1
2cf0: 20 44 55 4d 4d 59 5d 0a 20 20 65 78 65 63 73 71   DUMMY].  execsq
2d00: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
2d10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2d20: 6a 6b 6c 28 6a 2c 20 6b 2c 20 6c 29 3b 0a 20 20  jkl(j, k, l);.  
2d30: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  }.  sqlite3_step
2d40: 20 24 3a 3a 53 54 4d 54 31 0a 7d 20 7b 53 51 4c   $::STMT1.} {SQL
2d50: 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65  ITE_ERROR}.do_te
2d60: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e  st shared-$av.4.
2d70: 34 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  4.3 {.  sqlite3_
2d80: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54  finalize $::STMT
2d90: 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b  1.} {SQLITE_LOCK
2da0: 45 44 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  ED}.do_test shar
2db0: 65 64 2d 24 61 76 2e 34 2e 34 2e 34 20 7b 0a 20  ed-$av.4.4.4 {. 
2dc0: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
2dd0: 0a 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 31  .    set ::STMT1
2de0: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
2df0: 65 20 24 3a 3a 44 42 32 20 24 73 71 6c 20 2d 31  e $::DB2 $sql -1
2e00: 20 44 55 4d 4d 59 5d 0a 20 20 7d 20 6d 73 67 5d   DUMMY].  } msg]
2e10: 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67  .  list $rc $msg
2e20: 0a 7d 20 7b 31 20 7b 28 36 29 20 64 61 74 61 62  .} {1 {(6) datab
2e30: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  ase schema is lo
2e40: 63 6b 65 64 3a 20 74 65 73 74 7d 7d 0a 64 6f 5f  cked: test}}.do_
2e50: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
2e60: 34 2e 34 2e 35 20 7b 0a 20 20 73 65 74 20 72 63  4.4.5 {.  set rc
2e70: 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 73 65   [catch {.    se
2e80: 74 20 3a 3a 53 54 4d 54 31 20 5b 73 71 6c 69 74  t ::STMT1 [sqlit
2e90: 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a 44 42  e3_prepare $::DB
2ea0: 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  2 "SELECT * FROM
2eb0: 20 67 68 69 22 20 2d 31 20 44 55 4d 4d 59 5d 0a   ghi" -1 DUMMY].
2ec0: 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20    } msg].  list 
2ed0: 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 28  $rc $msg.} {1 {(
2ee0: 36 29 20 64 61 74 61 62 61 73 65 20 73 63 68 65  6) database sche
2ef0: 6d 61 20 69 73 20 6c 6f 63 6b 65 64 3a 20 74 65  ma is locked: te
2f00: 73 74 7d 7d 0a 0a 0a 63 61 74 63 68 20 7b 64 62  st}}...catch {db
2f10: 32 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b  2 close}.catch {
2f20: 64 62 20 63 6c 6f 73 65 7d 0a 0a 23 2d 2d 2d 2d  db close}..#----
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 73  ------.# Tests s
2f80: 68 61 72 65 64 2d 35 2e 2a 20 0a 23 0a 66 6f 72  hared-5.* .#.for
2f90: 65 61 63 68 20 64 62 20 5b 6c 69 73 74 20 74 65  each db [list te
2fa0: 73 74 2e 64 62 20 74 65 73 74 31 2e 64 62 20 74  st.db test1.db t
2fb0: 65 73 74 32 2e 64 62 20 74 65 73 74 33 2e 64 62  est2.db test3.db
2fc0: 5d 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  ] {.  file delet
2fd0: 65 20 2d 66 6f 72 63 65 20 24 64 62 20 24 7b 64  e -force $db ${d
2fe0: 62 7d 2d 6a 6f 75 72 6e 61 6c 0a 7d 0a 64 6f 5f  b}-journal.}.do_
2ff0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
3000: 35 2e 31 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  5.1.1 {.  sqlite
3010: 33 20 64 62 31 20 74 65 73 74 2e 64 62 0a 20 20  3 db1 test.db.  
3020: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
3030: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
3040: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
3050: 31 2e 64 62 27 20 41 53 20 74 65 73 74 31 3b 0a  1.db' AS test1;.
3060: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
3070: 32 2e 64 62 27 20 41 53 20 74 65 73 74 32 3b 0a  2.db' AS test2;.
3080: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
3090: 33 2e 64 62 27 20 41 53 20 74 65 73 74 33 3b 0a  3.db' AS test3;.
30a0: 20 20 7d 20 64 62 31 0a 20 20 65 78 65 63 73 71    } db1.  execsq
30b0: 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27  l {.    ATTACH '
30c0: 74 65 73 74 33 2e 64 62 27 20 41 53 20 74 65 73  test3.db' AS tes
30d0: 74 33 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27  t3;.    ATTACH '
30e0: 74 65 73 74 32 2e 64 62 27 20 41 53 20 74 65 73  test2.db' AS tes
30f0: 74 32 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27  t2;.    ATTACH '
3100: 74 65 73 74 31 2e 64 62 27 20 41 53 20 74 65 73  test1.db' AS tes
3110: 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d  t1;.  } db2.} {}
3120: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
3130: 24 61 76 2e 35 2e 31 2e 32 20 7b 0a 20 20 65 78  $av.5.1.2 {.  ex
3140: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3150: 54 45 20 54 41 42 4c 45 20 74 65 73 74 31 2e 74  TE TABLE test1.t
3160: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
3170: 41 54 45 20 49 4e 44 45 58 20 74 65 73 74 31 2e  ATE INDEX test1.
3180: 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a  i1 ON t1(a, b);.
3190: 20 20 7d 20 64 62 31 0a 7d 20 7b 7d 0a 69 66 63    } db1.} {}.ifc
31a0: 61 70 61 62 6c 65 20 76 69 65 77 20 7b 0a 20 20  apable view {.  
31b0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
31c0: 61 76 2e 35 2e 31 2e 33 20 7b 0a 20 20 20 20 65  av.5.1.3 {.    e
31d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
31e0: 52 45 41 54 45 20 56 49 45 57 20 74 65 73 74 31  REATE VIEW test1
31f0: 2e 76 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20  .v1 AS SELECT * 
3200: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20 64  FROM t1;.    } d
3210: 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61  b1.  } {}.}.ifca
3220: 70 61 62 6c 65 20 74 72 69 67 67 65 72 20 7b 0a  pable trigger {.
3230: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
3240: 2d 24 61 76 2e 35 2e 31 2e 34 20 7b 0a 20 20 20  -$av.5.1.4 {.   
3250: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3260: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
3270: 74 65 73 74 31 2e 74 72 69 67 31 20 41 46 54 45  test1.trig1 AFTE
3280: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42  R INSERT ON t1 B
3290: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53  EGIN.        INS
32a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
32b0: 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29  ES(new.a, new.b)
32c0: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20  ;.      END;.   
32d0: 20 7d 20 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a   } db1.  } {}.}.
32e0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
32f0: 61 76 2e 35 2e 31 2e 35 20 7b 0a 20 20 65 78 65  av.5.1.5 {.  exe
3300: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
3310: 49 4e 44 45 58 20 69 31 3b 0a 20 20 7d 20 64 62  INDEX i1;.  } db
3320: 32 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65  2.} {}.ifcapable
3330: 20 76 69 65 77 20 7b 0a 20 20 64 6f 5f 74 65 73   view {.  do_tes
3340: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 35 2e 31  t shared-$av.5.1
3350: 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .6 {.    execsql
3360: 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 56 49   {.      DROP VI
3370: 45 57 20 76 31 3b 0a 20 20 20 20 7d 20 64 62 32  EW v1;.    } db2
3380: 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61 70 61  .  } {}.}.ifcapa
3390: 62 6c 65 20 74 72 69 67 67 65 72 20 7b 0a 20 20  ble trigger {.  
33a0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
33b0: 61 76 2e 35 2e 31 2e 37 20 7b 0a 20 20 20 20 65  av.5.1.7 {.    e
33c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44  xecsql {.      D
33d0: 52 4f 50 20 54 52 49 47 47 45 52 20 74 72 69 67  ROP TRIGGER trig
33e0: 31 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d  1;.    } db2.  }
33f0: 20 7b 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68   {}.}.do_test sh
3400: 61 72 65 64 2d 24 61 76 2e 35 2e 31 2e 38 20 7b  ared-$av.5.1.8 {
3410: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3420: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a   DROP TABLE t1;.
3430: 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 69 66 63    } db2.} {}.ifc
3440: 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  apable compound 
3450: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  {.  do_test shar
3460: 65 64 2d 24 61 76 2e 35 2e 31 2e 39 20 7b 0a 20  ed-$av.5.1.9 {. 
3470: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3480: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3490: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55   sqlite_master U
34a0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
34b0: 2a 20 46 52 4f 4d 20 74 65 73 74 31 2e 73 71 6c  * FROM test1.sql
34c0: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 7d  ite_master.    }
34d0: 20 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23   db1.  } {}.}..#
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
3530: 74 73 20 73 68 61 72 65 64 2d 36 2e 2a 20 74 65  ts shared-6.* te
3540: 73 74 20 74 68 61 74 20 61 20 71 75 65 72 79 20  st that a query 
3550: 6f 62 74 61 69 6e 73 20 61 6c 6c 20 74 68 65 20  obtains all the 
3560: 72 65 61 64 2d 6c 6f 63 6b 73 20 69 74 20 6e 65  read-locks it ne
3570: 65 64 73 0a 23 20 62 65 66 6f 72 65 20 73 74 61  eds.# before sta
3580: 72 74 69 6e 67 20 65 78 65 63 75 74 69 6f 6e 20  rting execution 
3590: 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 54 68  of the query. Th
35a0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
35b0: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
35c0: 0a 23 20 73 6f 6d 65 20 72 6f 77 73 20 6f 66 20  .# some rows of 
35d0: 64 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65 74  data will be ret
35e0: 75 72 6e 65 64 20 62 65 66 6f 72 65 20 61 20 6c  urned before a l
35f0: 6f 63 6b 20 66 61 69 6c 73 20 61 6e 64 20 53 51  ock fails and SQ
3600: 4c 49 54 45 5f 4c 4f 43 4b 0a 23 20 69 73 20 72  LITE_LOCK.# is r
3610: 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 74 65  eturned..#.do_te
3620: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 36 2e  st shared-$av.6.
3630: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
3640: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
3650: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
3660: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
3670: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
3680: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3690: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
36a0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
36b0: 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 20 64 62  ES(3, 4);.  } db
36c0: 31 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65  1.} {}.ifcapable
36d0: 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f   compound {.  do
36e0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
36f0: 2e 36 2e 31 2e 32 20 7b 0a 20 20 20 20 65 78 65  .6.1.2 {.    exe
3700: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
3710: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e  ECT * FROM t1 UN
3720: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
3730: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 20   FROM t2;.    } 
3740: 64 62 32 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  db2.  } {1 2 3 4
3750: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  }.}.do_test shar
3760: 65 64 2d 24 61 76 2e 36 2e 31 2e 33 20 7b 0a 20  ed-$av.6.1.3 {. 
3770: 20 23 20 45 73 74 61 62 6c 69 73 68 20 61 20 77   # Establish a w
3780: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 61 62  rite lock on tab
3790: 6c 65 20 74 32 20 76 69 61 20 63 6f 6e 6e 65 63  le t2 via connec
37a0: 74 69 6f 6e 20 64 62 32 2e 20 54 68 65 6e 20 6d  tion db2. Then m
37b0: 61 6b 65 20 61 20 0a 20 20 23 20 55 4e 49 4f 4e  ake a .  # UNION
37c0: 20 61 6c 6c 20 71 75 65 72 79 20 75 73 69 6e 67   all query using
37d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 31 20   connection db1 
37e0: 74 68 61 74 20 66 69 72 73 74 20 61 63 63 65 73  that first acces
37f0: 73 65 73 20 74 31 2c 20 66 6f 6c 6c 6f 77 65 64  ses t1, followed
3800: 20 0a 20 20 23 20 62 79 20 74 32 2e 20 49 66 20   .  # by t2. If 
3810: 74 68 65 20 6c 6f 63 6b 73 20 61 72 65 20 67 72  the locks are gr
3820: 61 62 62 65 64 20 61 74 20 74 68 65 20 73 74 61  abbed at the sta
3830: 72 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  rt of the statem
3840: 65 6e 74 20 28 61 73 20 0a 20 20 23 20 74 68 65  ent (as .  # the
3850: 79 20 73 68 6f 75 6c 64 20 62 65 29 2c 20 6e 6f  y should be), no
3860: 20 72 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e   rows are return
3870: 65 64 2e 20 49 66 20 28 61 73 20 77 61 73 20 70  ed. If (as was p
3880: 72 65 76 69 6f 75 73 6c 79 20 74 68 65 20 63 61  reviously the ca
3890: 73 65 29 0a 20 20 23 20 74 68 65 79 20 61 72 65  se).  # they are
38a0: 20 67 72 61 62 62 65 64 20 61 73 20 74 68 65 20   grabbed as the 
38b0: 74 61 62 6c 65 73 20 61 72 65 20 61 63 63 65 73  tables are acces
38c0: 73 65 64 2c 20 74 68 65 20 74 31 20 72 6f 77 73  sed, the t1 rows
38d0: 20 77 69 6c 6c 20 62 65 20 0a 20 20 23 20 72 65   will be .  # re
38e0: 74 75 72 6e 65 64 20 62 65 66 6f 72 65 20 74 68  turned before th
38f0: 65 20 71 75 65 72 79 20 66 61 69 6c 73 2e 0a 20  e query fails.. 
3900: 20 23 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   #.  execsql {. 
3910: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
3920: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
3930: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 7d 20 64  UES(5, 6);.  } d
3940: 62 32 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69  b2.  set ret [li
3950: 73 74 5d 0a 20 20 63 61 74 63 68 20 7b 0a 20 20  st].  catch {.  
3960: 20 20 64 62 31 20 65 76 61 6c 20 7b 53 45 4c 45    db1 eval {SELE
3970: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT * FROM t1 UNI
3980: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20  ON ALL SELECT * 
3990: 46 52 4f 4d 20 74 32 7d 20 7b 0a 20 20 20 20 20  FROM t2} {.     
39a0: 20 6c 61 70 70 65 6e 64 20 72 65 74 20 24 61 20   lappend ret $a 
39b0: 24 62 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  $b.    }.  }.  s
39c0: 65 74 20 72 65 74 0a 7d 20 7b 7d 0a 64 6f 5f 74  et ret.} {}.do_t
39d0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 36  est shared-$av.6
39e0: 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.4 {.  execsql
39f0: 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20   {.    COMMIT;. 
3a00: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
3a10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3a20: 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d 20 64  UES(7, 8);.  } d
3a30: 62 32 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69  b2.  set ret [li
3a40: 73 74 5d 0a 20 20 63 61 74 63 68 20 7b 0a 20 20  st].  catch {.  
3a50: 20 20 64 62 31 20 65 76 61 6c 20 7b 0a 20 20 20    db1 eval {.   
3a60: 20 20 20 53 45 4c 45 43 54 20 28 43 41 53 45 20     SELECT (CASE 
3a70: 57 48 45 4e 20 61 3e 34 20 54 48 45 4e 20 28 53  WHEN a>4 THEN (S
3a80: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 29  ELECT a FROM t1)
3a90: 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20   ELSE 0 END) AS 
3aa0: 64 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  d FROM t2;.    }
3ab0: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
3ac0: 20 72 65 74 20 24 64 0a 20 20 20 20 7d 0a 20 20   ret $d.    }.  
3ad0: 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d 20 7b 7d  }.  set ret.} {}
3ae0: 0a 0a 63 61 74 63 68 20 7b 64 62 31 20 63 6c 6f  ..catch {db1 clo
3af0: 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 32 20 63  se}.catch {db2 c
3b00: 6c 6f 73 65 7d 0a 66 6f 72 65 61 63 68 20 66 20  lose}.foreach f 
3b10: 5b 6c 69 73 74 20 74 65 73 74 2e 64 62 20 74 65  [list test.db te
3b20: 73 74 32 2e 64 62 5d 20 7b 0a 20 20 66 69 6c 65  st2.db] {.  file
3b30: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24   delete -force $
3b40: 66 20 24 7b 66 7d 2d 6a 6f 75 72 6e 61 6c 0a 7d  f ${f}-journal.}
3b50: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3ba0: 54 65 73 74 73 20 73 68 61 72 65 64 2d 37 2e 2a  Tests shared-7.*
3bb0: 20 74 65 73 74 20 61 75 74 6f 2d 76 61 63 75 75   test auto-vacuu
3bc0: 6d 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c  m does not inval
3bd0: 69 64 61 74 65 20 63 75 72 73 6f 72 73 20 66 72  idate cursors fr
3be0: 6f 6d 0a 23 20 6f 74 68 65 72 20 73 68 61 72 65  om.# other share
3bf0: 64 2d 63 61 63 68 65 20 75 73 65 72 73 20 77 68  d-cache users wh
3c00: 65 6e 20 69 74 20 72 65 6f 72 67 61 6e 69 7a 65  en it reorganize
3c10: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
3c20: 6e 20 0a 23 20 43 4f 4d 4d 49 54 2e 0a 23 0a 64  n .# COMMIT..#.d
3c30: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
3c40: 76 2e 37 2e 31 20 7b 0a 20 20 23 20 54 68 69 73  v.7.1 {.  # This
3c50: 20 74 65 73 74 20 63 61 73 65 20 73 65 74 73 20   test case sets 
3c60: 75 70 20 61 20 74 65 73 74 20 64 61 74 61 62 61  up a test databa
3c70: 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  se in auto-vacuu
3c80: 6d 20 6d 6f 64 65 20 63 6f 6e 73 69 73 74 69 6e  m mode consistin
3c90: 67 20 0a 20 20 23 20 6f 66 20 74 77 6f 20 74 61  g .  # of two ta
3ca0: 62 6c 65 73 2c 20 74 31 20 61 6e 64 20 74 32 2e  bles, t1 and t2.
3cb0: 20 42 6f 74 68 20 68 61 76 65 20 61 20 73 69 6e   Both have a sin
3cc0: 67 6c 65 20 69 6e 64 65 78 2e 20 54 61 62 6c 65  gle index. Table
3cd0: 20 74 31 20 69 73 20 0a 20 20 23 20 70 6f 70 75   t1 is .  # popu
3ce0: 6c 61 74 65 64 20 66 69 72 73 74 20 28 73 6f 20  lated first (so 
3cf0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
3d00: 73 20 74 6f 77 61 72 64 20 74 68 65 20 73 74 61  s toward the sta
3d10: 72 74 20 6f 66 20 74 68 65 20 64 62 20 66 69 6c  rt of the db fil
3d20: 65 29 2c 20 0a 20 20 23 20 74 32 20 73 65 63 6f  e), .  # t2 seco
3d30: 6e 64 20 28 70 61 67 65 73 20 74 6f 77 61 72 64  nd (pages toward
3d40: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3d50: 66 69 6c 65 29 2e 20 0a 20 20 73 71 6c 69 74 65  file). .  sqlite
3d60: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73  3 db test.db.  s
3d70: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
3d80: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
3d90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52     BEGIN;.    CR
3da0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
3db0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
3dc0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3dd0: 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b  E t2(a PRIMARY K
3de0: 45 59 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 73 65  EY, b);.  }.  se
3df0: 74 20 3a 3a 63 6f 6e 74 65 6e 74 73 20 7b 7d 0a  t ::contents {}.
3e00: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
3e10: 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72  {$i < 100} {incr
3e20: 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 61 20   i} {.    set a 
3e30: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22  [string repeat "
3e40: 24 69 20 22 20 32 30 5d 0a 20 20 20 20 73 65 74  $i " 20].    set
3e50: 20 62 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   b [string repea
3e60: 74 20 22 24 69 20 22 20 32 30 5d 0a 20 20 20 20  t "$i " 20].    
3e70: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20  db eval {.      
3e80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3e90: 41 4c 55 45 53 28 3a 61 2c 20 3a 62 29 3b 0a 20  ALUES(:a, :b);. 
3ea0: 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64     }.    lappend
3eb0: 20 3a 3a 63 6f 6e 74 65 6e 74 73 20 5b 6c 69 73   ::contents [lis
3ec0: 74 20 5b 65 78 70 72 20 24 69 2b 31 5d 20 24 61  t [expr $i+1] $a
3ed0: 20 24 62 5d 0a 20 20 7d 0a 20 20 65 78 65 63 73   $b].  }.  execs
3ee0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
3ef0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
3f00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f   FROM t1;.    CO
3f10: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  MMIT;.  }.} {}.d
3f20: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
3f30: 76 2e 37 2e 32 20 7b 0a 20 20 23 20 54 68 69 73  v.7.2 {.  # This
3f40: 20 74 65 73 74 20 63 61 73 65 20 64 65 6c 65 74   test case delet
3f50: 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
3f60: 6f 66 20 74 61 62 6c 65 20 74 31 20 28 74 68 65  of table t1 (the
3f70: 20 6f 6e 65 20 61 74 20 74 68 65 20 73 74 61 72   one at the star
3f80: 74 20 6f 66 0a 20 20 23 20 74 68 65 20 66 69 6c  t of.  # the fil
3f90: 65 29 20 77 68 69 6c 65 20 6d 61 6e 79 20 63 75  e) while many cu
3fa0: 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
3fb0: 6e 20 74 61 62 6c 65 20 74 32 20 61 6e 64 20 69  n table t2 and i
3fc0: 74 27 73 20 69 6e 64 65 78 2e 20 41 6c 6c 20 6f  t's index. All o
3fd0: 66 0a 20 20 23 20 74 68 65 20 6e 6f 6e 2d 72 6f  f.  # the non-ro
3fe0: 6f 74 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  ot pages will be
3ff0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
4000: 65 6e 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  end to the start
4010: 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 23   of the file.  #
4020: 20 77 68 65 6e 20 74 68 65 20 44 45 4c 45 54 45   when the DELETE
4030: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 2d 20   is committed - 
4040: 74 68 69 73 20 74 65 73 74 20 76 65 72 69 66 69  this test verifi
4050: 65 73 20 74 68 61 74 20 6d 6f 76 69 6e 67 20 74  es that moving t
4060: 68 65 20 70 61 67 65 73 0a 20 20 23 20 64 6f 65  he pages.  # doe
4070: 73 20 6e 6f 74 20 64 69 73 74 75 72 62 20 74 68  s not disturb th
4080: 65 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  e open cursors..
4090: 20 20 23 0a 0a 20 20 70 72 6f 63 20 6c 6f 63 6b    #..  proc lock
40a0: 72 6f 77 20 7b 64 62 20 74 62 6c 20 6f 69 64 73  row {db tbl oids
40b0: 20 62 6f 64 79 7d 20 7b 0a 20 20 20 20 73 65 74   body} {.    set
40c0: 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 20 20   ret [list].    
40d0: 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20  db eval "SELECT 
40e0: 6f 69 64 20 41 53 20 69 2c 20 61 2c 20 62 20 46  oid AS i, a, b F
40f0: 52 4f 4d 20 24 74 62 6c 20 4f 52 44 45 52 20 42  ROM $tbl ORDER B
4100: 59 20 61 22 20 7b 0a 20 20 20 20 20 20 69 66 20  Y a" {.      if 
4110: 7b 24 69 3d 3d 5b 6c 69 6e 64 65 78 20 24 6f 69  {$i==[lindex $oi
4120: 64 73 20 30 5d 7d 20 7b 0a 20 20 20 20 20 20 20  ds 0]} {.       
4130: 20 73 65 74 20 6e 6f 69 64 73 20 5b 6c 72 61 6e   set noids [lran
4140: 67 65 20 24 6f 69 64 73 20 31 20 65 6e 64 5d 0a  ge $oids 1 end].
4150: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
4160: 6e 67 74 68 20 24 6e 6f 69 64 73 5d 3d 3d 30 7d  ngth $noids]==0}
4170: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
4180: 20 73 75 62 72 65 74 20 5b 65 76 61 6c 20 24 62   subret [eval $b
4190: 6f 64 79 5d 0a 20 20 20 20 20 20 20 20 7d 20 65  ody].        } e
41a0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
41b0: 73 65 74 20 73 75 62 72 65 74 20 5b 6c 6f 63 6b  set subret [lock
41c0: 72 6f 77 20 24 64 62 20 24 74 62 6c 20 24 6e 6f  row $db $tbl $no
41d0: 69 64 73 20 24 62 6f 64 79 5d 0a 20 20 20 20 20  ids $body].     
41e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
41f0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 5b     lappend ret [
4200: 6c 69 73 74 20 24 69 20 24 61 20 24 62 5d 0a 20  list $i $a $b]. 
4210: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4220: 5b 6c 69 6e 73 65 72 74 20 24 73 75 62 72 65 74  [linsert $subret
4230: 20 30 20 24 72 65 74 5d 0a 20 20 7d 0a 20 20 70   0 $ret].  }.  p
4240: 72 6f 63 20 6c 6f 63 6b 74 62 6c 72 6f 77 73 20  roc locktblrows 
4250: 7b 64 62 20 74 62 6c 20 62 6f 64 79 7d 20 7b 0a  {db tbl body} {.
4260: 20 20 20 20 73 65 74 20 6f 69 64 73 20 5b 64 62      set oids [db
4270: 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 6f 69   eval "SELECT oi
4280: 64 20 46 52 4f 4d 20 24 74 62 6c 22 5d 0a 20 20  d FROM $tbl"].  
4290: 20 20 6c 6f 63 6b 72 6f 77 20 24 64 62 20 24 74    lockrow $db $t
42a0: 62 6c 20 24 6f 69 64 73 20 24 62 6f 64 79 0a 20  bl $oids $body. 
42b0: 20 7d 0a 0a 20 20 73 65 74 20 73 63 61 6e 73 20   }..  set scans 
42c0: 5b 6c 6f 63 6b 74 62 6c 72 6f 77 73 20 64 62 20  [locktblrows db 
42d0: 74 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  t2 {.    execsql
42e0: 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20   {.      DELETE 
42f0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20 64  FROM t1;.    } d
4300: 62 32 0a 20 20 7d 5d 0a 20 20 73 65 74 20 65 72  b2.  }].  set er
4310: 72 6f 72 20 30 0a 0a 20 20 23 20 54 65 73 74 20  ror 0..  # Test 
4320: 74 68 61 74 20 65 61 63 68 20 53 45 4c 45 43 54  that each SELECT
4330: 20 71 75 65 72 79 20 72 65 74 75 72 6e 65 64 20   query returned 
4340: 74 68 65 20 65 78 70 65 63 74 65 64 20 63 6f 6e  the expected con
4350: 74 65 6e 74 73 20 6f 66 20 74 32 2e 0a 20 20 66  tents of t2..  f
4360: 6f 72 65 61 63 68 20 73 20 24 73 63 61 6e 73 20  oreach s $scans 
4370: 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 73 6f 72 74  {.    if {[lsort
4380: 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 64 65 78   -integer -index
4390: 20 30 20 24 73 5d 21 3d 24 3a 3a 63 6f 6e 74 65   0 $s]!=$::conte
43a0: 6e 74 73 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  nts} {.      set
43b0: 20 65 72 72 6f 72 20 31 0a 20 20 20 20 7d 0a 20   error 1.    }. 
43c0: 20 7d 0a 20 20 73 65 74 20 65 72 72 6f 72 0a 7d   }.  set error.}
43d0: 20 7b 30 7d 0a 0a 63 61 74 63 68 20 7b 64 62 20   {0}..catch {db 
43e0: 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62  close}.catch {db
43f0: 32 20 63 6c 6f 73 65 7d 0a 75 6e 73 65 74 20 2d  2 close}.unset -
4400: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 63 6f 6e 74 65  nocomplain conte
4410: 6e 74 73 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  nts..#----------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4460: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
4470: 20 74 65 73 74 73 20 74 72 79 20 74 6f 20 74 72   tests try to tr
4480: 69 63 6b 20 74 68 65 20 73 68 61 72 65 64 2d 63  ick the shared-c
4490: 61 63 68 65 20 63 6f 64 65 20 69 6e 74 6f 20 61  ache code into a
44a0: 73 73 75 6d 69 6e 67 0a 23 20 74 68 65 20 77 72  ssuming.# the wr
44b0: 6f 6e 67 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ong encoding for
44c0: 20 61 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 66   a database..#.f
44d0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
44e0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
44f0: 62 2d 6a 6f 75 72 6e 61 6c 0a 69 66 63 61 70 61  b-journal.ifcapa
4500: 62 6c 65 20 75 74 66 31 36 20 7b 0a 20 20 64 6f  ble utf16 {.  do
4510: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
4520: 2e 38 2e 31 2e 31 20 7b 0a 20 20 20 20 73 71 6c  .8.1.1 {.    sql
4530: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
4540: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4550: 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64      PRAGMA encod
4560: 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27 3b 0a  ing = 'UTF-16';.
4570: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4580: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
4590: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  r;.    }.  } {}.
45a0: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
45b0: 2d 24 61 76 2e 38 2e 31 2e 32 20 7b 0a 20 20 20  -$av.8.1.2 {.   
45c0: 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 65   string range [e
45d0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 65  xecsql {PRAGMA e
45e0: 6e 63 6f 64 69 6e 67 3b 7d 5d 20 30 20 65 6e 64  ncoding;}] 0 end
45f0: 2d 32 0a 20 20 7d 20 7b 55 54 46 2d 31 36 7d 0a  -2.  } {UTF-16}.
4600: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
4610: 2d 24 61 76 2e 38 2e 31 2e 33 20 7b 0a 20 20 20  -$av.8.1.3 {.   
4620: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
4630: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
4640: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
4650: 65 6e 63 6f 64 69 6e 67 20 3d 20 27 55 54 46 2d  encoding = 'UTF-
4660: 38 27 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  8';.      CREATE
4670: 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c   TABLE abc(a, b,
4680: 20 63 29 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20   c);.    } db2. 
4690: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
46a0: 73 68 61 72 65 64 2d 24 61 76 2e 38 2e 31 2e 34  shared-$av.8.1.4
46b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
46c0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
46d0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
46e0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 22 74  er;.    }.  } "t
46f0: 61 62 6c 65 20 61 62 63 20 61 62 63 20 5b 65 78  able abc abc [ex
4700: 70 72 20 24 41 55 54 4f 56 41 43 55 55 4d 3f 33  pr $AUTOVACUUM?3
4710: 3a 32 5d 20 7b 43 52 45 41 54 45 20 54 41 42 4c  :2] {CREATE TABL
4720: 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 7d 22  E abc(a, b, c)}"
4730: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
4740: 64 2d 24 61 76 2e 38 2e 31 2e 35 20 7b 0a 20 20  d-$av.8.1.5 {.  
4750: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20    db2 close.    
4760: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
4770: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 3b  PRAGMA encoding;
4780: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 55 54 46 2d  .    }.  } {UTF-
4790: 38 7d 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65  8}.  file delete
47a0: 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62   -force test2.db
47b0: 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61   test2.db-journa
47c0: 6c 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  l.  do_test shar
47d0: 65 64 2d 24 61 76 2e 38 2e 32 2e 31 20 7b 0a 20  ed-$av.8.2.1 {. 
47e0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
47f0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
4800: 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20  .db' AS aux;.   
4810: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4820: 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74   aux.sqlite_mast
4830: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  er;.    }.  } {}
4840: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
4850: 64 2d 24 61 76 2e 38 2e 32 2e 32 20 7b 0a 20 20  d-$av.8.2.2 {.  
4860: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
4870: 73 74 32 2e 64 62 0a 20 20 20 20 65 78 65 63 73  st2.db.    execs
4880: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
4890: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 55 54  A encoding = 'UT
48a0: 46 2d 31 36 27 3b 0a 20 20 20 20 20 20 43 52 45  F-16';.      CRE
48b0: 41 54 45 20 54 41 42 4c 45 20 64 65 66 28 64 2c  ATE TABLE def(d,
48c0: 20 65 2c 20 66 29 3b 0a 20 20 20 20 7d 20 64 62   e, f);.    } db
48d0: 32 0a 20 20 20 20 73 74 72 69 6e 67 20 72 61 6e  2.    string ran
48e0: 67 65 20 5b 65 78 65 63 73 71 6c 20 7b 50 52 41  ge [execsql {PRA
48f0: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 3b 7d 20 64  GMA encoding;} d
4900: 62 32 5d 20 30 20 65 6e 64 2d 32 0a 20 20 7d 20  b2] 0 end-2.  } 
4910: 7b 55 54 46 2d 31 36 7d 0a 20 20 64 6f 5f 74 65  {UTF-16}.  do_te
4920: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 38 2e  st shared-$av.8.
4930: 32 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73  2.3 {.    catchs
4940: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
4950: 54 20 2a 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c  T * FROM aux.sql
4960: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
4970: 7d 0a 20 20 7d 20 7b 31 20 7b 61 74 74 61 63 68  }.  } {1 {attach
4980: 65 64 20 64 61 74 61 62 61 73 65 73 20 6d 75 73  ed databases mus
4990: 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 74  t use the same t
49a0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20  ext encoding as 
49b0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 7d 7d 0a  main database}}.
49c0: 7d 0a 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  }..catch {db clo
49d0: 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 32 20 63  se}.catch {db2 c
49e0: 6c 6f 73 65 7d 0a 66 69 6c 65 20 64 65 6c 65 74  lose}.file delet
49f0: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
4a00: 20 74 65 73 74 32 2e 64 62 0a 0a 23 2d 2d 2d 2d   test2.db..#----
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
4a60: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20  llowing tests - 
4a70: 73 68 61 72 65 64 2d 39 2e 2a 20 2d 20 74 65 73  shared-9.* - tes
4a80: 74 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 20 62  t interactions b
4a90: 65 74 77 65 65 6e 20 54 45 4d 50 20 74 72 69 67  etween TEMP trig
4aa0: 67 65 72 73 0a 23 20 61 6e 64 20 73 68 61 72 65  gers.# and share
4ab0: 64 2d 73 63 68 65 6d 61 73 2e 0a 23 0a 69 66 63  d-schemas..#.ifc
4ac0: 61 70 61 62 6c 65 20 74 72 69 67 67 65 72 26 26  apable trigger&&
4ad0: 74 65 6d 70 64 62 20 7b 0a 0a 64 6f 5f 74 65 73  tempdb {..do_tes
4ae0: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 39 2e 31  t shared-$av.9.1
4af0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
4b00: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
4b10: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
4b20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
4b30: 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61  EATE TABLE abc(a
4b40: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
4b50: 41 54 45 20 54 41 42 4c 45 20 61 62 63 5f 6d 69  ATE TABLE abc_mi
4b60: 72 72 6f 72 28 61 2c 20 62 2c 20 63 29 3b 0a 20  rror(a, b, c);. 
4b70: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
4b80: 52 49 47 47 45 52 20 42 45 46 4f 52 45 20 49 4e  RIGGER BEFORE IN
4b90: 53 45 52 54 20 4f 4e 20 61 62 63 20 42 45 47 49  SERT ON abc BEGI
4ba0: 4e 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N .      INSERT 
4bb0: 49 4e 54 4f 20 61 62 63 5f 6d 69 72 72 6f 72 28  INTO abc_mirror(
4bc0: 61 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28  a, b, c) VALUES(
4bd0: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65  new.a, new.b, ne
4be0: 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  w.c);.    END;. 
4bf0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4c00: 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  bc VALUES(1, 2, 
4c10: 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  3);.    SELECT *
4c20: 20 46 52 4f 4d 20 61 62 63 5f 6d 69 72 72 6f 72   FROM abc_mirror
4c30: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a  ;.  }.} {1 2 3}.
4c40: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
4c50: 61 76 2e 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  av.9.2 {.  execs
4c60: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
4c70: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
4c80: 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 53 45  4, 5, 6);.    SE
4c90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 5f  LECT * FROM abc_
4ca0: 6d 69 72 72 6f 72 3b 0a 20 20 7d 20 64 62 32 0a  mirror;.  } db2.
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 33  t shared-$av.9.3
4cd0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
4ce0: 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a  db2 close.} {}..
4cf0: 7d 20 3b 20 23 20 45 6e 64 20 73 68 61 72 65 64  } ; # End shared
4d00: 2d 39 2e 2a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  -9.*..#---------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d50: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
4d60: 6e 67 20 74 65 73 74 73 20 2d 20 73 68 61 72 65  ng tests - share
4d70: 64 2d 31 30 2e 2a 20 2d 20 74 65 73 74 20 74 68  d-10.* - test th
4d80: 61 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 62  at the library b
4d90: 65 68 61 76 65 73 20 0a 23 20 63 6f 72 72 65 63  ehaves .# correc
4da0: 74 6c 79 20 77 68 65 6e 20 61 20 63 6f 6e 6e 65  tly when a conne
4db0: 63 74 69 6f 6e 20 74 6f 20 61 20 73 68 61 72 65  ction to a share
4dc0: 64 2d 63 61 63 68 65 20 69 73 20 63 6c 6f 73 65  d-cache is close
4dd0: 64 2e 20 0a 23 0a 64 6f 5f 74 65 73 74 20 73 68  d. .#.do_test sh
4de0: 61 72 65 64 2d 24 61 76 2e 31 30 2e 31 20 7b 0a  ared-$av.10.1 {.
4df0: 20 20 23 20 43 72 65 61 74 65 20 61 20 73 6d 61    # Create a sma
4e00: 6c 6c 20 73 61 6d 70 6c 65 20 64 61 74 61 62 61  ll sample databa
4e10: 73 65 20 77 69 74 68 20 74 77 6f 20 63 6f 6e 6e  se with two conn
4e20: 65 63 74 69 6f 6e 73 20 74 6f 20 69 74 20 28 64  ections to it (d
4e30: 62 20 61 6e 64 20 64 62 32 29 2e 0a 20 20 66 69  b and db2)..  fi
4e40: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
4e50: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
4e60: 65 33 20 64 62 20 20 74 65 73 74 2e 64 62 0a 20  e3 db  test.db. 
4e70: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
4e80: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
4e90: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4ea0: 45 20 61 62 28 61 20 50 52 49 4d 41 52 59 20 4b  E ab(a PRIMARY K
4eb0: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
4ec0: 54 45 20 54 41 42 4c 45 20 64 65 28 64 20 50 52  TE TABLE de(d PR
4ed0: 49 4d 41 52 59 20 4b 45 59 2c 20 65 29 3b 0a 20  IMARY KEY, e);. 
4ee0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4ef0: 62 20 56 41 4c 55 45 53 28 27 43 68 69 61 6e 67  b VALUES('Chiang
4f00: 20 4d 61 69 27 2c 20 31 30 30 30 30 30 29 3b 0a   Mai', 100000);.
4f10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4f20: 61 62 20 56 41 4c 55 45 53 28 27 42 61 6e 67 6b  ab VALUES('Bangk
4f30: 6f 6b 27 2c 20 38 30 30 30 30 30 30 29 3b 0a 20  ok', 8000000);. 
4f40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
4f50: 65 20 56 41 4c 55 45 53 28 27 55 62 6f 6e 27 2c  e VALUES('Ubon',
4f60: 20 31 32 30 30 30 30 29 3b 0a 20 20 20 20 49 4e   120000);.    IN
4f70: 53 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41 4c  SERT INTO de VAL
4f80: 55 45 53 28 27 4b 68 6f 6e 20 4b 61 65 6e 27 2c  UES('Khon Kaen',
4f90: 20 32 30 30 30 30 30 29 3b 0a 20 20 7d 0a 7d 20   200000);.  }.} 
4fa0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  {}.do_test share
4fb0: 64 2d 24 61 76 2e 31 30 2e 32 20 7b 0a 20 20 23  d-$av.10.2 {.  #
4fc0: 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61   Open a read-tra
4fd0: 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nsaction with th
4fe0: 65 20 66 69 72 73 74 20 63 6f 6e 6e 65 63 74 69  e first connecti
4ff0: 6f 6e 2c 20 61 20 77 72 69 74 65 2d 74 72 61 6e  on, a write-tran
5000: 73 61 63 74 69 6f 6e 0a 20 20 23 20 77 69 74 68  saction.  # with
5010: 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 20 20 65   the second..  e
5020: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
5030: 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  IN;.    SELECT *
5040: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 7d 0a 20 20   FROM ab;.  }.  
5050: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
5060: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
5070: 49 4e 54 4f 20 64 65 20 56 41 4c 55 45 53 28 27  INTO de VALUES('
5080: 50 61 74 61 79 61 27 2c 20 33 30 30 30 30 29 3b  Pataya', 30000);
5090: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  .  } db2.} {}.do
50a0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
50b0: 2e 31 30 2e 33 20 7b 0a 20 20 23 20 41 6e 20 65  .10.3 {.  # An e
50c0: 78 74 65 72 6e 61 6c 20 63 6f 6e 6e 65 63 74 69  xternal connecti
50d0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 62 6c  on should be abl
50e0: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 64 61  e to read the da
50f0: 74 61 62 61 73 65 2c 20 62 75 74 20 6e 6f 74 0a  tabase, but not.
5100: 20 20 23 20 70 72 65 70 61 72 65 20 61 20 77 72    # prepare a wr
5110: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  ite operation.. 
5120: 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74   if {$::tcl_plat
5130: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d  form(platform)==
5140: 22 75 6e 69 78 22 7d 20 7b 0a 20 20 20 20 73 71  "unix"} {.    sq
5150: 6c 69 74 65 33 20 64 62 33 20 2e 2f 74 65 73 74  lite3 db3 ./test
5160: 2e 64 62 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  .db.  } else {. 
5170: 20 20 20 73 71 6c 69 74 65 33 20 64 62 33 20 54     sqlite3 db3 T
5180: 45 53 54 2e 44 42 0a 20 20 7d 0a 20 20 65 78 65  EST.DB.  }.  exe
5190: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
51a0: 54 20 2a 20 46 52 4f 4d 20 61 62 3b 0a 20 20 7d  T * FROM ab;.  }
51b0: 20 64 62 33 0a 20 20 63 61 74 63 68 73 71 6c 20   db3.  catchsql 
51c0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
51d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 20   INSERT INTO de 
51e0: 56 41 4c 55 45 53 28 27 50 61 74 61 79 61 27 2c  VALUES('Pataya',
51f0: 20 33 30 30 30 30 29 3b 0a 20 20 7d 20 64 62 33   30000);.  } db3
5200: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
5210: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74  is locked}}.do_t
5220: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5230: 30 2e 34 20 7b 0a 20 20 23 20 43 6c 6f 73 65 20  0.4 {.  # Close 
5240: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5250: 69 74 68 20 74 68 65 20 77 72 69 74 65 2d 74 72  ith the write-tr
5260: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 20  ansaction open. 
5270: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a   db2 close.} {}.
5280: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5290: 61 76 2e 31 30 2e 35 20 7b 0a 20 20 23 20 54 65  av.10.5 {.  # Te
52a0: 73 74 20 74 68 61 74 20 74 68 65 20 64 62 32 20  st that the db2 
52b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
52c0: 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  been automatical
52d0: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ly rolled back..
52e0: 20 20 23 20 49 66 20 69 74 20 68 61 73 20 6e 6f    # If it has no
52f0: 74 20 74 68 65 20 28 27 50 61 74 61 79 61 27 2c  t the ('Pataya',
5300: 20 33 30 30 30 30 29 20 65 6e 74 72 79 20 77 69   30000) entry wi
5310: 6c 6c 20 73 74 69 6c 6c 20 62 65 20 69 6e 20 74  ll still be in t
5320: 68 65 20 74 61 62 6c 65 2e 0a 20 20 65 78 65 63  he table..  exec
5330: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
5340: 20 2a 20 46 52 4f 4d 20 64 65 3b 0a 20 20 7d 0a   * FROM de;.  }.
5350: 7d 20 7b 55 62 6f 6e 20 31 32 30 30 30 30 20 7b  } {Ubon 120000 {
5360: 4b 68 6f 6e 20 4b 61 65 6e 7d 20 32 30 30 30 30  Khon Kaen} 20000
5370: 30 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  0}.do_test share
5380: 64 2d 24 61 76 2e 31 30 2e 35 20 7b 0a 20 20 23  d-$av.10.5 {.  #
5390: 20 43 6c 6f 73 69 6e 67 20 64 62 32 20 73 68 6f   Closing db2 sho
53a0: 75 6c 64 20 68 61 76 65 20 64 72 6f 70 70 65 64  uld have dropped
53b0: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
53c0: 65 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 64  e back to a read
53d0: 2d 6c 6f 63 6b 2e 0a 20 20 23 20 53 6f 20 64 62  -lock..  # So db
53e0: 33 20 73 68 6f 75 6c 64 20 62 65 20 61 62 6c 65  3 should be able
53f0: 20 74 6f 20 70 72 65 70 61 72 65 20 61 20 77 72   to prepare a wr
5400: 69 74 65 2e 2e 2e 0a 20 20 63 61 74 63 68 73 71  ite....  catchsq
5410: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  l {INSERT INTO d
5420: 65 20 56 41 4c 55 45 53 28 27 50 61 74 61 79 61  e VALUES('Pataya
5430: 27 2c 20 33 30 30 30 30 29 3b 7d 20 64 62 33 0a  ', 30000);} db3.
5440: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
5450: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e 36   shared-$av.10.6
5460: 20 7b 0a 20 20 23 20 2e 2e 2e 20 62 75 74 20 6e   {.  # ... but n
5470: 6f 74 20 63 6f 6d 6d 69 74 20 69 74 2e 0a 20 20  ot commit it..  
5480: 63 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d 49 54  catchsql {COMMIT
5490: 7d 20 64 62 33 0a 7d 20 7b 31 20 7b 64 61 74 61  } db3.} {1 {data
54a0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
54b0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
54c0: 24 61 76 2e 31 30 2e 37 20 7b 0a 20 20 23 20 43  $av.10.7 {.  # C
54d0: 6f 6d 6d 69 74 20 74 68 65 20 28 72 65 61 64 2d  ommit the (read-
54e0: 6f 6e 6c 79 29 20 64 62 20 74 72 61 6e 73 61 63  only) db transac
54f0: 74 69 6f 6e 2e 20 43 68 65 63 6b 20 76 69 61 20  tion. Check via 
5500: 64 62 33 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  db3 to make sure
5510: 20 74 68 65 20 0a 20 20 23 20 63 6f 6e 74 65 6e   the .  # conten
5520: 74 73 20 6f 66 20 74 61 62 6c 65 20 22 64 65 22  ts of table "de"
5530: 20 61 72 65 20 73 74 69 6c 6c 20 61 73 20 74 68   are still as th
5540: 65 79 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  ey should be..  
5550: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f  execsql {.    CO
5560: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 65 63  MMIT;.  }.  exec
5570: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
5580: 20 2a 20 46 52 4f 4d 20 64 65 3b 0a 20 20 7d 20   * FROM de;.  } 
5590: 64 62 33 0a 7d 20 7b 55 62 6f 6e 20 31 32 30 30  db3.} {Ubon 1200
55a0: 30 30 20 7b 4b 68 6f 6e 20 4b 61 65 6e 7d 20 32  00 {Khon Kaen} 2
55b0: 30 30 30 30 30 20 50 61 74 61 79 61 20 33 30 30  00000 Pataya 300
55c0: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  00}.do_test shar
55d0: 65 64 2d 24 61 76 2e 31 30 2e 39 20 7b 0a 20 20  ed-$av.10.9 {.  
55e0: 23 20 43 6f 6d 6d 69 74 20 74 68 65 20 65 78 74  # Commit the ext
55f0: 65 72 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ernal transactio
5600: 6e 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 43  n..  catchsql {C
5610: 4f 4d 4d 49 54 7d 20 64 62 33 0a 7d 20 7b 30 20  OMMIT} db3.} {0 
5620: 7b 7d 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68  {}}.integrity_ch
5630: 65 63 6b 20 73 68 61 72 65 64 2d 24 61 76 2e 31  eck shared-$av.1
5640: 30 2e 31 30 0a 64 6f 5f 74 65 73 74 20 73 68 61  0.10.do_test sha
5650: 72 65 64 2d 24 61 76 2e 31 30 2e 31 31 20 7b 0a  red-$av.10.11 {.
5660: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 33    db close.  db3
5670: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f   close.} {}..do_
5680: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
5690: 31 31 2e 31 20 7b 0a 20 20 66 69 6c 65 20 64 65  11.1 {.  file de
56a0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
56b0: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
56c0: 20 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69    test.db.  sqli
56d0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
56e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
56f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
5700: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  (a, b, c);.    C
5710: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 32  REATE TABLE abc2
5720: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 42  (a, b, c);.    B
5730: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
5740: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
5750: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d  (1, 2, 3);.  }.}
5760: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72   {}.do_test shar
5770: 65 64 2d 24 61 76 2e 31 31 2e 32 20 7b 0a 20 20  ed-$av.11.2 {.  
5780: 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b  catchsql {BEGIN;
5790: 7d 20 64 62 32 0a 20 20 63 61 74 63 68 73 71 6c  } db2.  catchsql
57a0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
57b0: 61 62 63 3b 7d 20 64 62 32 0a 7d 20 7b 31 20 7b  abc;} db2.} {1 {
57c0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
57d0: 73 20 6c 6f 63 6b 65 64 3a 20 61 62 63 7d 7d 0a  s locked: abc}}.
57e0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
57f0: 61 76 2e 31 31 2e 33 20 7b 0a 20 20 63 61 74 63  av.11.3 {.  catc
5800: 68 73 71 6c 20 7b 42 45 47 49 4e 7d 20 64 62 32  hsql {BEGIN} db2
5810: 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74  .} {1 {cannot st
5820: 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
5830: 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  n within a trans
5840: 61 63 74 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74  action}}.do_test
5850: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 34   shared-$av.11.4
5860: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53   {.  catchsql {S
5870: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
5880: 32 3b 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 7d 7d  2;} db2.} {0 {}}
5890: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
58a0: 24 61 76 2e 31 31 2e 35 20 7b 0a 20 20 63 61 74  $av.11.5 {.  cat
58b0: 63 68 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e  chsql {INSERT IN
58c0: 54 4f 20 61 62 63 32 20 56 41 4c 55 45 53 28 31  TO abc2 VALUES(1
58d0: 2c 20 32 2c 20 33 29 3b 7d 20 64 62 32 0a 7d 20  , 2, 3);} db2.} 
58e0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
58f0: 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  locked}}.do_test
5900: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 36   shared-$av.11.6
5910: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53   {.  catchsql {S
5920: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
5930: 32 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74  2}.} {0 {}}.do_t
5940: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5950: 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.6 {.  execsql 
5960: 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  {.    ROLLBACK;.
5970: 20 20 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f      PRAGMA read_
5980: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b  uncommitted = 1;
5990: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  .  } db2.} {}.do
59a0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
59b0: 2e 31 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  .11.7 {.  execsq
59c0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
59d0: 4e 54 4f 20 61 62 63 32 20 56 41 4c 55 45 53 28  NTO abc2 VALUES(
59e0: 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e  4, 5, 6);.    IN
59f0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 32 20 56  SERT INTO abc2 V
5a00: 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a  ALUES(7, 8, 9);.
5a10: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
5a20: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 38   shared-$av.11.8
5a30: 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69   {.  set res [li
5a40: 73 74 5d 0a 20 20 62 72 65 61 6b 70 6f 69 6e 74  st].  breakpoint
5a50: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20 20  .  db2 eval {.  
5a60: 20 20 53 45 4c 45 43 54 20 61 62 63 2e 61 20 61    SELECT abc.a a
5a70: 73 20 49 2c 20 61 62 63 32 2e 61 20 61 73 20 49  s I, abc2.a as I
5a80: 49 20 46 52 4f 4d 20 61 62 63 2c 20 61 62 63 32  I FROM abc, abc2
5a90: 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 65 78 65 63  ;.  } {.    exec
5aa0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45  sql {.      DELE
5ab0: 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45 52  TE FROM abc WHER
5ac0: 45 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  E 1;.    }.    l
5ad0: 61 70 70 65 6e 64 20 72 65 73 20 24 49 20 24 49  append res $I $I
5ae0: 49 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73 0a  I.  }.  set res.
5af0: 7d 20 7b 31 20 34 20 7b 7d 20 37 7d 0a 0a 64 6f  } {1 4 {} 7}..do
5b00: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
5b10: 2e 31 31 2e 31 31 20 7b 0a 20 20 64 62 20 63 6c  .11.11 {.  db cl
5b20: 6f 73 65 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  ose.  db2 close.
5b30: 7d 20 7b 7d 0a 0a 7d 0a 0a 73 71 6c 69 74 65 33  } {}..}..sqlite3
5b40: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
5b50: 61 63 68 65 20 24 3a 3a 65 6e 61 62 6c 65 5f 73  ache $::enable_s
5b60: 68 61 72 65 64 5f 63 61 63 68 65 0a 66 69 6e 69  hared_cache.fini
5b70: 73 68 5f 74 65 73 74 0a                          sh_test.