/ Hex Artifact Content
Login

Artifact 34945a516532b11182c3eb26e31247eee3c9ae48:


0000: 23 20 32 30 30 35 20 44 65 63 65 6d 62 65 72 20  # 2005 December 
0010: 33 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  30.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  #***************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 24 49 64  ********.#.# $Id
0170: 3a 20 73 68 61 72 65 64 2e 74 65 73 74 2c 76 20  : shared.test,v 
0180: 31 2e 33 36 20 32 30 30 39 2f 30 33 2f 31 36 20  1.36 2009/03/16 
0190: 31 33 3a 31 39 3a 33 36 20 64 61 6e 69 65 6c 6b  13:19:36 danielk
01a0: 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74 20  1977 Exp $..set 
01b0: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
01c0: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
01d0: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
01e0: 73 74 65 72 2e 74 63 6c 0a 64 62 20 63 6c 6f 73  ster.tcl.db clos
01f0: 65 0a 0a 23 20 54 68 65 73 65 20 74 65 73 74 73  e..# These tests
0200: 20 63 61 6e 6e 6f 74 20 62 65 20 72 75 6e 20 77   cannot be run w
0210: 69 74 68 6f 75 74 20 74 68 65 20 41 54 54 41 43  ithout the ATTAC
0220: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 23 0a 69 66 63  H command..#.ifc
0230: 61 70 61 62 6c 65 20 21 73 68 61 72 65 64 5f 63  apable !shared_c
0240: 61 63 68 65 7c 7c 21 61 74 74 61 63 68 20 7b 0a  ache||!attach {.
0250: 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20    finish_test.  
0260: 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 74 20 3a 3a  return.}..set ::
0270: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
0280: 63 68 65 20 5b 73 71 6c 69 74 65 33 5f 65 6e 61  che [sqlite3_ena
0290: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
02a0: 20 31 5d 0a 0a 66 6f 72 65 61 63 68 20 61 76 20   1]..foreach av 
02b0: 5b 6c 69 73 74 20 30 20 31 5d 20 7b 0a 0a 23 20  [list 0 1] {..# 
02c0: 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
02d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
02e0: 20 65 78 65 63 75 74 65 20 74 68 65 20 61 75 74   execute the aut
02f0: 6f 2d 76 61 63 75 75 6d 20 70 72 61 67 6d 61 0a  o-vacuum pragma.
0300: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
0310: 2e 64 62 0a 73 71 6c 69 74 65 33 20 64 62 20 74  .db.sqlite3 db t
0320: 65 73 74 2e 64 62 0a 0a 69 66 63 61 70 61 62 6c  est.db..ifcapabl
0330: 65 20 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a 20  e autovacuum {. 
0340: 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d   do_test shared-
0350: 5b 65 78 70 72 20 24 61 76 2b 31 5d 2e 31 2e 30  [expr $av+1].1.0
0360: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
0370: 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75  pragma auto_vacu
0380: 75 6d 3d 24 3a 3a 61 76 22 0a 20 20 20 20 65 78  um=$::av".    ex
0390: 65 63 73 71 6c 20 7b 70 72 61 67 6d 61 20 61 75  ecsql {pragma au
03a0: 74 6f 5f 76 61 63 75 75 6d 7d 0a 20 20 7d 20 22  to_vacuum}.  } "
03b0: 24 61 76 22 0a 7d 20 65 6c 73 65 20 7b 0a 20 20  $av".} else {.  
03c0: 69 66 20 7b 24 61 76 7d 20 7b 0a 20 20 20 20 64  if {$av} {.    d
03d0: 62 20 63 6c 6f 73 65 0a 20 20 20 20 62 72 65 61  b close.    brea
03e0: 6b 0a 20 20 7d 0a 7d 0a 0a 23 20 69 66 20 77 65  k.  }.}..# if we
03f0: 27 72 65 20 75 73 69 6e 67 20 70 72 6f 78 79 20  're using proxy 
0400: 6c 6f 63 6b 73 2c 20 77 65 20 75 73 65 20 32 20  locks, we use 2 
0410: 66 69 6c 65 64 65 73 63 72 69 70 74 6f 72 73 20  filedescriptors 
0420: 66 6f 72 20 61 20 64 62 0a 23 20 74 68 61 74 20  for a db.# that 
0430: 69 73 20 6f 70 65 6e 20 62 75 74 20 4e 4f 54 20  is open but NOT 
0440: 79 65 74 20 6c 6f 63 6b 65 64 2c 20 61 66 74 65  yet locked, afte
0450: 72 20 61 20 6c 6f 63 6b 20 69 73 20 74 61 6b 65  r a lock is take
0460: 6e 20 77 65 27 6c 6c 20 68 61 76 65 20 33 2c 20  n we'll have 3, 
0470: 0a 23 20 6e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69  .# normally sqli
0480: 74 65 20 75 73 65 73 20 31 20 28 70 72 6f 78 79  te uses 1 (proxy
0490: 20 6c 6f 63 6b 69 6e 67 20 61 64 64 73 20 74 68   locking adds th
04a0: 65 20 63 6f 6e 63 68 20 61 6e 64 20 74 68 65 20  e conch and the 
04b0: 6c 6f 63 61 6c 20 6c 6f 63 6b 29 0a 73 65 74 20  local lock).set 
04c0: 75 73 69 6e 67 5f 70 72 6f 78 79 20 30 0a 66 6f  using_proxy 0.fo
04d0: 72 65 61 63 68 20 7b 6e 61 6d 65 20 76 61 6c 75  reach {name valu
04e0: 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 65 6e  e} [array get en
04f0: 76 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  v SQLITE_FORCE_P
0500: 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 5d 20 7b 0a  ROXY_LOCKING] {.
0510: 20 20 73 65 74 20 75 73 69 6e 67 5f 70 72 6f 78    set using_prox
0520: 79 20 24 76 61 6c 75 65 0a 7d 0a 73 65 74 20 65  y $value.}.set e
0530: 78 74 72 61 66 64 73 5f 70 72 65 6c 6f 63 6b 20  xtrafds_prelock 
0540: 30 0a 73 65 74 20 65 78 74 72 61 66 64 73 5f 70  0.set extrafds_p
0550: 6f 73 74 6c 6f 63 6b 20 30 0a 69 66 20 7b 24 75  ostlock 0.if {$u
0560: 73 69 6e 67 5f 70 72 6f 78 79 3e 30 7d 20 7b 0a  sing_proxy>0} {.
0570: 20 20 73 65 74 20 65 78 74 72 61 66 64 73 5f 70    set extrafds_p
0580: 72 65 6c 6f 63 6b 20 31 0a 20 20 73 65 74 20 65  relock 1.  set e
0590: 78 74 72 61 66 64 73 5f 70 6f 73 74 6c 6f 63 6b  xtrafds_postlock
05a0: 20 32 0a 7d 20 0a 0a 23 20 24 61 76 20 69 73 20   2.} ..# $av is 
05b0: 63 75 72 72 65 6e 74 6c 79 20 30 20 69 66 20 74  currently 0 if t
05c0: 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  his loop iterati
05d0: 6f 6e 20 69 73 20 74 6f 20 74 65 73 74 20 77 69  on is to test wi
05e0: 74 68 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 74  th auto-vacuum t
05f0: 75 72 6e 65 64 0a 23 20 6f 66 66 2c 20 61 6e 64  urned.# off, and
0600: 20 31 20 69 66 20 69 74 20 69 73 20 74 75 72 6e   1 if it is turn
0610: 65 64 20 6f 6e 2e 20 49 6e 63 72 65 6d 65 6e 74  ed on. Increment
0620: 20 69 74 20 73 6f 20 74 68 61 74 20 28 31 20 2d   it so that (1 -
0630: 3e 20 6e 6f 20 61 75 74 6f 2d 76 61 63 75 75 6d  > no auto-vacuum
0640: 29 20 0a 23 20 61 6e 64 20 28 32 20 2d 3e 20 61  ) .# and (2 -> a
0650: 75 74 6f 2d 76 61 63 75 75 6d 29 2e 20 54 68 65  uto-vacuum). The
0660: 20 73 6f 6c 65 20 72 65 61 73 6f 6e 20 66 6f 72   sole reason for
0670: 20 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   this is so that
0680: 20 69 74 20 6c 6f 6f 6b 73 20 6e 69 63 65 72 0a   it looks nicer.
0690: 23 20 77 68 65 6e 20 77 65 20 75 73 65 20 74 68  # when we use th
06a0: 69 73 20 76 61 72 69 61 62 6c 65 20 61 73 20 70  is variable as p
06b0: 61 72 74 20 6f 66 20 74 65 73 74 2d 63 61 73 65  art of test-case
06c0: 20 6e 61 6d 65 73 2e 0a 23 0a 69 6e 63 72 20 61   names..#.incr a
06d0: 76 0a 0a 23 20 54 65 73 74 20 6f 72 67 61 6e 69  v..# Test organi
06e0: 7a 61 74 69 6f 6e 3a 0a 23 0a 23 20 73 68 61 72  zation:.#.# shar
06f0: 65 64 2d 31 2e 2a 3a 20 53 69 6d 70 6c 65 20 74  ed-1.*: Simple t
0700: 65 73 74 20 74 6f 20 76 65 72 69 66 79 20 62 61  est to verify ba
0710: 73 69 63 20 73 61 6e 69 74 79 20 6f 66 20 74 61  sic sanity of ta
0720: 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 69 6e  ble level lockin
0730: 67 20 77 68 65 6e 0a 23 20 20 20 20 20 20 20 20  g when.#        
0740: 20 20 20 20 20 74 77 6f 20 63 6f 6e 6e 65 63 74       two connect
0750: 69 6f 6e 73 20 73 68 61 72 65 20 61 20 70 61 67  ions share a pag
0760: 65 72 20 63 61 63 68 65 2e 0a 23 20 73 68 61 72  er cache..# shar
0770: 65 64 2d 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  ed-2.*: Test tha
0780: 74 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  t a read transac
0790: 74 69 6f 6e 20 63 61 6e 20 63 6f 2d 65 78 69 73  tion can co-exis
07a0: 74 20 77 69 74 68 20 61 20 0a 23 20 20 20 20 20  t with a .#     
07b0: 20 20 20 20 20 20 20 20 77 72 69 74 65 2d 74 72          write-tr
07c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 6e 63 6c 75  ansaction, inclu
07d0: 64 69 6e 67 20 61 20 73 69 6d 70 6c 65 20 74 65  ding a simple te
07e0: 73 74 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  st to ensure the
07f0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
0800: 65 78 74 65 72 6e 61 6c 20 6c 6f 63 6b 69 6e 67  external locking
0810: 20 70 72 6f 74 6f 63 6f 6c 20 69 73 20 73 74 69   protocol is sti
0820: 6c 6c 20 77 6f 72 6b 69 6e 67 2e 0a 23 20 73 68  ll working..# sh
0830: 61 72 65 64 2d 33 2e 2a 3a 20 53 69 6d 70 6c 65  ared-3.*: Simple
0840: 20 74 65 73 74 20 6f 66 20 72 65 61 64 2d 75 6e   test of read-un
0850: 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 2e 0a  committed mode..
0860: 23 20 73 68 61 72 65 64 2d 34 2e 2a 3a 20 43 68  # shared-4.*: Ch
0870: 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 63 68  eck that the sch
0880: 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e  ema is locked an
0890: 64 20 75 6e 6c 6f 63 6b 65 64 20 63 6f 72 72 65  d unlocked corre
08a0: 63 74 6c 79 2e 0a 23 20 73 68 61 72 65 64 2d 35  ctly..# shared-5
08b0: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 63 72  .*: Test that cr
08c0: 65 61 74 69 6e 67 2f 64 72 6f 70 70 69 6e 67 20  eating/dropping 
08d0: 73 63 68 65 6d 61 20 69 74 65 6d 73 20 77 6f 72  schema items wor
08e0: 6b 73 20 77 68 65 6e 20 64 61 74 61 62 61 73 65  ks when database
08f0: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
0900: 61 72 65 20 61 74 74 61 63 68 65 64 20 69 6e 20  are attached in 
0910: 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
0920: 20 74 6f 20 64 69 66 66 65 72 65 6e 74 20 68 61   to different ha
0930: 6e 64 6c 65 73 2e 0a 23 20 73 68 61 72 65 64 2d  ndles..# shared-
0940: 36 2e 2a 3a 20 4c 6f 63 6b 69 6e 67 2c 20 55 4e  6.*: Locking, UN
0950: 49 4f 4e 20 41 4c 4c 20 71 75 65 72 69 65 73 20  ION ALL queries 
0960: 61 6e 64 20 73 75 62 2d 71 75 65 72 69 65 73 2e  and sub-queries.
0970: 0a 23 20 73 68 61 72 65 64 2d 37 2e 2a 3a 20 41  .# shared-7.*: A
0980: 75 74 6f 76 61 63 75 75 6d 20 61 6e 64 20 73 68  utovacuum and sh
0990: 61 72 65 64 2d 63 61 63 68 65 2e 0a 23 20 73 68  ared-cache..# sh
09a0: 61 72 65 64 2d 38 2e 2a 3a 20 54 65 73 74 73 20  ared-8.*: Tests 
09b0: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74  related to the t
09c0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  ext encoding of 
09d0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 64 61 74  shared-cache dat
09e0: 61 62 61 73 65 73 2e 0a 23 20 73 68 61 72 65 64  abases..# shared
09f0: 2d 39 2e 2a 3a 20 54 45 4d 50 20 74 72 69 67 67  -9.*: TEMP trigg
0a00: 65 72 73 20 61 6e 64 20 73 68 61 72 65 64 2d 63  ers and shared-c
0a10: 61 63 68 65 20 64 61 74 61 62 61 73 65 73 2e 0a  ache databases..
0a20: 23 20 73 68 61 72 65 64 2d 31 30 2e 2a 3a 20 54  # shared-10.*: T
0a30: 65 73 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ests of sqlite3_
0a40: 63 6c 6f 73 65 28 29 2e 0a 23 20 73 68 61 72 65  close()..# share
0a50: 64 2d 31 31 2e 2a 3a 20 54 65 73 74 20 74 72 61  d-11.*: Test tra
0a60: 6e 73 61 63 74 69 6f 6e 20 6c 6f 63 6b 69 6e 67  nsaction locking
0a70: 2e 0a 23 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61  ..#..do_test sha
0a80: 72 65 64 2d 24 61 76 2e 31 2e 31 20 7b 0a 20 20  red-$av.1.1 {.  
0a90: 23 20 4f 70 65 6e 20 61 20 73 65 63 6f 6e 64 20  # Open a second 
0aa0: 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20  database on the 
0ab0: 66 69 6c 65 20 74 65 73 74 2e 64 62 2e 20 49 74  file test.db. It
0ac0: 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 65 20   should use the 
0ad0: 73 61 6d 65 20 70 61 67 65 72 0a 20 20 23 20 63  same pager.  # c
0ae0: 61 63 68 65 20 61 6e 64 20 73 63 68 65 6d 61 20  ache and schema 
0af0: 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
0b00: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 56 65 72 69  connection. Veri
0b10: 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 31 20 66  fy that only 1 f
0b20: 69 6c 65 20 69 73 20 0a 20 20 23 20 6f 70 65 6e  ile is .  # open
0b30: 65 64 2e 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ed..  sqlite3 db
0b40: 32 20 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20  2 test.db.  set 
0b50: 3a 3a 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69  ::sqlite_open_fi
0b60: 6c 65 5f 63 6f 75 6e 74 0a 20 20 65 78 70 72 20  le_count.  expr 
0b70: 24 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c  $sqlite_open_fil
0b80: 65 5f 63 6f 75 6e 74 2d 24 65 78 74 72 61 66 64  e_count-$extrafd
0b90: 73 5f 70 6f 73 74 6c 6f 63 6b 0a 7d 20 7b 31 7d  s_postlock.} {1}
0ba0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
0bb0: 24 61 76 2e 31 2e 32 20 7b 0a 20 20 23 20 41 64  $av.1.2 {.  # Ad
0bc0: 64 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 20  d a table and a 
0bd0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 64 61  single row of da
0be0: 74 61 20 76 69 61 20 74 68 65 20 66 69 72 73 74  ta via the first
0bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 0a 20 20   connection. .  
0c00: 23 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  # Ensure that th
0c10: 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  e second connect
0c20: 69 6f 6e 20 63 61 6e 20 73 65 65 20 74 68 65 6d  ion can see them
0c30: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
0c40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
0c50: 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  bc(a, b, c);.   
0c60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
0c70: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
0c80: 3b 0a 20 20 7d 20 64 62 0a 20 20 65 78 65 63 73  ;.  } db.  execs
0c90: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0ca0: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20  * FROM abc;.  } 
0cb0: 64 62 32 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f  db2.} {1 2 3}.do
0cc0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
0cd0: 2e 31 2e 33 20 7b 0a 20 20 23 20 48 61 76 65 20  .1.3 {.  # Have 
0ce0: 74 68 65 20 66 69 72 73 74 20 63 6f 6e 6e 65 63  the first connec
0cf0: 74 69 6f 6e 20 62 65 67 69 6e 20 61 20 74 72 61  tion begin a tra
0d00: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 6f 62 74  nsaction and obt
0d10: 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 0a  ain a read-lock.
0d20: 20 20 23 20 6f 6e 20 74 61 62 6c 65 20 61 62 63    # on table abc
0d30: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  . This should no
0d40: 74 20 70 72 65 76 65 6e 74 20 74 68 65 20 73 65  t prevent the se
0d50: 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  cond connection 
0d60: 66 72 6f 6d 20 0a 20 20 23 20 71 75 65 72 79 69  from .  # queryi
0d70: 6e 67 20 61 62 63 2e 0a 20 20 65 78 65 63 73 71  ng abc..  execsq
0d80: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
0d90: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0da0: 20 61 62 63 3b 0a 20 20 7d 0a 20 20 65 78 65 63   abc;.  }.  exec
0db0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
0dc0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d   * FROM abc;.  }
0dd0: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 7d 0a 64   db2.} {1 2 3}.d
0de0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
0df0: 76 2e 31 2e 34 20 7b 0a 20 20 23 20 54 72 79 20  v.1.4 {.  # Try 
0e00: 74 6f 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20  to insert a row 
0e10: 69 6e 74 6f 20 61 62 63 20 76 69 61 20 63 6f 6e  into abc via con
0e20: 6e 65 63 74 69 6f 6e 20 32 2e 20 54 68 69 73 20  nection 2. This 
0e30: 73 68 6f 75 6c 64 20 66 61 69 6c 20 62 65 63 61  should fail beca
0e40: 75 73 65 0a 20 20 23 20 6f 66 20 74 68 65 20 72  use.  # of the r
0e50: 65 61 64 2d 6c 6f 63 6b 20 63 6f 6e 6e 65 63 74  ead-lock connect
0e60: 69 6f 6e 20 31 20 69 73 20 68 6f 6c 64 69 6e 67  ion 1 is holding
0e70: 20 6f 6e 20 74 61 62 6c 65 20 61 62 63 20 28 6f   on table abc (o
0e80: 62 74 61 69 6e 65 64 20 69 6e 20 74 68 65 0a 20  btained in the. 
0e90: 20 23 20 70 72 65 76 69 6f 75 73 20 74 65 73 74   # previous test
0ea0: 20 63 61 73 65 29 2e 0a 20 20 63 61 74 63 68 73   case)..  catchs
0eb0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
0ec0: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
0ed0: 34 2c 20 35 2c 20 36 29 3b 0a 20 20 7d 20 64 62  4, 5, 6);.  } db
0ee0: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
0ef0: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
0f00: 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65 73 74 20  : abc}}.do_test 
0f10: 73 68 61 72 65 64 2d 24 61 76 2e 31 2e 35 20 7b  shared-$av.1.5 {
0f20: 0a 20 20 23 20 55 73 69 6e 67 20 63 6f 6e 6e 65  .  # Using conne
0f30: 63 74 69 6f 6e 20 32 20 28 74 68 65 20 6f 6e 65  ction 2 (the one
0f40: 20 77 69 74 68 6f 75 74 20 74 68 65 20 6f 70 65   without the ope
0f50: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  n transaction), 
0f60: 74 72 79 20 74 6f 20 63 72 65 61 74 65 0a 20 20  try to create.  
0f70: 23 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 20 54  # a new table. T
0f80: 68 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 20  his should fail 
0f90: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 6f  because of the o
0fa0: 70 65 6e 20 72 65 61 64 20 74 72 61 6e 73 61 63  pen read transac
0fb0: 74 69 6f 6e 20 0a 20 20 23 20 68 65 6c 64 20 62  tion .  # held b
0fc0: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 2e 0a  y connection 1..
0fd0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0fe0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 65   CREATE TABLE de
0ff0: 66 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 7d 20  f(d, e, f);.  } 
1000: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
1010: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
1020: 65 64 3a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ed: sqlite_maste
1030: 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  r}}.do_test shar
1040: 65 64 2d 24 61 76 2e 31 2e 36 20 7b 0a 20 20 23  ed-$av.1.6 {.  #
1050: 20 55 70 67 72 61 64 65 20 63 6f 6e 6e 65 63 74   Upgrade connect
1060: 69 6f 6e 20 31 27 73 20 74 72 61 6e 73 61 63 74  ion 1's transact
1070: 69 6f 6e 20 74 6f 20 61 20 77 72 69 74 65 20 74  ion to a write t
1080: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 43 72 65 61  ransaction. Crea
1090: 74 65 0a 20 20 23 20 61 20 6e 65 77 20 74 61 62  te.  # a new tab
10a0: 6c 65 20 2d 20 64 65 66 20 2d 20 61 6e 64 20 69  le - def - and i
10b0: 6e 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f  nsert a row into
10c0: 20 69 74 2e 20 42 65 63 61 75 73 65 20 74 68 65   it. Because the
10d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 0a 20 20   connection 1.  
10e0: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f  # transaction mo
10f0: 64 69 66 69 65 73 20 74 68 65 20 73 63 68 65 6d  difies the schem
1100: 61 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  a, it should not
1110: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
1120: 20 0a 20 20 23 20 63 6f 6e 6e 65 63 74 69 6f 6e   .  # connection
1130: 20 32 20 74 6f 20 61 63 63 65 73 73 20 74 68 65   2 to access the
1140: 20 64 61 74 61 62 61 73 65 20 61 74 20 61 6c 6c   database at all
1150: 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65   until the conne
1160: 63 74 69 6f 6e 20 31 20 0a 20 20 23 20 68 61 73  ction 1 .  # has
1170: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 74 72   finished the tr
1180: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 65 78 65  ansaction..  exe
1190: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
11a0: 45 20 54 41 42 4c 45 20 64 65 66 28 64 2c 20 65  E TABLE def(d, e
11b0: 2c 20 66 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , f);.    INSERT
11c0: 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53   INTO def VALUES
11d0: 28 27 49 56 27 2c 20 27 56 27 2c 20 27 56 49 27  ('IV', 'V', 'VI'
11e0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
11f0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
1200: 2e 37 20 7b 0a 20 20 23 20 52 65 61 64 20 66 72  .7 {.  # Read fr
1210: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  om the sqlite_ma
1220: 73 74 65 72 20 74 61 62 6c 65 20 77 69 74 68 20  ster table with 
1230: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 28 69 6e  connection 1 (in
1240: 73 69 64 65 20 74 68 65 20 0a 20 20 23 20 74 72  side the .  # tr
1250: 61 6e 73 61 63 74 69 6f 6e 29 2e 20 54 68 65 6e  ansaction). Then
1260: 20 74 65 73 74 20 74 68 61 74 20 77 65 20 63 61   test that we ca
1270: 6e 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 77 69  n not do this wi
1280: 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 2e  th connection 2.
1290: 20 54 68 69 73 0a 20 20 23 20 69 73 20 62 65 63   This.  # is bec
12a0: 61 75 73 65 20 6f 66 20 74 68 65 20 73 63 68 65  ause of the sche
12b0: 6d 61 2d 6d 6f 64 69 66 69 65 64 20 6c 6f 63 6b  ma-modified lock
12c0: 20 65 73 74 61 62 6c 69 73 68 65 64 20 62 79 20   established by 
12d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 0a 20 20  connection 1 .  
12e0: 23 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  # in the previou
12f0: 73 20 74 65 73 74 20 63 61 73 65 2e 0a 20 20 65  s test case..  e
1300: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1310: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
1320: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 20 20  e_master;.  }.  
1330: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
1340: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
1350: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 20  ite_master;.  } 
1360: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
1370: 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 63  se schema is loc
1380: 6b 65 64 3a 20 6d 61 69 6e 7d 7d 0a 64 6f 5f 74  ked: main}}.do_t
1390: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
13a0: 2e 38 20 7b 0a 20 20 23 20 43 6f 6d 6d 69 74 20  .8 {.  # Commit 
13b0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31  the connection 1
13c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
13d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f  execsql {.    CO
13e0: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
13f0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
1400: 61 76 2e 32 2e 31 20 7b 0a 20 20 23 20 4f 70 65  av.2.1 {.  # Ope
1410: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 33  n connection db3
1420: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1430: 2e 20 55 73 65 20 61 20 64 69 66 66 65 72 65 6e  . Use a differen
1440: 74 20 70 61 74 68 20 74 6f 20 74 68 65 20 73 61  t path to the sa
1450: 6d 65 0a 20 20 23 20 66 69 6c 65 20 73 6f 20 74  me.  # file so t
1460: 68 61 74 20 64 62 33 20 64 6f 65 73 20 2a 6e 6f  hat db3 does *no
1470: 74 2a 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  t* share the sam
1480: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 73  e pager cache as
1490: 20 64 62 20 61 6e 64 20 64 62 32 0a 20 20 23 20   db and db2.  # 
14a0: 28 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65  (there should be
14b0: 20 74 77 6f 20 6f 70 65 6e 20 66 69 6c 65 20 68   two open file h
14c0: 61 6e 64 6c 65 73 29 2e 0a 20 20 69 66 20 7b 24  andles)..  if {$
14d0: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  ::tcl_platform(p
14e0: 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22  latform)=="unix"
14f0: 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  } {.    sqlite3 
1500: 64 62 33 20 2e 2f 74 65 73 74 2e 64 62 0a 20 20  db3 ./test.db.  
1510: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c  } else {.    sql
1520: 69 74 65 33 20 64 62 33 20 54 45 53 54 2e 44 42  ite3 db3 TEST.DB
1530: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 73 71 6c  .  }.  set ::sql
1540: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
1550: 75 6e 74 0a 20 20 65 78 70 72 20 24 73 71 6c 69  unt.  expr $sqli
1560: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
1570: 6e 74 2d 28 24 65 78 74 72 61 66 64 73 5f 70 72  nt-($extrafds_pr
1580: 65 6c 6f 63 6b 2b 24 65 78 74 72 61 66 64 73 5f  elock+$extrafds_
1590: 70 6f 73 74 6c 6f 63 6b 29 0a 7d 20 7b 32 7d 0a  postlock).} {2}.
15a0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
15b0: 61 76 2e 32 2e 32 20 7b 0a 20 20 23 20 53 74 61  av.2.2 {.  # Sta
15c0: 72 74 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  rt read transact
15d0: 69 6f 6e 73 20 6f 6e 20 64 62 20 61 6e 64 20 64  ions on db and d
15e0: 62 32 20 28 74 68 65 20 73 68 61 72 65 64 20 70  b2 (the shared p
15f0: 61 67 65 72 20 63 61 63 68 65 29 2e 20 45 6e 73  ager cache). Ens
1600: 75 72 65 0a 20 20 23 20 64 62 33 20 63 61 6e 6e  ure.  # db3 cann
1610: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
1620: 64 61 74 61 62 61 73 65 2e 0a 20 20 65 78 65 63  database..  exec
1630: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
1640: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1650: 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 20 20 65 78  OM abc;.  }.  ex
1660: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1670: 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  N;.    SELECT * 
1680: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62  FROM abc;.  } db
1690: 32 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  2.  catchsql {. 
16a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
16b0: 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  bc VALUES(1, 2, 
16c0: 33 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31  3);.  } db2.} {1
16d0: 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   {database table
16e0: 20 69 73 20 6c 6f 63 6b 65 64 3a 20 61 62 63 7d   is locked: abc}
16f0: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
1700: 2d 24 61 76 2e 32 2e 33 20 7b 0a 20 20 23 20 54  -$av.2.3 {.  # T
1710: 75 72 6e 20 64 62 27 73 20 74 72 61 6e 73 61 63  urn db's transac
1720: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 77 72 69 74  tion into a writ
1730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 64  e-transaction. d
1740: 62 33 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  b3 should still 
1750: 62 65 0a 20 20 23 20 61 62 6c 65 20 74 6f 20 72  be.  # able to r
1760: 65 61 64 20 66 72 6f 6d 20 74 61 62 6c 65 20 64  ead from table d
1770: 65 66 20 28 62 75 74 20 77 69 6c 6c 20 6e 6f 74  ef (but will not
1780: 20 73 65 65 20 74 68 65 20 6e 65 77 20 72 6f 77   see the new row
1790: 29 2e 20 43 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  ). Connection.  
17a0: 23 20 64 62 32 20 73 68 6f 75 6c 64 20 6e 6f 74  # db2 should not
17b0: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64   be able to read
17c0: 20 64 65 66 20 28 62 65 63 61 75 73 65 20 6f 66   def (because of
17d0: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 29   the write-lock)
17e0: 2e 0a 0a 23 20 54 6f 64 6f 3a 20 54 68 65 20 66  ...# Todo: The f
17f0: 61 69 6c 65 64 20 22 49 4e 53 45 52 54 20 49 4e  ailed "INSERT IN
1800: 54 4f 20 61 62 63 20 2e 2e 2e 22 20 73 74 61 74  TO abc ..." stat
1810: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f  ement in the abo
1820: 76 65 20 74 65 73 74 0a 23 20 68 61 73 20 73 74  ve test.# has st
1830: 61 72 74 65 64 20 61 20 77 72 69 74 65 2d 74 72  arted a write-tr
1840: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64 62 32  ansaction on db2
1850: 20 28 73 68 6f 75 6c 64 20 74 68 69 73 20 62 65   (should this be
1860: 20 73 6f 3f 29 2e 20 54 68 69 73 20 0a 23 20 77   so?). This .# w
1870: 6f 75 6c 64 20 70 72 65 76 65 6e 74 20 63 6f 6e  ould prevent con
1880: 6e 65 63 74 69 6f 6e 20 64 62 20 66 72 6f 6d 20  nection db from 
1890: 73 74 61 72 74 69 6e 67 20 61 20 77 72 69 74 65  starting a write
18a0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f  -transaction. So
18b0: 20 72 6f 6c 6c 20 74 68 65 0a 23 20 64 62 32 20   roll the.# db2 
18c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 61 63 6b  transaction back
18d0: 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
18e0: 77 69 74 68 20 61 20 6e 65 77 20 72 65 61 64 20  with a new read 
18f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 65  transaction..  e
1900: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c  xecsql {.    ROL
1910: 4c 42 41 43 4b 3b 0a 20 20 20 20 42 45 47 49 4e  LBACK;.    BEGIN
1920: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1930: 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64 62 32  ROM abc;.  } db2
1940: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
1950: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65    INSERT INTO de
1960: 66 20 56 41 4c 55 45 53 28 27 56 49 49 27 2c 20  f VALUES('VII', 
1970: 27 56 49 49 49 27 2c 20 27 49 58 27 29 3b 0a 20  'VIII', 'IX');. 
1980: 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b 0a 20 20   }.  concat [.  
1990: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
19a0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 3b 20  ECT * FROM def; 
19b0: 7d 20 64 62 33 0a 20 20 5d 20 5b 0a 20 20 20 20  } db3.  ] [.    
19c0: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
19d0: 54 20 2a 20 46 52 4f 4d 20 64 65 66 3b 20 7d 20  T * FROM def; } 
19e0: 64 62 32 0a 20 20 5d 0a 7d 20 7b 30 20 7b 49 56  db2.  ].} {0 {IV
19f0: 20 56 20 56 49 7d 20 31 20 7b 64 61 74 61 62 61   V VI} 1 {databa
1a00: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
1a10: 65 64 3a 20 64 65 66 7d 7d 0a 64 6f 5f 74 65 73  ed: def}}.do_tes
1a20: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 32 2e 34  t shared-$av.2.4
1a30: 20 7b 0a 20 20 23 20 43 6f 6d 6d 69 74 20 74 68   {.  # Commit th
1a40: 65 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  e open transacti
1a50: 6f 6e 20 6f 6e 20 64 62 2e 20 64 62 32 20 73 74  on on db. db2 st
1a60: 69 6c 6c 20 68 6f 6c 64 73 20 61 20 72 65 61 64  ill holds a read
1a70: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20  -transaction..  
1a80: 23 20 54 68 69 73 20 73 68 6f 75 6c 64 20 70 72  # This should pr
1a90: 65 76 65 6e 74 20 64 62 33 20 66 72 6f 6d 20 77  event db3 from w
1aa0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1ab0: 74 61 62 61 73 65 2c 20 62 75 74 20 6e 6f 74 20  tabase, but not 
1ac0: 66 72 6f 6d 20 0a 20 20 23 20 72 65 61 64 69 6e  from .  # readin
1ad0: 67 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  g..  execsql {. 
1ae0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
1af0: 20 63 6f 6e 63 61 74 20 5b 0a 20 20 20 20 63 61   concat [.    ca
1b00: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
1b10: 2a 20 46 52 4f 4d 20 64 65 66 3b 20 7d 20 64 62  * FROM def; } db
1b20: 33 0a 20 20 5d 20 5b 0a 20 20 20 20 63 61 74 63  3.  ] [.    catc
1b30: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
1b40: 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27 58  TO def VALUES('X
1b50: 27 2c 20 27 58 49 27 2c 20 27 58 49 49 27 29 3b  ', 'XI', 'XII');
1b60: 20 7d 20 64 62 33 0a 20 20 5d 0a 7d 20 7b 30 20   } db3.  ].} {0 
1b70: 7b 49 56 20 56 20 56 49 20 56 49 49 20 56 49 49  {IV V VI VII VII
1b80: 49 20 49 58 7d 20 31 20 7b 64 61 74 61 62 61 73  I IX} 1 {databas
1b90: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 63  e is locked}}..c
1ba0: 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 20 64  atchsql COMMIT d
1bb0: 62 32 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  b2..do_test shar
1bc0: 65 64 2d 24 61 76 2e 33 2e 31 2e 31 20 7b 0a 20  ed-$av.3.1.1 {. 
1bd0: 20 23 20 54 68 69 73 20 74 65 73 74 20 63 61 73   # This test cas
1be0: 65 20 73 74 61 72 74 73 20 61 20 6c 69 6e 65 61  e starts a linea
1bf0: 72 20 73 63 61 6e 20 6f 66 20 74 61 62 6c 65 20  r scan of table 
1c00: 27 73 65 71 27 20 75 73 69 6e 67 20 61 20 0a 20  'seq' using a . 
1c10: 20 23 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74   # read-uncommit
1c20: 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ted connection. 
1c30: 49 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  In the middle of
1c40: 20 74 68 65 20 73 63 61 6e 2c 20 72 6f 77 73 20   the scan, rows 
1c50: 61 72 65 20 61 64 64 65 64 0a 20 20 23 20 74 6f  are added.  # to
1c60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1c70: 73 65 71 20 74 61 62 6c 65 20 28 61 68 65 61 64  seq table (ahead
1c80: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1c90: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 29  cursor position)
1ca0: 2e 0a 20 20 23 20 54 68 65 20 75 6e 63 6f 6d 6d  ..  # The uncomm
1cb0: 69 74 74 65 64 20 72 6f 77 73 20 73 68 6f 75 6c  itted rows shoul
1cc0: 64 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  d be included in
1cd0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1ce0: 74 68 65 20 73 63 61 6e 2e 0a 20 20 65 78 65 63  the scan..  exec
1cf0: 73 71 6c 20 22 0a 20 20 20 20 43 52 45 41 54 45  sql ".    CREATE
1d00: 20 54 41 42 4c 45 20 73 65 71 28 69 20 50 52 49   TABLE seq(i PRI
1d10: 4d 41 52 59 20 4b 45 59 2c 20 78 29 3b 0a 20 20  MARY KEY, x);.  
1d20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65    INSERT INTO se
1d30: 71 20 56 41 4c 55 45 53 28 31 2c 20 27 5b 73 74  q VALUES(1, '[st
1d40: 72 69 6e 67 20 72 65 70 65 61 74 20 58 20 35 30  ring repeat X 50
1d50: 30 5d 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  0]');.    INSERT
1d60: 20 49 4e 54 4f 20 73 65 71 20 56 41 4c 55 45 53   INTO seq VALUES
1d70: 28 32 2c 20 27 5b 73 74 72 69 6e 67 20 72 65 70  (2, '[string rep
1d80: 65 61 74 20 58 20 35 30 30 5d 27 29 3b 0a 20 20  eat X 500]');.  
1d90: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  ".  execsql {SEL
1da0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
1db0: 65 5f 6d 61 73 74 65 72 7d 20 64 62 32 0a 20 20  e_master} db2.  
1dc0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
1dd0: 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64  read_uncommitted
1de0: 20 3d 20 31 7d 20 64 62 32 0a 0a 20 20 73 65 74   = 1} db2..  set
1df0: 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 64 62   ret [list].  db
1e00: 32 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 69  2 eval {SELECT i
1e10: 20 46 52 4f 4d 20 73 65 71 20 4f 52 44 45 52 20   FROM seq ORDER 
1e20: 42 59 20 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b  BY i} {.    if {
1e30: 24 69 20 3c 20 34 7d 20 7b 0a 20 20 20 20 20 20  $i < 4} {.      
1e40: 73 65 74 20 6d 61 78 20 5b 65 78 65 63 73 71 6c  set max [execsql
1e50: 20 7b 53 45 4c 45 43 54 20 6d 61 78 28 69 29 20   {SELECT max(i) 
1e60: 46 52 4f 4d 20 73 65 71 7d 5d 0a 20 20 20 20 20  FROM seq}].     
1e70: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20   db eval {.     
1e80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73     INSERT INTO s
1e90: 65 71 20 53 45 4c 45 43 54 20 69 20 2b 20 3a 6d  eq SELECT i + :m
1ea0: 61 78 2c 20 78 20 46 52 4f 4d 20 73 65 71 3b 0a  ax, x FROM seq;.
1eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ec0: 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 24 69    lappend ret $i
1ed0: 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d  .  }.  set ret.}
1ee0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
1ef0: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
1f00: 31 34 20 31 35 20 31 36 7d 0a 64 6f 5f 74 65 73  14 15 16}.do_tes
1f10: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 33 2e 31  t shared-$av.3.1
1f20: 2e 32 20 7b 0a 20 20 23 20 41 6e 6f 74 68 65 72  .2 {.  # Another
1f30: 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
1f40: 6f 75 67 68 20 74 61 62 6c 65 20 73 65 71 20 75  ough table seq u
1f50: 73 69 6e 67 20 61 20 72 65 61 64 2d 75 6e 63 6f  sing a read-unco
1f60: 6d 6d 69 74 74 65 64 20 63 6f 6e 6e 65 63 74 69  mmitted connecti
1f70: 6f 6e 2e 0a 20 20 23 20 54 68 69 73 20 74 69 6d  on..  # This tim
1f80: 65 2c 20 64 65 6c 65 74 65 20 65 61 63 68 20 72  e, delete each r
1f90: 6f 77 20 61 73 20 69 74 20 69 73 20 72 65 61 64  ow as it is read
1fa0: 2e 20 53 68 6f 75 6c 64 20 6e 6f 74 20 61 66 66  . Should not aff
1fb0: 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  ect the results 
1fc0: 6f 66 0a 20 20 23 20 74 68 65 20 73 63 61 6e 2c  of.  # the scan,
1fd0: 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20 73   but the table s
1fe0: 68 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 20 61  hould be empty a
1ff0: 66 74 65 72 20 74 68 65 20 73 63 61 6e 20 69 73  fter the scan is
2000: 20 63 6f 6e 63 6c 75 64 65 64 20 0a 20 20 23 20   concluded .  # 
2010: 28 74 65 73 74 20 33 2e 31 2e 33 20 76 65 72 69  (test 3.1.3 veri
2020: 66 69 65 73 20 74 68 69 73 29 2e 0a 20 20 73 65  fies this)..  se
2030: 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 64  t ret [list].  d
2040: 62 32 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  b2 eval {SELECT 
2050: 69 20 46 52 4f 4d 20 73 65 71 7d 20 7b 0a 20 20  i FROM seq} {.  
2060: 20 20 64 62 20 65 76 61 6c 20 7b 44 45 4c 45 54    db eval {DELET
2070: 45 20 46 52 4f 4d 20 73 65 71 20 57 48 45 52 45  E FROM seq WHERE
2080: 20 69 20 3d 20 3a 69 7d 0a 20 20 20 20 6c 61 70   i = :i}.    lap
2090: 70 65 6e 64 20 72 65 74 20 24 69 0a 20 20 7d 0a  pend ret $i.  }.
20a0: 20 20 73 65 74 20 72 65 74 0a 7d 20 7b 31 20 32    set ret.} {1 2
20b0: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
20c0: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
20d0: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61   16}.do_test sha
20e0: 72 65 64 2d 24 61 76 2e 33 2e 31 2e 33 20 7b 0a  red-$av.3.1.3 {.
20f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2100: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 65  SELECT * FROM se
2110: 71 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 63 61 74  q;.  }.} {}..cat
2120: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 63 61  ch {db close}.ca
2130: 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a  tch {db2 close}.
2140: 63 61 74 63 68 20 7b 64 62 33 20 63 6c 6f 73 65  catch {db3 close
2150: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
21a0: 20 54 65 73 74 73 20 73 68 61 72 65 64 2d 34 2e   Tests shared-4.
21b0: 2a 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20  * test that the 
21c0: 73 63 68 65 6d 61 20 6c 6f 63 6b 69 6e 67 20 72  schema locking r
21d0: 75 6c 65 73 20 61 72 65 20 61 70 70 6c 69 65 64  ules are applied
21e0: 20 0a 23 20 63 6f 72 72 65 63 74 6c 79 2e 20 69   .# correctly. i
21f0: 2e 65 2e 3a 0a 23 0a 23 20 31 2e 20 41 6c 6c 20  .e.:.#.# 1. All 
2200: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 72 65 71  transactions req
2210: 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
2220: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 73 20   on the schemas 
2230: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 65  of databases the
2240: 79 0a 23 20 20 20 20 61 63 63 65 73 73 2e 0a 23  y.#    access..#
2250: 20 32 2e 20 54 72 61 6e 73 61 63 74 69 6f 6e 73   2. Transactions
2260: 20 74 68 61 74 20 6d 6f 64 69 66 79 20 61 20 64   that modify a d
2270: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 72  atabase schema r
2280: 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
2290: 6f 63 6b 20 6f 6e 20 74 68 61 74 0a 23 20 20 20  ock on that.#   
22a0: 20 73 63 68 65 6d 61 2e 0a 23 20 33 2e 20 49 74   schema..# 3. It
22b0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
22c0: 20 74 6f 20 63 6f 6d 70 69 6c 65 20 61 20 73 74   to compile a st
22d0: 61 74 65 6d 65 6e 74 20 77 68 69 6c 65 20 61 6e  atement while an
22e0: 6f 74 68 65 72 20 68 61 6e 64 6c 65 20 68 61 73  other handle has
22f0: 20 61 20 0a 23 20 20 20 20 77 72 69 74 65 2d 6c   a .#    write-l
2300: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
2310: 61 2e 0a 23 0a 0a 23 20 4f 70 65 6e 20 74 77 6f  a..#..# Open two
2320: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
2330: 73 20 64 62 20 61 6e 64 20 64 62 32 2e 20 45 61  s db and db2. Ea
2340: 63 68 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20  ch has a single 
2350: 61 74 74 61 63 68 20 64 61 74 61 62 61 73 65 0a  attach database.
2360: 23 20 28 61 73 20 77 65 6c 6c 20 61 73 20 6d 61  # (as well as ma
2370: 69 6e 29 3a 0a 23 0a 23 20 20 20 20 20 64 62 2e  in):.#.#     db.
2380: 6d 61 69 6e 20 20 20 2d 3e 20 20 20 2e 2f 74 65  main   ->   ./te
2390: 73 74 2e 64 62 0a 23 20 20 20 20 20 64 62 2e 74  st.db.#     db.t
23a0: 65 73 74 32 20 20 2d 3e 20 20 20 2e 2f 74 65 73  est2  ->   ./tes
23b0: 74 32 2e 64 62 0a 23 20 20 20 20 20 64 62 32 2e  t2.db.#     db2.
23c0: 6d 61 69 6e 20 20 2d 3e 20 20 20 2e 2f 74 65 73  main  ->   ./tes
23d0: 74 32 2e 64 62 0a 23 20 20 20 20 20 64 62 32 2e  t2.db.#     db2.
23e0: 74 65 73 74 20 20 2d 3e 20 20 20 2e 2f 74 65 73  test  ->   ./tes
23f0: 74 2e 64 62 0a 23 0a 66 6f 72 63 65 64 65 6c 65  t.db.#.forcedele
2400: 74 65 20 74 65 73 74 2e 64 62 0a 66 6f 72 63 65  te test.db.force
2410: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 0a  delete test2.db.
2420: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
2430: 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c  2.db-journal.sql
2440: 69 74 65 33 20 64 62 20 20 74 65 73 74 2e 64 62  ite3 db  test.db
2450: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73  .sqlite3 db2 tes
2460: 74 32 2e 64 62 0a 64 6f 5f 74 65 73 74 20 73 68  t2.db.do_test sh
2470: 61 72 65 64 2d 24 61 76 2e 34 2e 31 2e 31 20 7b  ared-$av.4.1.1 {
2480: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70  .  set sqlite_op
2490: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 20 20  en_file_count.  
24a0: 65 78 70 72 20 24 73 71 6c 69 74 65 5f 6f 70 65  expr $sqlite_ope
24b0: 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2d 28 24 65  n_file_count-($e
24c0: 78 74 72 61 66 64 73 5f 70 72 65 6c 6f 63 6b 2a  xtrafds_prelock*
24d0: 32 29 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74  2).} {2}.do_test
24e0: 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 31 2e   shared-$av.4.1.
24f0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 41  2 {.  execsql {A
2500: 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27  TTACH 'test2.db'
2510: 20 41 53 20 74 65 73 74 32 7d 0a 20 20 73 65 74   AS test2}.  set
2520: 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c   sqlite_open_fil
2530: 65 5f 63 6f 75 6e 74 0a 20 20 65 78 70 72 20 24  e_count.  expr $
2540: 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
2550: 5f 63 6f 75 6e 74 2d 28 24 65 78 74 72 61 66 64  _count-($extrafd
2560: 73 5f 70 6f 73 74 6c 6f 63 6b 2a 32 29 0a 7d 20  s_postlock*2).} 
2570: 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  {2}.do_test shar
2580: 65 64 2d 24 61 76 2e 34 2e 31 2e 33 20 7b 0a 20  ed-$av.4.1.3 {. 
2590: 20 65 78 65 63 73 71 6c 20 7b 41 54 54 41 43 48   execsql {ATTACH
25a0: 20 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 65   'test.db' AS te
25b0: 73 74 7d 20 64 62 32 0a 20 20 73 65 74 20 73 71  st} db2.  set sq
25c0: 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  lite_open_file_c
25d0: 6f 75 6e 74 0a 20 20 65 78 70 72 20 24 73 71 6c  ount.  expr $sql
25e0: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
25f0: 75 6e 74 2d 28 24 65 78 74 72 61 66 64 73 5f 70  unt-($extrafds_p
2600: 6f 73 74 6c 6f 63 6b 2a 32 29 0a 7d 20 7b 32 7d  ostlock*2).} {2}
2610: 0a 0a 23 20 53 61 6e 69 74 79 20 63 68 65 63 6b  ..# Sanity check
2620: 3a 20 43 72 65 61 74 65 20 61 20 74 61 62 6c 65  : Create a table
2630: 20 69 6e 20 2e 2f 74 65 73 74 2e 64 62 20 76 69   in ./test.db vi
2640: 61 20 68 61 6e 64 6c 65 20 64 62 2c 20 61 6e 64  a handle db, and
2650: 20 74 65 73 74 20 74 68 61 74 20 68 61 6e 64 6c   test that handl
2660: 65 0a 23 20 64 62 32 20 63 61 6e 20 22 73 65 65  e.# db2 can "see
2670: 22 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  " the new table 
2680: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 41 20 68  immediately. A h
2690: 61 6e 64 6c 65 20 75 73 69 6e 67 20 61 20 73 65  andle using a se
26a0: 70 65 72 61 74 65 20 70 61 67 65 72 0a 23 20 63  perate pager.# c
26b0: 61 63 68 65 20 77 6f 75 6c 64 20 68 61 76 65 20  ache would have 
26c0: 74 6f 20 72 65 6c 6f 61 64 20 74 68 65 20 64 61  to reload the da
26d0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 62 65  tabase schema be
26e0: 66 6f 72 65 20 74 68 69 73 20 77 65 72 65 20 70  fore this were p
26f0: 6f 73 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65  ossible..#.do_te
2700: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e  st shared-$av.4.
2710: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
2720: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2730: 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b  LE abc(a, b, c);
2740: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2750: 45 20 64 65 66 28 64 2c 20 65 2c 20 66 29 3b 0a  E def(d, e, f);.
2760: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2770: 61 62 63 20 56 41 4c 55 45 53 28 27 69 27 2c 20  abc VALUES('i', 
2780: 27 69 69 27 2c 20 27 69 69 69 27 29 3b 0a 20 20  'ii', 'iii');.  
2790: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65    INSERT INTO de
27a0: 66 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49  f VALUES('I', 'I
27b0: 49 27 2c 20 27 49 49 49 27 29 3b 0a 20 20 7d 0a  I', 'III');.  }.
27c0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  } {}.do_test sha
27d0: 72 65 64 2d 24 61 76 2e 34 2e 32 2e 32 20 7b 0a  red-$av.4.2.2 {.
27e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
27f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
2800: 73 74 2e 61 62 63 3b 0a 20 20 7d 20 64 62 32 0a  st.abc;.  } db2.
2810: 7d 20 7b 69 20 69 69 20 69 69 69 7d 0a 0a 23 20  } {i ii iii}..# 
2820: 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  Open a read-tran
2830: 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 61 64  saction and read
2840: 20 66 72 6f 6d 20 74 61 62 6c 65 20 61 62 63 20   from table abc 
2850: 76 69 61 20 68 61 6e 64 6c 65 20 32 2e 20 43 68  via handle 2. Ch
2860: 65 63 6b 20 74 68 61 74 0a 23 20 68 61 6e 64 6c  eck that.# handl
2870: 65 20 31 20 63 61 6e 20 72 65 61 64 20 74 61 62  e 1 can read tab
2880: 6c 65 20 61 62 63 2e 20 43 68 65 63 6b 20 74 68  le abc. Check th
2890: 61 74 20 68 61 6e 64 6c 65 20 31 20 63 61 6e 6e  at handle 1 cann
28a0: 6f 74 20 6d 6f 64 69 66 79 20 74 61 62 6c 65 20  ot modify table 
28b0: 61 62 63 0a 23 20 6f 72 20 74 68 65 20 64 61 74  abc.# or the dat
28c0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 54 68  abase schema. Th
28d0: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 68 61  en check that ha
28e0: 6e 64 6c 65 20 31 20 63 61 6e 20 6d 6f 64 69 66  ndle 1 can modif
28f0: 79 20 74 61 62 6c 65 20 64 65 66 2e 0a 23 0a 64  y table def..#.d
2900: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
2910: 76 2e 34 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63  v.4.3.1 {.  exec
2920: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
2930: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2940: 4f 4d 20 74 65 73 74 2e 61 62 63 3b 0a 20 20 7d  OM test.abc;.  }
2950: 20 64 62 32 0a 7d 20 7b 69 20 69 69 20 69 69 69   db2.} {i ii iii
2960: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
2970: 2d 24 61 76 2e 34 2e 33 2e 32 20 7b 0a 20 20 63  -$av.4.3.2 {.  c
2980: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e  atchsql {.    IN
2990: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
29a0: 4c 55 45 53 28 27 69 76 27 2c 20 27 76 27 2c 20  LUES('iv', 'v', 
29b0: 27 76 69 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  'vi');.  }.} {1 
29c0: 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  {database table 
29d0: 69 73 20 6c 6f 63 6b 65 64 3a 20 61 62 63 7d 7d  is locked: abc}}
29e0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
29f0: 24 61 76 2e 34 2e 33 2e 33 20 7b 0a 20 20 63 61  $av.4.3.3 {.  ca
2a00: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  tchsql {.    CRE
2a10: 41 54 45 20 54 41 42 4c 45 20 67 68 69 28 67 2c  ATE TABLE ghi(g,
2a20: 20 68 2c 20 69 29 3b 0a 20 20 7d 0a 7d 20 7b 31   h, i);.  }.} {1
2a30: 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   {database table
2a40: 20 69 73 20 6c 6f 63 6b 65 64 3a 20 73 71 6c 69   is locked: sqli
2a50: 74 65 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74  te_master}}.do_t
2a60: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34  est shared-$av.4
2a70: 2e 33 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  .3.3 {.  catchsq
2a80: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
2a90: 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27  NTO def VALUES('
2aa0: 49 56 27 2c 20 27 56 27 2c 20 27 56 49 27 29 3b  IV', 'V', 'VI');
2ab0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  .  }.} {0 {}}.do
2ac0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
2ad0: 2e 34 2e 33 2e 34 20 7b 0a 20 20 23 20 43 6c 65  .4.3.4 {.  # Cle
2ae0: 61 6e 75 70 3a 20 63 6f 6d 6d 69 74 20 74 68 65  anup: commit the
2af0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
2b00: 6e 65 64 20 62 79 20 64 62 32 2e 0a 20 20 65 78  ned by db2..  ex
2b10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d  ecsql {.    COMM
2b20: 49 54 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a  IT.  } db2.} {}.
2b30: 0a 23 20 4f 70 65 6e 20 61 20 77 72 69 74 65 2d  .# Open a write-
2b40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 75 73 69 6e  transaction usin
2b50: 67 20 68 61 6e 64 6c 65 20 31 20 61 6e 64 20 6d  g handle 1 and m
2b60: 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
2b70: 73 65 20 73 63 68 65 6d 61 2e 0a 23 20 54 68 65  se schema..# The
2b80: 6e 20 74 72 79 20 74 6f 20 65 78 65 63 75 74 65  n try to execute
2b90: 20 61 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74   a compiled stat
2ba0: 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 66 72  ement to read fr
2bb0: 6f 6d 20 74 68 65 20 73 61 6d 65 20 0a 23 20 64  om the same .# d
2bc0: 61 74 61 62 61 73 65 20 76 69 61 20 68 61 6e 64  atabase via hand
2bd0: 6c 65 20 32 20 28 66 61 69 6c 73 20 74 6f 20 67  le 2 (fails to g
2be0: 65 74 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73  et the lock on s
2bf0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 29 2e 20 41  qlite_master). A
2c00: 6c 73 6f 0a 23 20 74 72 79 20 74 6f 20 63 6f 6d  lso.# try to com
2c10: 70 69 6c 65 20 61 20 72 65 61 64 20 6f 66 20 74  pile a read of t
2c20: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
2c30: 20 75 73 69 6e 67 20 68 61 6e 64 6c 65 20 32 20   using handle 2 
2c40: 28 61 6c 73 6f 20 66 61 69 6c 73 29 2e 0a 23 20  (also fails)..# 
2c50: 46 69 6e 61 6c 6c 79 2c 20 63 6f 6d 70 69 6c 65  Finally, compile
2c60: 20 61 20 72 65 61 64 20 6f 66 20 74 68 65 20 6f   a read of the o
2c70: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
2c80: 69 6e 67 20 68 61 6e 64 6c 65 20 32 2e 20 54 68  ing handle 2. Th
2c90: 69 73 0a 23 20 73 68 6f 75 6c 64 20 61 6c 73 6f  is.# should also
2ca0: 20 66 61 69 6c 2e 0a 23 0a 69 66 63 61 70 61 62   fail..#.ifcapab
2cb0: 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20  le compound {.  
2cc0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
2cd0: 61 76 2e 34 2e 34 2e 31 2e 32 20 7b 0a 20 20 20  av.4.4.1.2 {.   
2ce0: 20 23 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20   # Sanity check 
2cf0: 31 3a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  1: Check that th
2d00: 65 20 73 63 68 65 6d 61 20 69 73 20 77 68 61 74  e schema is what
2d10: 20 77 65 20 74 68 69 6e 6b 20 69 74 20 69 73 20   we think it is 
2d20: 77 68 65 6e 20 76 69 65 77 65 64 0a 20 20 20 20  when viewed.    
2d30: 23 20 76 69 61 20 68 61 6e 64 6c 65 20 31 2e 0a  # via handle 1..
2d40: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2d50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2d60: 20 74 65 73 74 32 2e 67 68 69 28 67 2c 20 68 2c   test2.ghi(g, h,
2d70: 20 69 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   i);.      SELEC
2d80: 54 20 27 74 65 73 74 2e 64 62 3a 27 7c 7c 6e 61  T 'test.db:'||na
2d90: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
2da0: 61 73 74 65 72 20 0a 20 20 20 20 20 20 55 4e 49  aster .      UNI
2db0: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c  ON ALL.      SEL
2dc0: 45 43 54 20 27 74 65 73 74 32 2e 64 62 3a 27 7c  ECT 'test2.db:'|
2dd0: 7c 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73 74 32  |name FROM test2
2de0: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a  .sqlite_master;.
2df0: 20 20 20 20 7d 0a 20 20 7d 20 7b 74 65 73 74 2e      }.  } {test.
2e00: 64 62 3a 61 62 63 20 74 65 73 74 2e 64 62 3a 64  db:abc test.db:d
2e10: 65 66 20 74 65 73 74 32 2e 64 62 3a 67 68 69 7d  ef test2.db:ghi}
2e20: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
2e30: 64 2d 24 61 76 2e 34 2e 34 2e 31 2e 32 20 7b 0a  d-$av.4.4.1.2 {.
2e40: 20 20 20 20 23 20 53 61 6e 69 74 79 20 63 68 65      # Sanity che
2e50: 63 6b 20 32 3a 20 43 68 65 63 6b 20 74 68 61 74  ck 2: Check that
2e60: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 77   the schema is w
2e70: 68 61 74 20 77 65 20 74 68 69 6e 6b 20 69 74 20  hat we think it 
2e80: 69 73 20 77 68 65 6e 20 76 69 65 77 65 64 0a 20  is when viewed. 
2e90: 20 20 20 23 20 76 69 61 20 68 61 6e 64 6c 65 20     # via handle 
2ea0: 32 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  2..    execsql {
2eb0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 74  .      SELECT 't
2ec0: 65 73 74 32 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20  est2.db:'||name 
2ed0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2ee0: 65 72 20 0a 20 20 20 20 20 20 55 4e 49 4f 4e 20  er .      UNION 
2ef0: 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ALL.      SELECT
2f00: 20 27 74 65 73 74 2e 64 62 3a 27 7c 7c 6e 61 6d   'test.db:'||nam
2f10: 65 20 46 52 4f 4d 20 74 65 73 74 2e 73 71 6c 69  e FROM test.sqli
2f20: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 7d  te_master;.    }
2f30: 20 64 62 32 0a 20 20 7d 20 7b 74 65 73 74 32 2e   db2.  } {test2.
2f40: 64 62 3a 67 68 69 20 74 65 73 74 2e 64 62 3a 61  db:ghi test.db:a
2f50: 62 63 20 74 65 73 74 2e 64 62 3a 64 65 66 7d 0a  bc test.db:def}.
2f60: 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }..do_test share
2f70: 64 2d 24 61 76 2e 34 2e 34 2e 32 20 7b 0a 20 20  d-$av.4.4.2 {.  
2f80: 73 65 74 20 3a 3a 44 42 32 20 5b 73 71 6c 69 74  set ::DB2 [sqlit
2f90: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
2fa0: 69 6e 74 65 72 20 64 62 32 5d 0a 20 20 73 65 74  inter db2].  set
2fb0: 20 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46   sql {SELECT * F
2fc0: 52 4f 4d 20 61 62 63 7d 0a 20 20 73 65 74 20 3a  ROM abc}.  set :
2fd0: 3a 53 54 4d 54 31 20 5b 73 71 6c 69 74 65 33 5f  :STMT1 [sqlite3_
2fe0: 70 72 65 70 61 72 65 20 24 3a 3a 44 42 32 20 24  prepare $::DB2 $
2ff0: 73 71 6c 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20  sql -1 DUMMY].  
3000: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
3010: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
3020: 54 41 42 4c 45 20 6a 6b 6c 28 6a 2c 20 6b 2c 20  TABLE jkl(j, k, 
3030: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
3040: 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 31 0a  3_step $::STMT1.
3050: 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d  } {SQLITE_ERROR}
3060: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
3070: 24 61 76 2e 34 2e 34 2e 33 20 7b 0a 20 20 73 71  $av.4.4.3 {.  sq
3080: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
3090: 3a 3a 53 54 4d 54 31 0a 7d 20 7b 53 51 4c 49 54  ::STMT1.} {SQLIT
30a0: 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73  E_LOCKED}.do_tes
30b0: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 34  t shared-$av.4.4
30c0: 2e 34 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63  .4 {.  set rc [c
30d0: 61 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a  atch {.    set :
30e0: 3a 53 54 4d 54 31 20 5b 73 71 6c 69 74 65 33 5f  :STMT1 [sqlite3_
30f0: 70 72 65 70 61 72 65 20 24 3a 3a 44 42 32 20 24  prepare $::DB2 $
3100: 73 71 6c 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20  sql -1 DUMMY].  
3110: 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72  } msg].  list $r
3120: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 28 36 29  c $msg.} {1 {(6)
3130: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
3140: 20 69 73 20 6c 6f 63 6b 65 64 3a 20 74 65 73 74   is locked: test
3150: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
3160: 64 2d 24 61 76 2e 34 2e 34 2e 35 20 7b 0a 20 20  d-$av.4.4.5 {.  
3170: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a  set rc [catch {.
3180: 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 31 20      set ::STMT1 
3190: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
31a0: 20 24 3a 3a 44 42 32 20 22 53 45 4c 45 43 54 20   $::DB2 "SELECT 
31b0: 2a 20 46 52 4f 4d 20 67 68 69 22 20 2d 31 20 44  * FROM ghi" -1 D
31c0: 55 4d 4d 59 5d 0a 20 20 7d 20 6d 73 67 5d 0a 20  UMMY].  } msg]. 
31d0: 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d   list $rc $msg.}
31e0: 20 7b 31 20 7b 28 36 29 20 64 61 74 61 62 61 73   {1 {(6) databas
31f0: 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b  e schema is lock
3200: 65 64 3a 20 74 65 73 74 7d 7d 0a 0a 0a 63 61 74  ed: test}}...cat
3210: 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 63  ch {db2 close}.c
3220: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
3230: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
3280: 65 73 74 73 20 73 68 61 72 65 64 2d 35 2e 2a 20  ests shared-5.* 
3290: 0a 23 0a 66 6f 72 65 61 63 68 20 64 62 20 5b 6c  .#.foreach db [l
32a0: 69 73 74 20 74 65 73 74 2e 64 62 20 74 65 73 74  ist test.db test
32b0: 31 2e 64 62 20 74 65 73 74 32 2e 64 62 20 74 65  1.db test2.db te
32c0: 73 74 33 2e 64 62 5d 20 7b 0a 20 20 66 6f 72 63  st3.db] {.  forc
32d0: 65 64 65 6c 65 74 65 20 24 64 62 20 24 7b 64 62  edelete $db ${db
32e0: 7d 2d 6a 6f 75 72 6e 61 6c 0a 7d 0a 64 6f 5f 74  }-journal.}.do_t
32f0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 35  est shared-$av.5
3300: 2e 31 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .1.1 {.  sqlite3
3310: 20 64 62 31 20 74 65 73 74 2e 64 62 0a 20 20 73   db1 test.db.  s
3320: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
3330: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
3340: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 31     ATTACH 'test1
3350: 2e 64 62 27 20 41 53 20 74 65 73 74 31 3b 0a 20  .db' AS test1;. 
3360: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
3370: 2e 64 62 27 20 41 53 20 74 65 73 74 32 3b 0a 20  .db' AS test2;. 
3380: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 33     ATTACH 'test3
3390: 2e 64 62 27 20 41 53 20 74 65 73 74 33 3b 0a 20  .db' AS test3;. 
33a0: 20 7d 20 64 62 31 0a 20 20 65 78 65 63 73 71 6c   } db1.  execsql
33b0: 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74   {.    ATTACH 't
33c0: 65 73 74 33 2e 64 62 27 20 41 53 20 74 65 73 74  est3.db' AS test
33d0: 33 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  3;.    ATTACH 't
33e0: 65 73 74 32 2e 64 62 27 20 41 53 20 74 65 73 74  est2.db' AS test
33f0: 32 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  2;.    ATTACH 't
3400: 65 73 74 31 2e 64 62 27 20 41 53 20 74 65 73 74  est1.db' AS test
3410: 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a  1;.  } db2.} {}.
3420: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
3430: 61 76 2e 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65  av.5.1.2 {.  exe
3440: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
3450: 45 20 54 41 42 4c 45 20 74 65 73 74 31 2e 74 31  E TABLE test1.t1
3460: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
3470: 54 45 20 49 4e 44 45 58 20 74 65 73 74 31 2e 69  TE INDEX test1.i
3480: 31 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20  1 ON t1(a, b);. 
3490: 20 7d 20 64 62 31 0a 7d 20 7b 7d 0a 69 66 63 61   } db1.} {}.ifca
34a0: 70 61 62 6c 65 20 76 69 65 77 20 7b 0a 20 20 64  pable view {.  d
34b0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
34c0: 76 2e 35 2e 31 2e 33 20 7b 0a 20 20 20 20 65 78  v.5.1.3 {.    ex
34d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
34e0: 45 41 54 45 20 56 49 45 57 20 74 65 73 74 31 2e  EATE VIEW test1.
34f0: 76 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  v1 AS SELECT * F
3500: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20 64 62  ROM t1;.    } db
3510: 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61 70  1.  } {}.}.ifcap
3520: 61 62 6c 65 20 74 72 69 67 67 65 72 20 7b 0a 20  able trigger {. 
3530: 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d   do_test shared-
3540: 24 61 76 2e 35 2e 31 2e 34 20 7b 0a 20 20 20 20  $av.5.1.4 {.    
3550: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3560: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
3570: 65 73 74 31 2e 74 72 69 67 31 20 41 46 54 45 52  est1.trig1 AFTER
3580: 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45   INSERT ON t1 BE
3590: 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45  GIN.        INSE
35a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
35b0: 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b  S(new.a, new.b);
35c0: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
35d0: 7d 20 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 64  } db1.  } {}.}.d
35e0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
35f0: 76 2e 35 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63  v.5.1.5 {.  exec
3600: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 49  sql {.    DROP I
3610: 4e 44 45 58 20 69 31 3b 0a 20 20 7d 20 64 62 32  NDEX i1;.  } db2
3620: 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20  .} {}.ifcapable 
3630: 76 69 65 77 20 7b 0a 20 20 64 6f 5f 74 65 73 74  view {.  do_test
3640: 20 73 68 61 72 65 64 2d 24 61 76 2e 35 2e 31 2e   shared-$av.5.1.
3650: 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  6 {.    execsql 
3660: 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 56 49 45  {.      DROP VIE
3670: 57 20 76 31 3b 0a 20 20 20 20 7d 20 64 62 32 0a  W v1;.    } db2.
3680: 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61 70 61 62    } {}.}.ifcapab
3690: 6c 65 20 74 72 69 67 67 65 72 20 7b 0a 20 20 64  le trigger {.  d
36a0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
36b0: 76 2e 35 2e 31 2e 37 20 7b 0a 20 20 20 20 65 78  v.5.1.7 {.    ex
36c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52  ecsql {.      DR
36d0: 4f 50 20 54 52 49 47 47 45 52 20 74 72 69 67 31  OP TRIGGER trig1
36e0: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20  ;.    } db2.  } 
36f0: 7b 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  {}.}.do_test sha
3700: 72 65 64 2d 24 61 76 2e 35 2e 31 2e 38 20 7b 0a  red-$av.5.1.8 {.
3710: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3720: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
3730: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 69 66 63 61   } db2.} {}.ifca
3740: 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b  pable compound {
3750: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
3760: 64 2d 24 61 76 2e 35 2e 31 2e 39 20 7b 0a 20 20  d-$av.5.1.9 {.  
3770: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3780: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3790: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
37a0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
37b0: 20 46 52 4f 4d 20 74 65 73 74 31 2e 73 71 6c 69   FROM test1.sqli
37c0: 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 7d 20  te_master.    } 
37d0: 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d  db1.  } {}.}..#-
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
3830: 73 20 73 68 61 72 65 64 2d 36 2e 2a 20 74 65 73  s shared-6.* tes
3840: 74 20 74 68 61 74 20 61 20 71 75 65 72 79 20 6f  t that a query o
3850: 62 74 61 69 6e 73 20 61 6c 6c 20 74 68 65 20 72  btains all the r
3860: 65 61 64 2d 6c 6f 63 6b 73 20 69 74 20 6e 65 65  ead-locks it nee
3870: 64 73 0a 23 20 62 65 66 6f 72 65 20 73 74 61 72  ds.# before star
3880: 74 69 6e 67 20 65 78 65 63 75 74 69 6f 6e 20 6f  ting execution o
3890: 66 20 74 68 65 20 71 75 65 72 79 2e 20 54 68 69  f the query. Thi
38a0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
38b0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 0a  re is no chance.
38c0: 23 20 73 6f 6d 65 20 72 6f 77 73 20 6f 66 20 64  # some rows of d
38d0: 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ata will be retu
38e0: 72 6e 65 64 20 62 65 66 6f 72 65 20 61 20 6c 6f  rned before a lo
38f0: 63 6b 20 66 61 69 6c 73 20 61 6e 64 20 53 51 4c  ck fails and SQL
3900: 49 54 45 5f 4c 4f 43 4b 0a 23 20 69 73 20 72 65  ITE_LOCK.# is re
3910: 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  turned..#.do_tes
3920: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 36 2e 31  t shared-$av.6.1
3930: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
3940: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3950: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3960: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3970: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
3980: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3990: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
39a0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
39b0: 53 28 33 2c 20 34 29 3b 0a 20 20 7d 20 64 62 31  S(3, 4);.  } db1
39c0: 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20  .} {}.ifcapable 
39d0: 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f  compound {.  do_
39e0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
39f0: 36 2e 31 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  6.1.2 {.    exec
3a00: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
3a10: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT * FROM t1 UNI
3a20: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20  ON ALL SELECT * 
3a30: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 20 64  FROM t2;.    } d
3a40: 62 32 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d  b2.  } {1 2 3 4}
3a50: 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .}.do_test share
3a60: 64 2d 24 61 76 2e 36 2e 31 2e 33 20 7b 0a 20 20  d-$av.6.1.3 {.  
3a70: 23 20 45 73 74 61 62 6c 69 73 68 20 61 20 77 72  # Establish a wr
3a80: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 61 62 6c  ite lock on tabl
3a90: 65 20 74 32 20 76 69 61 20 63 6f 6e 6e 65 63 74  e t2 via connect
3aa0: 69 6f 6e 20 64 62 32 2e 20 54 68 65 6e 20 6d 61  ion db2. Then ma
3ab0: 6b 65 20 61 20 0a 20 20 23 20 55 4e 49 4f 4e 20  ke a .  # UNION 
3ac0: 61 6c 6c 20 71 75 65 72 79 20 75 73 69 6e 67 20  all query using 
3ad0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 31 20 74  connection db1 t
3ae0: 68 61 74 20 66 69 72 73 74 20 61 63 63 65 73 73  hat first access
3af0: 65 73 20 74 31 2c 20 66 6f 6c 6c 6f 77 65 64 20  es t1, followed 
3b00: 0a 20 20 23 20 62 79 20 74 32 2e 20 49 66 20 74  .  # by t2. If t
3b10: 68 65 20 6c 6f 63 6b 73 20 61 72 65 20 67 72 61  he locks are gra
3b20: 62 62 65 64 20 61 74 20 74 68 65 20 73 74 61 72  bbed at the star
3b30: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
3b40: 6e 74 20 28 61 73 20 0a 20 20 23 20 74 68 65 79  nt (as .  # they
3b50: 20 73 68 6f 75 6c 64 20 62 65 29 2c 20 6e 6f 20   should be), no 
3b60: 72 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65  rows are returne
3b70: 64 2e 20 49 66 20 28 61 73 20 77 61 73 20 70 72  d. If (as was pr
3b80: 65 76 69 6f 75 73 6c 79 20 74 68 65 20 63 61 73  eviously the cas
3b90: 65 29 0a 20 20 23 20 74 68 65 79 20 61 72 65 20  e).  # they are 
3ba0: 67 72 61 62 62 65 64 20 61 73 20 74 68 65 20 74  grabbed as the t
3bb0: 61 62 6c 65 73 20 61 72 65 20 61 63 63 65 73 73  ables are access
3bc0: 65 64 2c 20 74 68 65 20 74 31 20 72 6f 77 73 20  ed, the t1 rows 
3bd0: 77 69 6c 6c 20 62 65 20 0a 20 20 23 20 72 65 74  will be .  # ret
3be0: 75 72 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  urned before the
3bf0: 20 71 75 65 72 79 20 66 61 69 6c 73 2e 0a 20 20   query fails..  
3c00: 23 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  #.  execsql {.  
3c10: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
3c20: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
3c30: 45 53 28 35 2c 20 36 29 3b 0a 20 20 7d 20 64 62  ES(5, 6);.  } db
3c40: 32 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73  2.  set ret [lis
3c50: 74 5d 0a 20 20 63 61 74 63 68 20 7b 0a 20 20 20  t].  catch {.   
3c60: 20 64 62 31 20 65 76 61 6c 20 7b 53 45 4c 45 43   db1 eval {SELEC
3c70: 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T * FROM t1 UNIO
3c80: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46  N ALL SELECT * F
3c90: 52 4f 4d 20 74 32 7d 20 7b 0a 20 20 20 20 20 20  ROM t2} {.      
3ca0: 6c 61 70 70 65 6e 64 20 72 65 74 20 24 61 20 24  lappend ret $a $
3cb0: 62 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  b.    }.  }.  se
3cc0: 74 20 72 65 74 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  t ret.} {}.do_te
3cd0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 36 2e  st shared-$av.6.
3ce0: 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.4 {.  execsql 
3cf0: 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  {.    COMMIT;.  
3d00: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
3d10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3d20: 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d 20 64 62  ES(7, 8);.  } db
3d30: 32 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73  2.  set ret [lis
3d40: 74 5d 0a 20 20 63 61 74 63 68 20 7b 0a 20 20 20  t].  catch {.   
3d50: 20 64 62 31 20 65 76 61 6c 20 7b 0a 20 20 20 20   db1 eval {.    
3d60: 20 20 53 45 4c 45 43 54 20 28 43 41 53 45 20 57    SELECT (CASE W
3d70: 48 45 4e 20 61 3e 34 20 54 48 45 4e 20 28 53 45  HEN a>4 THEN (SE
3d80: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 29 20  LECT a FROM t1) 
3d90: 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 64  ELSE 0 END) AS d
3da0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 20   FROM t2;.    } 
3db0: 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  {.      lappend 
3dc0: 72 65 74 20 24 64 0a 20 20 20 20 7d 0a 20 20 7d  ret $d.    }.  }
3dd0: 0a 20 20 73 65 74 20 72 65 74 0a 7d 20 7b 7d 0a  .  set ret.} {}.
3de0: 0a 63 61 74 63 68 20 7b 64 62 31 20 63 6c 6f 73  .catch {db1 clos
3df0: 65 7d 0a 63 61 74 63 68 20 7b 64 62 32 20 63 6c  e}.catch {db2 cl
3e00: 6f 73 65 7d 0a 66 6f 72 65 61 63 68 20 66 20 5b  ose}.foreach f [
3e10: 6c 69 73 74 20 74 65 73 74 2e 64 62 20 74 65 73  list test.db tes
3e20: 74 32 2e 64 62 5d 20 7b 0a 20 20 66 6f 72 63 65  t2.db] {.  force
3e30: 64 65 6c 65 74 65 20 24 66 20 24 7b 66 7d 2d 6a  delete $f ${f}-j
3e40: 6f 75 72 6e 61 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  ournal.}..#-----
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 73 68  -----.# Tests sh
3ea0: 61 72 65 64 2d 37 2e 2a 20 74 65 73 74 20 61 75  ared-7.* test au
3eb0: 74 6f 2d 76 61 63 75 75 6d 20 64 6f 65 73 20 6e  to-vacuum does n
3ec0: 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 63 75  ot invalidate cu
3ed0: 72 73 6f 72 73 20 66 72 6f 6d 0a 23 20 6f 74 68  rsors from.# oth
3ee0: 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
3ef0: 75 73 65 72 73 20 77 68 65 6e 20 69 74 20 72 65  users when it re
3f00: 6f 72 67 61 6e 69 7a 65 73 20 74 68 65 20 64 61  organizes the da
3f10: 74 61 62 61 73 65 20 6f 6e 20 0a 23 20 43 4f 4d  tabase on .# COM
3f20: 4d 49 54 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73  MIT..#.do_test s
3f30: 68 61 72 65 64 2d 24 61 76 2e 37 2e 31 20 7b 0a  hared-$av.7.1 {.
3f40: 20 20 23 20 54 68 69 73 20 74 65 73 74 20 63 61    # This test ca
3f50: 73 65 20 73 65 74 73 20 75 70 20 61 20 74 65 73  se sets up a tes
3f60: 74 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 75  t database in au
3f70: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  to-vacuum mode c
3f80: 6f 6e 73 69 73 74 69 6e 67 20 0a 20 20 23 20 6f  onsisting .  # o
3f90: 66 20 74 77 6f 20 74 61 62 6c 65 73 2c 20 74 31  f two tables, t1
3fa0: 20 61 6e 64 20 74 32 2e 20 42 6f 74 68 20 68 61   and t2. Both ha
3fb0: 76 65 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  ve a single inde
3fc0: 78 2e 20 54 61 62 6c 65 20 74 31 20 69 73 20 0a  x. Table t1 is .
3fd0: 20 20 23 20 70 6f 70 75 6c 61 74 65 64 20 66 69    # populated fi
3fe0: 72 73 74 20 28 73 6f 20 63 6f 6e 73 69 73 74 73  rst (so consists
3ff0: 20 6f 66 20 70 61 67 65 73 20 74 6f 77 61 72 64   of pages toward
4000: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
4010: 65 20 64 62 20 66 69 6c 65 29 2c 20 0a 20 20 23  e db file), .  #
4020: 20 74 32 20 73 65 63 6f 6e 64 20 28 70 61 67 65   t2 second (page
4030: 73 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64  s toward the end
4040: 20 6f 66 20 74 68 65 20 66 69 6c 65 29 2e 20 0a   of the file). .
4050: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
4060: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
4070: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
4080: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
4090: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
40a0: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
40b0: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  KEY, b);.    CRE
40c0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
40d0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
40e0: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63 6f 6e 74    }.  set ::cont
40f0: 65 6e 74 73 20 7b 7d 0a 20 20 66 6f 72 20 7b 73  ents {}.  for {s
4100: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30  et i 0} {$i < 10
4110: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
4120: 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67 20    set a [string 
4130: 72 65 70 65 61 74 20 22 24 69 20 22 20 32 30 5d  repeat "$i " 20]
4140: 0a 20 20 20 20 73 65 74 20 62 20 5b 73 74 72 69  .    set b [stri
4150: 6e 67 20 72 65 70 65 61 74 20 22 24 69 20 22 20  ng repeat "$i " 
4160: 32 30 5d 0a 20 20 20 20 64 62 20 65 76 61 6c 20  20].    db eval 
4170: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
4180: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 3a 61  NTO t1 VALUES(:a
4190: 2c 20 3a 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , :b);.    }.   
41a0: 20 6c 61 70 70 65 6e 64 20 3a 3a 63 6f 6e 74 65   lappend ::conte
41b0: 6e 74 73 20 5b 6c 69 73 74 20 5b 65 78 70 72 20  nts [list [expr 
41c0: 24 69 2b 31 5d 20 24 61 20 24 62 5d 0a 20 20 7d  $i+1] $a $b].  }
41d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
41e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
41f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4200: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
4210: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73  }.} {}.do_test s
4220: 68 61 72 65 64 2d 24 61 76 2e 37 2e 32 20 7b 0a  hared-$av.7.2 {.
4230: 20 20 23 20 54 68 69 73 20 74 65 73 74 20 63 61    # This test ca
4240: 73 65 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  se deletes the c
4250: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 61 62 6c 65  ontents of table
4260: 20 74 31 20 28 74 68 65 20 6f 6e 65 20 61 74 20   t1 (the one at 
4270: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 20 20 23  the start of.  #
4280: 20 74 68 65 20 66 69 6c 65 29 20 77 68 69 6c 65   the file) while
4290: 20 6d 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72   many cursors ar
42a0: 65 20 6f 70 65 6e 20 6f 6e 20 74 61 62 6c 65 20  e open on table 
42b0: 74 32 20 61 6e 64 20 69 74 73 20 69 6e 64 65 78  t2 and its index
42c0: 2e 20 41 6c 6c 20 6f 66 0a 20 20 23 20 74 68 65  . All of.  # the
42d0: 20 6e 6f 6e 2d 72 6f 6f 74 20 70 61 67 65 73 20   non-root pages 
42e0: 77 69 6c 6c 20 62 65 20 6d 6f 76 65 64 20 66 72  will be moved fr
42f0: 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 20 74 68  om the end to th
4300: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66  e start of the f
4310: 69 6c 65 0a 20 20 23 20 77 68 65 6e 20 74 68 65  ile.  # when the
4320: 20 44 45 4c 45 54 45 20 69 73 20 63 6f 6d 6d 69   DELETE is commi
4330: 74 74 65 64 20 2d 20 74 68 69 73 20 74 65 73 74  tted - this test
4340: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 6d   verifies that m
4350: 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 73 0a  oving the pages.
4360: 20 20 23 20 64 6f 65 73 20 6e 6f 74 20 64 69 73    # does not dis
4370: 74 75 72 62 20 74 68 65 20 6f 70 65 6e 20 63 75  turb the open cu
4380: 72 73 6f 72 73 2e 0a 20 20 23 0a 0a 20 20 70 72  rsors..  #..  pr
4390: 6f 63 20 6c 6f 63 6b 72 6f 77 20 7b 64 62 20 74  oc lockrow {db t
43a0: 62 6c 20 6f 69 64 73 20 62 6f 64 79 7d 20 7b 0a  bl oids body} {.
43b0: 20 20 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73      set ret [lis
43c0: 74 5d 0a 20 20 20 20 64 62 20 65 76 61 6c 20 22  t].    db eval "
43d0: 53 45 4c 45 43 54 20 6f 69 64 20 41 53 20 69 2c  SELECT oid AS i,
43e0: 20 61 2c 20 62 20 46 52 4f 4d 20 24 74 62 6c 20   a, b FROM $tbl 
43f0: 4f 52 44 45 52 20 42 59 20 61 22 20 7b 0a 20 20  ORDER BY a" {.  
4400: 20 20 20 20 69 66 20 7b 24 69 3d 3d 5b 6c 69 6e      if {$i==[lin
4410: 64 65 78 20 24 6f 69 64 73 20 30 5d 7d 20 7b 0a  dex $oids 0]} {.
4420: 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 69 64          set noid
4430: 73 20 5b 6c 72 61 6e 67 65 20 24 6f 69 64 73 20  s [lrange $oids 
4440: 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 69  1 end].        i
4450: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 6f 69  f {[llength $noi
4460: 64 73 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20  ds]==0} {.      
4470: 20 20 20 20 73 65 74 20 73 75 62 72 65 74 20 5b      set subret [
4480: 65 76 61 6c 20 24 62 6f 64 79 5d 0a 20 20 20 20  eval $body].    
4490: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
44a0: 20 20 20 20 20 20 20 73 65 74 20 73 75 62 72 65         set subre
44b0: 74 20 5b 6c 6f 63 6b 72 6f 77 20 24 64 62 20 24  t [lockrow $db $
44c0: 74 62 6c 20 24 6e 6f 69 64 73 20 24 62 6f 64 79  tbl $noids $body
44d0: 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ].        }.    
44e0: 20 20 7d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e    }.      lappen
44f0: 64 20 72 65 74 20 5b 6c 69 73 74 20 24 69 20 24  d ret [list $i $
4500: 61 20 24 62 5d 0a 20 20 20 20 7d 0a 20 20 20 20  a $b].    }.    
4510: 72 65 74 75 72 6e 20 5b 6c 69 6e 73 65 72 74 20  return [linsert 
4520: 24 73 75 62 72 65 74 20 30 20 24 72 65 74 5d 0a  $subret 0 $ret].
4530: 20 20 7d 0a 20 20 70 72 6f 63 20 6c 6f 63 6b 74    }.  proc lockt
4540: 62 6c 72 6f 77 73 20 7b 64 62 20 74 62 6c 20 62  blrows {db tbl b
4550: 6f 64 79 7d 20 7b 0a 20 20 20 20 73 65 74 20 6f  ody} {.    set o
4560: 69 64 73 20 5b 64 62 20 65 76 61 6c 20 22 53 45  ids [db eval "SE
4570: 4c 45 43 54 20 6f 69 64 20 46 52 4f 4d 20 24 74  LECT oid FROM $t
4580: 62 6c 22 5d 0a 20 20 20 20 6c 6f 63 6b 72 6f 77  bl"].    lockrow
4590: 20 24 64 62 20 24 74 62 6c 20 24 6f 69 64 73 20   $db $tbl $oids 
45a0: 24 62 6f 64 79 0a 20 20 7d 0a 0a 20 20 73 65 74  $body.  }..  set
45b0: 20 73 63 61 6e 73 20 5b 6c 6f 63 6b 74 62 6c 72   scans [locktblr
45c0: 6f 77 73 20 64 62 20 74 32 20 7b 0a 20 20 20 20  ows db t2 {.    
45d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
45e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
45f0: 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 5d 0a 20      } db2.  }]. 
4600: 20 73 65 74 20 65 72 72 6f 72 20 30 0a 0a 20 20   set error 0..  
4610: 23 20 54 65 73 74 20 74 68 61 74 20 65 61 63 68  # Test that each
4620: 20 53 45 4c 45 43 54 20 71 75 65 72 79 20 72 65   SELECT query re
4630: 74 75 72 6e 65 64 20 74 68 65 20 65 78 70 65 63  turned the expec
4640: 74 65 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ted contents of 
4650: 74 32 2e 0a 20 20 66 6f 72 65 61 63 68 20 73 20  t2..  foreach s 
4660: 24 73 63 61 6e 73 20 7b 0a 20 20 20 20 69 66 20  $scans {.    if 
4670: 7b 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72  {[lsort -integer
4680: 20 2d 69 6e 64 65 78 20 30 20 24 73 5d 21 3d 24   -index 0 $s]!=$
4690: 3a 3a 63 6f 6e 74 65 6e 74 73 7d 20 7b 0a 20 20  ::contents} {.  
46a0: 20 20 20 20 73 65 74 20 65 72 72 6f 72 20 31 0a      set error 1.
46b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20      }.  }.  set 
46c0: 65 72 72 6f 72 0a 7d 20 7b 30 7d 0a 0a 63 61 74  error.} {0}..cat
46d0: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 63 61  ch {db close}.ca
46e0: 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a  tch {db2 close}.
46f0: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
4700: 6e 20 63 6f 6e 74 65 6e 74 73 0a 0a 23 2d 2d 2d  n contents..#---
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
4760: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 74 72  llowing tests tr
4770: 79 20 74 6f 20 74 72 69 63 6b 20 74 68 65 20 73  y to trick the s
4780: 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 64 65  hared-cache code
4790: 20 69 6e 74 6f 20 61 73 73 75 6d 69 6e 67 0a 23   into assuming.#
47a0: 20 74 68 65 20 77 72 6f 6e 67 20 65 6e 63 6f 64   the wrong encod
47b0: 69 6e 67 20 66 6f 72 20 61 20 64 61 74 61 62 61  ing for a databa
47c0: 73 65 2e 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74  se..#.forcedelet
47d0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
47e0: 62 2d 6a 6f 75 72 6e 61 6c 0a 69 66 63 61 70 61  b-journal.ifcapa
47f0: 62 6c 65 20 75 74 66 31 36 20 7b 0a 20 20 64 6f  ble utf16 {.  do
4800: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
4810: 2e 38 2e 31 2e 31 20 7b 0a 20 20 20 20 73 71 6c  .8.1.1 {.    sql
4820: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
4830: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4840: 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64      PRAGMA encod
4850: 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27 3b 0a  ing = 'UTF-16';.
4860: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4870: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
4880: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  r;.    }.  } {}.
4890: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
48a0: 2d 24 61 76 2e 38 2e 31 2e 32 20 7b 0a 20 20 20  -$av.8.1.2 {.   
48b0: 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 65   string range [e
48c0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 65  xecsql {PRAGMA e
48d0: 6e 63 6f 64 69 6e 67 3b 7d 5d 20 30 20 65 6e 64  ncoding;}] 0 end
48e0: 2d 32 0a 20 20 7d 20 7b 55 54 46 2d 31 36 7d 0a  -2.  } {UTF-16}.
48f0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
4900: 64 2d 24 61 76 2e 38 2e 31 2e 33 20 7b 0a 20 20  d-$av.8.1.3 {.  
4910: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
4920: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
4930: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
4940: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 55 54 46   encoding = 'UTF
4950: 2d 38 27 3b 0a 20 20 20 20 20 20 43 52 45 41 54  -8';.      CREAT
4960: 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62  E TABLE abc(a, b
4970: 2c 20 63 29 3b 0a 20 20 20 20 7d 20 64 62 32 0a  , c);.    } db2.
4980: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
4990: 20 73 68 61 72 65 64 2d 24 61 76 2e 38 2e 31 2e   shared-$av.8.1.
49a0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
49b0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
49c0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
49d0: 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 22  ter;.    }.  } "
49e0: 74 61 62 6c 65 20 61 62 63 20 61 62 63 20 5b 65  table abc abc [e
49f0: 78 70 72 20 24 41 55 54 4f 56 41 43 55 55 4d 3f  xpr $AUTOVACUUM?
4a00: 33 3a 32 5d 20 7b 43 52 45 41 54 45 20 54 41 42  3:2] {CREATE TAB
4a10: 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 7d  LE abc(a, b, c)}
4a20: 22 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  ".  do_test shar
4a30: 65 64 2d 24 61 76 2e 38 2e 31 2e 35 20 7b 0a 20  ed-$av.8.1.5 {. 
4a40: 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 20     db2 close.   
4a50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
4a60: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
4a70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 55 54 46  ;.    }.  } {UTF
4a80: 2d 38 7d 0a 0a 20 20 66 6f 72 63 65 64 65 6c 65  -8}..  forcedele
4a90: 74 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74  te test2.db test
4aa0: 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 64  2.db-journal.  d
4ab0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
4ac0: 76 2e 38 2e 32 2e 31 20 7b 0a 20 20 20 20 65 78  v.8.2.1 {.    ex
4ad0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54  ecsql {.      AT
4ae0: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
4af0: 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 53 45  AS aux;.      SE
4b00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 75 78 2e  LECT * FROM aux.
4b10: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
4b20: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
4b30: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
4b40: 2e 38 2e 32 2e 32 20 7b 0a 20 20 20 20 73 71 6c  .8.2.2 {.    sql
4b50: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
4b60: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
4b70: 20 20 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63        PRAGMA enc
4b80: 6f 64 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27  oding = 'UTF-16'
4b90: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
4ba0: 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66  ABLE def(d, e, f
4bb0: 29 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 20  );.    } db2.   
4bc0: 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 65   string range [e
4bd0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 65  xecsql {PRAGMA e
4be0: 6e 63 6f 64 69 6e 67 3b 7d 20 64 62 32 5d 20 30  ncoding;} db2] 0
4bf0: 20 65 6e 64 2d 32 0a 20 20 7d 20 7b 55 54 46 2d   end-2.  } {UTF-
4c00: 31 36 7d 0a 0a 20 20 63 61 74 63 68 20 7b 64 62  16}..  catch {db
4c10: 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20   close}.  catch 
4c20: 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20 66 6f  {db2 close}.  fo
4c30: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
4c40: 62 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 64 6f  b test2.db..  do
4c50: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
4c60: 2e 38 2e 33 2e 32 20 7b 0a 20 20 20 20 73 71 6c  .8.3.2 {.    sql
4c70: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
4c80: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52      execsql { CR
4c90: 45 41 54 45 20 54 41 42 4c 45 20 64 65 66 28 64  EATE TABLE def(d
4ca0: 2c 20 65 2c 20 66 29 20 7d 0a 20 20 20 20 65 78  , e, f) }.    ex
4cb0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 65  ecsql { PRAGMA e
4cc0: 6e 63 6f 64 69 6e 67 20 7d 0a 20 20 7d 20 7b 55  ncoding }.  } {U
4cd0: 54 46 2d 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20  TF-8}.  do_test 
4ce0: 73 68 61 72 65 64 2d 24 61 76 2e 38 2e 33 2e 33  shared-$av.8.3.3
4cf0: 20 7b 0a 20 20 20 20 73 65 74 20 7a 44 62 31 36   {.    set zDb16
4d00: 20 22 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76   "[encoding conv
4d10: 65 72 74 74 6f 20 75 6e 69 63 6f 64 65 20 74 65  ertto unicode te
4d20: 73 74 2e 64 62 5d 5c 78 30 30 5c 78 30 30 22 0a  st.db]\x00\x00".
4d30: 20 20 20 20 73 65 74 20 64 62 31 36 20 5b 73 71      set db16 [sq
4d40: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 24 7a 44  lite3_open16 $zD
4d50: 62 31 36 20 7b 7d 5d 0a 0a 20 20 20 20 73 65 74  b16 {}]..    set
4d60: 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70   stmt [sqlite3_p
4d70: 72 65 70 61 72 65 20 24 64 62 31 36 20 22 53 45  repare $db16 "SE
4d80: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
4d90: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 2d 31 20  lite_master" -1 
4da0: 44 55 4d 4d 59 5d 0a 20 20 20 20 73 71 6c 69 74  DUMMY].    sqlit
4db0: 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 20 20  e3_step $stmt.  
4dc0: 20 20 73 65 74 20 73 71 6c 20 5b 73 71 6c 69 74    set sql [sqlit
4dd0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
4de0: 73 74 6d 74 20 30 5d 0a 20 20 20 20 73 71 6c 69  stmt 0].    sqli
4df0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74  te3_finalize $st
4e00: 6d 74 0a 20 20 20 20 73 65 74 20 73 71 6c 0a 20  mt.    set sql. 
4e10: 20 7d 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45   } {CREATE TABLE
4e20: 20 64 65 66 28 64 2c 20 65 2c 20 66 29 7d 0a 20   def(d, e, f)}. 
4e30: 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d   do_test shared-
4e40: 24 61 76 2e 38 2e 33 2e 34 20 7b 0a 20 20 20 20  $av.8.3.4 {.    
4e50: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
4e60: 33 5f 70 72 65 70 61 72 65 20 24 64 62 31 36 20  3_prepare $db16 
4e70: 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  "PRAGMA encoding
4e80: 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 20 20  " -1 DUMMY].    
4e90: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74  sqlite3_step $st
4ea0: 6d 74 0a 20 20 20 20 73 65 74 20 65 6e 63 20 5b  mt.    set enc [
4eb0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4ec0: 65 78 74 20 24 73 74 6d 74 20 30 5d 0a 20 20 20  ext $stmt 0].   
4ed0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
4ee0: 65 20 24 73 74 6d 74 0a 20 20 20 20 73 65 74 20  e $stmt.    set 
4ef0: 65 6e 63 0a 20 20 7d 20 7b 55 54 46 2d 38 7d 0a  enc.  } {UTF-8}.
4f00: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
4f10: 20 24 64 62 31 36 0a 0a 23 20 42 75 67 20 23 32   $db16..# Bug #2
4f20: 35 34 37 20 69 73 20 63 61 75 73 69 6e 67 20 74  547 is causing t
4f30: 68 69 73 20 74 6f 20 66 61 69 6c 2e 0a 69 66 20  his to fail..if 
4f40: 30 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68  0 {.  do_test sh
4f50: 61 72 65 64 2d 24 61 76 2e 38 2e 32 2e 33 20 7b  ared-$av.8.2.3 {
4f60: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
4f70: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4f80: 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d  ROM aux.sqlite_m
4f90: 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  aster;.    }.  }
4fa0: 20 7b 31 20 7b 61 74 74 61 63 68 65 64 20 64 61   {1 {attached da
4fb0: 74 61 62 61 73 65 73 20 6d 75 73 74 20 75 73 65  tabases must use
4fc0: 20 74 68 65 20 73 61 6d 65 20 74 65 78 74 20 65   the same text e
4fd0: 6e 63 6f 64 69 6e 67 20 61 73 20 6d 61 69 6e 20  ncoding as main 
4fe0: 64 61 74 61 62 61 73 65 7d 7d 0a 7d 0a 7d 0a 0a  database}}.}.}..
4ff0: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
5000: 0a 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73  .catch {db2 clos
5010: 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  e}.forcedelete t
5020: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
5030: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
5080: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
5090: 73 74 73 20 2d 20 73 68 61 72 65 64 2d 39 2e 2a  sts - shared-9.*
50a0: 20 2d 20 74 65 73 74 20 69 6e 74 65 72 61 63 74   - test interact
50b0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 20 54 45 4d  ions between TEM
50c0: 50 20 74 72 69 67 67 65 72 73 0a 23 20 61 6e 64  P triggers.# and
50d0: 20 73 68 61 72 65 64 2d 73 63 68 65 6d 61 73 2e   shared-schemas.
50e0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 74 72 69  .#.ifcapable tri
50f0: 67 67 65 72 26 26 74 65 6d 70 64 62 20 7b 0a 0a  gger&&tempdb {..
5100: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5110: 61 76 2e 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74  av.9.1 {.  sqlit
5120: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
5130: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
5140: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
5150: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5160: 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20   abc(a, b, c);. 
5170: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5180: 61 62 63 5f 6d 69 72 72 6f 72 28 61 2c 20 62 2c  abc_mirror(a, b,
5190: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
51a0: 54 45 4d 50 20 54 52 49 47 47 45 52 20 42 45 46  TEMP TRIGGER BEF
51b0: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 61 62  ORE INSERT ON ab
51c0: 63 20 42 45 47 49 4e 20 0a 20 20 20 20 20 20 49  c BEGIN .      I
51d0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 5f 6d  NSERT INTO abc_m
51e0: 69 72 72 6f 72 28 61 2c 20 62 2c 20 63 29 20 56  irror(a, b, c) V
51f0: 41 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77  ALUES(new.a, new
5200: 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 20 20  .b, new.c);.    
5210: 45 4e 44 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  END;.    INSERT 
5220: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
5230: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 53 45  1, 2, 3);.    SE
5240: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 5f  LECT * FROM abc_
5250: 6d 69 72 72 6f 72 3b 0a 20 20 7d 0a 7d 20 7b 31  mirror;.  }.} {1
5260: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 68   2 3}.do_test sh
5270: 61 72 65 64 2d 24 61 76 2e 39 2e 32 20 7b 0a 20  ared-$av.9.2 {. 
5280: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
5290: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
52a0: 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a  ALUES(4, 5, 6);.
52b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
52c0: 4d 20 61 62 63 5f 6d 69 72 72 6f 72 3b 0a 20 20  M abc_mirror;.  
52d0: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 7d 0a  } db2.} {1 2 3}.
52e0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
52f0: 61 76 2e 39 2e 33 20 7b 0a 20 20 64 62 20 63 6c  av.9.3 {.  db cl
5300: 6f 73 65 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  ose.  db2 close.
5310: 7d 20 7b 7d 0a 0a 7d 20 3b 20 23 20 45 6e 64 20  } {}..} ; # End 
5320: 73 68 61 72 65 64 2d 39 2e 2a 0a 0a 23 2d 2d 2d  shared-9.*..#---
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
5380: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d  ollowing tests -
5390: 20 73 68 61 72 65 64 2d 31 30 2e 2a 20 2d 20 74   shared-10.* - t
53a0: 65 73 74 20 74 68 61 74 20 74 68 65 20 6c 69 62  est that the lib
53b0: 72 61 72 79 20 62 65 68 61 76 65 73 20 0a 23 20  rary behaves .# 
53c0: 63 6f 72 72 65 63 74 6c 79 20 77 68 65 6e 20 61  correctly when a
53d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
53e0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
53f0: 20 63 6c 6f 73 65 64 2e 20 0a 23 0a 64 6f 5f 74   closed. .#.do_t
5400: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5410: 30 2e 31 20 7b 0a 20 20 23 20 43 72 65 61 74 65  0.1 {.  # Create
5420: 20 61 20 73 6d 61 6c 6c 20 73 61 6d 70 6c 65 20   a small sample 
5430: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 77  database with tw
5440: 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  o connections to
5450: 20 69 74 20 28 64 62 20 61 6e 64 20 64 62 32 29   it (db and db2)
5460: 2e 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  ..  forcedelete 
5470: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
5480: 33 20 64 62 20 20 74 65 73 74 2e 64 62 0a 20 20  3 db  test.db.  
5490: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
54a0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
54b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
54c0: 20 61 62 28 61 20 50 52 49 4d 41 52 59 20 4b 45   ab(a PRIMARY KE
54d0: 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  Y, b);.    CREAT
54e0: 45 20 54 41 42 4c 45 20 64 65 28 64 20 50 52 49  E TABLE de(d PRI
54f0: 4d 41 52 59 20 4b 45 59 2c 20 65 29 3b 0a 20 20  MARY KEY, e);.  
5500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
5510: 20 56 41 4c 55 45 53 28 27 43 68 69 61 6e 67 20   VALUES('Chiang 
5520: 4d 61 69 27 2c 20 31 30 30 30 30 30 29 3b 0a 20  Mai', 100000);. 
5530: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
5540: 62 20 56 41 4c 55 45 53 28 27 42 61 6e 67 6b 6f  b VALUES('Bangko
5550: 6b 27 2c 20 38 30 30 30 30 30 30 29 3b 0a 20 20  k', 8000000);.  
5560: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65    INSERT INTO de
5570: 20 56 41 4c 55 45 53 28 27 55 62 6f 6e 27 2c 20   VALUES('Ubon', 
5580: 31 32 30 30 30 30 29 3b 0a 20 20 20 20 49 4e 53  120000);.    INS
5590: 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41 4c 55  ERT INTO de VALU
55a0: 45 53 28 27 4b 68 6f 6e 20 4b 61 65 6e 27 2c 20  ES('Khon Kaen', 
55b0: 32 30 30 30 30 30 29 3b 0a 20 20 7d 0a 7d 20 7b  200000);.  }.} {
55c0: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
55d0: 2d 24 61 76 2e 31 30 2e 32 20 7b 0a 20 20 23 20  -$av.10.2 {.  # 
55e0: 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  Open a read-tran
55f0: 73 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  saction with the
5600: 20 66 69 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f   first connectio
5610: 6e 2c 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  n, a write-trans
5620: 61 63 74 69 6f 6e 0a 20 20 23 20 77 69 74 68 20  action.  # with 
5630: 74 68 65 20 73 65 63 6f 6e 64 2e 0a 20 20 65 78  the second..  ex
5640: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
5650: 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  N;.    SELECT * 
5660: 46 52 4f 4d 20 61 62 3b 0a 20 20 7d 0a 20 20 65  FROM ab;.  }.  e
5670: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
5680: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
5690: 4e 54 4f 20 64 65 20 56 41 4c 55 45 53 28 27 50  NTO de VALUES('P
56a0: 61 74 61 79 61 27 2c 20 33 30 30 30 30 29 3b 0a  ataya', 30000);.
56b0: 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f    } db2.} {}.do_
56c0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
56d0: 31 30 2e 33 20 7b 0a 20 20 23 20 41 6e 20 65 78  10.3 {.  # An ex
56e0: 74 65 72 6e 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  ternal connectio
56f0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 62 6c 65  n should be able
5700: 20 74 6f 20 72 65 61 64 20 74 68 65 20 64 61 74   to read the dat
5710: 61 62 61 73 65 2c 20 62 75 74 20 6e 6f 74 0a 20  abase, but not. 
5720: 20 23 20 70 72 65 70 61 72 65 20 61 20 77 72 69   # prepare a wri
5730: 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  te operation..  
5740: 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  if {$::tcl_platf
5750: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22  orm(platform)=="
5760: 75 6e 69 78 22 7d 20 7b 0a 20 20 20 20 73 71 6c  unix"} {.    sql
5770: 69 74 65 33 20 64 62 33 20 2e 2f 74 65 73 74 2e  ite3 db3 ./test.
5780: 64 62 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  db.  } else {.  
5790: 20 20 73 71 6c 69 74 65 33 20 64 62 33 20 54 45    sqlite3 db3 TE
57a0: 53 54 2e 44 42 0a 20 20 7d 0a 20 20 65 78 65 63  ST.DB.  }.  exec
57b0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
57c0: 20 2a 20 46 52 4f 4d 20 61 62 3b 0a 20 20 7d 20   * FROM ab;.  } 
57d0: 64 62 33 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  db3.  catchsql {
57e0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
57f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 20 56  INSERT INTO de V
5800: 41 4c 55 45 53 28 27 50 61 74 61 79 61 27 2c 20  ALUES('Pataya', 
5810: 33 30 30 30 30 29 3b 0a 20 20 7d 20 64 62 33 0a  30000);.  } db3.
5820: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
5830: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
5840: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30  st shared-$av.10
5850: 2e 34 20 7b 0a 20 20 23 20 43 6c 6f 73 65 20 74  .4 {.  # Close t
5860: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
5870: 74 68 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  th the write-tra
5880: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 20 20  nsaction open.  
5890: 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64  db2 close.} {}.d
58a0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
58b0: 76 2e 31 30 2e 35 20 7b 0a 20 20 23 20 54 65 73  v.10.5 {.  # Tes
58c0: 74 20 74 68 61 74 20 74 68 65 20 64 62 32 20 74  t that the db2 t
58d0: 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
58e0: 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
58f0: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  y rolled back.. 
5900: 20 23 20 49 66 20 69 74 20 68 61 73 20 6e 6f 74   # If it has not
5910: 20 74 68 65 20 28 27 50 61 74 61 79 61 27 2c 20   the ('Pataya', 
5920: 33 30 30 30 30 29 20 65 6e 74 72 79 20 77 69 6c  30000) entry wil
5930: 6c 20 73 74 69 6c 6c 20 62 65 20 69 6e 20 74 68  l still be in th
5940: 65 20 74 61 62 6c 65 2e 0a 20 20 65 78 65 63 73  e table..  execs
5950: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5960: 2a 20 46 52 4f 4d 20 64 65 3b 0a 20 20 7d 0a 7d  * FROM de;.  }.}
5970: 20 7b 55 62 6f 6e 20 31 32 30 30 30 30 20 7b 4b   {Ubon 120000 {K
5980: 68 6f 6e 20 4b 61 65 6e 7d 20 32 30 30 30 30 30  hon Kaen} 200000
5990: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
59a0: 2d 24 61 76 2e 31 30 2e 35 20 7b 0a 20 20 23 20  -$av.10.5 {.  # 
59b0: 43 6c 6f 73 69 6e 67 20 64 62 32 20 73 68 6f 75  Closing db2 shou
59c0: 6c 64 20 68 61 76 65 20 64 72 6f 70 70 65 64 20  ld have dropped 
59d0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
59e0: 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 64 2d   back to a read-
59f0: 6c 6f 63 6b 2e 0a 20 20 23 20 53 6f 20 64 62 33  lock..  # So db3
5a00: 20 73 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20   should be able 
5a10: 74 6f 20 70 72 65 70 61 72 65 20 61 20 77 72 69  to prepare a wri
5a20: 74 65 2e 2e 2e 0a 20 20 63 61 74 63 68 73 71 6c  te....  catchsql
5a30: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65   {INSERT INTO de
5a40: 20 56 41 4c 55 45 53 28 27 50 61 74 61 79 61 27   VALUES('Pataya'
5a50: 2c 20 33 30 30 30 30 29 3b 7d 20 64 62 33 0a 7d  , 30000);} db3.}
5a60: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
5a70: 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e 36 20  shared-$av.10.6 
5a80: 7b 0a 20 20 23 20 2e 2e 2e 20 62 75 74 20 6e 6f  {.  # ... but no
5a90: 74 20 63 6f 6d 6d 69 74 20 69 74 2e 0a 20 20 63  t commit it..  c
5aa0: 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d  atchsql {COMMIT}
5ab0: 20 64 62 33 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db3.} {1 {datab
5ac0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
5ad0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5ae0: 61 76 2e 31 30 2e 37 20 7b 0a 20 20 23 20 43 6f  av.10.7 {.  # Co
5af0: 6d 6d 69 74 20 74 68 65 20 28 72 65 61 64 2d 6f  mmit the (read-o
5b00: 6e 6c 79 29 20 64 62 20 74 72 61 6e 73 61 63 74  nly) db transact
5b10: 69 6f 6e 2e 20 43 68 65 63 6b 20 76 69 61 20 64  ion. Check via d
5b20: 62 33 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  b3 to make sure 
5b30: 74 68 65 20 0a 20 20 23 20 63 6f 6e 74 65 6e 74  the .  # content
5b40: 73 20 6f 66 20 74 61 62 6c 65 20 22 64 65 22 20  s of table "de" 
5b50: 61 72 65 20 73 74 69 6c 6c 20 61 73 20 74 68 65  are still as the
5b60: 79 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 65  y should be..  e
5b70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
5b80: 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  MIT;.  }.  execs
5b90: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5ba0: 2a 20 46 52 4f 4d 20 64 65 3b 0a 20 20 7d 20 64  * FROM de;.  } d
5bb0: 62 33 0a 7d 20 7b 55 62 6f 6e 20 31 32 30 30 30  b3.} {Ubon 12000
5bc0: 30 20 7b 4b 68 6f 6e 20 4b 61 65 6e 7d 20 32 30  0 {Khon Kaen} 20
5bd0: 30 30 30 30 20 50 61 74 61 79 61 20 33 30 30 30  0000 Pataya 3000
5be0: 30 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  0}.do_test share
5bf0: 64 2d 24 61 76 2e 31 30 2e 39 20 7b 0a 20 20 23  d-$av.10.9 {.  #
5c00: 20 43 6f 6d 6d 69 74 20 74 68 65 20 65 78 74 65   Commit the exte
5c10: 72 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rnal transaction
5c20: 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 43 4f  ..  catchsql {CO
5c30: 4d 4d 49 54 7d 20 64 62 33 0a 7d 20 7b 30 20 7b  MMIT} db3.} {0 {
5c40: 7d 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65  }}.integrity_che
5c50: 63 6b 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30  ck shared-$av.10
5c60: 2e 31 30 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  .10.do_test shar
5c70: 65 64 2d 24 61 76 2e 31 30 2e 31 31 20 7b 0a 20  ed-$av.10.11 {. 
5c80: 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 33 20   db close.  db3 
5c90: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  close.} {}..do_t
5ca0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5cb0: 31 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  1.1 {.  forcedel
5cc0: 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 73 71  ete test.db.  sq
5cd0: 6c 69 74 65 33 20 64 62 20 20 74 65 73 74 2e 64  lite3 db  test.d
5ce0: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  b.  sqlite3 db2 
5cf0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
5d00: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
5d10: 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63  ABLE abc(a, b, c
5d20: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
5d30: 42 4c 45 20 61 62 63 32 28 61 2c 20 62 2c 20 63  BLE abc2(a, b, c
5d40: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
5d50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
5d60: 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  c VALUES(1, 2, 3
5d70: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
5d80: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5d90: 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.2 {.  catchsql
5da0: 20 7b 42 45 47 49 4e 3b 7d 20 64 62 32 0a 20 20   {BEGIN;} db2.  
5db0: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
5dc0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 7d 20 64 62   * FROM abc;} db
5dd0: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
5de0: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
5df0: 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65 73 74 20  : abc}}.do_test 
5e00: 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 33 20  shared-$av.11.3 
5e10: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45  {.  catchsql {BE
5e20: 47 49 4e 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 63  GIN} db2.} {1 {c
5e30: 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72  annot start a tr
5e40: 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e  ansaction within
5e50: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 7d 7d   a transaction}}
5e60: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
5e70: 24 61 76 2e 31 31 2e 34 20 7b 0a 20 20 63 61 74  $av.11.4 {.  cat
5e80: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  chsql {SELECT * 
5e90: 46 52 4f 4d 20 61 62 63 32 3b 7d 20 64 62 32 0a  FROM abc2;} db2.
5ea0: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
5eb0: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 35   shared-$av.11.5
5ec0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 49   {.  catchsql {I
5ed0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 32 20  NSERT INTO abc2 
5ee0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
5ef0: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
5f00: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
5f10: 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 73  cked}}.do_test s
5f20: 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 36 20 7b  hared-$av.11.6 {
5f30: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
5f40: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 32 7d  ECT * FROM abc2}
5f50: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
5f60: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e  t shared-$av.11.
5f70: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
5f80: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
5f90: 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e    PRAGMA read_un
5fa0: 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20  committed = 1;. 
5fb0: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74   } db2.} {}.do_t
5fc0: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
5fd0: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
5fe0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
5ff0: 4f 20 61 62 63 32 20 56 41 4c 55 45 53 28 34 2c  O abc2 VALUES(4,
6000: 20 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45   5, 6);.    INSE
6010: 52 54 20 49 4e 54 4f 20 61 62 63 32 20 56 41 4c  RT INTO abc2 VAL
6020: 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20  UES(7, 8, 9);.  
6030: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73  }.} {}.do_test s
6040: 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 38 20 7b  hared-$av.11.8 {
6050: 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74  .  set res [list
6060: 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20  ].  db2 eval {. 
6070: 20 20 20 53 45 4c 45 43 54 20 61 62 63 2e 61 20     SELECT abc.a 
6080: 61 73 20 49 2c 20 61 62 63 32 2e 61 20 61 73 20  as I, abc2.a as 
6090: 49 49 20 46 52 4f 4d 20 61 62 63 2c 20 61 62 63  II FROM abc, abc
60a0: 32 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 65 78 65  2;.  } {.    exe
60b0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c  csql {.      DEL
60c0: 45 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45  ETE FROM abc WHE
60d0: 52 45 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RE 1;.    }.    
60e0: 6c 61 70 70 65 6e 64 20 72 65 73 20 24 49 20 24  lappend res $I $
60f0: 49 49 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73  II.  }.  set res
6100: 0a 7d 20 7b 31 20 34 20 7b 7d 20 37 7d 0a 69 66  .} {1 4 {} 7}.if
6110: 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
6120: 20 63 6f 6d 6d 61 6e 64 20 73 71 6c 69 74 65 33   command sqlite3
6130: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
6140: 70 6f 72 74 5d 5d 3d 3d 31 7d 20 7b 0a 20 20 64  port]]==1} {.  d
6150: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
6160: 76 2e 31 31 2e 39 20 7b 0a 20 20 20 20 73 74 72  v.11.9 {.    str
6170: 69 6e 67 20 74 6f 6c 6f 77 65 72 20 5b 73 71 6c  ing tolower [sql
6180: 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68  ite3_shared_cach
6190: 65 5f 72 65 70 6f 72 74 5d 0a 20 20 7d 20 5b 73  e_report].  } [s
61a0: 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 5b 6c  tring tolower [l
61b0: 69 73 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ist [file native
61c0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  name [file norma
61d0: 6c 69 7a 65 20 74 65 73 74 2e 64 62 5d 5d 20 32  lize test.db]] 2
61e0: 5d 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 68  ]].}..do_test sh
61f0: 61 72 65 64 2d 24 61 76 2e 31 31 2e 31 31 20 7b  ared-$av.11.11 {
6200: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62  .  db close.  db
6210: 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 20  2 close.} {}..# 
6220: 54 68 69 73 20 74 65 73 74 73 20 74 68 61 74 20  This tests that 
6230: 69 66 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  if it is impossi
6240: 62 6c 65 20 74 6f 20 66 72 65 65 20 61 6e 79 20  ble to free any 
6250: 70 61 67 65 73 2c 20 53 51 4c 69 74 65 20 77 69  pages, SQLite wi
6260: 6c 6c 0a 23 20 65 78 63 65 65 64 20 74 68 65 20  ll.# exceed the 
6270: 6c 69 6d 69 74 20 73 65 74 20 62 79 20 50 52 41  limit set by PRA
6280: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 2e 0a  GMA cache_size..
6290: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
62a0: 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  .db test.db-jour
62b0: 6e 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20 74  nal.sqlite3 db t
62c0: 65 73 74 2e 64 62 20 0a 69 66 63 61 70 61 62 6c  est.db .ifcapabl
62d0: 65 20 70 61 67 65 72 5f 70 72 61 67 6d 61 73 20  e pager_pragmas 
62e0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  {.  do_test shar
62f0: 65 64 2d 24 61 76 2e 31 32 2e 31 20 7b 0a 20 20  ed-$av.12.1 {.  
6300: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6310: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
6320: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20  ize = 10;.      
6330: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
6340: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 30  e;.    }.  } {10
6350: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  }.}.do_test shar
6360: 65 64 2d 24 61 76 2e 31 32 2e 32 20 7b 0a 20 20  ed-$av.12.2 {.  
6370: 73 65 74 20 3a 3a 64 62 5f 68 61 6e 64 6c 65 73  set ::db_handles
6380: 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 20 7b 73   [list].  for {s
6390: 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 31 35  et i 1} {$i < 15
63a0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
63b0: 20 6c 61 70 70 65 6e 64 20 3a 3a 64 62 5f 68 61   lappend ::db_ha
63c0: 6e 64 6c 65 73 20 64 62 24 69 0a 20 20 20 20 73  ndles db$i.    s
63d0: 71 6c 69 74 65 33 20 64 62 24 69 20 74 65 73 74  qlite3 db$i test
63e0: 2e 64 62 20 0a 20 20 20 20 65 78 65 63 73 71 6c  .db .    execsql
63f0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 64   "CREATE TABLE d
6400: 62 24 7b 69 7d 28 61 2c 20 62 2c 20 63 29 22 20  b${i}(a, b, c)" 
6410: 64 62 24 69 20 0a 20 20 20 20 65 78 65 63 73 71  db$i .    execsq
6420: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  l "INSERT INTO d
6430: 62 24 7b 69 7d 20 56 41 4c 55 45 53 28 31 2c 20  b${i} VALUES(1, 
6440: 32 2c 20 33 29 22 0a 20 20 7d 0a 7d 20 7b 7d 0a  2, 3)".  }.} {}.
6450: 70 72 6f 63 20 6e 65 73 74 65 64 5f 73 65 6c 65  proc nested_sele
6460: 63 74 20 7b 68 61 6e 64 6c 65 73 7d 20 7b 0a 20  ct {handles} {. 
6470: 20 5b 6c 69 6e 64 65 78 20 24 68 61 6e 64 6c 65   [lindex $handle
6480: 73 20 30 5d 20 65 76 61 6c 20 22 53 45 4c 45 43  s 0] eval "SELEC
6490: 54 20 2a 20 46 52 4f 4d 20 5b 6c 69 6e 64 65 78  T * FROM [lindex
64a0: 20 24 68 61 6e 64 6c 65 73 20 30 5d 22 20 7b 0a   $handles 0]" {.
64b0: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 72 65      lappend ::re
64c0: 73 20 24 61 20 24 62 20 24 63 0a 20 20 20 20 69  s $a $b $c.    i
64d0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 68 61 6e  f {[llength $han
64e0: 64 6c 65 73 5d 3e 31 7d 20 7b 0a 20 20 20 20 20  dles]>1} {.     
64f0: 20 6e 65 73 74 65 64 5f 73 65 6c 65 63 74 20 5b   nested_select [
6500: 6c 72 61 6e 67 65 20 24 68 61 6e 64 6c 65 73 20  lrange $handles 
6510: 31 20 65 6e 64 5d 0a 20 20 20 20 7d 0a 20 20 7d  1 end].    }.  }
6520: 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .}.do_test share
6530: 64 2d 24 61 76 2e 31 32 2e 33 20 7b 0a 20 20 73  d-$av.12.3 {.  s
6540: 65 74 20 3a 3a 72 65 73 20 5b 6c 69 73 74 5d 0a  et ::res [list].
6550: 20 20 6e 65 73 74 65 64 5f 73 65 6c 65 63 74 20    nested_select 
6560: 24 3a 3a 64 62 5f 68 61 6e 64 6c 65 73 0a 20 20  $::db_handles.  
6570: 73 65 74 20 3a 3a 72 65 73 0a 7d 20 5b 73 74 72  set ::res.} [str
6580: 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e  ing range [strin
6590: 67 20 72 65 70 65 61 74 20 22 31 20 32 20 33 20  g repeat "1 2 3 
65a0: 22 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 64 62  " [llength $::db
65b0: 5f 68 61 6e 64 6c 65 73 5d 5d 20 30 20 65 6e 64  _handles]] 0 end
65c0: 2d 31 5d 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61  -1]..do_test sha
65d0: 72 65 64 2d 24 61 76 2e 31 32 2e 58 20 7b 0a 20  red-$av.12.X {. 
65e0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 65   db close.  fore
65f0: 61 63 68 20 68 20 24 3a 3a 64 62 5f 68 61 6e 64  ach h $::db_hand
6600: 6c 65 73 20 7b 20 0a 20 20 20 20 24 68 20 63 6c  les { .    $h cl
6610: 6f 73 65 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  ose.  }.} {}..# 
6620: 49 6e 74 65 72 6e 61 6c 6c 79 2c 20 6c 6f 63 6b  Internally, lock
6630: 73 20 61 72 65 20 61 63 71 75 69 72 65 64 20 6f  s are acquired o
6640: 6e 20 73 68 61 72 65 64 20 42 2d 54 72 65 65 20  n shared B-Tree 
6650: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
6660: 65 20 6f 72 64 65 72 0a 23 20 74 68 61 74 20 74  e order.# that t
6670: 68 65 20 73 74 72 75 63 74 75 72 65 73 20 61 70  he structures ap
6680: 70 65 61 72 20 69 6e 20 74 68 65 20 76 69 72 74  pear in the virt
6690: 75 61 6c 20 6d 65 6d 6f 72 79 20 61 64 64 72 65  ual memory addre
66a0: 73 73 20 73 70 61 63 65 2e 20 54 68 69 73 0a 23  ss space. This.#
66b0: 20 74 65 73 74 20 63 61 73 65 20 61 74 74 65 6d   test case attem
66c0: 70 74 73 20 74 6f 20 63 61 75 73 65 20 74 68 65  pts to cause the
66d0: 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 73 74   order of the st
66e0: 72 75 63 74 75 72 65 73 20 69 6e 20 6d 65 6d 6f  ructures in memo
66f0: 72 79 20 0a 23 20 74 6f 20 62 65 20 64 69 66 66  ry .# to be diff
6700: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
6710: 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
6720: 65 79 20 61 72 65 20 61 74 74 61 63 68 65 64 20  ey are attached 
6730: 74 6f 20 61 20 67 69 76 65 6e 0a 23 20 64 61 74  to a given.# dat
6740: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68  abase handle. Th
6750: 69 73 20 63 6f 76 65 72 73 20 61 6e 20 65 78 74  is covers an ext
6760: 72 61 20 6c 69 6e 65 20 6f 72 20 74 77 6f 2e 0a  ra line or two..
6770: 23 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  #.do_test shared
6780: 2d 24 61 76 2e 31 33 2e 31 20 7b 0a 20 20 66 6f  -$av.13.1 {.  fo
6790: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
67a0: 64 62 20 74 65 73 74 33 2e 64 62 20 74 65 73 74  db test3.db test
67b0: 34 2e 64 62 20 74 65 73 74 35 2e 64 62 0a 20 20  4.db test5.db.  
67c0: 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f  sqlite3 db :memo
67d0: 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ry:.  execsql {.
67e0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
67f0: 32 2e 64 62 27 20 41 53 20 61 75 78 32 3b 0a 20  2.db' AS aux2;. 
6800: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 33     ATTACH 'test3
6810: 2e 64 62 27 20 41 53 20 61 75 78 33 3b 0a 20 20  .db' AS aux3;.  
6820: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 34 2e    ATTACH 'test4.
6830: 64 62 27 20 41 53 20 61 75 78 34 3b 0a 20 20 20  db' AS aux4;.   
6840: 20 41 54 54 41 43 48 20 27 74 65 73 74 35 2e 64   ATTACH 'test5.d
6850: 62 27 20 41 53 20 61 75 78 35 3b 0a 20 20 20 20  b' AS aux5;.    
6860: 44 45 54 41 43 48 20 61 75 78 32 3b 0a 20 20 20  DETACH aux2;.   
6870: 20 44 45 54 41 43 48 20 61 75 78 33 3b 0a 20 20   DETACH aux3;.  
6880: 20 20 44 45 54 41 43 48 20 61 75 78 34 3b 0a 20    DETACH aux4;. 
6890: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
68a0: 2e 64 62 27 20 41 53 20 61 75 78 32 3b 0a 20 20  .db' AS aux2;.  
68b0: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 33 2e    ATTACH 'test3.
68c0: 64 62 27 20 41 53 20 61 75 78 33 3b 0a 20 20 20  db' AS aux3;.   
68d0: 20 41 54 54 41 43 48 20 27 74 65 73 74 34 2e 64   ATTACH 'test4.d
68e0: 62 27 20 41 53 20 61 75 78 34 3b 0a 20 20 7d 0a  b' AS aux4;.  }.
68f0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  } {}.do_test sha
6900: 72 65 64 2d 24 61 76 2e 31 33 2e 32 20 7b 0a 20  red-$av.13.2 {. 
6910: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
6920: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
6930: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
6940: 41 54 45 20 54 41 42 4c 45 20 61 75 78 32 2e 74  ATE TABLE aux2.t
6950: 32 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  2(a, b, c);.    
6960: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
6970: 33 2e 74 33 28 61 2c 20 62 2c 20 63 29 3b 0a 20  3.t3(a, b, c);. 
6980: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6990: 61 75 78 34 2e 74 34 28 61 2c 20 62 2c 20 63 29  aux4.t4(a, b, c)
69a0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
69b0: 4c 45 20 61 75 78 35 2e 74 35 28 61 2c 20 62 2c  LE aux5.t5(a, b,
69c0: 20 63 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   c);.    SELECT 
69d0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 0a 20  count(*) FROM . 
69e0: 20 20 20 20 20 61 75 78 32 2e 73 71 6c 69 74 65       aux2.sqlite
69f0: 5f 6d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  _master, .      
6a00: 61 75 78 33 2e 73 71 6c 69 74 65 5f 6d 61 73 74  aux3.sqlite_mast
6a10: 65 72 2c 20 0a 20 20 20 20 20 20 61 75 78 34 2e  er, .      aux4.
6a20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2c 20 0a  sqlite_master, .
6a30: 20 20 20 20 20 20 61 75 78 35 2e 73 71 6c 69 74        aux5.sqlit
6a40: 65 5f 6d 61 73 74 65 72 0a 20 20 7d 0a 7d 20 7b  e_master.  }.} {
6a50: 31 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  1}.do_test share
6a60: 64 2d 24 61 76 2e 31 33 2e 33 20 7b 0a 20 20 64  d-$av.13.3 {.  d
6a70: 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 20  b close.} {}..# 
6a80: 54 65 73 74 20 74 68 61 74 20 6e 6f 74 68 69 6e  Test that nothin
6a90: 67 20 68 6f 72 72 69 62 6c 65 20 68 61 70 70 65  g horrible happe
6aa0: 6e 73 20 69 66 20 61 20 63 6f 6e 6e 65 63 74 69  ns if a connecti
6ab0: 6f 6e 20 74 6f 20 61 20 73 68 61 72 65 64 20 42  on to a shared B
6ac0: 2d 54 72 65 65 20 0a 23 20 73 74 72 75 63 74 75  -Tree .# structu
6ad0: 72 65 20 69 73 20 63 6c 6f 73 65 64 20 77 68 69  re is closed whi
6ae0: 6c 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  le some other co
6af0: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 20  nnection has an 
6b00: 6f 70 65 6e 20 63 75 72 73 6f 72 2e 0a 23 0a 64  open cursor..#.d
6b10: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
6b20: 76 2e 31 34 2e 31 20 7b 0a 20 20 73 71 6c 69 74  v.14.1 {.  sqlit
6b30: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
6b40: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
6b50: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  .db.  execsql {S
6b60: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
6b70: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 7d  sqlite_master}.}
6b80: 20 7b 64 62 31 20 64 62 32 20 64 62 33 20 64 62   {db1 db2 db3 db
6b90: 34 20 64 62 35 20 64 62 36 20 64 62 37 20 64 62  4 db5 db6 db7 db
6ba0: 38 20 64 62 39 20 64 62 31 30 20 64 62 31 31 20  8 db9 db10 db11 
6bb0: 64 62 31 32 20 64 62 31 33 20 64 62 31 34 7d 0a  db12 db13 db14}.
6bc0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
6bd0: 61 76 2e 31 34 2e 32 20 7b 0a 20 20 73 65 74 20  av.14.2 {.  set 
6be0: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 64 62 20  res [list].  db 
6bf0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d  eval {SELECT nam
6c00: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
6c10: 73 74 65 72 7d 20 7b 0a 20 20 20 20 69 66 20 7b  ster} {.    if {
6c20: 24 6e 61 6d 65 20 65 71 20 22 64 62 37 22 7d 20  $name eq "db7"} 
6c30: 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c 6f 73  {.      db2 clos
6c40: 65 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70  e.    }.    lapp
6c50: 65 6e 64 20 72 65 73 20 24 6e 61 6d 65 0a 20 20  end res $name.  
6c60: 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 20 7b 64  }.  set res.} {d
6c70: 62 31 20 64 62 32 20 64 62 33 20 64 62 34 20 64  b1 db2 db3 db4 d
6c80: 62 35 20 64 62 36 20 64 62 37 20 64 62 38 20 64  b5 db6 db7 db8 d
6c90: 62 39 20 64 62 31 30 20 64 62 31 31 20 64 62 31  b9 db10 db11 db1
6ca0: 32 20 64 62 31 33 20 64 62 31 34 7d 0a 64 6f 5f  2 db13 db14}.do_
6cb0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
6cc0: 31 34 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73  14.3 {.  db clos
6cd0: 65 0a 7d 20 7b 7d 0a 0a 23 20 50 6f 70 75 6c 61  e.} {}..# Popula
6ce0: 74 65 20 61 20 64 61 74 61 62 61 73 65 20 73 63  te a database sc
6cf0: 68 65 6d 61 20 75 73 69 6e 67 20 63 6f 6e 6e 65  hema using conne
6d00: 63 74 69 6f 6e 20 5b 64 62 5d 2e 20 54 68 65 6e  ction [db]. Then
6d10: 20 64 72 6f 70 20 69 74 20 75 73 69 6e 67 0a 23   drop it using.#
6d20: 20 5b 64 62 32 5d 2e 20 54 68 69 73 20 69 73 20   [db2]. This is 
6d30: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  to try to find a
6d40: 6e 79 20 70 6f 69 6e 74 73 20 77 68 65 72 65 20  ny points where 
6d50: 73 68 61 72 65 64 2d 73 63 68 65 6d 61 20 65 6c  shared-schema el
6d60: 65 6d 65 6e 74 73 0a 23 20 61 72 65 20 61 6c 6c  ements.# are all
6d70: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  ocated using the
6d80: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
6d90: 72 20 6f 66 20 5b 64 62 5d 2e 0a 23 20 0a 23 20  r of [db]..# .# 
6da0: 4d 75 74 65 78 65 73 20 61 72 65 20 65 6e 61 62  Mutexes are enab
6db0: 6c 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 73  led for this tes
6dc0: 74 20 61 73 20 74 68 61 74 20 61 63 74 69 76 61  t as that activa
6dd0: 74 65 73 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  tes a couple of 
6de0: 75 73 65 66 75 6c 0a 23 20 61 73 73 65 72 74 28  useful.# assert(
6df0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
6e00: 74 68 65 20 43 20 63 6f 64 65 2e 0a 23 0a 64 6f  the C code..#.do
6e10: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
6e20: 2d 31 35 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64  -15.1 {.  forced
6e30: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20  elete test.db.  
6e40: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
6e50: 64 62 20 2d 66 75 6c 6c 6d 75 74 65 78 20 31 0a  db -fullmutex 1.
6e60: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
6e70: 73 74 2e 64 62 20 2d 66 75 6c 6c 6d 75 74 65 78  st.db -fullmutex
6e80: 20 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   1.  execsql {. 
6e90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6ea0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  t1(a, b, c);.   
6eb0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
6ec0: 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20 20   ON t1(a, b);.  
6ed0: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76 31    CREATE VIEW v1
6ee0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
6ef0: 4d 20 74 31 3b 20 0a 20 20 20 20 43 52 45 41 54  M t1; .    CREAT
6f00: 45 20 56 49 45 57 20 76 32 20 41 53 20 53 45 4c  E VIEW v2 AS SEL
6f10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 76  ECT * FROM t1, v
6f20: 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1 .             
6f30: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74           WHERE t
6f40: 31 2e 63 3d 76 31 2e 63 20 47 52 4f 55 50 20 42  1.c=v1.c GROUP B
6f50: 59 20 74 31 2e 61 20 4f 52 44 45 52 20 42 59 20  Y t1.a ORDER BY 
6f60: 76 31 2e 62 3b 20 0a 20 20 20 20 43 52 45 41 54  v1.b; .    CREAT
6f70: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
6f80: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
6f90: 20 0a 20 20 20 20 20 20 57 48 45 4e 20 6e 65 77   .      WHEN new
6fa0: 2e 61 21 3d 31 0a 20 20 20 20 42 45 47 49 4e 0a  .a!=1.    BEGIN.
6fb0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
6fc0: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 3b 0a  M t1 WHERE a=5;.
6fd0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6fe0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
6ff0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 55 50 44 41  , 3);.      UPDA
7000: 54 45 20 74 31 20 53 45 54 20 63 3d 63 2b 31 3b  TE t1 SET c=c+1;
7010: 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 49  .    END;..    I
7020: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7030: 4c 55 45 53 28 35 2c 20 36 2c 20 37 29 3b 0a 20  LUES(5, 6, 7);. 
7040: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7050: 31 20 56 41 4c 55 45 53 28 38 2c 20 39 2c 20 31  1 VALUES(8, 9, 1
7060: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
7070: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31  NTO t1 VALUES(11
7080: 2c 20 31 32 2c 20 31 33 29 3b 0a 20 20 20 20 41  , 12, 13);.    A
7090: 4e 41 4c 59 5a 45 3b 0a 20 20 20 20 53 45 4c 45  NALYZE;.    SELE
70a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
70b0: 7d 0a 7d 20 7b 31 20 32 20 36 20 38 20 39 20 31  }.} {1 2 6 8 9 1
70c0: 32 20 31 20 32 20 35 20 31 31 20 31 32 20 31 34  2 1 2 5 11 12 14
70d0: 20 31 20 32 20 34 7d 0a 64 6f 5f 74 65 73 74 20   1 2 4}.do_test 
70e0: 73 68 61 72 65 64 2d 24 61 76 2d 31 35 2e 32 20  shared-$av-15.2 
70f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 52  {.  execsql { DR
7100: 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 20 64 62  OP TABLE t1 } db
7110: 32 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a  2.} {}.db close.
7120: 64 62 32 20 63 6c 6f 73 65 0a 0a 7d 0a 0a 73 71  db2 close..}..sq
7130: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
7140: 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61  red_cache $::ena
7150: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
7160: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.