/ Hex Artifact Content
Login

Artifact b9f3bbd3ba727c5f1f8c815b7d0199262aacf214:


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 34 20 32 30 30 38 2f 30 37 2f 31 32 20  1.34 2008/07/12 
0190: 31 34 3a 35 32 3a 32 30 20 64 72 68 20 45 78 70  14:52:20 drh Exp
01a0: 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20   $..set testdir 
01b0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
01c0: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
01d0: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
01e0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 54 68 65  .db close..# The
01f0: 73 65 20 74 65 73 74 73 20 63 61 6e 6e 6f 74 20  se tests cannot 
0200: 62 65 20 72 75 6e 20 77 69 74 68 6f 75 74 20 74  be run without t
0210: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
0220: 64 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 21  d..#.ifcapable !
0230: 73 68 61 72 65 64 5f 63 61 63 68 65 7c 7c 21 61  shared_cache||!a
0240: 74 74 61 63 68 20 7b 0a 20 20 66 69 6e 69 73 68  ttach {.  finish
0250: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
0260: 0a 0a 73 65 74 20 3a 3a 65 6e 61 62 6c 65 5f 73  ..set ::enable_s
0270: 68 61 72 65 64 5f 63 61 63 68 65 20 5b 73 71 6c  hared_cache [sql
0280: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
0290: 65 64 5f 63 61 63 68 65 20 31 5d 0a 0a 66 6f 72  ed_cache 1]..for
02a0: 65 61 63 68 20 61 76 20 5b 6c 69 73 74 20 30 20  each av [list 0 
02b0: 31 5d 20 7b 0a 0a 23 20 4f 70 65 6e 20 74 68 65  1] {..# Open the
02c0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
02d0: 74 69 6f 6e 20 61 6e 64 20 65 78 65 63 75 74 65  tion and execute
02e0: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
02f0: 20 70 72 61 67 6d 61 0a 66 69 6c 65 20 64 65 6c   pragma.file del
0300: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
0310: 64 62 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  db.sqlite3 db te
0320: 73 74 2e 64 62 0a 0a 69 66 63 61 70 61 62 6c 65  st.db..ifcapable
0330: 20 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a 20 20   autovacuum {.  
0340: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 5b  do_test shared-[
0350: 65 78 70 72 20 24 61 76 2b 31 5d 2e 31 2e 30 20  expr $av+1].1.0 
0360: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 70  {.    execsql "p
0370: 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75  ragma auto_vacuu
0380: 6d 3d 24 3a 3a 61 76 22 0a 20 20 20 20 65 78 65  m=$::av".    exe
0390: 63 73 71 6c 20 7b 70 72 61 67 6d 61 20 61 75 74  csql {pragma aut
03a0: 6f 5f 76 61 63 75 75 6d 7d 0a 20 20 7d 20 22 24  o_vacuum}.  } "$
03b0: 61 76 22 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 69  av".} else {.  i
03c0: 66 20 7b 24 61 76 7d 20 7b 0a 20 20 20 20 64 62  f {$av} {.    db
03d0: 20 63 6c 6f 73 65 0a 20 20 20 20 62 72 65 61 6b   close.    break
03e0: 0a 20 20 7d 0a 7d 0a 0a 23 20 24 61 76 20 69 73  .  }.}..# $av is
03f0: 20 63 75 72 72 65 6e 74 6c 79 20 30 20 69 66 20   currently 0 if 
0400: 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74  this loop iterat
0410: 69 6f 6e 20 69 73 20 74 6f 20 74 65 73 74 20 77  ion is to test w
0420: 69 74 68 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  ith auto-vacuum 
0430: 74 75 72 6e 65 64 0a 23 20 6f 66 66 2c 20 61 6e  turned.# off, an
0440: 64 20 31 20 69 66 20 69 74 20 69 73 20 74 75 72  d 1 if it is tur
0450: 6e 65 64 20 6f 6e 2e 20 49 6e 63 72 65 6d 65 6e  ned on. Incremen
0460: 74 20 69 74 20 73 6f 20 74 68 61 74 20 28 31 20  t it so that (1 
0470: 2d 3e 20 6e 6f 20 61 75 74 6f 2d 76 61 63 75 75  -> no auto-vacuu
0480: 6d 29 20 0a 23 20 61 6e 64 20 28 32 20 2d 3e 20  m) .# and (2 -> 
0490: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2e 20 54 68  auto-vacuum). Th
04a0: 65 20 73 6f 6c 65 20 72 65 61 73 6f 6e 20 66 6f  e sole reason fo
04b0: 72 20 74 68 69 73 20 69 73 20 73 6f 20 74 68 61  r this is so tha
04c0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6e 69 63 65 72  t it looks nicer
04d0: 0a 23 20 77 68 65 6e 20 77 65 20 75 73 65 20 74  .# when we use t
04e0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 61 73 20  his variable as 
04f0: 70 61 72 74 20 6f 66 20 74 65 73 74 2d 63 61 73  part of test-cas
0500: 65 20 6e 61 6d 65 73 2e 0a 23 0a 69 6e 63 72 20  e names..#.incr 
0510: 61 76 0a 0a 23 20 54 65 73 74 20 6f 72 67 61 6e  av..# Test organ
0520: 69 7a 61 74 69 6f 6e 3a 0a 23 0a 23 20 73 68 61  ization:.#.# sha
0530: 72 65 64 2d 31 2e 2a 3a 20 53 69 6d 70 6c 65 20  red-1.*: Simple 
0540: 74 65 73 74 20 74 6f 20 76 65 72 69 66 79 20 62  test to verify b
0550: 61 73 69 63 20 73 61 6e 69 74 79 20 6f 66 20 74  asic sanity of t
0560: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 69  able level locki
0570: 6e 67 20 77 68 65 6e 0a 23 20 20 20 20 20 20 20  ng when.#       
0580: 20 20 20 20 20 20 74 77 6f 20 63 6f 6e 6e 65 63        two connec
0590: 74 69 6f 6e 73 20 73 68 61 72 65 20 61 20 70 61  tions share a pa
05a0: 67 65 72 20 63 61 63 68 65 2e 0a 23 20 73 68 61  ger cache..# sha
05b0: 72 65 64 2d 32 2e 2a 3a 20 54 65 73 74 20 74 68  red-2.*: Test th
05c0: 61 74 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  at a read transa
05d0: 63 74 69 6f 6e 20 63 61 6e 20 63 6f 2d 65 78 69  ction can co-exi
05e0: 73 74 20 77 69 74 68 20 61 20 0a 23 20 20 20 20  st with a .#    
05f0: 20 20 20 20 20 20 20 20 20 77 72 69 74 65 2d 74           write-t
0600: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 6e 63 6c  ransaction, incl
0610: 75 64 69 6e 67 20 61 20 73 69 6d 70 6c 65 20 74  uding a simple t
0620: 65 73 74 20 74 6f 20 65 6e 73 75 72 65 20 74 68  est to ensure th
0630: 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  e .#            
0640: 20 65 78 74 65 72 6e 61 6c 20 6c 6f 63 6b 69 6e   external lockin
0650: 67 20 70 72 6f 74 6f 63 6f 6c 20 69 73 20 73 74  g protocol is st
0660: 69 6c 6c 20 77 6f 72 6b 69 6e 67 2e 0a 23 20 73  ill working..# s
0670: 68 61 72 65 64 2d 33 2e 2a 3a 20 53 69 6d 70 6c  hared-3.*: Simpl
0680: 65 20 74 65 73 74 20 6f 66 20 72 65 61 64 2d 75  e test of read-u
0690: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 2e  ncommitted mode.
06a0: 0a 23 20 73 68 61 72 65 64 2d 34 2e 2a 3a 20 43  .# shared-4.*: C
06b0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 63  heck that the sc
06c0: 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 20 61  hema is locked a
06d0: 6e 64 20 75 6e 6c 6f 63 6b 65 64 20 63 6f 72 72  nd unlocked corr
06e0: 65 63 74 6c 79 2e 0a 23 20 73 68 61 72 65 64 2d  ectly..# shared-
06f0: 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 63  5.*: Test that c
0700: 72 65 61 74 69 6e 67 2f 64 72 6f 70 70 69 6e 67  reating/dropping
0710: 20 73 63 68 65 6d 61 20 69 74 65 6d 73 20 77 6f   schema items wo
0720: 72 6b 73 20 77 68 65 6e 20 64 61 74 61 62 61 73  rks when databas
0730: 65 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  es.#            
0740: 20 61 72 65 20 61 74 74 61 63 68 65 64 20 69 6e   are attached in
0750: 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
0760: 73 20 74 6f 20 64 69 66 66 65 72 65 6e 74 20 68  s to different h
0770: 61 6e 64 6c 65 73 2e 0a 23 20 73 68 61 72 65 64  andles..# shared
0780: 2d 36 2e 2a 3a 20 4c 6f 63 6b 69 6e 67 2c 20 55  -6.*: Locking, U
0790: 4e 49 4f 4e 20 41 4c 4c 20 71 75 65 72 69 65 73  NION ALL queries
07a0: 20 61 6e 64 20 73 75 62 2d 71 75 65 72 69 65 73   and sub-queries
07b0: 2e 0a 23 20 73 68 61 72 65 64 2d 37 2e 2a 3a 20  ..# shared-7.*: 
07c0: 41 75 74 6f 76 61 63 75 75 6d 20 61 6e 64 20 73  Autovacuum and s
07d0: 68 61 72 65 64 2d 63 61 63 68 65 2e 0a 23 20 73  hared-cache..# s
07e0: 68 61 72 65 64 2d 38 2e 2a 3a 20 54 65 73 74 73  hared-8.*: Tests
07f0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
0800: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66  text encoding of
0810: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 64 61   shared-cache da
0820: 74 61 62 61 73 65 73 2e 0a 23 20 73 68 61 72 65  tabases..# share
0830: 64 2d 39 2e 2a 3a 20 54 45 4d 50 20 74 72 69 67  d-9.*: TEMP trig
0840: 67 65 72 73 20 61 6e 64 20 73 68 61 72 65 64 2d  gers and shared-
0850: 63 61 63 68 65 20 64 61 74 61 62 61 73 65 73 2e  cache databases.
0860: 0a 23 20 73 68 61 72 65 64 2d 31 30 2e 2a 3a 20  .# shared-10.*: 
0870: 54 65 73 74 73 20 6f 66 20 73 71 6c 69 74 65 33  Tests of sqlite3
0880: 5f 63 6c 6f 73 65 28 29 2e 0a 23 20 73 68 61 72  _close()..# shar
0890: 65 64 2d 31 31 2e 2a 3a 20 54 65 73 74 20 74 72  ed-11.*: Test tr
08a0: 61 6e 73 61 63 74 69 6f 6e 20 6c 6f 63 6b 69 6e  ansaction lockin
08b0: 67 2e 0a 23 0a 0a 64 6f 5f 74 65 73 74 20 73 68  g..#..do_test sh
08c0: 61 72 65 64 2d 24 61 76 2e 31 2e 31 20 7b 0a 20  ared-$av.1.1 {. 
08d0: 20 23 20 4f 70 65 6e 20 61 20 73 65 63 6f 6e 64   # Open a second
08e0: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
08f0: 20 66 69 6c 65 20 74 65 73 74 2e 64 62 2e 20 49   file test.db. I
0900: 74 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 65  t should use the
0910: 20 73 61 6d 65 20 70 61 67 65 72 0a 20 20 23 20   same pager.  # 
0920: 63 61 63 68 65 20 61 6e 64 20 73 63 68 65 6d 61  cache and schema
0930: 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
0940: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 56 65 72   connection. Ver
0950: 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 31 20  ify that only 1 
0960: 66 69 6c 65 20 69 73 20 0a 20 20 23 20 6f 70 65  file is .  # ope
0970: 6e 65 64 2e 0a 20 20 73 71 6c 69 74 65 33 20 64  ned..  sqlite3 d
0980: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 73 65 74  b2 test.db.  set
0990: 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66   ::sqlite_open_f
09a0: 69 6c 65 5f 63 6f 75 6e 74 0a 7d 20 7b 31 7d 0a  ile_count.} {1}.
09b0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
09c0: 61 76 2e 31 2e 32 20 7b 0a 20 20 23 20 41 64 64  av.1.2 {.  # Add
09d0: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 20 73   a table and a s
09e0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 64 61 74  ingle row of dat
09f0: 61 20 76 69 61 20 74 68 65 20 66 69 72 73 74 20  a via the first 
0a00: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 0a 20 20 23  connection. .  #
0a10: 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
0a20: 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69   second connecti
0a30: 6f 6e 20 63 61 6e 20 73 65 65 20 74 68 65 6d 2e  on can see them.
0a40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0a50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
0a60: 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  c(a, b, c);.    
0a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0a80: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
0a90: 0a 20 20 7d 20 64 62 0a 20 20 65 78 65 63 73 71  .  } db.  execsq
0aa0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
0ab0: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20 64   FROM abc;.  } d
0ac0: 62 32 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f  b2.} {1 2 3}.do_
0ad0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
0ae0: 31 2e 33 20 7b 0a 20 20 23 20 48 61 76 65 20 74  1.3 {.  # Have t
0af0: 68 65 20 66 69 72 73 74 20 63 6f 6e 6e 65 63 74  he first connect
0b00: 69 6f 6e 20 62 65 67 69 6e 20 61 20 74 72 61 6e  ion begin a tran
0b10: 73 61 63 74 69 6f 6e 20 61 6e 64 20 6f 62 74 61  saction and obta
0b20: 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 0a 20  in a read-lock. 
0b30: 20 23 20 6f 6e 20 74 61 62 6c 65 20 61 62 63 2e   # on table abc.
0b40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   This should not
0b50: 20 70 72 65 76 65 6e 74 20 74 68 65 20 73 65 63   prevent the sec
0b60: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ond connection f
0b70: 72 6f 6d 20 0a 20 20 23 20 71 75 65 72 79 69 6e  rom .  # queryin
0b80: 67 20 61 62 63 2e 0a 20 20 65 78 65 63 73 71 6c  g abc..  execsql
0b90: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
0ba0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0bb0: 61 62 63 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  abc;.  }.  execs
0bc0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0bd0: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20  * FROM abc;.  } 
0be0: 64 62 32 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f  db2.} {1 2 3}.do
0bf0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
0c00: 2e 31 2e 34 20 7b 0a 20 20 23 20 54 72 79 20 74  .1.4 {.  # Try t
0c10: 6f 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20 69  o insert a row i
0c20: 6e 74 6f 20 61 62 63 20 76 69 61 20 63 6f 6e 6e  nto abc via conn
0c30: 65 63 74 69 6f 6e 20 32 2e 20 54 68 69 73 20 73  ection 2. This s
0c40: 68 6f 75 6c 64 20 66 61 69 6c 20 62 65 63 61 75  hould fail becau
0c50: 73 65 0a 20 20 23 20 6f 66 20 74 68 65 20 72 65  se.  # of the re
0c60: 61 64 2d 6c 6f 63 6b 20 63 6f 6e 6e 65 63 74 69  ad-lock connecti
0c70: 6f 6e 20 31 20 69 73 20 68 6f 6c 64 69 6e 67 20  on 1 is holding 
0c80: 6f 6e 20 74 61 62 6c 65 20 61 62 63 20 28 6f 62  on table abc (ob
0c90: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 0a 20 20  tained in the.  
0ca0: 23 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20  # previous test 
0cb0: 63 61 73 65 29 2e 0a 20 20 63 61 74 63 68 73 71  case)..  catchsq
0cc0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
0cd0: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 34  NTO abc VALUES(4
0ce0: 2c 20 35 2c 20 36 29 3b 0a 20 20 7d 20 64 62 32  , 5, 6);.  } db2
0cf0: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
0d00: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a  table is locked:
0d10: 20 61 62 63 7d 7d 0a 64 6f 5f 74 65 73 74 20 73   abc}}.do_test s
0d20: 68 61 72 65 64 2d 24 61 76 2e 31 2e 35 20 7b 0a  hared-$av.1.5 {.
0d30: 20 20 23 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63    # Using connec
0d40: 74 69 6f 6e 20 32 20 28 74 68 65 20 6f 6e 65 20  tion 2 (the one 
0d50: 77 69 74 68 6f 75 74 20 74 68 65 20 6f 70 65 6e  without the open
0d60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
0d70: 72 79 20 74 6f 20 63 72 65 61 74 65 0a 20 20 23  ry to create.  #
0d80: 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68   a new table. Th
0d90: 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 62  is should fail b
0da0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 6f 70  ecause of the op
0db0: 65 6e 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  en read transact
0dc0: 69 6f 6e 20 0a 20 20 23 20 68 65 6c 64 20 62 79  ion .  # held by
0dd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 2e 0a 20   connection 1.. 
0de0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0df0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 65 66  CREATE TABLE def
0e00: 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 7d 20 64  (d, e, f);.  } d
0e10: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
0e20: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
0e30: 64 3a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  d: sqlite_master
0e40: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
0e50: 64 2d 24 61 76 2e 31 2e 36 20 7b 0a 20 20 23 20  d-$av.1.6 {.  # 
0e60: 55 70 67 72 61 64 65 20 63 6f 6e 6e 65 63 74 69  Upgrade connecti
0e70: 6f 6e 20 31 27 73 20 74 72 61 6e 73 61 63 74 69  on 1's transacti
0e80: 6f 6e 20 74 6f 20 61 20 77 72 69 74 65 20 74 72  on to a write tr
0e90: 61 6e 73 61 63 74 69 6f 6e 2e 20 43 72 65 61 74  ansaction. Creat
0ea0: 65 0a 20 20 23 20 61 20 6e 65 77 20 74 61 62 6c  e.  # a new tabl
0eb0: 65 20 2d 20 64 65 66 20 2d 20 61 6e 64 20 69 6e  e - def - and in
0ec0: 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f 20  sert a row into 
0ed0: 69 74 2e 20 42 65 63 61 75 73 65 20 74 68 65 20  it. Because the 
0ee0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 0a 20 20 23  connection 1.  #
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64   transaction mod
0f00: 69 66 69 65 73 20 74 68 65 20 73 63 68 65 6d 61  ifies the schema
0f10: 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  , it should not 
0f20: 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
0f30: 0a 20 20 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  .  # connection 
0f40: 32 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  2 to access the 
0f50: 64 61 74 61 62 61 73 65 20 61 74 20 61 6c 6c 20  database at all 
0f60: 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63  until the connec
0f70: 74 69 6f 6e 20 31 20 0a 20 20 23 20 68 61 73 20  tion 1 .  # has 
0f80: 66 69 6e 69 73 68 65 64 20 74 68 65 20 74 72 61  finished the tra
0f90: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 65 78 65 63  nsaction..  exec
0fa0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0fb0: 20 54 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c   TABLE def(d, e,
0fc0: 20 66 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   f);.    INSERT 
0fd0: 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28  INTO def VALUES(
0fe0: 27 49 56 27 2c 20 27 56 27 2c 20 27 56 49 27 29  'IV', 'V', 'VI')
0ff0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
1000: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 2e  st shared-$av.1.
1010: 37 20 7b 0a 20 20 23 20 52 65 61 64 20 66 72 6f  7 {.  # Read fro
1020: 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  m the sqlite_mas
1030: 74 65 72 20 74 61 62 6c 65 20 77 69 74 68 20 63  ter table with c
1040: 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 28 69 6e 73  onnection 1 (ins
1050: 69 64 65 20 74 68 65 20 0a 20 20 23 20 74 72 61  ide the .  # tra
1060: 6e 73 61 63 74 69 6f 6e 29 2e 20 54 68 65 6e 20  nsaction). Then 
1070: 74 65 73 74 20 74 68 61 74 20 77 65 20 63 61 6e  test that we can
1080: 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 77 69 74   not do this wit
1090: 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 2e 20  h connection 2. 
10a0: 54 68 69 73 0a 20 20 23 20 69 73 20 62 65 63 61  This.  # is beca
10b0: 75 73 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d  use of the schem
10c0: 61 2d 6d 6f 64 69 66 69 65 64 20 6c 6f 63 6b 20  a-modified lock 
10d0: 65 73 74 61 62 6c 69 73 68 65 64 20 62 79 20 63  established by c
10e0: 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 0a 20 20 23  onnection 1 .  #
10f0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
1100: 20 74 65 73 74 20 63 61 73 65 2e 0a 20 20 65 78   test case..  ex
1110: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
1120: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
1130: 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 20 20 63  _master;.  }.  c
1140: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
1150: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
1160: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 20 64  te_master;.  } d
1170: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
1180: 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b  e schema is lock
1190: 65 64 3a 20 6d 61 69 6e 7d 7d 0a 64 6f 5f 74 65  ed: main}}.do_te
11a0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 2e  st shared-$av.1.
11b0: 38 20 7b 0a 20 20 23 20 43 6f 6d 6d 69 74 20 74  8 {.  # Commit t
11c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20  he connection 1 
11d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 65  transaction..  e
11e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
11f0: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  MIT;.  }.} {}..d
1200: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
1210: 76 2e 32 2e 31 20 7b 0a 20 20 23 20 4f 70 65 6e  v.2.1 {.  # Open
1220: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 33 20   connection db3 
1230: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1240: 20 55 73 65 20 61 20 64 69 66 66 65 72 65 6e 74   Use a different
1250: 20 70 61 74 68 20 74 6f 20 74 68 65 20 73 61 6d   path to the sam
1260: 65 0a 20 20 23 20 66 69 6c 65 20 73 6f 20 74 68  e.  # file so th
1270: 61 74 20 64 62 33 20 64 6f 65 73 20 2a 6e 6f 74  at db3 does *not
1280: 2a 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  * share the same
1290: 20 70 61 67 65 72 20 63 61 63 68 65 20 61 73 20   pager cache as 
12a0: 64 62 20 61 6e 64 20 64 62 32 0a 20 20 23 20 28  db and db2.  # (
12b0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
12c0: 74 77 6f 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  two open file ha
12d0: 6e 64 6c 65 73 29 2e 0a 20 20 69 66 20 7b 24 3a  ndles)..  if {$:
12e0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  :tcl_platform(pl
12f0: 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d  atform)=="unix"}
1300: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
1310: 62 33 20 2e 2f 74 65 73 74 2e 64 62 0a 20 20 7d  b3 ./test.db.  }
1320: 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c 69   else {.    sqli
1330: 74 65 33 20 64 62 33 20 54 45 53 54 2e 44 42 0a  te3 db3 TEST.DB.
1340: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69    }.  set ::sqli
1350: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
1360: 6e 74 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74  nt.} {2}.do_test
1370: 20 73 68 61 72 65 64 2d 24 61 76 2e 32 2e 32 20   shared-$av.2.2 
1380: 7b 0a 20 20 23 20 53 74 61 72 74 20 72 65 61 64  {.  # Start read
1390: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 6e   transactions on
13a0: 20 64 62 20 61 6e 64 20 64 62 32 20 28 74 68 65   db and db2 (the
13b0: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
13c0: 63 68 65 29 2e 20 45 6e 73 75 72 65 0a 20 20 23  che). Ensure.  #
13d0: 20 64 62 33 20 63 61 6e 6e 6f 74 20 77 72 69 74   db3 cannot writ
13e0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
13f0: 65 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  e..  execsql {. 
1400: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45     BEGIN;.    SE
1410: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
1420: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
1430: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
1440: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
1450: 63 3b 0a 20 20 7d 20 64 62 32 0a 20 20 63 61 74  c;.  } db2.  cat
1460: 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  chsql {.    INSE
1470: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
1480: 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d  ES(1, 2, 3);.  }
1490: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
14a0: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
14b0: 6b 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65  ked: abc}}.do_te
14c0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 32 2e  st shared-$av.2.
14d0: 33 20 7b 0a 20 20 23 20 54 75 72 6e 20 64 62 27  3 {.  # Turn db'
14e0: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  s transaction in
14f0: 74 6f 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  to a write-trans
1500: 61 63 74 69 6f 6e 2e 20 64 62 33 20 73 68 6f 75  action. db3 shou
1510: 6c 64 20 73 74 69 6c 6c 20 62 65 0a 20 20 23 20  ld still be.  # 
1520: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  able to read fro
1530: 6d 20 74 61 62 6c 65 20 64 65 66 20 28 62 75 74  m table def (but
1540: 20 77 69 6c 6c 20 6e 6f 74 20 73 65 65 20 74 68   will not see th
1550: 65 20 6e 65 77 20 72 6f 77 29 2e 20 43 6f 6e 6e  e new row). Conn
1560: 65 63 74 69 6f 6e 0a 20 20 23 20 64 62 32 20 73  ection.  # db2 s
1570: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 62 6c  hould not be abl
1580: 65 20 74 6f 20 72 65 61 64 20 64 65 66 20 28 62  e to read def (b
1590: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 72  ecause of the wr
15a0: 69 74 65 2d 6c 6f 63 6b 29 2e 0a 0a 23 20 54 6f  ite-lock)...# To
15b0: 64 6f 3a 20 54 68 65 20 66 61 69 6c 65 64 20 22  do: The failed "
15c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
15d0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 20 69  ..." statement i
15e0: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 65 73 74  n the above test
15f0: 0a 23 20 68 61 73 20 73 74 61 72 74 65 64 20 61  .# has started a
1600: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1610: 6f 6e 20 6f 6e 20 64 62 32 20 28 73 68 6f 75 6c  on on db2 (shoul
1620: 64 20 74 68 69 73 20 62 65 20 73 6f 3f 29 2e 20  d this be so?). 
1630: 54 68 69 73 20 0a 23 20 77 6f 75 6c 64 20 70 72  This .# would pr
1640: 65 76 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  event connection
1650: 20 64 62 20 66 72 6f 6d 20 73 74 61 72 74 69 6e   db from startin
1660: 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  g a write-transa
1670: 63 74 69 6f 6e 2e 20 53 6f 20 72 6f 6c 6c 20 74  ction. So roll t
1680: 68 65 0a 23 20 64 62 32 20 74 72 61 6e 73 61 63  he.# db2 transac
1690: 74 69 6f 6e 20 62 61 63 6b 20 61 6e 64 20 72 65  tion back and re
16a0: 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20  place it with a 
16b0: 6e 65 77 20 72 65 61 64 20 74 72 61 6e 73 61 63  new read transac
16c0: 74 69 6f 6e 2e 0a 20 20 65 78 65 63 73 71 6c 20  tion..  execsql 
16d0: 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  {.    ROLLBACK;.
16e0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53      BEGIN;.    S
16f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
1700: 3b 0a 20 20 7d 20 64 62 32 0a 0a 20 20 65 78 65  ;.  } db2..  exe
1710: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
1720: 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45  T INTO def VALUE
1730: 53 28 27 56 49 49 27 2c 20 27 56 49 49 49 27 2c  S('VII', 'VIII',
1740: 20 27 49 58 27 29 3b 0a 20 20 7d 0a 20 20 63 6f   'IX');.  }.  co
1750: 6e 63 61 74 20 5b 0a 20 20 20 20 63 61 74 63 68  ncat [.    catch
1760: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
1770: 52 4f 4d 20 64 65 66 3b 20 7d 20 64 62 33 0a 20  ROM def; } db3. 
1780: 20 5d 20 5b 0a 20 20 20 20 63 61 74 63 68 73 71   ] [.    catchsq
1790: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
17a0: 4d 20 64 65 66 3b 20 7d 20 64 62 32 0a 20 20 5d  M def; } db2.  ]
17b0: 0a 7d 20 7b 30 20 7b 49 56 20 56 20 56 49 7d 20  .} {0 {IV V VI} 
17c0: 31 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c  1 {database tabl
17d0: 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 64 65 66  e is locked: def
17e0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
17f0: 64 2d 24 61 76 2e 32 2e 34 20 7b 0a 20 20 23 20  d-$av.2.4 {.  # 
1800: 43 6f 6d 6d 69 74 20 74 68 65 20 6f 70 65 6e 20  Commit the open 
1810: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64  transaction on d
1820: 62 2e 20 64 62 32 20 73 74 69 6c 6c 20 68 6f 6c  b. db2 still hol
1830: 64 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ds a read-transa
1840: 63 74 69 6f 6e 2e 0a 20 20 23 20 54 68 69 73 20  ction..  # This 
1850: 73 68 6f 75 6c 64 20 70 72 65 76 65 6e 74 20 64  should prevent d
1860: 62 33 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  b3 from writing 
1870: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1880: 20 62 75 74 20 6e 6f 74 20 66 72 6f 6d 20 0a 20   but not from . 
1890: 20 23 20 72 65 61 64 69 6e 67 2e 0a 20 20 65 78   # reading..  ex
18a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d  ecsql {.    COMM
18b0: 49 54 3b 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74  IT;.  }.  concat
18c0: 20 5b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   [.    catchsql 
18d0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
18e0: 64 65 66 3b 20 7d 20 64 62 33 0a 20 20 5d 20 5b  def; } db3.  ] [
18f0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
1900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20  INSERT INTO def 
1910: 56 41 4c 55 45 53 28 27 58 27 2c 20 27 58 49 27  VALUES('X', 'XI'
1920: 2c 20 27 58 49 49 27 29 3b 20 7d 20 64 62 33 0a  , 'XII'); } db3.
1930: 20 20 5d 0a 7d 20 7b 30 20 7b 49 56 20 56 20 56    ].} {0 {IV V V
1940: 49 20 56 49 49 20 56 49 49 49 20 49 58 7d 20 31  I VII VIII IX} 1
1950: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
1960: 63 6b 65 64 7d 7d 0a 0a 63 61 74 63 68 73 71 6c  cked}}..catchsql
1970: 20 43 4f 4d 4d 49 54 20 64 62 32 0a 0a 64 6f 5f   COMMIT db2..do_
1980: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
1990: 33 2e 31 2e 31 20 7b 0a 20 20 23 20 54 68 69 73  3.1.1 {.  # This
19a0: 20 74 65 73 74 20 63 61 73 65 20 73 74 61 72 74   test case start
19b0: 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
19c0: 6f 66 20 74 61 62 6c 65 20 27 73 65 71 27 20 75  of table 'seq' u
19d0: 73 69 6e 67 20 61 20 0a 20 20 23 20 72 65 61 64  sing a .  # read
19e0: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 6f 6e  -uncommitted con
19f0: 6e 65 63 74 69 6f 6e 2e 20 49 6e 20 74 68 65 20  nection. In the 
1a00: 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 63  middle of the sc
1a10: 61 6e 2c 20 72 6f 77 73 20 61 72 65 20 61 64 64  an, rows are add
1a20: 65 64 0a 20 20 23 20 74 6f 20 74 68 65 20 65 6e  ed.  # to the en
1a30: 64 20 6f 66 20 74 68 65 20 73 65 71 20 74 61 62  d of the seq tab
1a40: 6c 65 20 28 61 68 65 61 64 20 6f 66 20 74 68 65  le (ahead of the
1a50: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1a60: 70 6f 73 69 74 69 6f 6e 29 2e 0a 20 20 23 20 54  position)..  # T
1a70: 68 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 72  he uncommitted r
1a80: 6f 77 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ows should be in
1a90: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
1aa0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 63 61  sults of the sca
1ab0: 6e 2e 0a 20 20 65 78 65 63 73 71 6c 20 22 0a 20  n..  execsql ". 
1ac0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1ad0: 73 65 71 28 69 20 50 52 49 4d 41 52 59 20 4b 45  seq(i PRIMARY KE
1ae0: 59 2c 20 78 29 3b 0a 20 20 20 20 49 4e 53 45 52  Y, x);.    INSER
1af0: 54 20 49 4e 54 4f 20 73 65 71 20 56 41 4c 55 45  T INTO seq VALUE
1b00: 53 28 31 2c 20 27 5b 73 74 72 69 6e 67 20 72 65  S(1, '[string re
1b10: 70 65 61 74 20 58 20 35 30 30 5d 27 29 3b 0a 20  peat X 500]');. 
1b20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73     INSERT INTO s
1b30: 65 71 20 56 41 4c 55 45 53 28 32 2c 20 27 5b 73  eq VALUES(2, '[s
1b40: 74 72 69 6e 67 20 72 65 70 65 61 74 20 58 20 35  tring repeat X 5
1b50: 30 30 5d 27 29 3b 0a 20 20 22 0a 20 20 65 78 65  00]');.  ".  exe
1b60: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  csql {SELECT * F
1b70: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1b80: 72 7d 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c  r} db2.  execsql
1b90: 20 7b 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e   {PRAGMA read_un
1ba0: 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 7d 20 64  committed = 1} d
1bb0: 62 32 0a 0a 20 20 73 65 74 20 72 65 74 20 5b 6c  b2..  set ret [l
1bc0: 69 73 74 5d 0a 20 20 64 62 32 20 65 76 61 6c 20  ist].  db2 eval 
1bd0: 7b 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 73  {SELECT i FROM s
1be0: 65 71 20 4f 52 44 45 52 20 42 59 20 69 7d 20 7b  eq ORDER BY i} {
1bf0: 0a 20 20 20 20 69 66 20 7b 24 69 20 3c 20 34 7d  .    if {$i < 4}
1c00: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6d 61 78   {.      set max
1c10: 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43   [execsql {SELEC
1c20: 54 20 6d 61 78 28 69 29 20 46 52 4f 4d 20 73 65  T max(i) FROM se
1c30: 71 7d 5d 0a 20 20 20 20 20 20 64 62 20 65 76 61  q}].      db eva
1c40: 6c 20 7b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  l {.        INSE
1c50: 52 54 20 49 4e 54 4f 20 73 65 71 20 53 45 4c 45  RT INTO seq SELE
1c60: 43 54 20 69 20 2b 20 3a 6d 61 78 2c 20 78 20 46  CT i + :max, x F
1c70: 52 4f 4d 20 73 65 71 3b 0a 20 20 20 20 20 20 7d  ROM seq;.      }
1c80: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65  .    }.    lappe
1c90: 6e 64 20 72 65 74 20 24 69 0a 20 20 7d 0a 20 20  nd ret $i.  }.  
1ca0: 73 65 74 20 72 65 74 0a 7d 20 7b 31 20 32 20 33  set ret.} {1 2 3
1cb0: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
1cc0: 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31  11 12 13 14 15 1
1cd0: 36 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  6}.do_test share
1ce0: 64 2d 24 61 76 2e 33 2e 31 2e 32 20 7b 0a 20 20  d-$av.3.1.2 {.  
1cf0: 23 20 41 6e 6f 74 68 65 72 20 6c 69 6e 65 61 72  # Another linear
1d00: 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
1d10: 62 6c 65 20 73 65 71 20 75 73 69 6e 67 20 61 20  ble seq using a 
1d20: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
1d30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 23   connection..  #
1d40: 20 54 68 69 73 20 74 69 6d 65 2c 20 64 65 6c 65   This time, dele
1d50: 74 65 20 65 61 63 68 20 72 6f 77 20 61 73 20 69  te each row as i
1d60: 74 20 69 73 20 72 65 61 64 2e 20 53 68 6f 75 6c  t is read. Shoul
1d70: 64 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65  d not affect the
1d80: 20 72 65 73 75 6c 74 73 20 6f 66 0a 20 20 23 20   results of.  # 
1d90: 74 68 65 20 73 63 61 6e 2c 20 62 75 74 20 74 68  the scan, but th
1da0: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
1db0: 65 20 65 6d 70 74 79 20 61 66 74 65 72 20 74 68  e empty after th
1dc0: 65 20 73 63 61 6e 20 69 73 20 63 6f 6e 63 6c 75  e scan is conclu
1dd0: 64 65 64 20 0a 20 20 23 20 28 74 65 73 74 20 33  ded .  # (test 3
1de0: 2e 31 2e 33 20 76 65 72 69 66 69 65 73 20 74 68  .1.3 verifies th
1df0: 69 73 29 2e 0a 20 20 73 65 74 20 72 65 74 20 5b  is)..  set ret [
1e00: 6c 69 73 74 5d 0a 20 20 64 62 32 20 65 76 61 6c  list].  db2 eval
1e10: 20 7b 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20   {SELECT i FROM 
1e20: 73 65 71 7d 20 7b 0a 20 20 20 20 64 62 20 65 76  seq} {.    db ev
1e30: 61 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  al {DELETE FROM 
1e40: 73 65 71 20 57 48 45 52 45 20 69 20 3d 20 3a 69  seq WHERE i = :i
1e50: 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  }.    lappend re
1e60: 74 20 24 69 0a 20 20 7d 0a 20 20 73 65 74 20 72  t $i.  }.  set r
1e70: 65 74 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  et.} {1 2 3 4 5 
1e80: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
1e90: 20 31 33 20 31 34 20 31 35 20 31 36 7d 0a 64 6f   13 14 15 16}.do
1ea0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
1eb0: 2e 33 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  .3.1.3 {.  execs
1ec0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1ed0: 2a 20 46 52 4f 4d 20 73 65 71 3b 0a 20 20 7d 0a  * FROM seq;.  }.
1ee0: 7d 20 7b 7d 0a 0a 63 61 74 63 68 20 7b 64 62 20  } {}..catch {db 
1ef0: 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62  close}.catch {db
1f00: 32 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b  2 close}.catch {
1f10: 64 62 33 20 63 6c 6f 73 65 7d 0a 0a 23 2d 2d 2d  db3 close}..#---
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20  -------.# Tests 
1f70: 73 68 61 72 65 64 2d 34 2e 2a 20 74 65 73 74 20  shared-4.* test 
1f80: 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20  that the schema 
1f90: 6c 6f 63 6b 69 6e 67 20 72 75 6c 65 73 20 61 72  locking rules ar
1fa0: 65 20 61 70 70 6c 69 65 64 20 0a 23 20 63 6f 72  e applied .# cor
1fb0: 72 65 63 74 6c 79 2e 20 69 2e 65 2e 3a 0a 23 0a  rectly. i.e.:.#.
1fc0: 23 20 31 2e 20 41 6c 6c 20 74 72 61 6e 73 61 63  # 1. All transac
1fd0: 74 69 6f 6e 73 20 72 65 71 75 69 72 65 20 61 20  tions require a 
1fe0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
1ff0: 20 73 63 68 65 6d 61 73 20 6f 66 20 64 61 74 61   schemas of data
2000: 62 61 73 65 73 20 74 68 65 79 0a 23 20 20 20 20  bases they.#    
2010: 61 63 63 65 73 73 2e 0a 23 20 32 2e 20 54 72 61  access..# 2. Tra
2020: 6e 73 61 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  nsactions that m
2030: 6f 64 69 66 79 20 61 20 64 61 74 61 62 61 73 65  odify a database
2040: 20 73 63 68 65 6d 61 20 72 65 71 75 69 72 65 20   schema require 
2050: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
2060: 74 68 61 74 0a 23 20 20 20 20 73 63 68 65 6d 61  that.#    schema
2070: 2e 0a 23 20 33 2e 20 49 74 20 69 73 20 6e 6f 74  ..# 3. It is not
2080: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6d   possible to com
2090: 70 69 6c 65 20 61 20 73 74 61 74 65 6d 65 6e 74  pile a statement
20a0: 20 77 68 69 6c 65 20 61 6e 6f 74 68 65 72 20 68   while another h
20b0: 61 6e 64 6c 65 20 68 61 73 20 61 20 0a 23 20 20  andle has a .#  
20c0: 20 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20    write-lock on 
20d0: 74 68 65 20 73 63 68 65 6d 61 2e 0a 23 0a 0a 23  the schema..#..#
20e0: 20 4f 70 65 6e 20 74 77 6f 20 64 61 74 61 62 61   Open two databa
20f0: 73 65 20 68 61 6e 64 6c 65 73 20 64 62 20 61 6e  se handles db an
2100: 64 20 64 62 32 2e 20 45 61 63 68 20 68 61 73 20  d db2. Each has 
2110: 61 20 73 69 6e 67 6c 65 20 61 74 74 61 63 68 20  a single attach 
2120: 64 61 74 61 62 61 73 65 0a 23 20 28 61 73 20 77  database.# (as w
2130: 65 6c 6c 20 61 73 20 6d 61 69 6e 29 3a 0a 23 0a  ell as main):.#.
2140: 23 20 20 20 20 20 64 62 2e 6d 61 69 6e 20 20 20  #     db.main   
2150: 2d 3e 20 20 20 2e 2f 74 65 73 74 2e 64 62 0a 23  ->   ./test.db.#
2160: 20 20 20 20 20 64 62 2e 74 65 73 74 32 20 20 2d       db.test2  -
2170: 3e 20 20 20 2e 2f 74 65 73 74 32 2e 64 62 0a 23  >   ./test2.db.#
2180: 20 20 20 20 20 64 62 32 2e 6d 61 69 6e 20 20 2d       db2.main  -
2190: 3e 20 20 20 2e 2f 74 65 73 74 32 2e 64 62 0a 23  >   ./test2.db.#
21a0: 20 20 20 20 20 64 62 32 2e 74 65 73 74 20 20 2d       db2.test  -
21b0: 3e 20 20 20 2e 2f 74 65 73 74 2e 64 62 0a 23 0a  >   ./test.db.#.
21c0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
21d0: 63 65 20 74 65 73 74 2e 64 62 0a 66 69 6c 65 20  ce test.db.file 
21e0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
21f0: 73 74 32 2e 64 62 0a 66 69 6c 65 20 64 65 6c 65  st2.db.file dele
2200: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e  te -force test2.
2210: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74  db-journal.sqlit
2220: 65 33 20 64 62 20 20 74 65 73 74 2e 64 62 0a 73  e3 db  test.db.s
2230: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32  qlite3 db2 test2
2240: 2e 64 62 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  .db.do_test shar
2250: 65 64 2d 24 61 76 2e 34 2e 31 2e 31 20 7b 0a 20  ed-$av.4.1.1 {. 
2260: 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e   set sqlite_open
2270: 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 7d 20 7b 32  _file_count.} {2
2280: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
2290: 2d 24 61 76 2e 34 2e 31 2e 32 20 7b 0a 20 20 65  -$av.4.1.2 {.  e
22a0: 78 65 63 73 71 6c 20 7b 41 54 54 41 43 48 20 27  xecsql {ATTACH '
22b0: 74 65 73 74 32 2e 64 62 27 20 41 53 20 74 65 73  test2.db' AS tes
22c0: 74 32 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65  t2}.  set sqlite
22d0: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
22e0: 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73  .} {2}.do_test s
22f0: 68 61 72 65 64 2d 24 61 76 2e 34 2e 31 2e 33 20  hared-$av.4.1.3 
2300: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 41 54 54  {.  execsql {ATT
2310: 41 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53  ACH 'test.db' AS
2320: 20 74 65 73 74 7d 20 64 62 32 0a 20 20 73 65 74   test} db2.  set
2330: 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c   sqlite_open_fil
2340: 65 5f 63 6f 75 6e 74 0a 7d 20 7b 32 7d 0a 0a 23  e_count.} {2}..#
2350: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 43   Sanity check: C
2360: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 69 6e  reate a table in
2370: 20 2e 2f 74 65 73 74 2e 64 62 20 76 69 61 20 68   ./test.db via h
2380: 61 6e 64 6c 65 20 64 62 2c 20 61 6e 64 20 74 65  andle db, and te
2390: 73 74 20 74 68 61 74 20 68 61 6e 64 6c 65 0a 23  st that handle.#
23a0: 20 64 62 32 20 63 61 6e 20 22 73 65 65 22 20 74   db2 can "see" t
23b0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6d 6d  he new table imm
23c0: 65 64 69 61 74 65 6c 79 2e 20 41 20 68 61 6e 64  ediately. A hand
23d0: 6c 65 20 75 73 69 6e 67 20 61 20 73 65 70 65 72  le using a seper
23e0: 61 74 65 20 70 61 67 65 72 0a 23 20 63 61 63 68  ate pager.# cach
23f0: 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  e would have to 
2400: 72 65 6c 6f 61 64 20 74 68 65 20 64 61 74 61 62  reload the datab
2410: 61 73 65 20 73 63 68 65 6d 61 20 62 65 66 6f 72  ase schema befor
2420: 65 20 74 68 69 73 20 77 65 72 65 20 70 6f 73 73  e this were poss
2430: 69 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ible..#.do_test 
2440: 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 32 2e 31  shared-$av.4.2.1
2450: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2460: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2470: 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  abc(a, b, c);.  
2480: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
2490: 65 66 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20  ef(d, e, f);.   
24a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
24b0: 20 56 41 4c 55 45 53 28 27 69 27 2c 20 27 69 69   VALUES('i', 'ii
24c0: 27 2c 20 27 69 69 69 27 29 3b 0a 20 20 20 20 49  ', 'iii');.    I
24d0: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56  NSERT INTO def V
24e0: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 2c  ALUES('I', 'II',
24f0: 20 27 49 49 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b   'III');.  }.} {
2500: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
2510: 2d 24 61 76 2e 34 2e 32 2e 32 20 7b 0a 20 20 65  -$av.4.2.2 {.  e
2520: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
2530: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74 2e  ECT * FROM test.
2540: 61 62 63 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b  abc;.  } db2.} {
2550: 69 20 69 69 20 69 69 69 7d 0a 0a 23 20 4f 70 65  i ii iii}..# Ope
2560: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
2570: 74 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 66 72  tion and read fr
2580: 6f 6d 20 74 61 62 6c 65 20 61 62 63 20 76 69 61  om table abc via
2590: 20 68 61 6e 64 6c 65 20 32 2e 20 43 68 65 63 6b   handle 2. Check
25a0: 20 74 68 61 74 0a 23 20 68 61 6e 64 6c 65 20 31   that.# handle 1
25b0: 20 63 61 6e 20 72 65 61 64 20 74 61 62 6c 65 20   can read table 
25c0: 61 62 63 2e 20 43 68 65 63 6b 20 74 68 61 74 20  abc. Check that 
25d0: 68 61 6e 64 6c 65 20 31 20 63 61 6e 6e 6f 74 20  handle 1 cannot 
25e0: 6d 6f 64 69 66 79 20 74 61 62 6c 65 20 61 62 63  modify table abc
25f0: 0a 23 20 6f 72 20 74 68 65 20 64 61 74 61 62 61  .# or the databa
2600: 73 65 20 73 63 68 65 6d 61 2e 20 54 68 65 6e 20  se schema. Then 
2610: 63 68 65 63 6b 20 74 68 61 74 20 68 61 6e 64 6c  check that handl
2620: 65 20 31 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  e 1 can modify t
2630: 61 62 6c 65 20 64 65 66 2e 0a 23 0a 64 6f 5f 74  able def..#.do_t
2640: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34  est shared-$av.4
2650: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
2660: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
2670: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2680: 74 65 73 74 2e 61 62 63 3b 0a 20 20 7d 20 64 62  test.abc;.  } db
2690: 32 0a 7d 20 7b 69 20 69 69 20 69 69 69 7d 0a 64  2.} {i ii iii}.d
26a0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
26b0: 76 2e 34 2e 33 2e 32 20 7b 0a 20 20 63 61 74 63  v.4.3.2 {.  catc
26c0: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
26d0: 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45  T INTO abc VALUE
26e0: 53 28 27 69 76 27 2c 20 27 76 27 2c 20 27 76 69  S('iv', 'v', 'vi
26f0: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61  ');.  }.} {1 {da
2700: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
2710: 6c 6f 63 6b 65 64 3a 20 61 62 63 7d 7d 0a 64 6f  locked: abc}}.do
2720: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
2730: 2e 34 2e 33 2e 33 20 7b 0a 20 20 63 61 74 63 68  .4.3.3 {.  catch
2740: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
2750: 20 54 41 42 4c 45 20 67 68 69 28 67 2c 20 68 2c   TABLE ghi(g, h,
2760: 20 69 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64   i);.  }.} {1 {d
2770: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
2780: 20 6c 6f 63 6b 65 64 3a 20 73 71 6c 69 74 65 5f   locked: sqlite_
2790: 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65 73 74  master}}.do_test
27a0: 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e 33 2e   shared-$av.4.3.
27b0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
27c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
27d0: 20 64 65 66 20 56 41 4c 55 45 53 28 27 49 56 27   def VALUES('IV'
27e0: 2c 20 27 56 27 2c 20 27 56 49 27 29 3b 0a 20 20  , 'V', 'VI');.  
27f0: 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65  }.} {0 {}}.do_te
2800: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 34 2e  st shared-$av.4.
2810: 33 2e 34 20 7b 0a 20 20 23 20 43 6c 65 61 6e 75  3.4 {.  # Cleanu
2820: 70 3a 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  p: commit the tr
2830: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
2840: 20 62 79 20 64 62 32 2e 0a 20 20 65 78 65 63 73   by db2..  execs
2850: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 0a  ql {.    COMMIT.
2860: 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 0a 23 20    } db2.} {}..# 
2870: 4f 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  Open a write-tra
2880: 6e 73 61 63 74 69 6f 6e 20 75 73 69 6e 67 20 68  nsaction using h
2890: 61 6e 64 6c 65 20 31 20 61 6e 64 20 6d 6f 64 69  andle 1 and modi
28a0: 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
28b0: 73 63 68 65 6d 61 2e 0a 23 20 54 68 65 6e 20 74  schema..# Then t
28c0: 72 79 20 74 6f 20 65 78 65 63 75 74 65 20 61 20  ry to execute a 
28d0: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
28e0: 6e 74 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  nt to read from 
28f0: 74 68 65 20 73 61 6d 65 20 0a 23 20 64 61 74 61  the same .# data
2900: 62 61 73 65 20 76 69 61 20 68 61 6e 64 6c 65 20  base via handle 
2910: 32 20 28 66 61 69 6c 73 20 74 6f 20 67 65 74 20  2 (fails to get 
2920: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 71 6c 69  the lock on sqli
2930: 74 65 5f 6d 61 73 74 65 72 29 2e 20 41 6c 73 6f  te_master). Also
2940: 0a 23 20 74 72 79 20 74 6f 20 63 6f 6d 70 69 6c  .# try to compil
2950: 65 20 61 20 72 65 61 64 20 6f 66 20 74 68 65 20  e a read of the 
2960: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 75 73  same database us
2970: 69 6e 67 20 68 61 6e 64 6c 65 20 32 20 28 61 6c  ing handle 2 (al
2980: 73 6f 20 66 61 69 6c 73 29 2e 0a 23 20 46 69 6e  so fails)..# Fin
2990: 61 6c 6c 79 2c 20 63 6f 6d 70 69 6c 65 20 61 20  ally, compile a 
29a0: 72 65 61 64 20 6f 66 20 74 68 65 20 6f 74 68 65  read of the othe
29b0: 72 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  r database using
29c0: 20 68 61 6e 64 6c 65 20 32 2e 20 54 68 69 73 0a   handle 2. This.
29d0: 23 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 66 61  # should also fa
29e0: 69 6c 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  il..#.ifcapable 
29f0: 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f  compound {.  do_
2a00: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
2a10: 34 2e 34 2e 31 2e 32 20 7b 0a 20 20 20 20 23 20  4.4.1.2 {.    # 
2a20: 53 61 6e 69 74 79 20 63 68 65 63 6b 20 31 3a 20  Sanity check 1: 
2a30: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73  Check that the s
2a40: 63 68 65 6d 61 20 69 73 20 77 68 61 74 20 77 65  chema is what we
2a50: 20 74 68 69 6e 6b 20 69 74 20 69 73 20 77 68 65   think it is whe
2a60: 6e 20 76 69 65 77 65 64 0a 20 20 20 20 23 20 76  n viewed.    # v
2a70: 69 61 20 68 61 6e 64 6c 65 20 31 2e 0a 20 20 20  ia handle 1..   
2a80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2a90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65   CREATE TABLE te
2aa0: 73 74 32 2e 67 68 69 28 67 2c 20 68 2c 20 69 29  st2.ghi(g, h, i)
2ab0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27  ;.      SELECT '
2ac0: 74 65 73 74 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20  test.db:'||name 
2ad0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2ae0: 65 72 20 0a 20 20 20 20 20 20 55 4e 49 4f 4e 20  er .      UNION 
2af0: 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ALL.      SELECT
2b00: 20 27 74 65 73 74 32 2e 64 62 3a 27 7c 7c 6e 61   'test2.db:'||na
2b10: 6d 65 20 46 52 4f 4d 20 74 65 73 74 32 2e 73 71  me FROM test2.sq
2b20: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
2b30: 20 7d 0a 20 20 7d 20 7b 74 65 73 74 2e 64 62 3a   }.  } {test.db:
2b40: 61 62 63 20 74 65 73 74 2e 64 62 3a 64 65 66 20  abc test.db:def 
2b50: 74 65 73 74 32 2e 64 62 3a 67 68 69 7d 0a 20 20  test2.db:ghi}.  
2b60: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
2b70: 61 76 2e 34 2e 34 2e 31 2e 32 20 7b 0a 20 20 20  av.4.4.1.2 {.   
2b80: 20 23 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20   # Sanity check 
2b90: 32 3a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  2: Check that th
2ba0: 65 20 73 63 68 65 6d 61 20 69 73 20 77 68 61 74  e schema is what
2bb0: 20 77 65 20 74 68 69 6e 6b 20 69 74 20 69 73 20   we think it is 
2bc0: 77 68 65 6e 20 76 69 65 77 65 64 0a 20 20 20 20  when viewed.    
2bd0: 23 20 76 69 61 20 68 61 6e 64 6c 65 20 32 2e 0a  # via handle 2..
2be0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2bf0: 20 20 20 20 53 45 4c 45 43 54 20 27 74 65 73 74      SELECT 'test
2c00: 32 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f  2.db:'||name FRO
2c10: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2c20: 0a 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  .      UNION ALL
2c30: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 74  .      SELECT 't
2c40: 65 73 74 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20 46  est.db:'||name F
2c50: 52 4f 4d 20 74 65 73 74 2e 73 71 6c 69 74 65 5f  ROM test.sqlite_
2c60: 6d 61 73 74 65 72 3b 0a 20 20 20 20 7d 20 64 62  master;.    } db
2c70: 32 0a 20 20 7d 20 7b 74 65 73 74 32 2e 64 62 3a  2.  } {test2.db:
2c80: 67 68 69 20 74 65 73 74 2e 64 62 3a 61 62 63 20  ghi test.db:abc 
2c90: 74 65 73 74 2e 64 62 3a 64 65 66 7d 0a 7d 0a 0a  test.db:def}.}..
2ca0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
2cb0: 61 76 2e 34 2e 34 2e 32 20 7b 0a 20 20 73 65 74  av.4.4.2 {.  set
2cc0: 20 3a 3a 44 42 32 20 5b 73 71 6c 69 74 65 33 5f   ::DB2 [sqlite3_
2cd0: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74  connection_point
2ce0: 65 72 20 64 62 32 5d 0a 20 20 73 65 74 20 73 71  er db2].  set sq
2cf0: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
2d00: 20 61 62 63 7d 0a 20 20 73 65 74 20 3a 3a 53 54   abc}.  set ::ST
2d10: 4d 54 31 20 5b 73 71 6c 69 74 65 33 5f 70 72 65  MT1 [sqlite3_pre
2d20: 70 61 72 65 20 24 3a 3a 44 42 32 20 24 73 71 6c  pare $::DB2 $sql
2d30: 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 65 78 65   -1 DUMMY].  exe
2d40: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
2d50: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2d60: 4c 45 20 6a 6b 6c 28 6a 2c 20 6b 2c 20 6c 29 3b  LE jkl(j, k, l);
2d70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
2d80: 74 65 70 20 24 3a 3a 53 54 4d 54 31 0a 7d 20 7b  tep $::STMT1.} {
2d90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f  SQLITE_ERROR}.do
2da0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
2db0: 2e 34 2e 34 2e 33 20 7b 0a 20 20 73 71 6c 69 74  .4.4.3 {.  sqlit
2dc0: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53  e3_finalize $::S
2dd0: 54 4d 54 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c  TMT1.} {SQLITE_L
2de0: 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20 73  OCKED}.do_test s
2df0: 68 61 72 65 64 2d 24 61 76 2e 34 2e 34 2e 34 20  hared-$av.4.4.4 
2e00: 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63  {.  set rc [catc
2e10: 68 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 53 54  h {.    set ::ST
2e20: 4d 54 31 20 5b 73 71 6c 69 74 65 33 5f 70 72 65  MT1 [sqlite3_pre
2e30: 70 61 72 65 20 24 3a 3a 44 42 32 20 24 73 71 6c  pare $::DB2 $sql
2e40: 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 7d 20 6d   -1 DUMMY].  } m
2e50: 73 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24  sg].  list $rc $
2e60: 6d 73 67 0a 7d 20 7b 31 20 7b 28 36 29 20 64 61  msg.} {1 {(6) da
2e70: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
2e80: 20 6c 6f 63 6b 65 64 3a 20 74 65 73 74 7d 7d 0a   locked: test}}.
2e90: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
2ea0: 61 76 2e 34 2e 34 2e 35 20 7b 0a 20 20 73 65 74  av.4.4.5 {.  set
2eb0: 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20   rc [catch {.   
2ec0: 20 73 65 74 20 3a 3a 53 54 4d 54 31 20 5b 73 71   set ::STMT1 [sq
2ed0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a  lite3_prepare $:
2ee0: 3a 44 42 32 20 22 53 45 4c 45 43 54 20 2a 20 46  :DB2 "SELECT * F
2ef0: 52 4f 4d 20 67 68 69 22 20 2d 31 20 44 55 4d 4d  ROM ghi" -1 DUMM
2f00: 59 5d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69  Y].  } msg].  li
2f10: 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31  st $rc $msg.} {1
2f20: 20 7b 28 36 29 20 64 61 74 61 62 61 73 65 20 73   {(6) database s
2f30: 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 3a  chema is locked:
2f40: 20 74 65 73 74 7d 7d 0a 0a 0a 63 61 74 63 68 20   test}}...catch 
2f50: 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 63 61 74 63  {db2 close}.catc
2f60: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 0a 23 2d  h {db close}..#-
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
2fc0: 73 20 73 68 61 72 65 64 2d 35 2e 2a 20 0a 23 0a  s shared-5.* .#.
2fd0: 66 6f 72 65 61 63 68 20 64 62 20 5b 6c 69 73 74  foreach db [list
2fe0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 31 2e 64   test.db test1.d
2ff0: 62 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 33  b test2.db test3
3000: 2e 64 62 5d 20 7b 0a 20 20 66 69 6c 65 20 64 65  .db] {.  file de
3010: 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 64 62 20  lete -force $db 
3020: 24 7b 64 62 7d 2d 6a 6f 75 72 6e 61 6c 0a 7d 0a  ${db}-journal.}.
3030: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
3040: 61 76 2e 35 2e 31 2e 31 20 7b 0a 20 20 73 71 6c  av.5.1.1 {.  sql
3050: 69 74 65 33 20 64 62 31 20 74 65 73 74 2e 64 62  ite3 db1 test.db
3060: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
3070: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
3080: 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74   {.    ATTACH 't
3090: 65 73 74 31 2e 64 62 27 20 41 53 20 74 65 73 74  est1.db' AS test
30a0: 31 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  1;.    ATTACH 't
30b0: 65 73 74 32 2e 64 62 27 20 41 53 20 74 65 73 74  est2.db' AS test
30c0: 32 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  2;.    ATTACH 't
30d0: 65 73 74 33 2e 64 62 27 20 41 53 20 74 65 73 74  est3.db' AS test
30e0: 33 3b 0a 20 20 7d 20 64 62 31 0a 20 20 65 78 65  3;.  } db1.  exe
30f0: 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43  csql {.    ATTAC
3100: 48 20 27 74 65 73 74 33 2e 64 62 27 20 41 53 20  H 'test3.db' AS 
3110: 74 65 73 74 33 3b 0a 20 20 20 20 41 54 54 41 43  test3;.    ATTAC
3120: 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20  H 'test2.db' AS 
3130: 74 65 73 74 32 3b 0a 20 20 20 20 41 54 54 41 43  test2;.    ATTAC
3140: 48 20 27 74 65 73 74 31 2e 64 62 27 20 41 53 20  H 'test1.db' AS 
3150: 74 65 73 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d  test1;.  } db2.}
3160: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72   {}.do_test shar
3170: 65 64 2d 24 61 76 2e 35 2e 31 2e 32 20 7b 0a 20  ed-$av.5.1.2 {. 
3180: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
3190: 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74  REATE TABLE test
31a0: 31 2e 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  1.t1(a, b);.    
31b0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 65 73  CREATE INDEX tes
31c0: 74 31 2e 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  t1.i1 ON t1(a, b
31d0: 29 3b 0a 20 20 7d 20 64 62 31 0a 7d 20 7b 7d 0a  );.  } db1.} {}.
31e0: 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 20 7b  ifcapable view {
31f0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
3200: 64 2d 24 61 76 2e 35 2e 31 2e 33 20 7b 0a 20 20  d-$av.5.1.3 {.  
3210: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3220: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 65    CREATE VIEW te
3230: 73 74 31 2e 76 31 20 41 53 20 53 45 4c 45 43 54  st1.v1 AS SELECT
3240: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
3250: 7d 20 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d 0a 69  } db1.  } {}.}.i
3260: 66 63 61 70 61 62 6c 65 20 74 72 69 67 67 65 72  fcapable trigger
3270: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61   {.  do_test sha
3280: 72 65 64 2d 24 61 76 2e 35 2e 31 2e 34 20 7b 0a  red-$av.5.1.4 {.
3290: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
32a0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
32b0: 45 52 20 74 65 73 74 31 2e 74 72 69 67 31 20 41  ER test1.trig1 A
32c0: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
32d0: 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20  1 BEGIN.        
32e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
32f0: 41 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77  ALUES(new.a, new
3300: 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a  .b);.      END;.
3310: 20 20 20 20 7d 20 64 62 31 0a 20 20 7d 20 7b 7d      } db1.  } {}
3320: 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .}.do_test share
3330: 64 2d 24 61 76 2e 35 2e 31 2e 35 20 7b 0a 20 20  d-$av.5.1.5 {.  
3340: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
3350: 4f 50 20 49 4e 44 45 58 20 69 31 3b 0a 20 20 7d  OP INDEX i1;.  }
3360: 20 64 62 32 0a 7d 20 7b 7d 0a 69 66 63 61 70 61   db2.} {}.ifcapa
3370: 62 6c 65 20 76 69 65 77 20 7b 0a 20 20 64 6f 5f  ble view {.  do_
3380: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
3390: 35 2e 31 2e 36 20 7b 0a 20 20 20 20 65 78 65 63  5.1.6 {.    exec
33a0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50  sql {.      DROP
33b0: 20 56 49 45 57 20 76 31 3b 0a 20 20 20 20 7d 20   VIEW v1;.    } 
33c0: 64 62 32 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63  db2.  } {}.}.ifc
33d0: 61 70 61 62 6c 65 20 74 72 69 67 67 65 72 20 7b  apable trigger {
33e0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .  do_test share
33f0: 64 2d 24 61 76 2e 35 2e 31 2e 37 20 7b 0a 20 20  d-$av.5.1.7 {.  
3400: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3410: 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74    DROP TRIGGER t
3420: 72 69 67 31 3b 0a 20 20 20 20 7d 20 64 62 32 0a  rig1;.    } db2.
3430: 20 20 7d 20 7b 7d 0a 7d 0a 64 6f 5f 74 65 73 74    } {}.}.do_test
3440: 20 73 68 61 72 65 64 2d 24 61 76 2e 35 2e 31 2e   shared-$av.5.1.
3450: 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  8 {.  execsql {.
3460: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
3470: 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a  1;.  } db2.} {}.
3480: 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75  ifcapable compou
3490: 6e 64 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73  nd {.  do_test s
34a0: 68 61 72 65 64 2d 24 61 76 2e 35 2e 31 2e 39 20  hared-$av.5.1.9 
34b0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
34c0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
34d0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
34e0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  r UNION ALL SELE
34f0: 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74 31 2e  CT * FROM test1.
3500: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
3510: 20 20 7d 20 64 62 31 0a 20 20 7d 20 7b 7d 0a 7d    } db1.  } {}.}
3520: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3570: 54 65 73 74 73 20 73 68 61 72 65 64 2d 36 2e 2a  Tests shared-6.*
3580: 20 74 65 73 74 20 74 68 61 74 20 61 20 71 75 65   test that a que
3590: 72 79 20 6f 62 74 61 69 6e 73 20 61 6c 6c 20 74  ry obtains all t
35a0: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 73 20 69 74  he read-locks it
35b0: 20 6e 65 65 64 73 0a 23 20 62 65 66 6f 72 65 20   needs.# before 
35c0: 73 74 61 72 74 69 6e 67 20 65 78 65 63 75 74 69  starting executi
35d0: 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 2e  on of the query.
35e0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
35f0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
3600: 6e 63 65 0a 23 20 73 6f 6d 65 20 72 6f 77 73 20  nce.# some rows 
3610: 6f 66 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20  of data will be 
3620: 72 65 74 75 72 6e 65 64 20 62 65 66 6f 72 65 20  returned before 
3630: 61 20 6c 6f 63 6b 20 66 61 69 6c 73 20 61 6e 64  a lock fails and
3640: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 0a 23 20 69   SQLITE_LOCK.# i
3650: 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f  s returned..#.do
3660: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
3670: 2e 36 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  .6.1.1 {.  execs
3680: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
3690: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
36a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
36b0: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t2(a, b);.    I
36c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
36d0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
36e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
36f0: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d  ALUES(3, 4);.  }
3700: 20 64 62 31 0a 7d 20 7b 7d 0a 69 66 63 61 70 61   db1.} {}.ifcapa
3710: 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20  ble compound {. 
3720: 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d   do_test shared-
3730: 24 61 76 2e 36 2e 31 2e 32 20 7b 0a 20 20 20 20  $av.6.1.2 {.    
3740: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3750: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3760: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
3770: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
3780: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 32 20   } db2.  } {1 2 
3790: 33 20 34 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73  3 4}.}.do_test s
37a0: 68 61 72 65 64 2d 24 61 76 2e 36 2e 31 2e 33 20  hared-$av.6.1.3 
37b0: 7b 0a 20 20 23 20 45 73 74 61 62 6c 69 73 68 20  {.  # Establish 
37c0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
37d0: 74 61 62 6c 65 20 74 32 20 76 69 61 20 63 6f 6e  table t2 via con
37e0: 6e 65 63 74 69 6f 6e 20 64 62 32 2e 20 54 68 65  nection db2. The
37f0: 6e 20 6d 61 6b 65 20 61 20 0a 20 20 23 20 55 4e  n make a .  # UN
3800: 49 4f 4e 20 61 6c 6c 20 71 75 65 72 79 20 75 73  ION all query us
3810: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ing connection d
3820: 62 31 20 74 68 61 74 20 66 69 72 73 74 20 61 63  b1 that first ac
3830: 63 65 73 73 65 73 20 74 31 2c 20 66 6f 6c 6c 6f  cesses t1, follo
3840: 77 65 64 20 0a 20 20 23 20 62 79 20 74 32 2e 20  wed .  # by t2. 
3850: 49 66 20 74 68 65 20 6c 6f 63 6b 73 20 61 72 65  If the locks are
3860: 20 67 72 61 62 62 65 64 20 61 74 20 74 68 65 20   grabbed at the 
3870: 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 74 61  start of the sta
3880: 74 65 6d 65 6e 74 20 28 61 73 20 0a 20 20 23 20  tement (as .  # 
3890: 74 68 65 79 20 73 68 6f 75 6c 64 20 62 65 29 2c  they should be),
38a0: 20 6e 6f 20 72 6f 77 73 20 61 72 65 20 72 65 74   no rows are ret
38b0: 75 72 6e 65 64 2e 20 49 66 20 28 61 73 20 77 61  urned. If (as wa
38c0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 74 68 65  s previously the
38d0: 20 63 61 73 65 29 0a 20 20 23 20 74 68 65 79 20   case).  # they 
38e0: 61 72 65 20 67 72 61 62 62 65 64 20 61 73 20 74  are grabbed as t
38f0: 68 65 20 74 61 62 6c 65 73 20 61 72 65 20 61 63  he tables are ac
3900: 63 65 73 73 65 64 2c 20 74 68 65 20 74 31 20 72  cessed, the t1 r
3910: 6f 77 73 20 77 69 6c 6c 20 62 65 20 0a 20 20 23  ows will be .  #
3920: 20 72 65 74 75 72 6e 65 64 20 62 65 66 6f 72 65   returned before
3930: 20 74 68 65 20 71 75 65 72 79 20 66 61 69 6c 73   the query fails
3940: 2e 0a 20 20 23 0a 20 20 65 78 65 63 73 71 6c 20  ..  #.  execsql 
3950: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
3960: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3970: 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20  VALUES(5, 6);.  
3980: 7d 20 64 62 32 0a 20 20 73 65 74 20 72 65 74 20  } db2.  set ret 
3990: 5b 6c 69 73 74 5d 0a 20 20 63 61 74 63 68 20 7b  [list].  catch {
39a0: 0a 20 20 20 20 64 62 31 20 65 76 61 6c 20 7b 53  .    db1 eval {S
39b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
39c0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
39d0: 20 2a 20 46 52 4f 4d 20 74 32 7d 20 7b 0a 20 20   * FROM t2} {.  
39e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20      lappend ret 
39f0: 24 61 20 24 62 0a 20 20 20 20 7d 0a 20 20 7d 0a  $a $b.    }.  }.
3a00: 20 20 73 65 74 20 72 65 74 0a 7d 20 7b 7d 0a 64    set ret.} {}.d
3a10: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61  o_test shared-$a
3a20: 76 2e 36 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63  v.6.1.4 {.  exec
3a30: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
3a40: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
3a50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3a60: 56 41 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20  VALUES(7, 8);.  
3a70: 7d 20 64 62 32 0a 20 20 73 65 74 20 72 65 74 20  } db2.  set ret 
3a80: 5b 6c 69 73 74 5d 0a 20 20 63 61 74 63 68 20 7b  [list].  catch {
3a90: 0a 20 20 20 20 64 62 31 20 65 76 61 6c 20 7b 0a  .    db1 eval {.
3aa0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 28 43 41        SELECT (CA
3ab0: 53 45 20 57 48 45 4e 20 61 3e 34 20 54 48 45 4e  SE WHEN a>4 THEN
3ac0: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
3ad0: 74 31 29 20 45 4c 53 45 20 30 20 45 4e 44 29 20  t1) ELSE 0 END) 
3ae0: 41 53 20 64 20 46 52 4f 4d 20 74 32 3b 0a 20 20  AS d FROM t2;.  
3af0: 20 20 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70    } {.      lapp
3b00: 65 6e 64 20 72 65 74 20 24 64 0a 20 20 20 20 7d  end ret $d.    }
3b10: 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d  .  }.  set ret.}
3b20: 20 7b 7d 0a 0a 63 61 74 63 68 20 7b 64 62 31 20   {}..catch {db1 
3b30: 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62  close}.catch {db
3b40: 32 20 63 6c 6f 73 65 7d 0a 66 6f 72 65 61 63 68  2 close}.foreach
3b50: 20 66 20 5b 6c 69 73 74 20 74 65 73 74 2e 64 62   f [list test.db
3b60: 20 74 65 73 74 32 2e 64 62 5d 20 7b 0a 20 20 66   test2.db] {.  f
3b70: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
3b80: 65 20 24 66 20 24 7b 66 7d 2d 6a 6f 75 72 6e 61  e $f ${f}-journa
3b90: 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  l.}..#----------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3be0: 0a 23 20 54 65 73 74 73 20 73 68 61 72 65 64 2d  .# Tests shared-
3bf0: 37 2e 2a 20 74 65 73 74 20 61 75 74 6f 2d 76 61  7.* test auto-va
3c00: 63 75 75 6d 20 64 6f 65 73 20 6e 6f 74 20 69 6e  cuum does not in
3c10: 76 61 6c 69 64 61 74 65 20 63 75 72 73 6f 72 73  validate cursors
3c20: 20 66 72 6f 6d 0a 23 20 6f 74 68 65 72 20 73 68   from.# other sh
3c30: 61 72 65 64 2d 63 61 63 68 65 20 75 73 65 72 73  ared-cache users
3c40: 20 77 68 65 6e 20 69 74 20 72 65 6f 72 67 61 6e   when it reorgan
3c50: 69 7a 65 73 20 74 68 65 20 64 61 74 61 62 61 73  izes the databas
3c60: 65 20 6f 6e 20 0a 23 20 43 4f 4d 4d 49 54 2e 0a  e on .# COMMIT..
3c70: 23 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  #.do_test shared
3c80: 2d 24 61 76 2e 37 2e 31 20 7b 0a 20 20 23 20 54  -$av.7.1 {.  # T
3c90: 68 69 73 20 74 65 73 74 20 63 61 73 65 20 73 65  his test case se
3ca0: 74 73 20 75 70 20 61 20 74 65 73 74 20 64 61 74  ts up a test dat
3cb0: 61 62 61 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  abase in auto-va
3cc0: 63 75 75 6d 20 6d 6f 64 65 20 63 6f 6e 73 69 73  cuum mode consis
3cd0: 74 69 6e 67 20 0a 20 20 23 20 6f 66 20 74 77 6f  ting .  # of two
3ce0: 20 74 61 62 6c 65 73 2c 20 74 31 20 61 6e 64 20   tables, t1 and 
3cf0: 74 32 2e 20 42 6f 74 68 20 68 61 76 65 20 61 20  t2. Both have a 
3d00: 73 69 6e 67 6c 65 20 69 6e 64 65 78 2e 20 54 61  single index. Ta
3d10: 62 6c 65 20 74 31 20 69 73 20 0a 20 20 23 20 70  ble t1 is .  # p
3d20: 6f 70 75 6c 61 74 65 64 20 66 69 72 73 74 20 28  opulated first (
3d30: 73 6f 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  so consists of p
3d40: 61 67 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ages toward the 
3d50: 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 62 20  start of the db 
3d60: 66 69 6c 65 29 2c 20 0a 20 20 23 20 74 32 20 73  file), .  # t2 s
3d70: 65 63 6f 6e 64 20 28 70 61 67 65 73 20 74 6f 77  econd (pages tow
3d80: 61 72 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ard the end of t
3d90: 68 65 20 66 69 6c 65 29 2e 20 0a 20 20 73 71 6c  he file). .  sql
3da0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
3db0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
3dc0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
3dd0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
3de0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3df0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
3e00: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
3e10: 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52  ABLE t2(a PRIMAR
3e20: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 7d 0a 20  Y KEY, b);.  }. 
3e30: 20 73 65 74 20 3a 3a 63 6f 6e 74 65 6e 74 73 20   set ::contents 
3e40: 7b 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20  {}.  for {set i 
3e50: 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69  0} {$i < 100} {i
3e60: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74  ncr i} {.    set
3e70: 20 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   a [string repea
3e80: 74 20 22 24 69 20 22 20 32 30 5d 0a 20 20 20 20  t "$i " 20].    
3e90: 73 65 74 20 62 20 5b 73 74 72 69 6e 67 20 72 65  set b [string re
3ea0: 70 65 61 74 20 22 24 69 20 22 20 32 30 5d 0a 20  peat "$i " 20]. 
3eb0: 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20     db eval {.   
3ec0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3ed0: 31 20 56 41 4c 55 45 53 28 3a 61 2c 20 3a 62 29  1 VALUES(:a, :b)
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70  ;.    }.    lapp
3ef0: 65 6e 64 20 3a 3a 63 6f 6e 74 65 6e 74 73 20 5b  end ::contents [
3f00: 6c 69 73 74 20 5b 65 78 70 72 20 24 69 2b 31 5d  list [expr $i+1]
3f10: 20 24 61 20 24 62 5d 0a 20 20 7d 0a 20 20 65 78   $a $b].  }.  ex
3f20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
3f30: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
3f40: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3f50: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
3f60: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
3f70: 2d 24 61 76 2e 37 2e 32 20 7b 0a 20 20 23 20 54  -$av.7.2 {.  # T
3f80: 68 69 73 20 74 65 73 74 20 63 61 73 65 20 64 65  his test case de
3f90: 6c 65 74 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  letes the conten
3fa0: 74 73 20 6f 66 20 74 61 62 6c 65 20 74 31 20 28  ts of table t1 (
3fb0: 74 68 65 20 6f 6e 65 20 61 74 20 74 68 65 20 73  the one at the s
3fc0: 74 61 72 74 20 6f 66 0a 20 20 23 20 74 68 65 20  tart of.  # the 
3fd0: 66 69 6c 65 29 20 77 68 69 6c 65 20 6d 61 6e 79  file) while many
3fe0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65   cursors are ope
3ff0: 6e 20 6f 6e 20 74 61 62 6c 65 20 74 32 20 61 6e  n on table t2 an
4000: 64 20 69 74 73 20 69 6e 64 65 78 2e 20 41 6c 6c  d its index. All
4010: 20 6f 66 0a 20 20 23 20 74 68 65 20 6e 6f 6e 2d   of.  # the non-
4020: 72 6f 6f 74 20 70 61 67 65 73 20 77 69 6c 6c 20  root pages will 
4030: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  be moved from th
4040: 65 20 65 6e 64 20 74 6f 20 74 68 65 20 73 74 61  e end to the sta
4050: 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  rt of the file. 
4060: 20 23 20 77 68 65 6e 20 74 68 65 20 44 45 4c 45   # when the DELE
4070: 54 45 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  TE is committed 
4080: 2d 20 74 68 69 73 20 74 65 73 74 20 76 65 72 69  - this test veri
4090: 66 69 65 73 20 74 68 61 74 20 6d 6f 76 69 6e 67  fies that moving
40a0: 20 74 68 65 20 70 61 67 65 73 0a 20 20 23 20 64   the pages.  # d
40b0: 6f 65 73 20 6e 6f 74 20 64 69 73 74 75 72 62 20  oes not disturb 
40c0: 74 68 65 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  the open cursors
40d0: 2e 0a 20 20 23 0a 0a 20 20 70 72 6f 63 20 6c 6f  ..  #..  proc lo
40e0: 63 6b 72 6f 77 20 7b 64 62 20 74 62 6c 20 6f 69  ckrow {db tbl oi
40f0: 64 73 20 62 6f 64 79 7d 20 7b 0a 20 20 20 20 73  ds body} {.    s
4100: 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20  et ret [list].  
4110: 20 20 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43    db eval "SELEC
4120: 54 20 6f 69 64 20 41 53 20 69 2c 20 61 2c 20 62  T oid AS i, a, b
4130: 20 46 52 4f 4d 20 24 74 62 6c 20 4f 52 44 45 52   FROM $tbl ORDER
4140: 20 42 59 20 61 22 20 7b 0a 20 20 20 20 20 20 69   BY a" {.      i
4150: 66 20 7b 24 69 3d 3d 5b 6c 69 6e 64 65 78 20 24  f {$i==[lindex $
4160: 6f 69 64 73 20 30 5d 7d 20 7b 0a 20 20 20 20 20  oids 0]} {.     
4170: 20 20 20 73 65 74 20 6e 6f 69 64 73 20 5b 6c 72     set noids [lr
4180: 61 6e 67 65 20 24 6f 69 64 73 20 31 20 65 6e 64  ange $oids 1 end
4190: 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ].        if {[l
41a0: 6c 65 6e 67 74 68 20 24 6e 6f 69 64 73 5d 3d 3d  length $noids]==
41b0: 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0} {.          s
41c0: 65 74 20 73 75 62 72 65 74 20 5b 65 76 61 6c 20  et subret [eval 
41d0: 24 62 6f 64 79 5d 0a 20 20 20 20 20 20 20 20 7d  $body].        }
41e0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
41f0: 20 20 73 65 74 20 73 75 62 72 65 74 20 5b 6c 6f    set subret [lo
4200: 63 6b 72 6f 77 20 24 64 62 20 24 74 62 6c 20 24  ckrow $db $tbl $
4210: 6e 6f 69 64 73 20 24 62 6f 64 79 5d 0a 20 20 20  noids $body].   
4220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4230: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74       lappend ret
4240: 20 5b 6c 69 73 74 20 24 69 20 24 61 20 24 62 5d   [list $i $a $b]
4250: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4260: 6e 20 5b 6c 69 6e 73 65 72 74 20 24 73 75 62 72  n [linsert $subr
4270: 65 74 20 30 20 24 72 65 74 5d 0a 20 20 7d 0a 20  et 0 $ret].  }. 
4280: 20 70 72 6f 63 20 6c 6f 63 6b 74 62 6c 72 6f 77   proc locktblrow
4290: 73 20 7b 64 62 20 74 62 6c 20 62 6f 64 79 7d 20  s {db tbl body} 
42a0: 7b 0a 20 20 20 20 73 65 74 20 6f 69 64 73 20 5b  {.    set oids [
42b0: 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20  db eval "SELECT 
42c0: 6f 69 64 20 46 52 4f 4d 20 24 74 62 6c 22 5d 0a  oid FROM $tbl"].
42d0: 20 20 20 20 6c 6f 63 6b 72 6f 77 20 24 64 62 20      lockrow $db 
42e0: 24 74 62 6c 20 24 6f 69 64 73 20 24 62 6f 64 79  $tbl $oids $body
42f0: 0a 20 20 7d 0a 0a 20 20 73 65 74 20 73 63 61 6e  .  }..  set scan
4300: 73 20 5b 6c 6f 63 6b 74 62 6c 72 6f 77 73 20 64  s [locktblrows d
4310: 62 20 74 32 20 7b 0a 20 20 20 20 65 78 65 63 73  b t2 {.    execs
4320: 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54  ql {.      DELET
4330: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d  E FROM t1;.    }
4340: 20 64 62 32 0a 20 20 7d 5d 0a 20 20 73 65 74 20   db2.  }].  set 
4350: 65 72 72 6f 72 20 30 0a 0a 20 20 23 20 54 65 73  error 0..  # Tes
4360: 74 20 74 68 61 74 20 65 61 63 68 20 53 45 4c 45  t that each SELE
4370: 43 54 20 71 75 65 72 79 20 72 65 74 75 72 6e 65  CT query returne
4380: 64 20 74 68 65 20 65 78 70 65 63 74 65 64 20 63  d the expected c
4390: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 32 2e 0a 20  ontents of t2.. 
43a0: 20 66 6f 72 65 61 63 68 20 73 20 24 73 63 61 6e   foreach s $scan
43b0: 73 20 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 73 6f  s {.    if {[lso
43c0: 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 64  rt -integer -ind
43d0: 65 78 20 30 20 24 73 5d 21 3d 24 3a 3a 63 6f 6e  ex 0 $s]!=$::con
43e0: 74 65 6e 74 73 7d 20 7b 0a 20 20 20 20 20 20 73  tents} {.      s
43f0: 65 74 20 65 72 72 6f 72 20 31 0a 20 20 20 20 7d  et error 1.    }
4400: 0a 20 20 7d 0a 20 20 73 65 74 20 65 72 72 6f 72  .  }.  set error
4410: 0a 7d 20 7b 30 7d 0a 0a 63 61 74 63 68 20 7b 64  .} {0}..catch {d
4420: 62 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b  b close}.catch {
4430: 64 62 32 20 63 6c 6f 73 65 7d 0a 75 6e 73 65 74  db2 close}.unset
4440: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 63 6f 6e   -nocomplain con
4450: 74 65 6e 74 73 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  tents..#--------
4460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44a0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
44b0: 6e 67 20 74 65 73 74 73 20 74 72 79 20 74 6f 20  ng tests try to 
44c0: 74 72 69 63 6b 20 74 68 65 20 73 68 61 72 65 64  trick the shared
44d0: 2d 63 61 63 68 65 20 63 6f 64 65 20 69 6e 74 6f  -cache code into
44e0: 20 61 73 73 75 6d 69 6e 67 0a 23 20 74 68 65 20   assuming.# the 
44f0: 77 72 6f 6e 67 20 65 6e 63 6f 64 69 6e 67 20 66  wrong encoding f
4500: 6f 72 20 61 20 64 61 74 61 62 61 73 65 2e 0a 23  or a database..#
4510: 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f  .file delete -fo
4520: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
4530: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 69 66 63 61  .db-journal.ifca
4540: 70 61 62 6c 65 20 75 74 66 31 36 20 7b 0a 20 20  pable utf16 {.  
4550: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
4560: 61 76 2e 38 2e 31 2e 31 20 7b 0a 20 20 20 20 73  av.8.1.1 {.    s
4570: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
4580: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
4590: 20 20 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63        PRAGMA enc
45a0: 6f 64 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27  oding = 'UTF-16'
45b0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
45c0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
45d0: 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ter;.    }.  } {
45e0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  }.  do_test shar
45f0: 65 64 2d 24 61 76 2e 38 2e 31 2e 32 20 7b 0a 20  ed-$av.8.1.2 {. 
4600: 20 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20     string range 
4610: 5b 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41  [execsql {PRAGMA
4620: 20 65 6e 63 6f 64 69 6e 67 3b 7d 5d 20 30 20 65   encoding;}] 0 e
4630: 6e 64 2d 32 0a 20 20 7d 20 7b 55 54 46 2d 31 36  nd-2.  } {UTF-16
4640: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61  }..  do_test sha
4650: 72 65 64 2d 24 61 76 2e 38 2e 31 2e 33 20 7b 0a  red-$av.8.1.3 {.
4660: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
4670: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
4680: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
4690: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 55  MA encoding = 'U
46a0: 54 46 2d 38 27 3b 0a 20 20 20 20 20 20 43 52 45  TF-8';.      CRE
46b0: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c  ATE TABLE abc(a,
46c0: 20 62 2c 20 63 29 3b 0a 20 20 20 20 7d 20 64 62   b, c);.    } db
46d0: 32 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  2.  } {}.  do_te
46e0: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 38 2e  st shared-$av.8.
46f0: 31 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  1.4 {.    execsq
4700: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
4710: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
4720: 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  aster;.    }.  }
4730: 20 22 74 61 62 6c 65 20 61 62 63 20 61 62 63 20   "table abc abc 
4740: 5b 65 78 70 72 20 24 41 55 54 4f 56 41 43 55 55  [expr $AUTOVACUU
4750: 4d 3f 33 3a 32 5d 20 7b 43 52 45 41 54 45 20 54  M?3:2] {CREATE T
4760: 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63  ABLE abc(a, b, c
4770: 29 7d 22 0a 20 20 64 6f 5f 74 65 73 74 20 73 68  )}".  do_test sh
4780: 61 72 65 64 2d 24 61 76 2e 38 2e 31 2e 35 20 7b  ared-$av.8.1.5 {
4790: 0a 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  .    db2 close. 
47a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
47b0: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
47c0: 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 55  ng;.    }.  } {U
47d0: 54 46 2d 38 7d 0a 0a 20 20 66 69 6c 65 20 64 65  TF-8}..  file de
47e0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
47f0: 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f  2.db test2.db-jo
4800: 75 72 6e 61 6c 0a 20 20 64 6f 5f 74 65 73 74 20  urnal.  do_test 
4810: 73 68 61 72 65 64 2d 24 61 76 2e 38 2e 32 2e 31  shared-$av.8.2.1
4820: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4830: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
4840: 65 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b  est2.db' AS aux;
4850: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
4860: 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f  FROM aux.sqlite_
4870: 6d 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  master;.    }.  
4880: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  } {}.  do_test s
4890: 68 61 72 65 64 2d 24 61 76 2e 38 2e 32 2e 32 20  hared-$av.8.2.2 
48a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
48b0: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 20 20 65  2 test2.db.    e
48c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
48d0: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
48e0: 20 27 55 54 46 2d 31 36 27 3b 0a 20 20 20 20 20   'UTF-16';.     
48f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 65   CREATE TABLE de
4900: 66 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20  f(d, e, f);.    
4910: 7d 20 64 62 32 0a 20 20 20 20 73 74 72 69 6e 67  } db2.    string
4920: 20 72 61 6e 67 65 20 5b 65 78 65 63 73 71 6c 20   range [execsql 
4930: 7b 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  {PRAGMA encoding
4940: 3b 7d 20 64 62 32 5d 20 30 20 65 6e 64 2d 32 0a  ;} db2] 0 end-2.
4950: 20 20 7d 20 7b 55 54 46 2d 31 36 7d 0a 0a 20 20    } {UTF-16}..  
4960: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
4970: 0a 20 20 63 61 74 63 68 20 7b 64 62 32 20 63 6c  .  catch {db2 cl
4980: 6f 73 65 7d 0a 20 20 66 69 6c 65 20 64 65 6c 65  ose}.  file dele
4990: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
49a0: 62 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 64 6f  b test2.db..  do
49b0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
49c0: 2e 38 2e 33 2e 32 20 7b 0a 20 20 20 20 73 71 6c  .8.3.2 {.    sql
49d0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
49e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52      execsql { CR
49f0: 45 41 54 45 20 54 41 42 4c 45 20 64 65 66 28 64  EATE TABLE def(d
4a00: 2c 20 65 2c 20 66 29 20 7d 0a 20 20 20 20 65 78  , e, f) }.    ex
4a10: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 65  ecsql { PRAGMA e
4a20: 6e 63 6f 64 69 6e 67 20 7d 0a 20 20 7d 20 7b 55  ncoding }.  } {U
4a30: 54 46 2d 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20  TF-8}.  do_test 
4a40: 73 68 61 72 65 64 2d 24 61 76 2e 38 2e 33 2e 33  shared-$av.8.3.3
4a50: 20 7b 0a 20 20 20 20 73 65 74 20 7a 44 62 31 36   {.    set zDb16
4a60: 20 22 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76   "[encoding conv
4a70: 65 72 74 74 6f 20 75 6e 69 63 6f 64 65 20 74 65  ertto unicode te
4a80: 73 74 2e 64 62 5d 5c 78 30 30 5c 78 30 30 22 0a  st.db]\x00\x00".
4a90: 20 20 20 20 73 65 74 20 64 62 31 36 20 5b 73 71      set db16 [sq
4aa0: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 24 7a 44  lite3_open16 $zD
4ab0: 62 31 36 20 7b 7d 5d 0a 0a 20 20 20 20 73 65 74  b16 {}]..    set
4ac0: 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70   stmt [sqlite3_p
4ad0: 72 65 70 61 72 65 20 24 64 62 31 36 20 22 53 45  repare $db16 "SE
4ae0: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
4af0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 2d 31 20  lite_master" -1 
4b00: 44 55 4d 4d 59 5d 0a 20 20 20 20 73 71 6c 69 74  DUMMY].    sqlit
4b10: 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 20 20  e3_step $stmt.  
4b20: 20 20 73 65 74 20 73 71 6c 20 5b 73 71 6c 69 74    set sql [sqlit
4b30: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
4b40: 73 74 6d 74 20 30 5d 0a 20 20 20 20 73 71 6c 69  stmt 0].    sqli
4b50: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74  te3_finalize $st
4b60: 6d 74 0a 20 20 20 20 73 65 74 20 73 71 6c 0a 20  mt.    set sql. 
4b70: 20 7d 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45   } {CREATE TABLE
4b80: 20 64 65 66 28 64 2c 20 65 2c 20 66 29 7d 0a 20   def(d, e, f)}. 
4b90: 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d   do_test shared-
4ba0: 24 61 76 2e 38 2e 33 2e 34 20 7b 0a 20 20 20 20  $av.8.3.4 {.    
4bb0: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
4bc0: 33 5f 70 72 65 70 61 72 65 20 24 64 62 31 36 20  3_prepare $db16 
4bd0: 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  "PRAGMA encoding
4be0: 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 20 20  " -1 DUMMY].    
4bf0: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74  sqlite3_step $st
4c00: 6d 74 0a 20 20 20 20 73 65 74 20 65 6e 63 20 5b  mt.    set enc [
4c10: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4c20: 65 78 74 20 24 73 74 6d 74 20 30 5d 0a 20 20 20  ext $stmt 0].   
4c30: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
4c40: 65 20 24 73 74 6d 74 0a 20 20 20 20 73 65 74 20  e $stmt.    set 
4c50: 65 6e 63 0a 20 20 7d 20 7b 55 54 46 2d 38 7d 0a  enc.  } {UTF-8}.
4c60: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
4c70: 20 24 64 62 31 36 0a 0a 23 20 42 75 67 20 23 32   $db16..# Bug #2
4c80: 35 34 37 20 69 73 20 63 61 75 73 69 6e 67 20 74  547 is causing t
4c90: 68 69 73 20 74 6f 20 66 61 69 6c 2e 0a 69 66 20  his to fail..if 
4ca0: 30 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68  0 {.  do_test sh
4cb0: 61 72 65 64 2d 24 61 76 2e 38 2e 32 2e 33 20 7b  ared-$av.8.2.3 {
4cc0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
4cd0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4ce0: 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d  ROM aux.sqlite_m
4cf0: 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  aster;.    }.  }
4d00: 20 7b 31 20 7b 61 74 74 61 63 68 65 64 20 64 61   {1 {attached da
4d10: 74 61 62 61 73 65 73 20 6d 75 73 74 20 75 73 65  tabases must use
4d20: 20 74 68 65 20 73 61 6d 65 20 74 65 78 74 20 65   the same text e
4d30: 6e 63 6f 64 69 6e 67 20 61 73 20 6d 61 69 6e 20  ncoding as main 
4d40: 64 61 74 61 62 61 73 65 7d 7d 0a 7d 0a 7d 0a 0a  database}}.}.}..
4d50: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
4d60: 0a 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73  .catch {db2 clos
4d70: 65 7d 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  e}.file delete -
4d80: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
4d90: 73 74 32 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  st2.db..#-------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4de0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
4df0: 77 69 6e 67 20 74 65 73 74 73 20 2d 20 73 68 61  wing tests - sha
4e00: 72 65 64 2d 39 2e 2a 20 2d 20 74 65 73 74 20 69  red-9.* - test i
4e10: 6e 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74 77  nteractions betw
4e20: 65 65 6e 20 54 45 4d 50 20 74 72 69 67 67 65 72  een TEMP trigger
4e30: 73 0a 23 20 61 6e 64 20 73 68 61 72 65 64 2d 73  s.# and shared-s
4e40: 63 68 65 6d 61 73 2e 0a 23 0a 69 66 63 61 70 61  chemas..#.ifcapa
4e50: 62 6c 65 20 74 72 69 67 67 65 72 26 26 74 65 6d  ble trigger&&tem
4e60: 70 64 62 20 7b 0a 0a 64 6f 5f 74 65 73 74 20 73  pdb {..do_test s
4e70: 68 61 72 65 64 2d 24 61 76 2e 39 2e 31 20 7b 0a  hared-$av.9.1 {.
4e80: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
4e90: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
4ea0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
4eb0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4ec0: 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62  E TABLE abc(a, b
4ed0: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
4ee0: 20 54 41 42 4c 45 20 61 62 63 5f 6d 69 72 72 6f   TABLE abc_mirro
4ef0: 72 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  r(a, b, c);.    
4f00: 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47  CREATE TEMP TRIG
4f10: 47 45 52 20 42 45 46 4f 52 45 20 49 4e 53 45 52  GER BEFORE INSER
4f20: 54 20 4f 4e 20 61 62 63 20 42 45 47 49 4e 20 0a  T ON abc BEGIN .
4f30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4f40: 4f 20 61 62 63 5f 6d 69 72 72 6f 72 28 61 2c 20  O abc_mirror(a, 
4f50: 62 2c 20 63 29 20 56 41 4c 55 45 53 28 6e 65 77  b, c) VALUES(new
4f60: 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63  .a, new.b, new.c
4f70: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  );.    END;.    
4f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
4f90: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
4fa0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
4fb0: 4f 4d 20 61 62 63 5f 6d 69 72 72 6f 72 3b 0a 20  OM abc_mirror;. 
4fc0: 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f   }.} {1 2 3}.do_
4fd0: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
4fe0: 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
4ff0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
5000: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 34 2c 20  O abc VALUES(4, 
5010: 35 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43  5, 6);.    SELEC
5020: 54 20 2a 20 46 52 4f 4d 20 61 62 63 5f 6d 69 72  T * FROM abc_mir
5030: 72 6f 72 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b  ror;.  } db2.} {
5040: 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73  1 2 3}.do_test s
5050: 68 61 72 65 64 2d 24 61 76 2e 39 2e 33 20 7b 0a  hared-$av.9.3 {.
5060: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32    db close.  db2
5070: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 7d 20 3b   close.} {}..} ;
5080: 20 23 20 45 6e 64 20 73 68 61 72 65 64 2d 39 2e   # End shared-9.
5090: 2a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *..#------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
50e0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
50f0: 74 65 73 74 73 20 2d 20 73 68 61 72 65 64 2d 31  tests - shared-1
5100: 30 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20  0.* - test that 
5110: 74 68 65 20 6c 69 62 72 61 72 79 20 62 65 68 61  the library beha
5120: 76 65 73 20 0a 23 20 63 6f 72 72 65 63 74 6c 79  ves .# correctly
5130: 20 77 68 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69   when a connecti
5140: 6f 6e 20 74 6f 20 61 20 73 68 61 72 65 64 2d 63  on to a shared-c
5150: 61 63 68 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  ache is closed. 
5160: 0a 23 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  .#.do_test share
5170: 64 2d 24 61 76 2e 31 30 2e 31 20 7b 0a 20 20 23  d-$av.10.1 {.  #
5180: 20 43 72 65 61 74 65 20 61 20 73 6d 61 6c 6c 20   Create a small 
5190: 73 61 6d 70 6c 65 20 64 61 74 61 62 61 73 65 20  sample database 
51a0: 77 69 74 68 20 74 77 6f 20 63 6f 6e 6e 65 63 74  with two connect
51b0: 69 6f 6e 73 20 74 6f 20 69 74 20 28 64 62 20 61  ions to it (db a
51c0: 6e 64 20 64 62 32 29 2e 0a 20 20 66 69 6c 65 20  nd db2)..  file 
51d0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
51e0: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  st.db.  sqlite3 
51f0: 64 62 20 20 74 65 73 74 2e 64 62 0a 20 20 73 71  db  test.db.  sq
5200: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
5210: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
5220: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
5230: 62 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  b(a PRIMARY KEY,
5240: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
5250: 54 41 42 4c 45 20 64 65 28 64 20 50 52 49 4d 41  TABLE de(d PRIMA
5260: 52 59 20 4b 45 59 2c 20 65 29 3b 0a 20 20 20 20  RY KEY, e);.    
5270: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
5280: 41 4c 55 45 53 28 27 43 68 69 61 6e 67 20 4d 61  ALUES('Chiang Ma
5290: 69 27 2c 20 31 30 30 30 30 30 29 3b 0a 20 20 20  i', 100000);.   
52a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
52b0: 56 41 4c 55 45 53 28 27 42 61 6e 67 6b 6f 6b 27  VALUES('Bangkok'
52c0: 2c 20 38 30 30 30 30 30 30 29 3b 0a 20 20 20 20  , 8000000);.    
52d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 20 56  INSERT INTO de V
52e0: 41 4c 55 45 53 28 27 55 62 6f 6e 27 2c 20 31 32  ALUES('Ubon', 12
52f0: 30 30 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  0000);.    INSER
5300: 54 20 49 4e 54 4f 20 64 65 20 56 41 4c 55 45 53  T INTO de VALUES
5310: 28 27 4b 68 6f 6e 20 4b 61 65 6e 27 2c 20 32 30  ('Khon Kaen', 20
5320: 30 30 30 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  0000);.  }.} {}.
5330: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5340: 61 76 2e 31 30 2e 32 20 7b 0a 20 20 23 20 4f 70  av.10.2 {.  # Op
5350: 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
5360: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 66  ction with the f
5370: 69 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  irst connection,
5380: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
5390: 74 69 6f 6e 0a 20 20 23 20 77 69 74 68 20 74 68  tion.  # with th
53a0: 65 20 73 65 63 6f 6e 64 2e 0a 20 20 65 78 65 63  e second..  exec
53b0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
53c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
53d0: 4f 4d 20 61 62 3b 0a 20 20 7d 0a 20 20 65 78 65  OM ab;.  }.  exe
53e0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
53f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5400: 4f 20 64 65 20 56 41 4c 55 45 53 28 27 50 61 74  O de VALUES('Pat
5410: 61 79 61 27 2c 20 33 30 30 30 30 29 3b 0a 20 20  aya', 30000);.  
5420: 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  } db2.} {}.do_te
5430: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30  st shared-$av.10
5440: 2e 33 20 7b 0a 20 20 23 20 41 6e 20 65 78 74 65  .3 {.  # An exte
5450: 72 6e 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  rnal connection 
5460: 73 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74  should be able t
5470: 6f 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  o read the datab
5480: 61 73 65 2c 20 62 75 74 20 6e 6f 74 0a 20 20 23  ase, but not.  #
5490: 20 70 72 65 70 61 72 65 20 61 20 77 72 69 74 65   prepare a write
54a0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 69 66   operation..  if
54b0: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
54c0: 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e  m(platform)=="un
54d0: 69 78 22 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74  ix"} {.    sqlit
54e0: 65 33 20 64 62 33 20 2e 2f 74 65 73 74 2e 64 62  e3 db3 ./test.db
54f0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
5500: 73 71 6c 69 74 65 33 20 64 62 33 20 54 45 53 54  sqlite3 db3 TEST
5510: 2e 44 42 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  .DB.  }.  execsq
5520: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
5530: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 7d 20 64 62   FROM ab;.  } db
5540: 33 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  3.  catchsql {. 
5550: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
5560: 53 45 52 54 20 49 4e 54 4f 20 64 65 20 56 41 4c  SERT INTO de VAL
5570: 55 45 53 28 27 50 61 74 61 79 61 27 2c 20 33 30  UES('Pataya', 30
5580: 30 30 30 29 3b 0a 20 20 7d 20 64 62 33 0a 7d 20  000);.  } db3.} 
5590: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
55a0: 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  locked}}.do_test
55b0: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e 34   shared-$av.10.4
55c0: 20 7b 0a 20 20 23 20 43 6c 6f 73 65 20 74 68 65   {.  # Close the
55d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
55e0: 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
55f0: 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 20 20 64 62  action open.  db
5600: 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f  2 close.} {}.do_
5610: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
5620: 31 30 2e 35 20 7b 0a 20 20 23 20 54 65 73 74 20  10.5 {.  # Test 
5630: 74 68 61 74 20 74 68 65 20 64 62 32 20 74 72 61  that the db2 tra
5640: 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
5650: 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
5660: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 23  rolled back..  #
5670: 20 49 66 20 69 74 20 68 61 73 20 6e 6f 74 20 74   If it has not t
5680: 68 65 20 28 27 50 61 74 61 79 61 27 2c 20 33 30  he ('Pataya', 30
5690: 30 30 30 29 20 65 6e 74 72 79 20 77 69 6c 6c 20  000) entry will 
56a0: 73 74 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 20  still be in the 
56b0: 74 61 62 6c 65 2e 0a 20 20 65 78 65 63 73 71 6c  table..  execsql
56c0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
56d0: 46 52 4f 4d 20 64 65 3b 0a 20 20 7d 0a 7d 20 7b  FROM de;.  }.} {
56e0: 55 62 6f 6e 20 31 32 30 30 30 30 20 7b 4b 68 6f  Ubon 120000 {Kho
56f0: 6e 20 4b 61 65 6e 7d 20 32 30 30 30 30 30 7d 0a  n Kaen} 200000}.
5700: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
5710: 61 76 2e 31 30 2e 35 20 7b 0a 20 20 23 20 43 6c  av.10.5 {.  # Cl
5720: 6f 73 69 6e 67 20 64 62 32 20 73 68 6f 75 6c 64  osing db2 should
5730: 20 68 61 76 65 20 64 72 6f 70 70 65 64 20 74 68   have dropped th
5740: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 62  e shared-cache b
5750: 61 63 6b 20 74 6f 20 61 20 72 65 61 64 2d 6c 6f  ack to a read-lo
5760: 63 6b 2e 0a 20 20 23 20 53 6f 20 64 62 33 20 73  ck..  # So db3 s
5770: 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f  hould be able to
5780: 20 70 72 65 70 61 72 65 20 61 20 77 72 69 74 65   prepare a write
5790: 2e 2e 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  ....  catchsql {
57a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 20 56  INSERT INTO de V
57b0: 41 4c 55 45 53 28 27 50 61 74 61 79 61 27 2c 20  ALUES('Pataya', 
57c0: 33 30 30 30 30 29 3b 7d 20 64 62 33 0a 7d 20 7b  30000);} db3.} {
57d0: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  0 {}}.do_test sh
57e0: 61 72 65 64 2d 24 61 76 2e 31 30 2e 36 20 7b 0a  ared-$av.10.6 {.
57f0: 20 20 23 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20    # ... but not 
5800: 63 6f 6d 6d 69 74 20 69 74 2e 0a 20 20 63 61 74  commit it..  cat
5810: 63 68 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20 64  chsql {COMMIT} d
5820: 62 33 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b3.} {1 {databas
5830: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f  e is locked}}.do
5840: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
5850: 2e 31 30 2e 37 20 7b 0a 20 20 23 20 43 6f 6d 6d  .10.7 {.  # Comm
5860: 69 74 20 74 68 65 20 28 72 65 61 64 2d 6f 6e 6c  it the (read-onl
5870: 79 29 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f  y) db transactio
5880: 6e 2e 20 43 68 65 63 6b 20 76 69 61 20 64 62 33  n. Check via db3
5890: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
58a0: 65 20 0a 20 20 23 20 63 6f 6e 74 65 6e 74 73 20  e .  # contents 
58b0: 6f 66 20 74 61 62 6c 65 20 22 64 65 22 20 61 72  of table "de" ar
58c0: 65 20 73 74 69 6c 6c 20 61 73 20 74 68 65 79 20  e still as they 
58d0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 65 78 65  should be..  exe
58e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49  csql {.    COMMI
58f0: 54 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  T;.  }.  execsql
5900: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
5910: 46 52 4f 4d 20 64 65 3b 0a 20 20 7d 20 64 62 33  FROM de;.  } db3
5920: 0a 7d 20 7b 55 62 6f 6e 20 31 32 30 30 30 30 20  .} {Ubon 120000 
5930: 7b 4b 68 6f 6e 20 4b 61 65 6e 7d 20 32 30 30 30  {Khon Kaen} 2000
5940: 30 30 20 50 61 74 61 79 61 20 33 30 30 30 30 7d  00 Pataya 30000}
5950: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
5960: 24 61 76 2e 31 30 2e 39 20 7b 0a 20 20 23 20 43  $av.10.9 {.  # C
5970: 6f 6d 6d 69 74 20 74 68 65 20 65 78 74 65 72 6e  ommit the extern
5980: 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  al transaction..
5990: 20 20 63 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d    catchsql {COMM
59a0: 49 54 7d 20 64 62 33 0a 7d 20 7b 30 20 7b 7d 7d  IT} db3.} {0 {}}
59b0: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
59c0: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 30 2e 31   shared-$av.10.1
59d0: 30 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  0.do_test shared
59e0: 2d 24 61 76 2e 31 30 2e 31 31 20 7b 0a 20 20 64  -$av.10.11 {.  d
59f0: 62 20 63 6c 6f 73 65 0a 20 20 64 62 33 20 63 6c  b close.  db3 cl
5a00: 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  ose.} {}..do_tes
5a10: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e  t shared-$av.11.
5a20: 31 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  1 {.  file delet
5a30: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
5a40: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 20 74  .  sqlite3 db  t
5a50: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
5a60: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
5a70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
5a80: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c  ATE TABLE abc(a,
5a90: 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41   b, c);.    CREA
5aa0: 54 45 20 54 41 42 4c 45 20 61 62 63 32 28 61 2c  TE TABLE abc2(a,
5ab0: 20 62 2c 20 63 29 3b 0a 20 20 20 20 42 45 47 49   b, c);.    BEGI
5ac0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
5ad0: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 31 2c  TO abc VALUES(1,
5ae0: 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d   2, 3);.  }.} {}
5af0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
5b00: 24 61 76 2e 31 31 2e 32 20 7b 0a 20 20 63 61 74  $av.11.2 {.  cat
5b10: 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 7d 20 64  chsql {BEGIN;} d
5b20: 62 32 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53  b2.  catchsql {S
5b30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
5b40: 3b 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74  ;} db2.} {1 {dat
5b50: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
5b60: 6f 63 6b 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f  ocked: abc}}.do_
5b70: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
5b80: 31 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  11.3 {.  catchsq
5b90: 6c 20 7b 42 45 47 49 4e 7d 20 64 62 32 0a 7d 20  l {BEGIN} db2.} 
5ba0: 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72 74  {1 {cannot start
5bb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
5bc0: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
5bd0: 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  ion}}.do_test sh
5be0: 61 72 65 64 2d 24 61 76 2e 31 31 2e 34 20 7b 0a  ared-$av.11.4 {.
5bf0: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
5c00: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 32 3b 7d  CT * FROM abc2;}
5c10: 20 64 62 32 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f   db2.} {0 {}}.do
5c20: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
5c30: 2e 31 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  .11.5 {.  catchs
5c40: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
5c50: 61 62 63 32 20 56 41 4c 55 45 53 28 31 2c 20 32  abc2 VALUES(1, 2
5c60: 2c 20 33 29 3b 7d 20 64 62 32 0a 7d 20 7b 31 20  , 3);} db2.} {1 
5c70: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
5c80: 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  ked}}.do_test sh
5c90: 61 72 65 64 2d 24 61 76 2e 31 31 2e 36 20 7b 0a  ared-$av.11.6 {.
5ca0: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
5cb0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 32 7d 0a  CT * FROM abc2}.
5cc0: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
5cd0: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31 2e 36   shared-$av.11.6
5ce0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5cf0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
5d00: 20 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e 63   PRAGMA read_unc
5d10: 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20 20  ommitted = 1;.  
5d20: 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  } db2.} {}.do_te
5d30: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 31  st shared-$av.11
5d40: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
5d50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5d60: 20 61 62 63 32 20 56 41 4c 55 45 53 28 34 2c 20   abc2 VALUES(4, 
5d70: 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 6);.    INSER
5d80: 54 20 49 4e 54 4f 20 61 62 63 32 20 56 41 4c 55  T INTO abc2 VALU
5d90: 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 7d  ES(7, 8, 9);.  }
5da0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68  .} {}.do_test sh
5db0: 61 72 65 64 2d 24 61 76 2e 31 31 2e 38 20 7b 0a  ared-$av.11.8 {.
5dc0: 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d    set res [list]
5dd0: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20 20  .  db2 eval {.  
5de0: 20 20 53 45 4c 45 43 54 20 61 62 63 2e 61 20 61    SELECT abc.a a
5df0: 73 20 49 2c 20 61 62 63 32 2e 61 20 61 73 20 49  s I, abc2.a as I
5e00: 49 20 46 52 4f 4d 20 61 62 63 2c 20 61 62 63 32  I FROM abc, abc2
5e10: 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 65 78 65 63  ;.  } {.    exec
5e20: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45  sql {.      DELE
5e30: 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45 52  TE FROM abc WHER
5e40: 45 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  E 1;.    }.    l
5e50: 61 70 70 65 6e 64 20 72 65 73 20 24 49 20 24 49  append res $I $I
5e60: 49 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73 0a  I.  }.  set res.
5e70: 7d 20 7b 31 20 34 20 7b 7d 20 37 7d 0a 69 66 20  } {1 4 {} 7}.if 
5e80: 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
5e90: 63 6f 6d 6d 61 6e 64 20 73 71 6c 69 74 65 33 5f  command sqlite3_
5ea0: 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70  shared_cache_rep
5eb0: 6f 72 74 5d 5d 3d 3d 31 7d 20 7b 0a 20 20 64 6f  ort]]==1} {.  do
5ec0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76  _test shared-$av
5ed0: 2e 31 31 2e 39 20 7b 0a 20 20 20 20 73 74 72 69  .11.9 {.    stri
5ee0: 6e 67 20 74 6f 6c 6f 77 65 72 20 5b 73 71 6c 69  ng tolower [sqli
5ef0: 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
5f00: 5f 72 65 70 6f 72 74 5d 0a 20 20 7d 20 5b 73 74  _report].  } [st
5f10: 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 5b 6c 69  ring tolower [li
5f20: 73 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  st [file nativen
5f30: 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  ame [file normal
5f40: 69 7a 65 20 74 65 73 74 2e 64 62 5d 5d 20 32 5d  ize test.db]] 2]
5f50: 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61  ].}..do_test sha
5f60: 72 65 64 2d 24 61 76 2e 31 31 2e 31 31 20 7b 0a  red-$av.11.11 {.
5f70: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32    db close.  db2
5f80: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 20 54   close.} {}..# T
5f90: 68 69 73 20 74 65 73 74 73 20 74 68 61 74 20 69  his tests that i
5fa0: 66 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  f it is impossib
5fb0: 6c 65 20 74 6f 20 66 72 65 65 20 61 6e 79 20 70  le to free any p
5fc0: 61 67 65 73 2c 20 53 51 4c 69 74 65 20 77 69 6c  ages, SQLite wil
5fd0: 6c 0a 23 20 65 78 63 65 65 64 20 74 68 65 20 6c  l.# exceed the l
5fe0: 69 6d 69 74 20 73 65 74 20 62 79 20 50 52 41 47  imit set by PRAG
5ff0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 2e 0a 66  MA cache_size..f
6000: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
6010: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
6020: 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74 65  b-journal.sqlite
6030: 33 20 64 62 20 74 65 73 74 2e 64 62 20 0a 69 66  3 db test.db .if
6040: 63 61 70 61 62 6c 65 20 70 61 67 65 72 5f 70 72  capable pager_pr
6050: 61 67 6d 61 73 20 7b 0a 20 20 64 6f 5f 74 65 73  agmas {.  do_tes
6060: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 32 2e  t shared-$av.12.
6070: 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 {.    execsql 
6080: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  {.      PRAGMA c
6090: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
60a0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
60b0: 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  he_size;.    }. 
60c0: 20 7d 20 7b 31 30 7d 0a 7d 0a 64 6f 5f 74 65 73   } {10}.}.do_tes
60d0: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 32 2e  t shared-$av.12.
60e0: 32 20 7b 0a 20 20 73 65 74 20 3a 3a 64 62 5f 68  2 {.  set ::db_h
60f0: 61 6e 64 6c 65 73 20 5b 6c 69 73 74 5d 0a 20 20  andles [list].  
6100: 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24  for {set i 1} {$
6110: 69 20 3c 20 31 35 7d 20 7b 69 6e 63 72 20 69 7d  i < 15} {incr i}
6120: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
6130: 3a 64 62 5f 68 61 6e 64 6c 65 73 20 64 62 24 69  :db_handles db$i
6140: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 24  .    sqlite3 db$
6150: 69 20 74 65 73 74 2e 64 62 20 0a 20 20 20 20 65  i test.db .    e
6160: 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54  xecsql "CREATE T
6170: 41 42 4c 45 20 64 62 24 7b 69 7d 28 61 2c 20 62  ABLE db${i}(a, b
6180: 2c 20 63 29 22 20 64 62 24 69 20 0a 20 20 20 20  , c)" db$i .    
6190: 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20  execsql "INSERT 
61a0: 49 4e 54 4f 20 64 62 24 7b 69 7d 20 56 41 4c 55  INTO db${i} VALU
61b0: 45 53 28 31 2c 20 32 2c 20 33 29 22 0a 20 20 7d  ES(1, 2, 3)".  }
61c0: 0a 7d 20 7b 7d 0a 70 72 6f 63 20 6e 65 73 74 65  .} {}.proc neste
61d0: 64 5f 73 65 6c 65 63 74 20 7b 68 61 6e 64 6c 65  d_select {handle
61e0: 73 7d 20 7b 0a 20 20 5b 6c 69 6e 64 65 78 20 24  s} {.  [lindex $
61f0: 68 61 6e 64 6c 65 73 20 30 5d 20 65 76 61 6c 20  handles 0] eval 
6200: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5b  "SELECT * FROM [
6210: 6c 69 6e 64 65 78 20 24 68 61 6e 64 6c 65 73 20  lindex $handles 
6220: 30 5d 22 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  0]" {.    lappen
6230: 64 20 3a 3a 72 65 73 20 24 61 20 24 62 20 24 63  d ::res $a $b $c
6240: 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74  .    if {[llengt
6250: 68 20 24 68 61 6e 64 6c 65 73 5d 3e 31 7d 20 7b  h $handles]>1} {
6260: 0a 20 20 20 20 20 20 6e 65 73 74 65 64 5f 73 65  .      nested_se
6270: 6c 65 63 74 20 5b 6c 72 61 6e 67 65 20 24 68 61  lect [lrange $ha
6280: 6e 64 6c 65 73 20 31 20 65 6e 64 5d 0a 20 20 20  ndles 1 end].   
6290: 20 7d 0a 20 20 7d 0a 7d 0a 64 6f 5f 74 65 73 74   }.  }.}.do_test
62a0: 20 73 68 61 72 65 64 2d 24 61 76 2e 31 32 2e 33   shared-$av.12.3
62b0: 20 7b 0a 20 20 73 65 74 20 3a 3a 72 65 73 20 5b   {.  set ::res [
62c0: 6c 69 73 74 5d 0a 20 20 6e 65 73 74 65 64 5f 73  list].  nested_s
62d0: 65 6c 65 63 74 20 24 3a 3a 64 62 5f 68 61 6e 64  elect $::db_hand
62e0: 6c 65 73 0a 20 20 73 65 74 20 3a 3a 72 65 73 0a  les.  set ::res.
62f0: 7d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  } [string range 
6300: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22  [string repeat "
6310: 31 20 32 20 33 20 22 20 5b 6c 6c 65 6e 67 74 68  1 2 3 " [llength
6320: 20 24 3a 3a 64 62 5f 68 61 6e 64 6c 65 73 5d 5d   $::db_handles]]
6330: 20 30 20 65 6e 64 2d 31 5d 0a 0a 64 6f 5f 74 65   0 end-1]..do_te
6340: 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 32  st shared-$av.12
6350: 2e 58 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .X {.  db close.
6360: 20 20 66 6f 72 65 61 63 68 20 68 20 24 3a 3a 64    foreach h $::d
6370: 62 5f 68 61 6e 64 6c 65 73 20 7b 20 0a 20 20 20  b_handles { .   
6380: 20 24 68 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 20   $h close.  }.} 
6390: 7b 7d 0a 0a 23 20 49 6e 74 65 72 6e 61 6c 6c 79  {}..# Internally
63a0: 2c 20 6c 6f 63 6b 73 20 61 72 65 20 61 63 71 75  , locks are acqu
63b0: 69 72 65 64 20 6f 6e 20 73 68 61 72 65 64 20 42  ired on shared B
63c0: 2d 54 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -Tree structures
63d0: 20 69 6e 20 74 68 65 20 6f 72 64 65 72 0a 23 20   in the order.# 
63e0: 74 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  that the structu
63f0: 72 65 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  res appear in th
6400: 65 20 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79  e virtual memory
6410: 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
6420: 54 68 69 73 0a 23 20 74 65 73 74 20 63 61 73 65  This.# test case
6430: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 61 75   attempts to cau
6440: 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
6450: 74 68 65 20 73 74 72 75 63 74 75 72 65 73 20 69  the structures i
6460: 6e 20 6d 65 6d 6f 72 79 20 0a 23 20 74 6f 20 62  n memory .# to b
6470: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
6480: 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
6490: 69 63 68 20 74 68 65 79 20 61 72 65 20 61 74 74  ich they are att
64a0: 61 63 68 65 64 20 74 6f 20 61 20 67 69 76 65 6e  ached to a given
64b0: 0a 23 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  .# database hand
64c0: 6c 65 2e 20 54 68 69 73 20 63 6f 76 65 72 73 20  le. This covers 
64d0: 61 6e 20 65 78 74 72 61 20 6c 69 6e 65 20 6f 72  an extra line or
64e0: 20 74 77 6f 2e 0a 23 0a 64 6f 5f 74 65 73 74 20   two..#.do_test 
64f0: 73 68 61 72 65 64 2d 24 61 76 2e 31 33 2e 31 20  shared-$av.13.1 
6500: 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  {.  file delete 
6510: 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 20  -force test2.db 
6520: 74 65 73 74 33 2e 64 62 20 74 65 73 74 34 2e 64  test3.db test4.d
6530: 62 20 74 65 73 74 35 2e 64 62 0a 20 20 73 71 6c  b test5.db.  sql
6540: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a  ite3 db :memory:
6550: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6560: 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64   ATTACH 'test2.d
6570: 62 27 20 41 53 20 61 75 78 32 3b 0a 20 20 20 20  b' AS aux2;.    
6580: 41 54 54 41 43 48 20 27 74 65 73 74 33 2e 64 62  ATTACH 'test3.db
6590: 27 20 41 53 20 61 75 78 33 3b 0a 20 20 20 20 41  ' AS aux3;.    A
65a0: 54 54 41 43 48 20 27 74 65 73 74 34 2e 64 62 27  TTACH 'test4.db'
65b0: 20 41 53 20 61 75 78 34 3b 0a 20 20 20 20 41 54   AS aux4;.    AT
65c0: 54 41 43 48 20 27 74 65 73 74 35 2e 64 62 27 20  TACH 'test5.db' 
65d0: 41 53 20 61 75 78 35 3b 0a 20 20 20 20 44 45 54  AS aux5;.    DET
65e0: 41 43 48 20 61 75 78 32 3b 0a 20 20 20 20 44 45  ACH aux2;.    DE
65f0: 54 41 43 48 20 61 75 78 33 3b 0a 20 20 20 20 44  TACH aux3;.    D
6600: 45 54 41 43 48 20 61 75 78 34 3b 0a 20 20 20 20  ETACH aux4;.    
6610: 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62  ATTACH 'test2.db
6620: 27 20 41 53 20 61 75 78 32 3b 0a 20 20 20 20 41  ' AS aux2;.    A
6630: 54 54 41 43 48 20 27 74 65 73 74 33 2e 64 62 27  TTACH 'test3.db'
6640: 20 41 53 20 61 75 78 33 3b 0a 20 20 20 20 41 54   AS aux3;.    AT
6650: 54 41 43 48 20 27 74 65 73 74 34 2e 64 62 27 20  TACH 'test4.db' 
6660: 41 53 20 61 75 78 34 3b 0a 20 20 7d 0a 7d 20 7b  AS aux4;.  }.} {
6670: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
6680: 2d 24 61 76 2e 31 33 2e 32 20 7b 0a 20 20 65 78  -$av.13.2 {.  ex
6690: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
66a0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
66b0: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
66c0: 20 54 41 42 4c 45 20 61 75 78 32 2e 74 32 28 61   TABLE aux2.t2(a
66d0: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
66e0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 33 2e 74  ATE TABLE aux3.t
66f0: 33 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  3(a, b, c);.    
6700: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
6710: 34 2e 74 34 28 61 2c 20 62 2c 20 63 29 3b 0a 20  4.t4(a, b, c);. 
6720: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6730: 61 75 78 35 2e 74 35 28 61 2c 20 62 2c 20 63 29  aux5.t5(a, b, c)
6740: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
6750: 6e 74 28 2a 29 20 46 52 4f 4d 20 0a 20 20 20 20  nt(*) FROM .    
6760: 20 20 61 75 78 32 2e 73 71 6c 69 74 65 5f 6d 61    aux2.sqlite_ma
6770: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 61 75 78  ster, .      aux
6780: 33 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2c  3.sqlite_master,
6790: 20 0a 20 20 20 20 20 20 61 75 78 34 2e 73 71 6c   .      aux4.sql
67a0: 69 74 65 5f 6d 61 73 74 65 72 2c 20 0a 20 20 20  ite_master, .   
67b0: 20 20 20 61 75 78 35 2e 73 71 6c 69 74 65 5f 6d     aux5.sqlite_m
67c0: 61 73 74 65 72 0a 20 20 7d 0a 7d 20 7b 31 7d 0a  aster.  }.} {1}.
67d0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 24  do_test shared-$
67e0: 61 76 2e 31 33 2e 33 20 7b 0a 20 20 64 62 20 63  av.13.3 {.  db c
67f0: 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73  lose.} {}..# Tes
6800: 74 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 68  t that nothing h
6810: 6f 72 72 69 62 6c 65 20 68 61 70 70 65 6e 73 20  orrible happens 
6820: 69 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  if a connection 
6830: 74 6f 20 61 20 73 68 61 72 65 64 20 42 2d 54 72  to a shared B-Tr
6840: 65 65 20 0a 23 20 73 74 72 75 63 74 75 72 65 20  ee .# structure 
6850: 69 73 20 63 6c 6f 73 65 64 20 77 68 69 6c 65 20  is closed while 
6860: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
6870: 63 74 69 6f 6e 20 68 61 73 20 61 6e 20 6f 70 65  ction has an ope
6880: 6e 20 63 75 72 73 6f 72 2e 0a 23 0a 64 6f 5f 74  n cursor..#.do_t
6890: 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31  est shared-$av.1
68a0: 34 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  4.1 {.  sqlite3 
68b0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  db test.db.  sql
68c0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
68d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
68e0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
68f0: 69 74 65 5f 6d 61 73 74 65 72 7d 0a 7d 20 7b 64  ite_master}.} {d
6900: 62 31 20 64 62 32 20 64 62 33 20 64 62 34 20 64  b1 db2 db3 db4 d
6910: 62 35 20 64 62 36 20 64 62 37 20 64 62 38 20 64  b5 db6 db7 db8 d
6920: 62 39 20 64 62 31 30 20 64 62 31 31 20 64 62 31  b9 db10 db11 db1
6930: 32 20 64 62 31 33 20 64 62 31 34 7d 0a 64 6f 5f  2 db13 db14}.do_
6940: 74 65 73 74 20 73 68 61 72 65 64 2d 24 61 76 2e  test shared-$av.
6950: 31 34 2e 32 20 7b 0a 20 20 73 65 74 20 72 65 73  14.2 {.  set res
6960: 20 5b 6c 69 73 74 5d 0a 20 20 64 62 20 65 76 61   [list].  db eva
6970: 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  l {SELECT name F
6980: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
6990: 72 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6e 61  r} {.    if {$na
69a0: 6d 65 20 65 71 20 22 64 62 37 22 7d 20 7b 0a 20  me eq "db7"} {. 
69b0: 20 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20       db2 close. 
69c0: 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64     }.    lappend
69d0: 20 72 65 73 20 24 6e 61 6d 65 0a 20 20 7d 0a 20   res $name.  }. 
69e0: 20 73 65 74 20 72 65 73 0a 7d 20 7b 64 62 31 20   set res.} {db1 
69f0: 64 62 32 20 64 62 33 20 64 62 34 20 64 62 35 20  db2 db3 db4 db5 
6a00: 64 62 36 20 64 62 37 20 64 62 38 20 64 62 39 20  db6 db7 db8 db9 
6a10: 64 62 31 30 20 64 62 31 31 20 64 62 31 32 20 64  db10 db11 db12 d
6a20: 62 31 33 20 64 62 31 34 7d 0a 64 6f 5f 74 65 73  b13 db14}.do_tes
6a30: 74 20 73 68 61 72 65 64 2d 24 61 76 2e 31 34 2e  t shared-$av.14.
6a40: 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d  3 {.  db close.}
6a50: 20 7b 7d 0a 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f   {}..}..sqlite3_
6a60: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
6a70: 63 68 65 20 24 3a 3a 65 6e 61 62 6c 65 5f 73 68  che $::enable_sh
6a80: 61 72 65 64 5f 63 61 63 68 65 0a 66 69 6e 69 73  ared_cache.finis
6a90: 68 5f 74 65 73 74 0a                             h_test.