/ Hex Artifact Content
Login

Artifact 413289e177e73c844cfc9896b6d78e0f2e62d963:


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 38 20 32 30 30 36 2f 30 31 2f 30 39 20 31  1.8 2006/01/09 1
0190: 36 3a 31 32 3a 30 35 20 64 61 6e 69 65 6c 6b 31  6:12:05 danielk1
01a0: 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74 20 74  977 Exp $..set t
01b0: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
01c0: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
01d0: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01e0: 74 65 72 2e 74 63 6c 0a 64 62 20 63 6c 6f 73 65  ter.tcl.db close
01f0: 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 73 68 61  ..ifcapable !sha
0200: 72 65 64 5f 63 61 63 68 65 20 7b 0a 20 20 66 69  red_cache {.  fi
0210: 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75  nish_test.  retu
0220: 72 6e 0a 7d 0a 73 65 74 20 3a 3a 65 6e 61 62 6c  rn.}.set ::enabl
0230: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b  e_shared_cache [
0240: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0250: 68 61 72 65 64 5f 63 61 63 68 65 20 31 5d 0a 0a  hared_cache 1]..
0260: 23 20 54 65 73 74 20 6f 72 67 61 6e 69 7a 61 74  # Test organizat
0270: 69 6f 6e 3a 0a 23 0a 23 20 73 68 61 72 65 64 2d  ion:.#.# shared-
0280: 31 2e 2a 3a 20 53 69 6d 70 6c 65 20 74 65 73 74  1.*: Simple test
0290: 20 74 6f 20 76 65 72 69 66 79 20 62 61 73 69 63   to verify basic
02a0: 20 73 61 6e 69 74 79 20 6f 66 20 74 61 62 6c 65   sanity of table
02b0: 20 6c 65 76 65 6c 20 6c 6f 63 6b 69 6e 67 20 77   level locking w
02c0: 68 65 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20  hen.#           
02d0: 20 20 74 77 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e    two connection
02e0: 73 20 73 68 61 72 65 20 61 20 70 61 67 65 72 20  s share a pager 
02f0: 63 61 63 68 65 2e 0a 23 20 73 68 61 72 65 64 2d  cache..# shared-
0300: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  2.*: Test that a
0310: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
0320: 6e 20 63 61 6e 20 63 6f 2d 65 78 69 73 74 20 77  n can co-exist w
0330: 69 74 68 20 61 20 0a 23 20 20 20 20 20 20 20 20  ith a .#        
0340: 20 20 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73       write-trans
0350: 61 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e  action, includin
0360: 67 20 61 20 73 69 6d 70 6c 65 20 74 65 73 74 20  g a simple test 
0370: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 0a 23  to ensure the .#
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 74               ext
0390: 65 72 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 70 72  ernal locking pr
03a0: 6f 74 6f 63 6f 6c 20 69 73 20 73 74 69 6c 6c 20  otocol is still 
03b0: 77 6f 72 6b 69 6e 67 2e 0a 23 20 73 68 61 72 65  working..# share
03c0: 64 2d 33 2e 2a 3a 20 53 69 6d 70 6c 65 20 74 65  d-3.*: Simple te
03d0: 73 74 20 6f 66 20 72 65 61 64 2d 75 6e 63 6f 6d  st of read-uncom
03e0: 6d 69 74 74 65 64 20 6d 6f 64 65 2e 0a 23 20 73  mitted mode..# s
03f0: 68 61 72 65 64 2d 34 2e 2a 3a 20 43 68 65 63 6b  hared-4.*: Check
0400: 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61   that the schema
0410: 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20 75   is locked and u
0420: 6e 6c 6f 63 6b 65 64 20 63 6f 72 72 65 63 74 6c  nlocked correctl
0430: 79 2e 0a 23 20 73 68 61 72 65 64 2d 35 2e 2a 3a  y..# shared-5.*:
0440: 20 54 65 73 74 20 74 68 61 74 20 63 72 65 61 74   Test that creat
0450: 69 6e 67 2f 64 72 6f 70 70 69 6e 67 20 73 63 68  ing/dropping sch
0460: 65 6d 61 20 69 74 65 6d 73 20 77 6f 72 6b 73 20  ema items works 
0470: 77 68 65 6e 20 64 61 74 61 62 61 73 65 73 0a 23  when databases.#
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72 65               are
0490: 20 61 74 74 61 63 68 65 64 20 69 6e 20 64 69 66   attached in dif
04a0: 66 65 72 65 6e 74 20 6f 72 64 65 72 73 20 74 6f  ferent orders to
04b0: 20 64 69 66 66 65 72 65 6e 74 20 68 61 6e 64 6c   different handl
04c0: 65 73 2e 0a 23 20 73 68 61 72 65 64 2d 36 2e 2a  es..# shared-6.*
04d0: 3a 20 4c 6f 63 6b 69 6e 67 2c 20 55 4e 49 4f 4e  : Locking, UNION
04e0: 20 41 4c 4c 20 71 75 65 72 69 65 73 20 61 6e 64   ALL queries and
04f0: 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a 23 20   sub-queries..# 
0500: 73 68 61 72 65 64 2d 37 2e 2a 3a 20 41 75 74 6f  shared-7.*: Auto
0510: 76 61 63 75 75 6d 20 61 6e 64 20 73 68 61 72 65  vacuum and share
0520: 64 2d 63 61 63 68 65 2e 0a 23 0a 0a 64 6f 5f 74  d-cache..#..do_t
0530: 65 73 74 20 73 68 61 72 65 64 2d 31 2e 31 20 7b  est shared-1.1 {
0540: 0a 20 20 23 20 4f 70 65 6e 20 61 20 73 65 63 6f  .  # Open a seco
0550: 6e 64 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  nd database on t
0560: 68 65 20 66 69 6c 65 20 74 65 73 74 2e 64 62 2e  he file test.db.
0570: 20 49 74 20 73 68 6f 75 6c 64 20 75 73 65 20 74   It should use t
0580: 68 65 20 73 61 6d 65 20 70 61 67 65 72 0a 20 20  he same pager.  
0590: 23 20 63 61 63 68 65 20 61 6e 64 20 73 63 68 65  # cache and sche
05a0: 6d 61 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  ma as the origin
05b0: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 56  al connection. V
05c0: 65 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20  erify that only 
05d0: 31 20 66 69 6c 65 20 69 73 20 0a 20 20 23 20 6f  1 file is .  # o
05e0: 70 65 6e 65 64 2e 0a 20 20 73 71 6c 69 74 65 33  pened..  sqlite3
05f0: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 73   db2 test.db.  s
0600: 71 6c 69 74 65 33 20 64 62 20 20 74 65 73 74 2e  qlite3 db  test.
0610: 64 62 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  db.  set ::sqlit
0620: 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
0630: 74 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  t.} {1}.do_test 
0640: 73 68 61 72 65 64 2d 31 2e 32 20 7b 0a 20 20 23  shared-1.2 {.  #
0650: 20 41 64 64 20 61 20 74 61 62 6c 65 20 61 6e 64   Add a table and
0660: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
0670: 20 64 61 74 61 20 76 69 61 20 74 68 65 20 66 69   data via the fi
0680: 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  rst connection. 
0690: 0a 20 20 23 20 45 6e 73 75 72 65 20 74 68 61 74  .  # Ensure that
06a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e   the second conn
06b0: 65 63 74 69 6f 6e 20 63 61 6e 20 73 65 65 20 74  ection can see t
06c0: 68 65 6d 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b  hem..  execsql {
06d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
06e0: 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a  E abc(a, b, c);.
06f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0700: 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  abc VALUES(1, 2,
0710: 20 33 29 3b 0a 20 20 7d 20 64 62 0a 20 20 65 78   3);.  } db.  ex
0720: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0730: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
0740: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 7d   } db2.} {1 2 3}
0750: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
0760: 31 2e 33 20 7b 0a 20 20 23 20 48 61 76 65 20 74  1.3 {.  # Have t
0770: 68 65 20 66 69 72 73 74 20 63 6f 6e 6e 65 63 74  he first connect
0780: 69 6f 6e 20 62 65 67 69 6e 20 61 20 74 72 61 6e  ion begin a tran
0790: 73 61 63 74 69 6f 6e 20 61 6e 64 20 6f 62 74 61  saction and obta
07a0: 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 0a 20  in a read-lock. 
07b0: 20 23 20 6f 6e 20 74 61 62 6c 65 20 61 62 63 2e   # on table abc.
07c0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   This should not
07d0: 20 70 72 65 76 65 6e 74 20 74 68 65 20 73 65 63   prevent the sec
07e0: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ond connection f
07f0: 72 6f 6d 20 0a 20 20 23 20 71 75 65 72 79 69 6e  rom .  # queryin
0800: 67 20 61 62 63 2e 0a 20 20 65 78 65 63 73 71 6c  g abc..  execsql
0810: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
0820: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0830: 61 62 63 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  abc;.  }.  execs
0840: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0850: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 20  * FROM abc;.  } 
0860: 64 62 32 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f  db2.} {1 2 3}.do
0870: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 31 2e 34  _test shared-1.4
0880: 20 7b 0a 20 20 23 20 54 72 79 20 74 6f 20 69 6e   {.  # Try to in
0890: 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f 20  sert a row into 
08a0: 61 62 63 20 76 69 61 20 63 6f 6e 6e 65 63 74 69  abc via connecti
08b0: 6f 6e 20 32 2e 20 54 68 69 73 20 73 68 6f 75 6c  on 2. This shoul
08c0: 64 20 66 61 69 6c 20 62 65 63 61 75 73 65 0a 20  d fail because. 
08d0: 20 23 20 6f 66 20 74 68 65 20 72 65 61 64 2d 6c   # of the read-l
08e0: 6f 63 6b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31  ock connection 1
08f0: 20 69 73 20 68 6f 6c 64 69 6e 67 20 6f 6e 20 74   is holding on t
0900: 61 62 6c 65 20 61 62 63 20 28 6f 62 74 61 69 6e  able abc (obtain
0910: 65 64 20 69 6e 20 74 68 65 0a 20 20 23 20 70 72  ed in the.  # pr
0920: 65 76 69 6f 75 73 20 74 65 73 74 20 63 61 73 65  evious test case
0930: 29 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  )..  catchsql {.
0940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0950: 61 62 63 20 56 41 4c 55 45 53 28 34 2c 20 35 2c  abc VALUES(4, 5,
0960: 20 36 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b   6);.  } db2.} {
0970: 31 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c  1 {database tabl
0980: 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 61 62 63  e is locked: abc
0990: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }}.do_test share
09a0: 64 2d 31 2e 35 20 7b 0a 20 20 23 20 55 73 69 6e  d-1.5 {.  # Usin
09b0: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28  g connection 2 (
09c0: 74 68 65 20 6f 6e 65 20 77 69 74 68 6f 75 74 20  the one without 
09d0: 74 68 65 20 6f 70 65 6e 20 74 72 61 6e 73 61 63  the open transac
09e0: 74 69 6f 6e 29 2c 20 74 72 79 20 74 6f 20 63 72  tion), try to cr
09f0: 65 61 74 65 0a 20 20 23 20 61 20 6e 65 77 20 74  eate.  # a new t
0a00: 61 62 6c 65 2e 20 54 68 69 73 20 73 68 6f 75 6c  able. This shoul
0a10: 64 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 6f  d fail because o
0a20: 66 20 74 68 65 20 6f 70 65 6e 20 72 65 61 64 20  f the open read 
0a30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 23  transaction .  #
0a40: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
0a50: 69 6f 6e 20 31 2e 0a 20 20 63 61 74 63 68 73 71  ion 1..  catchsq
0a60: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0a70: 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66  ABLE def(d, e, f
0a80: 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  );.  } db2.} {1 
0a90: 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  {database table 
0aa0: 69 73 20 6c 6f 63 6b 65 64 3a 20 73 71 6c 69 74  is locked: sqlit
0ab0: 65 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65  e_master}}.do_te
0ac0: 73 74 20 73 68 61 72 65 64 2d 31 2e 36 20 7b 0a  st shared-1.6 {.
0ad0: 20 20 23 20 55 70 67 72 61 64 65 20 63 6f 6e 6e    # Upgrade conn
0ae0: 65 63 74 69 6f 6e 20 31 27 73 20 74 72 61 6e 73  ection 1's trans
0af0: 61 63 74 69 6f 6e 20 74 6f 20 61 20 77 72 69 74  action to a writ
0b00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 43  e transaction. C
0b10: 72 65 61 74 65 0a 20 20 23 20 61 20 6e 65 77 20  reate.  # a new 
0b20: 74 61 62 6c 65 20 2d 20 64 65 66 20 2d 20 61 6e  table - def - an
0b30: 64 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20 69  d insert a row i
0b40: 6e 74 6f 20 69 74 2e 20 42 65 63 61 75 73 65 20  nto it. Because 
0b50: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31  the connection 1
0b60: 0a 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  # transaction
0b70: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 63   modifies the sc
0b80: 68 65 6d 61 2c 20 69 74 20 73 68 6f 75 6c 64 20  hema, it should 
0b90: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
0ba0: 66 6f 72 20 0a 20 20 23 20 63 6f 6e 6e 65 63 74  for .  # connect
0bb0: 69 6f 6e 20 32 20 74 6f 20 61 63 63 65 73 73 20  ion 2 to access 
0bc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
0bd0: 61 6c 6c 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  all until the co
0be0: 6e 6e 65 63 74 69 6f 6e 20 31 20 0a 20 20 23 20  nnection 1 .  # 
0bf0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 74 68 65  has finished the
0c00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
0c10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
0c20: 45 41 54 45 20 54 41 42 4c 45 20 64 65 66 28 64  EATE TABLE def(d
0c30: 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 49 4e 53  , e, f);.    INS
0c40: 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c  ERT INTO def VAL
0c50: 55 45 53 28 27 49 56 27 2c 20 27 56 27 2c 20 27  UES('IV', 'V', '
0c60: 56 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  VI');.  }.} {}.d
0c70: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 31 2e  o_test shared-1.
0c80: 37 20 7b 0a 20 20 23 20 52 65 61 64 20 66 72 6f  7 {.  # Read fro
0c90: 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  m the sqlite_mas
0ca0: 74 65 72 20 74 61 62 6c 65 20 77 69 74 68 20 63  ter table with c
0cb0: 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 28 69 6e 73  onnection 1 (ins
0cc0: 69 64 65 20 74 68 65 20 0a 20 20 23 20 74 72 61  ide the .  # tra
0cd0: 6e 73 61 63 74 69 6f 6e 29 2e 20 54 68 65 6e 20  nsaction). Then 
0ce0: 74 65 73 74 20 74 68 61 74 20 77 65 20 63 61 6e  test that we can
0cf0: 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 77 69 74   not do this wit
0d00: 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 2e 20  h connection 2. 
0d10: 54 68 69 73 0a 20 20 23 20 69 73 20 62 65 63 61  This.  # is beca
0d20: 75 73 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d  use of the schem
0d30: 61 2d 6d 6f 64 69 66 69 65 64 20 6c 6f 63 6b 20  a-modified lock 
0d40: 65 73 74 61 62 6c 69 73 68 65 64 20 62 79 20 63  established by c
0d50: 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 0a 20 20 23  onnection 1 .  #
0d60: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
0d70: 20 74 65 73 74 20 63 61 73 65 2e 0a 20 20 65 78   test case..  ex
0d80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0d90: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
0da0: 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 20 20 63  _master;.  }.  c
0db0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
0dc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
0dd0: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 20 64  te_master;.  } d
0de0: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
0df0: 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b  e schema is lock
0e00: 65 64 3a 20 6d 61 69 6e 7d 7d 0a 64 6f 5f 74 65  ed: main}}.do_te
0e10: 73 74 20 73 68 61 72 65 64 2d 31 2e 38 20 7b 0a  st shared-1.8 {.
0e20: 20 20 23 20 43 6f 6d 6d 69 74 20 74 68 65 20 63    # Commit the c
0e30: 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 74 72 61 6e  onnection 1 tran
0e40: 73 61 63 74 69 6f 6e 2e 0a 20 20 65 78 65 63 73  saction..  execs
0e50: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
0e60: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  .  }.} {}..do_te
0e70: 73 74 20 73 68 61 72 65 64 2d 32 2e 31 20 7b 0a  st shared-2.1 {.
0e80: 20 20 23 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74    # Open connect
0e90: 69 6f 6e 20 64 62 33 20 74 6f 20 74 68 65 20 64  ion db3 to the d
0ea0: 61 74 61 62 61 73 65 2e 20 55 73 65 20 61 20 64  atabase. Use a d
0eb0: 69 66 66 65 72 65 6e 74 20 70 61 74 68 20 74 6f  ifferent path to
0ec0: 20 74 68 65 20 73 61 6d 65 0a 20 20 23 20 66 69   the same.  # fi
0ed0: 6c 65 20 73 6f 20 74 68 61 74 20 64 62 33 20 64  le so that db3 d
0ee0: 6f 65 73 20 2a 6e 6f 74 2a 20 73 68 61 72 65 20  oes *not* share 
0ef0: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
0f00: 61 63 68 65 20 61 73 20 64 62 20 61 6e 64 20 64  ache as db and d
0f10: 62 32 0a 20 20 23 20 28 74 68 65 72 65 20 73 68  b2.  # (there sh
0f20: 6f 75 6c 64 20 62 65 20 74 77 6f 20 6f 70 65 6e  ould be two open
0f30: 20 66 69 6c 65 20 68 61 6e 64 6c 65 73 29 2e 0a   file handles)..
0f40: 20 20 73 71 6c 69 74 65 33 20 64 62 33 20 2e 2f    sqlite3 db3 ./
0f50: 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20 3a 3a  test.db.  set ::
0f60: 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
0f70: 5f 63 6f 75 6e 74 0a 7d 20 7b 32 7d 0a 64 6f 5f  _count.} {2}.do_
0f80: 74 65 73 74 20 73 68 61 72 65 64 2d 32 2e 32 20  test shared-2.2 
0f90: 7b 0a 20 20 23 20 53 74 61 72 74 20 72 65 61 64  {.  # Start read
0fa0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 6e   transactions on
0fb0: 20 64 62 20 61 6e 64 20 64 62 32 20 28 74 68 65   db and db2 (the
0fc0: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
0fd0: 63 68 65 29 2e 20 45 6e 73 75 72 65 0a 20 20 23  che). Ensure.  #
0fe0: 20 64 62 33 20 63 61 6e 6e 6f 74 20 77 72 69 74   db3 cannot writ
0ff0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1000: 65 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  e..  execsql {. 
1010: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45     BEGIN;.    SE
1020: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
1030: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
1040: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
1050: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
1060: 63 3b 0a 20 20 7d 20 64 62 32 0a 20 20 63 61 74  c;.  } db2.  cat
1070: 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  chsql {.    INSE
1080: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
1090: 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d  ES(1, 2, 3);.  }
10a0: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
10b0: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
10c0: 6b 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65  ked: abc}}.do_te
10d0: 73 74 20 73 68 61 72 65 64 2d 32 2e 33 20 7b 0a  st shared-2.3 {.
10e0: 20 20 23 20 54 75 72 6e 20 64 62 27 73 20 74 72    # Turn db's tr
10f0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 61  ansaction into a
1100: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1110: 6f 6e 2e 20 64 62 33 20 73 68 6f 75 6c 64 20 73  on. db3 should s
1120: 74 69 6c 6c 20 62 65 0a 20 20 23 20 61 62 6c 65  till be.  # able
1130: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 61   to read from ta
1140: 62 6c 65 20 64 65 66 20 28 62 75 74 20 77 69 6c  ble def (but wil
1150: 6c 20 6e 6f 74 20 73 65 65 20 74 68 65 20 6e 65  l not see the ne
1160: 77 20 72 6f 77 29 2e 20 43 6f 6e 6e 65 63 74 69  w row). Connecti
1170: 6f 6e 0a 20 20 23 20 64 62 32 20 73 68 6f 75 6c  on.  # db2 shoul
1180: 64 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  d not be able to
1190: 20 72 65 61 64 20 64 65 66 20 28 62 65 63 61 75   read def (becau
11a0: 73 65 20 6f 66 20 74 68 65 20 77 72 69 74 65 2d  se of the write-
11b0: 6c 6f 63 6b 29 2e 0a 0a 23 20 54 6f 64 6f 3a 20  lock)...# Todo: 
11c0: 54 68 65 20 66 61 69 6c 65 64 20 22 49 4e 53 45  The failed "INSE
11d0: 52 54 20 49 4e 54 4f 20 61 62 63 20 2e 2e 2e 22  RT INTO abc ..."
11e0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
11f0: 65 20 61 62 6f 76 65 20 74 65 73 74 0a 23 20 68  e above test.# h
1200: 61 73 20 73 74 61 72 74 65 64 20 61 20 77 72 69  as started a wri
1210: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1220: 6e 20 64 62 32 20 28 73 68 6f 75 6c 64 20 74 68  n db2 (should th
1230: 69 73 20 62 65 20 73 6f 3f 29 2e 20 54 68 69 73  is be so?). This
1240: 20 0a 23 20 77 6f 75 6c 64 20 70 72 65 76 65 6e   .# would preven
1250: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  t connection db 
1260: 66 72 6f 6d 20 73 74 61 72 74 69 6e 67 20 61 20  from starting a 
1270: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1280: 6e 2e 20 53 6f 20 72 6f 6c 6c 20 74 68 65 0a 23  n. So roll the.#
1290: 20 64 62 32 20 74 72 61 6e 73 61 63 74 69 6f 6e   db2 transaction
12a0: 20 62 61 63 6b 20 61 6e 64 20 72 65 70 6c 61 63   back and replac
12b0: 65 20 69 74 20 77 69 74 68 20 61 20 6e 65 77 20  e it with a new 
12c0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
12d0: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
12e0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
12f0: 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43  BEGIN;.    SELEC
1300: 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20  T * FROM abc;.  
1310: 7d 20 64 62 32 0a 0a 20 20 65 78 65 63 73 71 6c  } db2..  execsql
1320: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
1330: 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27 56  TO def VALUES('V
1340: 49 49 27 2c 20 27 56 49 49 49 27 2c 20 27 49 58  II', 'VIII', 'IX
1350: 27 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74  ');.  }.  concat
1360: 20 5b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   [.    catchsql 
1370: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1380: 64 65 66 3b 20 7d 20 64 62 33 0a 20 20 5d 20 5b  def; } db3.  ] [
1390: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
13a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65  SELECT * FROM de
13b0: 66 3b 20 7d 20 64 62 32 0a 20 20 5d 0a 7d 20 7b  f; } db2.  ].} {
13c0: 30 20 7b 49 56 20 56 20 56 49 7d 20 31 20 7b 64  0 {IV V VI} 1 {d
13d0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
13e0: 20 6c 6f 63 6b 65 64 3a 20 64 65 66 7d 7d 0a 64   locked: def}}.d
13f0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 32 2e  o_test shared-2.
1400: 34 20 7b 0a 20 20 23 20 43 6f 6d 6d 69 74 20 74  4 {.  # Commit t
1410: 68 65 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  he open transact
1420: 69 6f 6e 20 6f 6e 20 64 62 2e 20 64 62 32 20 73  ion on db. db2 s
1430: 74 69 6c 6c 20 68 6f 6c 64 73 20 61 20 72 65 61  till holds a rea
1440: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  d-transaction.. 
1450: 20 23 20 54 68 69 73 20 73 68 6f 75 6c 64 20 70   # This should p
1460: 72 65 76 65 6e 74 20 64 62 33 20 66 72 6f 6d 20  revent db3 from 
1470: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
1480: 61 74 61 62 61 73 65 2c 20 62 75 74 20 6e 6f 74  atabase, but not
1490: 20 66 72 6f 6d 20 0a 20 20 23 20 72 65 61 64 69   from .  # readi
14a0: 6e 67 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ng..  execsql {.
14b0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
14c0: 20 20 63 6f 6e 63 61 74 20 5b 0a 20 20 20 20 63    concat [.    c
14d0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
14e0: 20 2a 20 46 52 4f 4d 20 64 65 66 3b 20 7d 20 64   * FROM def; } d
14f0: 62 33 0a 20 20 5d 20 5b 0a 20 20 20 20 63 61 74  b3.  ] [.    cat
1500: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
1510: 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27  NTO def VALUES('
1520: 58 27 2c 20 27 58 49 27 2c 20 27 58 49 49 27 29  X', 'XI', 'XII')
1530: 3b 20 7d 20 64 62 33 0a 20 20 5d 0a 7d 20 7b 30  ; } db3.  ].} {0
1540: 20 7b 49 56 20 56 20 56 49 20 56 49 49 20 56 49   {IV V VI VII VI
1550: 49 49 20 49 58 7d 20 31 20 7b 64 61 74 61 62 61  II IX} 1 {databa
1560: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1570: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 20  catchsql COMMIT 
1580: 64 62 32 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61  db2..do_test sha
1590: 72 65 64 2d 33 2e 31 2e 31 20 7b 0a 20 20 23 20  red-3.1.1 {.  # 
15a0: 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20 73  This test case s
15b0: 74 61 72 74 73 20 61 20 6c 69 6e 65 61 72 20 73  tarts a linear s
15c0: 63 61 6e 20 6f 66 20 74 61 62 6c 65 20 27 73 65  can of table 'se
15d0: 71 27 20 75 73 69 6e 67 20 61 20 0a 20 20 23 20  q' using a .  # 
15e0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
15f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 20   connection. In 
1600: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
1610: 65 20 73 63 61 6e 2c 20 72 6f 77 73 20 61 72 65  e scan, rows are
1620: 20 61 64 64 65 64 0a 20 20 23 20 74 6f 20 74 68   added.  # to th
1630: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 71  e end of the seq
1640: 20 74 61 62 6c 65 20 28 61 68 65 61 64 20 6f 66   table (ahead of
1650: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
1660: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 29 2e 0a 20  sor position).. 
1670: 20 23 20 54 68 65 20 75 6e 63 6f 6d 6d 69 74 74   # The uncommitt
1680: 65 64 20 72 6f 77 73 20 73 68 6f 75 6c 64 20 62  ed rows should b
1690: 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  e included in th
16a0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
16b0: 20 73 63 61 6e 2e 0a 20 20 65 78 65 63 73 71 6c   scan..  execsql
16c0: 20 22 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   ".    CREATE TA
16d0: 42 4c 45 20 73 65 71 28 69 2c 20 78 29 3b 0a 20  BLE seq(i, x);. 
16e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73     INSERT INTO s
16f0: 65 71 20 56 41 4c 55 45 53 28 31 2c 20 27 5b 73  eq VALUES(1, '[s
1700: 74 72 69 6e 67 20 72 65 70 65 61 74 20 58 20 35  tring repeat X 5
1710: 30 30 5d 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  00]');.    INSER
1720: 54 20 49 4e 54 4f 20 73 65 71 20 56 41 4c 55 45  T INTO seq VALUE
1730: 53 28 32 2c 20 27 5b 73 74 72 69 6e 67 20 72 65  S(2, '[string re
1740: 70 65 61 74 20 58 20 35 30 30 5d 27 29 3b 0a 20  peat X 500]');. 
1750: 20 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   ".  execsql {SE
1760: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
1770: 74 65 5f 6d 61 73 74 65 72 7d 20 64 62 32 0a 20  te_master} db2. 
1780: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
1790: 20 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65   read_uncommitte
17a0: 64 20 3d 20 31 7d 20 64 62 32 0a 0a 20 20 73 65  d = 1} db2..  se
17b0: 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 64  t ret [list].  d
17c0: 62 32 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  b2 eval {SELECT 
17d0: 69 20 46 52 4f 4d 20 73 65 71 7d 20 7b 0a 20 20  i FROM seq} {.  
17e0: 20 20 69 66 20 7b 24 69 20 3c 20 34 7d 20 7b 0a    if {$i < 4} {.
17f0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a        execsql {.
1800: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
1810: 4e 54 4f 20 73 65 71 20 53 45 4c 45 43 54 20 69  NTO seq SELECT i
1820: 20 2b 20 28 53 45 4c 45 43 54 20 6d 61 78 28 69   + (SELECT max(i
1830: 29 20 46 52 4f 4d 20 73 65 71 29 2c 20 78 20 46  ) FROM seq), x F
1840: 52 4f 4d 20 73 65 71 3b 0a 20 20 20 20 20 20 7d  ROM seq;.      }
1850: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65  .    }.    lappe
1860: 6e 64 20 72 65 74 20 24 69 0a 20 20 7d 0a 20 20  nd ret $i.  }.  
1870: 73 65 74 20 72 65 74 0a 7d 20 7b 31 20 32 20 33  set ret.} {1 2 3
1880: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
1890: 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31  11 12 13 14 15 1
18a0: 36 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  6}.do_test share
18b0: 64 2d 33 2e 31 2e 32 20 7b 0a 20 20 23 20 41 6e  d-3.1.2 {.  # An
18c0: 6f 74 68 65 72 20 6c 69 6e 65 61 72 20 73 63 61  other linear sca
18d0: 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  n through table 
18e0: 73 65 71 20 75 73 69 6e 67 20 61 20 72 65 61 64  seq using a read
18f0: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 6f 6e  -uncommitted con
1900: 6e 65 63 74 69 6f 6e 2e 0a 20 20 23 20 54 68 69  nection..  # Thi
1910: 73 20 74 69 6d 65 2c 20 64 65 6c 65 74 65 20 65  s time, delete e
1920: 61 63 68 20 72 6f 77 20 61 73 20 69 74 20 69 73  ach row as it is
1930: 20 72 65 61 64 2e 20 53 68 6f 75 6c 64 20 6e 6f   read. Should no
1940: 74 20 61 66 66 65 63 74 20 74 68 65 20 72 65 73  t affect the res
1950: 75 6c 74 73 20 6f 66 0a 20 20 23 20 74 68 65 20  ults of.  # the 
1960: 73 63 61 6e 2c 20 62 75 74 20 74 68 65 20 74 61  scan, but the ta
1970: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 65 6d  ble should be em
1980: 70 74 79 20 61 66 74 65 72 20 74 68 65 20 73 63  pty after the sc
1990: 61 6e 20 69 73 20 63 6f 6e 63 6c 75 64 65 64 20  an is concluded 
19a0: 0a 20 20 23 20 28 74 65 73 74 20 33 2e 31 2e 33  .  # (test 3.1.3
19b0: 20 76 65 72 69 66 69 65 73 20 74 68 69 73 29 2e   verifies this).
19c0: 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73 74  .  set ret [list
19d0: 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45  ].  db2 eval {SE
19e0: 4c 45 43 54 20 69 20 46 52 4f 4d 20 73 65 71 7d  LECT i FROM seq}
19f0: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
1a00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 65 71 20  DELETE FROM seq 
1a10: 57 48 45 52 45 20 69 20 3d 20 24 69 7d 0a 20 20  WHERE i = $i}.  
1a20: 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 24 69    lappend ret $i
1a30: 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d  .  }.  set ret.}
1a40: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
1a50: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
1a60: 31 34 20 31 35 20 31 36 7d 0a 64 6f 5f 74 65 73  14 15 16}.do_tes
1a70: 74 20 73 68 61 72 65 64 2d 33 2e 31 2e 33 20 7b  t shared-3.1.3 {
1a80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1a90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
1aa0: 65 71 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 63 61  eq;.  }.} {}..ca
1ab0: 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 63  tch {db close}.c
1ac0: 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d  atch {db2 close}
1ad0: 0a 63 61 74 63 68 20 7b 64 62 33 20 63 6c 6f 73  .catch {db3 clos
1ae0: 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e}..#-----------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1b30: 23 20 54 65 73 74 73 20 73 68 61 72 65 64 2d 34  # Tests shared-4
1b40: 2e 2a 20 74 65 73 74 20 74 68 61 74 20 74 68 65  .* test that the
1b50: 20 73 63 68 65 6d 61 20 6c 6f 63 6b 69 6e 67 20   schema locking 
1b60: 72 75 6c 65 73 20 61 72 65 20 61 70 70 6c 69 65  rules are applie
1b70: 64 20 0a 23 20 63 6f 72 72 65 63 74 6c 79 2e 20  d .# correctly. 
1b80: 69 2e 65 2e 3a 0a 23 0a 23 20 31 2e 20 41 6c 6c  i.e.:.#.# 1. All
1b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 72 65   transactions re
1ba0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
1bb0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 73  k on the schemas
1bc0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
1bd0: 65 79 0a 23 20 20 20 20 61 63 63 65 73 73 2e 0a  ey.#    access..
1be0: 23 20 32 2e 20 54 72 61 6e 73 61 63 74 69 6f 6e  # 2. Transaction
1bf0: 73 20 74 68 61 74 20 6d 6f 64 69 66 79 20 61 20  s that modify a 
1c00: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
1c10: 72 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  require a write-
1c20: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 0a 23 20 20  lock on that.#  
1c30: 20 20 73 63 68 65 6d 61 2e 0a 23 20 33 2e 20 49    schema..# 3. I
1c40: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1c50: 65 20 74 6f 20 63 6f 6d 70 69 6c 65 20 61 20 73  e to compile a s
1c60: 74 61 74 65 6d 65 6e 74 20 77 68 69 6c 65 20 61  tatement while a
1c70: 6e 6f 74 68 65 72 20 68 61 6e 64 6c 65 20 68 61  nother handle ha
1c80: 73 20 61 20 0a 23 20 20 20 20 77 72 69 74 65 2d  s a .#    write-
1c90: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65  lock on the sche
1ca0: 6d 61 2e 0a 23 0a 0a 23 20 4f 70 65 6e 20 74 77  ma..#..# Open tw
1cb0: 6f 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  o database handl
1cc0: 65 73 20 64 62 20 61 6e 64 20 64 62 32 2e 20 45  es db and db2. E
1cd0: 61 63 68 20 68 61 73 20 61 20 73 69 6e 67 6c 65  ach has a single
1ce0: 20 61 74 74 61 63 68 20 64 61 74 61 62 61 73 65   attach database
1cf0: 0a 23 20 28 61 73 20 77 65 6c 6c 20 61 73 20 6d  .# (as well as m
1d00: 61 69 6e 29 3a 0a 23 0a 23 20 20 20 20 20 64 62  ain):.#.#     db
1d10: 2e 6d 61 69 6e 20 20 20 2d 3e 20 20 20 2e 2f 74  .main   ->   ./t
1d20: 65 73 74 2e 64 62 0a 23 20 20 20 20 20 64 62 2e  est.db.#     db.
1d30: 74 65 73 74 32 20 20 2d 3e 20 20 20 2e 2f 74 65  test2  ->   ./te
1d40: 73 74 32 2e 64 62 0a 23 20 20 20 20 20 64 62 32  st2.db.#     db2
1d50: 2e 6d 61 69 6e 20 20 2d 3e 20 20 20 2e 2f 74 65  .main  ->   ./te
1d60: 73 74 32 2e 64 62 0a 23 20 20 20 20 20 64 62 32  st2.db.#     db2
1d70: 2e 74 65 73 74 20 20 2d 3e 20 20 20 2e 2f 74 65  .test  ->   ./te
1d80: 73 74 2e 64 62 0a 23 0a 66 69 6c 65 20 64 65 6c  st.db.#.file del
1d90: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
1da0: 64 62 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  db.file delete -
1db0: 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 0a 66  force test2.db.f
1dc0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
1dd0: 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  e test2.db-journ
1de0: 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20 20 74  al.sqlite3 db  t
1df0: 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33 20 64  est.db.sqlite3 d
1e00: 62 32 20 74 65 73 74 32 2e 64 62 0a 64 6f 5f 74  b2 test2.db.do_t
1e10: 65 73 74 20 73 68 61 72 65 64 2d 34 2e 31 2e 31  est shared-4.1.1
1e20: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1e30: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a  open_file_count.
1e40: 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73 68  } {2}.do_test sh
1e50: 61 72 65 64 2d 34 2e 31 2e 32 20 7b 0a 20 20 65  ared-4.1.2 {.  e
1e60: 78 65 63 73 71 6c 20 7b 41 54 54 41 43 48 20 27  xecsql {ATTACH '
1e70: 74 65 73 74 32 2e 64 62 27 20 41 53 20 74 65 73  test2.db' AS tes
1e80: 74 32 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65  t2}.  set sqlite
1e90: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
1ea0: 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 73  .} {2}.do_test s
1eb0: 68 61 72 65 64 2d 34 2e 31 2e 33 20 7b 0a 20 20  hared-4.1.3 {.  
1ec0: 65 78 65 63 73 71 6c 20 7b 41 54 54 41 43 48 20  execsql {ATTACH 
1ed0: 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 65 73  'test.db' AS tes
1ee0: 74 7d 20 64 62 32 0a 20 20 73 65 74 20 73 71 6c  t} db2.  set sql
1ef0: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
1f00: 75 6e 74 0a 7d 20 7b 32 7d 0a 0a 23 20 53 61 6e  unt.} {2}..# San
1f10: 69 74 79 20 63 68 65 63 6b 3a 20 43 72 65 61 74  ity check: Creat
1f20: 65 20 61 20 74 61 62 6c 65 20 69 6e 20 2e 2f 74  e a table in ./t
1f30: 65 73 74 2e 64 62 20 76 69 61 20 68 61 6e 64 6c  est.db via handl
1f40: 65 20 64 62 2c 20 61 6e 64 20 74 65 73 74 20 74  e db, and test t
1f50: 68 61 74 20 68 61 6e 64 6c 65 0a 23 20 64 62 32  hat handle.# db2
1f60: 20 63 61 6e 20 22 73 65 65 22 20 74 68 65 20 6e   can "see" the n
1f70: 65 77 20 74 61 62 6c 65 20 69 6d 6d 65 64 69 61  ew table immedia
1f80: 74 65 6c 79 2e 20 41 20 68 61 6e 64 6c 65 20 75  tely. A handle u
1f90: 73 69 6e 67 20 61 20 73 65 70 65 72 61 74 65 20  sing a seperate 
1fa0: 70 61 67 65 72 0a 23 20 63 61 63 68 65 20 77 6f  pager.# cache wo
1fb0: 75 6c 64 20 68 61 76 65 20 74 6f 20 72 65 6c 6f  uld have to relo
1fc0: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1fd0: 73 63 68 65 6d 61 20 62 65 66 6f 72 65 20 74 68  schema before th
1fe0: 69 73 20 77 65 72 65 20 70 6f 73 73 69 62 6c 65  is were possible
1ff0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 68 61 72  ..#.do_test shar
2000: 65 64 2d 34 2e 32 2e 31 20 7b 0a 20 20 65 78 65  ed-4.2.1 {.  exe
2010: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
2020: 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62  E TABLE abc(a, b
2030: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
2040: 20 54 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c   TABLE def(d, e,
2050: 20 66 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   f);.    INSERT 
2060: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
2070: 27 69 27 2c 20 27 69 69 27 2c 20 27 69 69 69 27  'i', 'ii', 'iii'
2080: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2090: 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 27 49  TO def VALUES('I
20a0: 27 2c 20 27 49 49 27 2c 20 27 49 49 49 27 29 3b  ', 'II', 'III');
20b0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
20c0: 74 20 73 68 61 72 65 64 2d 34 2e 32 2e 32 20 7b  t shared-4.2.2 {
20d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
20e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
20f0: 65 73 74 2e 61 62 63 3b 0a 20 20 7d 20 64 62 32  est.abc;.  } db2
2100: 0a 7d 20 7b 69 20 69 69 20 69 69 69 7d 0a 0a 23  .} {i ii iii}..#
2110: 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61   Open a read-tra
2120: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 61  nsaction and rea
2130: 64 20 66 72 6f 6d 20 74 61 62 6c 65 20 61 62 63  d from table abc
2140: 20 76 69 61 20 68 61 6e 64 6c 65 20 32 2e 20 43   via handle 2. C
2150: 68 65 63 6b 20 74 68 61 74 0a 23 20 68 61 6e 64  heck that.# hand
2160: 6c 65 20 31 20 63 61 6e 20 72 65 61 64 20 74 61  le 1 can read ta
2170: 62 6c 65 20 61 62 63 2e 20 43 68 65 63 6b 20 74  ble abc. Check t
2180: 68 61 74 20 68 61 6e 64 6c 65 20 31 20 63 61 6e  hat handle 1 can
2190: 6e 6f 74 20 6d 6f 64 69 66 79 20 74 61 62 6c 65  not modify table
21a0: 20 61 62 63 0a 23 20 6f 72 20 74 68 65 20 64 61   abc.# or the da
21b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 54  tabase schema. T
21c0: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 68  hen check that h
21d0: 61 6e 64 6c 65 20 31 20 63 61 6e 20 6d 6f 64 69  andle 1 can modi
21e0: 66 79 20 74 61 62 6c 65 20 64 65 66 2e 0a 23 0a  fy table def..#.
21f0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 34  do_test shared-4
2200: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
2210: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
2220: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2230: 74 65 73 74 2e 61 62 63 3b 0a 20 20 7d 20 64 62  test.abc;.  } db
2240: 32 0a 7d 20 7b 69 20 69 69 20 69 69 69 7d 0a 64  2.} {i ii iii}.d
2250: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 34 2e  o_test shared-4.
2260: 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.2 {.  catchsql
2270: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
2280: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27 69  TO abc VALUES('i
2290: 76 27 2c 20 27 76 27 2c 20 27 76 69 27 29 3b 0a  v', 'v', 'vi');.
22a0: 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61    }.} {1 {databa
22b0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
22c0: 65 64 3a 20 61 62 63 7d 7d 0a 64 6f 5f 74 65 73  ed: abc}}.do_tes
22d0: 74 20 73 68 61 72 65 64 2d 34 2e 33 2e 33 20 7b  t shared-4.3.3 {
22e0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
22f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 67    CREATE TABLE g
2300: 68 69 28 67 2c 20 68 2c 20 69 29 3b 0a 20 20 7d  hi(g, h, i);.  }
2310: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
2320: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a  table is locked:
2330: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 7d   sqlite_master}}
2340: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
2350: 34 2e 33 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  4.3.3 {.  catchs
2360: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
2370: 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28  INTO def VALUES(
2380: 27 49 56 27 2c 20 27 56 27 2c 20 27 56 49 27 29  'IV', 'V', 'VI')
2390: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64  ;.  }.} {0 {}}.d
23a0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 34 2e  o_test shared-4.
23b0: 33 2e 34 20 7b 0a 20 20 23 20 43 6c 65 61 6e 75  3.4 {.  # Cleanu
23c0: 70 3a 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  p: commit the tr
23d0: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
23e0: 20 62 79 20 64 62 32 2e 0a 20 20 65 78 65 63 73   by db2..  execs
23f0: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 0a  ql {.    COMMIT.
2400: 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 0a 23 20    } db2.} {}..# 
2410: 4f 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  Open a write-tra
2420: 6e 73 61 63 74 69 6f 6e 20 75 73 69 6e 67 20 68  nsaction using h
2430: 61 6e 64 6c 65 20 31 20 61 6e 64 20 6d 6f 64 69  andle 1 and modi
2440: 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
2450: 73 63 68 65 6d 61 2e 0a 23 20 54 68 65 6e 20 74  schema..# Then t
2460: 72 79 20 74 6f 20 65 78 65 63 75 74 65 20 61 20  ry to execute a 
2470: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
2480: 6e 74 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  nt to read from 
2490: 74 68 65 20 73 61 6d 65 20 0a 23 20 64 61 74 61  the same .# data
24a0: 62 61 73 65 20 76 69 61 20 68 61 6e 64 6c 65 20  base via handle 
24b0: 32 20 28 66 61 69 6c 73 20 74 6f 20 67 65 74 20  2 (fails to get 
24c0: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 71 6c 69  the lock on sqli
24d0: 74 65 5f 6d 61 73 74 65 72 29 2e 20 41 6c 73 6f  te_master). Also
24e0: 0a 23 20 74 72 79 20 74 6f 20 63 6f 6d 70 69 6c  .# try to compil
24f0: 65 20 61 20 72 65 61 64 20 6f 66 20 74 68 65 20  e a read of the 
2500: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 75 73  same database us
2510: 69 6e 67 20 68 61 6e 64 6c 65 20 32 20 28 61 6c  ing handle 2 (al
2520: 73 6f 20 66 61 69 6c 73 29 2e 0a 23 20 46 69 6e  so fails)..# Fin
2530: 61 6c 6c 79 2c 20 63 6f 6d 70 69 6c 65 20 61 20  ally, compile a 
2540: 72 65 61 64 20 6f 66 20 74 68 65 20 6f 74 68 65  read of the othe
2550: 72 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  r database using
2560: 20 68 61 6e 64 6c 65 20 32 2e 20 54 68 69 73 0a   handle 2. This.
2570: 23 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 66 61  # should also fa
2580: 69 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 68  il..#.do_test sh
2590: 61 72 65 64 2d 34 2e 34 2e 31 2e 32 20 7b 0a 20  ared-4.4.1.2 {. 
25a0: 20 23 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20   # Sanity check 
25b0: 31 3a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  1: Check that th
25c0: 65 20 73 63 68 65 6d 61 20 69 73 20 77 68 61 74  e schema is what
25d0: 20 77 65 20 74 68 69 6e 6b 20 69 74 20 69 73 20   we think it is 
25e0: 77 68 65 6e 20 76 69 65 77 65 64 0a 20 20 23 20  when viewed.  # 
25f0: 76 69 61 20 68 61 6e 64 6c 65 20 31 2e 0a 20 20  via handle 1..  
2600: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2610: 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74 32  EATE TABLE test2
2620: 2e 67 68 69 28 67 2c 20 68 2c 20 69 29 3b 0a 20  .ghi(g, h, i);. 
2630: 20 20 20 53 45 4c 45 43 54 20 27 74 65 73 74 2e     SELECT 'test.
2640: 64 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20  db:'||name FROM 
2650: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
2660: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
2670: 20 53 45 4c 45 43 54 20 27 74 65 73 74 32 2e 64   SELECT 'test2.d
2680: 62 3a 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 74  b:'||name FROM t
2690: 65 73 74 32 2e 73 71 6c 69 74 65 5f 6d 61 73 74  est2.sqlite_mast
26a0: 65 72 3b 0a 20 20 7d 0a 7d 20 7b 74 65 73 74 2e  er;.  }.} {test.
26b0: 64 62 3a 61 62 63 20 74 65 73 74 2e 64 62 3a 64  db:abc test.db:d
26c0: 65 66 20 74 65 73 74 32 2e 64 62 3a 67 68 69 7d  ef test2.db:ghi}
26d0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
26e0: 34 2e 34 2e 31 2e 32 20 7b 0a 20 20 23 20 53 61  4.4.1.2 {.  # Sa
26f0: 6e 69 74 79 20 63 68 65 63 6b 20 32 3a 20 43 68  nity check 2: Ch
2700: 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 63 68  eck that the sch
2710: 65 6d 61 20 69 73 20 77 68 61 74 20 77 65 20 74  ema is what we t
2720: 68 69 6e 6b 20 69 74 20 69 73 20 77 68 65 6e 20  hink it is when 
2730: 76 69 65 77 65 64 0a 20 20 23 20 76 69 61 20 68  viewed.  # via h
2740: 61 6e 64 6c 65 20 32 2e 0a 20 20 65 78 65 63 73  andle 2..  execs
2750: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2760: 27 74 65 73 74 32 2e 64 62 3a 27 7c 7c 6e 61 6d  'test2.db:'||nam
2770: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
2780: 73 74 65 72 20 0a 20 20 20 20 55 4e 49 4f 4e 20  ster .    UNION 
2790: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 27  ALL.    SELECT '
27a0: 74 65 73 74 2e 64 62 3a 27 7c 7c 6e 61 6d 65 20  test.db:'||name 
27b0: 46 52 4f 4d 20 74 65 73 74 2e 73 71 6c 69 74 65  FROM test.sqlite
27c0: 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 20 64 62 32  _master;.  } db2
27d0: 0a 7d 20 7b 74 65 73 74 32 2e 64 62 3a 67 68 69  .} {test2.db:ghi
27e0: 20 74 65 73 74 2e 64 62 3a 61 62 63 20 74 65 73   test.db:abc tes
27f0: 74 2e 64 62 3a 64 65 66 7d 0a 0a 64 6f 5f 74 65  t.db:def}..do_te
2800: 73 74 20 73 68 61 72 65 64 2d 34 2e 34 2e 32 20  st shared-4.4.2 
2810: 7b 0a 20 20 73 65 74 20 3a 3a 44 42 32 20 5b 73  {.  set ::DB2 [s
2820: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
2830: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d 0a 20  n_pointer db2]. 
2840: 20 73 65 74 20 73 71 6c 20 7b 53 45 4c 45 43 54   set sql {SELECT
2850: 20 2a 20 46 52 4f 4d 20 61 62 63 7d 0a 20 20 73   * FROM abc}.  s
2860: 65 74 20 3a 3a 53 54 4d 54 31 20 5b 73 71 6c 69  et ::STMT1 [sqli
2870: 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a 44  te3_prepare $::D
2880: 42 32 20 24 73 71 6c 20 2d 31 20 44 55 4d 4d 59  B2 $sql -1 DUMMY
2890: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ].  execsql {.  
28a0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
28b0: 41 54 45 20 54 41 42 4c 45 20 6a 6b 6c 28 6a 2c  ATE TABLE jkl(j,
28c0: 20 6b 2c 20 6c 29 3b 0a 20 20 7d 0a 20 20 73 71   k, l);.  }.  sq
28d0: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
28e0: 4d 54 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52  MT1.} {SQLITE_ER
28f0: 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  ROR}.do_test sha
2900: 72 65 64 2d 34 2e 34 2e 33 20 7b 0a 20 20 73 71  red-4.4.3 {.  sq
2910: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
2920: 3a 3a 53 54 4d 54 31 0a 7d 20 7b 53 51 4c 49 54  ::STMT1.} {SQLIT
2930: 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73  E_LOCKED}.do_tes
2940: 74 20 73 68 61 72 65 64 2d 34 2e 34 2e 34 20 7b  t shared-4.4.4 {
2950: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2960: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 53 54 4d   {.    set ::STM
2970: 54 31 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  T1 [sqlite3_prep
2980: 61 72 65 20 24 3a 3a 44 42 32 20 24 73 71 6c 20  are $::DB2 $sql 
2990: 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 7d 20 6d 73  -1 DUMMY].  } ms
29a0: 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d  g].  list $rc $m
29b0: 73 67 0a 7d 20 7b 31 20 7b 28 36 29 20 64 61 74  sg.} {1 {(6) dat
29c0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
29d0: 6c 6f 63 6b 65 64 3a 20 74 65 73 74 7d 7d 0a 64  locked: test}}.d
29e0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d 34 2e  o_test shared-4.
29f0: 34 2e 35 20 7b 0a 20 20 73 65 74 20 72 63 20 5b  4.5 {.  set rc [
2a00: 63 61 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20  catch {.    set 
2a10: 3a 3a 53 54 4d 54 31 20 5b 73 71 6c 69 74 65 33  ::STMT1 [sqlite3
2a20: 5f 70 72 65 70 61 72 65 20 24 3a 3a 44 42 32 20  _prepare $::DB2 
2a30: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 67  "SELECT * FROM g
2a40: 68 69 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20  hi" -1 DUMMY].  
2a50: 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72  } msg].  list $r
2a60: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 28 36 29  c $msg.} {1 {(6)
2a70: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
2a80: 20 69 73 20 6c 6f 63 6b 65 64 3a 20 74 65 73 74   is locked: test
2a90: 7d 7d 0a 0a 0a 63 61 74 63 68 20 7b 64 62 32 20  }}...catch {db2 
2aa0: 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62  close}.catch {db
2ab0: 20 63 6c 6f 73 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   close}..#------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b00: 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 73 68 61  ----.# Tests sha
2b10: 72 65 64 2d 35 2e 2a 20 0a 23 0a 66 6f 72 65 61  red-5.* .#.forea
2b20: 63 68 20 64 62 20 5b 6c 69 73 74 20 74 65 73 74  ch db [list test
2b30: 2e 64 62 20 74 65 73 74 31 2e 64 62 20 74 65 73  .db test1.db tes
2b40: 74 32 2e 64 62 20 74 65 73 74 33 2e 64 62 5d 20  t2.db test3.db] 
2b50: 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  {.  file delete 
2b60: 2d 66 6f 72 63 65 20 24 64 62 20 24 7b 64 62 7d  -force $db ${db}
2b70: 2d 6a 6f 75 72 6e 61 6c 0a 7d 0a 64 6f 5f 74 65  -journal.}.do_te
2b80: 73 74 20 73 68 61 72 65 64 2d 35 2e 31 2e 31 20  st shared-5.1.1 
2b90: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 31 20  {.  sqlite3 db1 
2ba0: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
2bb0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
2bc0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54  execsql {.    AT
2bd0: 54 41 43 48 20 27 74 65 73 74 31 2e 64 62 27 20  TACH 'test1.db' 
2be0: 41 53 20 74 65 73 74 31 3b 0a 20 20 20 20 41 54  AS test1;.    AT
2bf0: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
2c00: 41 53 20 74 65 73 74 32 3b 0a 20 20 20 20 41 54  AS test2;.    AT
2c10: 54 41 43 48 20 27 74 65 73 74 33 2e 64 62 27 20  TACH 'test3.db' 
2c20: 41 53 20 74 65 73 74 33 3b 0a 20 20 7d 20 64 62  AS test3;.  } db
2c30: 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  1.  execsql {.  
2c40: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 33 2e    ATTACH 'test3.
2c50: 64 62 27 20 41 53 20 74 65 73 74 33 3b 0a 20 20  db' AS test3;.  
2c60: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e    ATTACH 'test2.
2c70: 64 62 27 20 41 53 20 74 65 73 74 32 3b 0a 20 20  db' AS test2;.  
2c80: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 31 2e    ATTACH 'test1.
2c90: 64 62 27 20 41 53 20 74 65 73 74 31 3b 0a 20 20  db' AS test1;.  
2ca0: 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  } db2.} {}.do_te
2cb0: 73 74 20 73 68 61 72 65 64 2d 35 2e 31 2e 32 20  st shared-5.1.2 
2cc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2cd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2ce0: 65 73 74 31 2e 74 31 28 61 2c 20 62 29 3b 0a 20  est1.t1(a, b);. 
2cf0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
2d00: 74 65 73 74 31 2e 69 31 20 4f 4e 20 74 31 28 61  test1.i1 ON t1(a
2d10: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
2d20: 20 56 49 45 57 20 74 65 73 74 31 2e 76 31 20 41   VIEW test1.v1 A
2d30: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
2d40: 74 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  t1;.    CREATE T
2d50: 52 49 47 47 45 52 20 74 65 73 74 31 2e 74 72 69  RIGGER test1.tri
2d60: 67 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  g1 AFTER INSERT 
2d70: 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20  ON t1 BEGIN.    
2d80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2d90: 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e   VALUES(new.a, n
2da0: 65 77 2e 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ew.b);.    END;.
2db0: 20 20 7d 20 64 62 31 0a 20 20 65 78 65 63 73 71    } db1.  execsq
2dc0: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44  l {.    DROP IND
2dd0: 45 58 20 69 31 3b 0a 20 20 20 20 44 52 4f 50 20  EX i1;.    DROP 
2de0: 56 49 45 57 20 76 31 3b 0a 20 20 20 20 44 52 4f  VIEW v1;.    DRO
2df0: 50 20 54 52 49 47 47 45 52 20 74 72 69 67 31 3b  P TRIGGER trig1;
2e00: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
2e10: 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d  t1;.  } db2.} {}
2e20: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
2e30: 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.1.2 {.  execsq
2e40: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
2e50: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2e60: 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  ter UNION ALL SE
2e70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74  LECT * FROM test
2e80: 31 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  1.sqlite_master.
2e90: 20 20 7d 20 64 62 31 0a 7d 20 7b 7d 0a 0a 23 2d    } db1.} {}..#-
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
2ef0: 73 20 73 68 61 72 65 64 2d 36 2e 2a 20 74 65 73  s shared-6.* tes
2f00: 74 20 74 68 61 74 20 61 20 71 75 65 72 79 20 6f  t that a query o
2f10: 62 74 61 69 6e 73 20 61 6c 6c 20 74 68 65 20 72  btains all the r
2f20: 65 61 64 2d 6c 6f 63 6b 73 20 69 74 20 6e 65 65  ead-locks it nee
2f30: 64 73 0a 23 20 62 65 66 6f 72 65 20 73 74 61 72  ds.# before star
2f40: 74 69 6e 67 20 65 78 65 63 75 74 69 6f 6e 20 6f  ting execution o
2f50: 66 20 74 68 65 20 71 75 65 72 79 2e 20 54 68 69  f the query. Thi
2f60: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
2f70: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 0a  re is no chance.
2f80: 23 20 73 6f 6d 65 20 72 6f 77 73 20 6f 66 20 64  # some rows of d
2f90: 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ata will be retu
2fa0: 72 6e 65 64 20 62 65 66 6f 72 65 20 61 20 6c 6f  rned before a lo
2fb0: 63 6b 20 66 61 69 6c 73 20 61 6e 64 20 53 51 4c  ck fails and SQL
2fc0: 49 54 45 5f 4c 4f 43 4b 0a 23 20 69 73 20 72 65  ITE_LOCK.# is re
2fd0: 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  turned..#.do_tes
2fe0: 74 20 73 68 61 72 65 64 2d 36 2e 31 2e 31 20 7b  t shared-6.1.1 {
2ff0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3000: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3010: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
3020: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
3030: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3040: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
3050: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
3060: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
3070: 20 34 29 3b 0a 20 20 7d 20 64 62 31 0a 20 20 65   4);.  } db1.  e
3080: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3090: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e  ECT * FROM t1 UN
30a0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
30b0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64 62   FROM t2;.  } db
30c0: 32 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  2.} {1 2 3 4}.do
30d0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 36 2e 31  _test shared-6.1
30e0: 2e 32 20 7b 0a 20 20 23 20 45 73 74 61 62 6c 69  .2 {.  # Establi
30f0: 73 68 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  sh a write lock 
3100: 6f 6e 20 74 61 62 6c 65 20 74 32 20 76 69 61 20  on table t2 via 
3110: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 32 2e 20  connection db2. 
3120: 54 68 65 6e 20 6d 61 6b 65 20 61 20 0a 20 20 23  Then make a .  #
3130: 20 55 4e 49 4f 4e 20 61 6c 6c 20 71 75 65 72 79   UNION all query
3140: 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   using connectio
3150: 6e 20 64 62 31 20 74 68 61 74 20 66 69 72 73 74  n db1 that first
3160: 20 61 63 63 65 73 73 65 73 20 74 31 2c 20 66 6f   accesses t1, fo
3170: 6c 6c 6f 77 65 64 20 0a 20 20 23 20 62 79 20 74  llowed .  # by t
3180: 32 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 73 20  2. If the locks 
3190: 61 72 65 20 67 72 61 62 62 65 64 20 61 74 20 74  are grabbed at t
31a0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
31b0: 73 74 61 74 65 6d 65 6e 74 20 28 61 73 20 0a 20  statement (as . 
31c0: 20 23 20 74 68 65 79 20 73 68 6f 75 6c 64 20 62   # they should b
31d0: 65 29 2c 20 6e 6f 20 72 6f 77 73 20 61 72 65 20  e), no rows are 
31e0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 28 61 73  returned. If (as
31f0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
3200: 74 68 65 20 63 61 73 65 29 0a 20 20 23 20 74 68  the case).  # th
3210: 65 79 20 61 72 65 20 67 72 61 62 62 65 64 20 61  ey are grabbed a
3220: 73 20 74 68 65 20 74 61 62 6c 65 73 20 61 72 65  s the tables are
3230: 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 20 74   accessed, the t
3240: 31 20 72 6f 77 73 20 77 69 6c 6c 20 62 65 20 0a  1 rows will be .
3250: 20 20 23 20 72 65 74 75 72 6e 65 64 20 62 65 66    # returned bef
3260: 6f 72 65 20 74 68 65 20 71 75 65 72 79 20 66 61  ore the query fa
3270: 69 6c 73 2e 0a 20 20 23 0a 20 20 65 78 65 63 73  ils..  #.  execs
3280: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
3290: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
32a0: 74 32 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t2 VALUES(5, 6);
32b0: 0a 20 20 7d 20 64 62 32 0a 20 20 73 65 74 20 72  .  } db2.  set r
32c0: 65 74 20 5b 6c 69 73 74 5d 0a 20 20 63 61 74 63  et [list].  catc
32d0: 68 20 7b 0a 20 20 20 20 64 62 31 20 65 76 61 6c  h {.    db1 eval
32e0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
32f0: 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
3300: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20 7b  ECT * FROM t2} {
3310: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72  .      lappend r
3320: 65 74 20 24 61 20 24 62 0a 20 20 20 20 7d 0a 20  et $a $b.    }. 
3330: 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d 20 7b   }.  set ret.} {
3340: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
3350: 2d 36 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  -6.1.3 {.  execs
3360: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
3370: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
3380: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3390: 41 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d  ALUES(7, 8);.  }
33a0: 20 64 62 32 0a 20 20 73 65 74 20 72 65 74 20 5b   db2.  set ret [
33b0: 6c 69 73 74 5d 0a 20 20 63 61 74 63 68 20 7b 0a  list].  catch {.
33c0: 20 20 20 20 64 62 31 20 65 76 61 6c 20 7b 0a 20      db1 eval {. 
33d0: 20 20 20 20 20 53 45 4c 45 43 54 20 28 43 41 53       SELECT (CAS
33e0: 45 20 57 48 45 4e 20 61 3e 34 20 54 48 45 4e 20  E WHEN a>4 THEN 
33f0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74  (SELECT a FROM t
3400: 31 29 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41  1) ELSE 0 END) A
3410: 53 20 64 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  S d FROM t2;.   
3420: 20 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65   } {.      lappe
3430: 6e 64 20 72 65 74 20 24 64 0a 20 20 20 20 7d 0a  nd ret $d.    }.
3440: 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d 20    }.  set ret.} 
3450: 7b 7d 0a 0a 63 61 74 63 68 20 7b 64 62 31 20 63  {}..catch {db1 c
3460: 6c 6f 73 65 7d 0a 63 61 74 63 68 20 7b 64 62 32  lose}.catch {db2
3470: 20 63 6c 6f 73 65 7d 0a 66 6f 72 65 61 63 68 20   close}.foreach 
3480: 66 20 5b 6c 69 73 74 20 74 65 73 74 2e 64 62 20  f [list test.db 
3490: 74 65 73 74 32 2e 64 62 5d 20 7b 0a 20 20 66 69  test2.db] {.  fi
34a0: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
34b0: 20 24 66 20 24 7b 66 7d 2d 6a 6f 75 72 6e 61 6c   $f ${f}-journal
34c0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3510: 23 20 54 65 73 74 73 20 73 68 61 72 65 64 2d 37  # Tests shared-7
3520: 2e 2a 20 74 65 73 74 20 61 75 74 6f 2d 76 61 63  .* test auto-vac
3530: 75 75 6d 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76  uum does not inv
3540: 61 6c 69 64 61 74 65 20 63 75 72 73 6f 72 73 20  alidate cursors 
3550: 66 72 6f 6d 0a 23 20 6f 74 68 65 72 20 73 68 61  from.# other sha
3560: 72 65 64 2d 63 61 63 68 65 20 75 73 65 72 73 20  red-cache users 
3570: 77 68 65 6e 20 69 74 20 72 65 6f 72 67 61 6e 69  when it reorgani
3580: 7a 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  zes the database
3590: 20 6f 6e 20 0a 23 20 43 4f 4d 4d 49 54 2e 0a 23   on .# COMMIT..#
35a0: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
35b0: 37 2e 31 20 7b 0a 20 20 23 20 54 68 69 73 20 74  7.1 {.  # This t
35c0: 65 73 74 20 63 61 73 65 20 73 65 74 73 20 75 70  est case sets up
35d0: 20 61 20 74 65 73 74 20 64 61 74 61 62 61 73 65   a test database
35e0: 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
35f0: 6d 6f 64 65 20 63 6f 6e 73 69 73 74 69 6e 67 20  mode consisting 
3600: 0a 20 20 23 20 6f 66 20 74 77 6f 20 74 61 62 6c  .  # of two tabl
3610: 65 73 2c 20 74 31 20 61 6e 64 20 74 32 2e 20 42  es, t1 and t2. B
3620: 6f 74 68 20 68 61 76 65 20 61 20 73 69 6e 67 6c  oth have a singl
3630: 65 20 69 6e 64 65 78 2e 20 54 61 62 6c 65 20 74  e index. Table t
3640: 31 20 69 73 20 0a 20 20 23 20 70 6f 70 75 6c 61  1 is .  # popula
3650: 74 65 64 20 66 69 72 73 74 20 28 73 6f 20 63 6f  ted first (so co
3660: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 20  nsists of pages 
3670: 74 6f 77 61 72 64 20 74 68 65 20 73 74 61 72 74  toward the start
3680: 20 6f 66 20 74 68 65 20 64 62 20 66 69 6c 65 29   of the db file)
3690: 2c 20 0a 20 20 23 20 74 32 20 73 65 63 6f 6e 64  , .  # t2 second
36a0: 20 28 70 61 67 65 73 20 74 6f 77 61 72 64 20 74   (pages toward t
36b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
36c0: 6c 65 29 2e 20 0a 20 20 73 71 6c 69 74 65 33 20  le). .  sqlite3 
36d0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  db test.db.  sql
36e0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
36f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3700: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
3710: 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 42 45 47  uum = 1;.    BEG
3720: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
3730: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
3740: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
3750: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
3760: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
3770: 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  ;.  }.  for {set
3780: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d   i 0} {$i < 100}
3790: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
37a0: 73 65 74 20 61 20 5b 73 74 72 69 6e 67 20 72 65  set a [string re
37b0: 70 65 61 74 20 22 24 69 20 22 20 32 30 5d 0a 20  peat "$i " 20]. 
37c0: 20 20 20 73 65 74 20 62 20 5b 73 74 72 69 6e 67     set b [string
37d0: 20 72 65 70 65 61 74 20 22 24 69 20 22 20 32 30   repeat "$i " 20
37e0: 5d 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a  ].    db eval {.
37f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3800: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20  O t1 VALUES($a, 
3810: 24 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  $b);.    }.    l
3820: 61 70 70 65 6e 64 20 3a 3a 63 6f 6e 74 65 6e 74  append ::content
3830: 73 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 24 69  s [list [expr $i
3840: 2b 31 5d 20 24 61 20 24 62 5d 0a 20 20 7d 0a 20  +1] $a $b].  }. 
3850: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
3860: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
3870: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3880: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3890: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
38a0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
38b0: 75 6d 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  um;.  }.} {1}.do
38c0: 5f 74 65 73 74 20 73 68 61 72 65 64 2d 37 2e 32  _test shared-7.2
38d0: 20 7b 0a 20 20 23 20 54 68 69 73 20 74 65 73 74   {.  # This test
38e0: 20 63 61 73 65 20 64 65 6c 65 74 65 73 20 74 68   case deletes th
38f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 61  e contents of ta
3900: 62 6c 65 20 74 31 20 28 74 68 65 20 6f 6e 65 20  ble t1 (the one 
3910: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
3920: 20 20 23 20 74 68 65 20 66 69 6c 65 29 20 77 68    # the file) wh
3930: 69 6c 65 20 6d 61 6e 79 20 63 75 72 73 6f 72 73  ile many cursors
3940: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 61 62   are open on tab
3950: 6c 65 20 74 32 20 61 6e 64 20 69 74 27 73 20 69  le t2 and it's i
3960: 6e 64 65 78 2e 20 41 6c 6c 20 6f 66 0a 20 20 23  ndex. All of.  #
3970: 20 74 68 65 20 6e 6f 6e 2d 72 6f 6f 74 20 70 61   the non-root pa
3980: 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 6f 76 65  ges will be move
3990: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74  d from the end t
39a0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
39b0: 68 65 20 66 69 6c 65 0a 20 20 23 20 77 68 65 6e  he file.  # when
39c0: 20 74 68 65 20 44 45 4c 45 54 45 20 69 73 20 63   the DELETE is c
39d0: 6f 6d 6d 69 74 74 65 64 20 2d 20 74 68 69 73 20  ommitted - this 
39e0: 74 65 73 74 20 76 65 72 69 66 69 65 73 20 74 68  test verifies th
39f0: 61 74 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  at moving the pa
3a00: 67 65 73 0a 20 20 23 20 64 6f 65 73 20 6e 6f 74  ges.  # does not
3a10: 20 64 69 73 74 75 72 62 20 74 68 65 20 6f 70 65   disturb the ope
3a20: 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 23 0a 0a  n cursors..  #..
3a30: 20 20 70 72 6f 63 20 6c 6f 63 6b 72 6f 77 20 7b    proc lockrow {
3a40: 64 62 20 74 62 6c 20 6f 69 64 73 20 62 6f 64 79  db tbl oids body
3a50: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 74 20  } {.    set ret 
3a60: 5b 6c 69 73 74 5d 0a 20 20 20 20 64 62 20 65 76  [list].    db ev
3a70: 61 6c 20 22 53 45 4c 45 43 54 20 6f 69 64 20 41  al "SELECT oid A
3a80: 53 20 69 2c 20 61 2c 20 62 20 46 52 4f 4d 20 24  S i, a, b FROM $
3a90: 74 62 6c 20 4f 52 44 45 52 20 42 59 20 61 22 20  tbl ORDER BY a" 
3aa0: 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 69 3d 3d  {.      if {$i==
3ab0: 5b 6c 69 6e 64 65 78 20 24 6f 69 64 73 20 30 5d  [lindex $oids 0]
3ac0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
3ad0: 6e 6f 69 64 73 20 5b 6c 72 61 6e 67 65 20 24 6f  noids [lrange $o
3ae0: 69 64 73 20 31 20 65 6e 64 5d 0a 20 20 20 20 20  ids 1 end].     
3af0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
3b00: 24 6e 6f 69 64 73 5d 3d 3d 30 7d 20 7b 0a 20 20  $noids]==0} {.  
3b10: 20 20 20 20 20 20 20 20 73 65 74 20 73 75 62 72          set subr
3b20: 65 74 20 5b 65 76 61 6c 20 24 62 6f 64 79 5d 0a  et [eval $body].
3b30: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
3b40: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
3b50: 75 62 72 65 74 20 5b 6c 6f 63 6b 72 6f 77 20 24  ubret [lockrow $
3b60: 64 62 20 24 74 62 6c 20 24 6e 6f 69 64 73 20 24  db $tbl $noids $
3b70: 62 6f 64 79 5d 0a 20 20 20 20 20 20 20 20 7d 0a  body].        }.
3b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 61        }.      la
3b90: 70 70 65 6e 64 20 72 65 74 20 5b 6c 69 73 74 20  ppend ret [list 
3ba0: 24 69 20 24 61 20 24 62 5d 0a 20 20 20 20 7d 0a  $i $a $b].    }.
3bb0: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e 73      return [lins
3bc0: 65 72 74 20 24 73 75 62 72 65 74 20 30 20 24 72  ert $subret 0 $r
3bd0: 65 74 5d 0a 20 20 7d 0a 20 20 70 72 6f 63 20 6c  et].  }.  proc l
3be0: 6f 63 6b 74 62 6c 72 6f 77 73 20 7b 64 62 20 74  ocktblrows {db t
3bf0: 62 6c 20 62 6f 64 79 7d 20 7b 0a 20 20 20 20 73  bl body} {.    s
3c00: 65 74 20 6f 69 64 73 20 5b 64 62 20 65 76 61 6c  et oids [db eval
3c10: 20 22 53 45 4c 45 43 54 20 6f 69 64 20 46 52 4f   "SELECT oid FRO
3c20: 4d 20 24 74 62 6c 22 5d 0a 20 20 20 20 6c 6f 63  M $tbl"].    loc
3c30: 6b 72 6f 77 20 24 64 62 20 24 74 62 6c 20 24 6f  krow $db $tbl $o
3c40: 69 64 73 20 24 62 6f 64 79 0a 20 20 7d 0a 0a 20  ids $body.  }.. 
3c50: 20 73 65 74 20 73 63 61 6e 73 20 5b 6c 6f 63 6b   set scans [lock
3c60: 74 62 6c 72 6f 77 73 20 64 62 20 74 32 20 7b 0a  tblrows db t2 {.
3c70: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3c80: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
3c90: 74 31 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20  t1;.    } db2.  
3ca0: 7d 5d 0a 20 20 73 65 74 20 65 72 72 6f 72 20 30  }].  set error 0
3cb0: 0a 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20  ..  # Test that 
3cc0: 65 61 63 68 20 53 45 4c 45 43 54 20 71 75 65 72  each SELECT quer
3cd0: 79 20 72 65 74 75 72 6e 65 64 20 74 68 65 20 65  y returned the e
3ce0: 78 70 65 63 74 65 64 20 63 6f 6e 74 65 6e 74 73  xpected contents
3cf0: 20 6f 66 20 74 32 2e 0a 20 20 66 6f 72 65 61 63   of t2..  foreac
3d00: 68 20 73 20 24 73 63 61 6e 73 20 7b 0a 20 20 20  h s $scans {.   
3d10: 20 69 66 20 7b 5b 6c 73 6f 72 74 20 2d 69 6e 74   if {[lsort -int
3d20: 65 67 65 72 20 2d 69 6e 64 65 78 20 30 20 24 73  eger -index 0 $s
3d30: 5d 21 3d 24 3a 3a 63 6f 6e 74 65 6e 74 73 7d 20  ]!=$::contents} 
3d40: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 72 72 6f  {.      set erro
3d50: 72 20 31 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r 1.    }.  }.  
3d60: 73 65 74 20 65 72 72 6f 72 0a 7d 20 7b 30 7d 0a  set error.} {0}.
3d70: 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65  .catch {db close
3d80: 7d 0a 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f  }.catch {db2 clo
3d90: 73 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  se}..#----------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
3df0: 20 74 65 73 74 73 20 74 72 79 20 74 6f 20 74 72   tests try to tr
3e00: 69 63 6b 20 74 68 65 20 73 68 61 72 65 64 2d 63  ick the shared-c
3e10: 61 63 68 65 20 63 6f 64 65 20 69 6e 74 6f 20 61  ache code into a
3e20: 73 73 75 6d 69 6e 67 0a 23 20 74 68 65 20 77 72  ssuming.# the wr
3e30: 6f 6e 67 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ong encoding for
3e40: 20 61 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 66   a database..#.f
3e50: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
3e60: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
3e70: 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65 73  b-journal.do_tes
3e80: 74 20 73 68 61 72 65 64 2d 38 2e 31 2e 31 20 7b  t shared-8.1.1 {
3e90: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
3ea0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
3eb0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63  {.    PRAGMA enc
3ec0: 6f 64 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27  oding = 'UTF-16'
3ed0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
3ee0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
3ef0: 72 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  r;.  }.} {}.do_t
3f00: 65 73 74 20 73 68 61 72 65 64 2d 38 2e 31 2e 32  est shared-8.1.2
3f10: 20 7b 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67   {.  string rang
3f20: 65 20 5b 65 78 65 63 73 71 6c 20 7b 50 52 41 47  e [execsql {PRAG
3f30: 4d 41 20 65 6e 63 6f 64 69 6e 67 3b 7d 5d 20 30  MA encoding;}] 0
3f40: 20 65 6e 64 2d 32 0a 7d 20 7b 55 54 46 2d 31 36   end-2.} {UTF-16
3f50: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
3f60: 2d 38 2e 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74  -8.1.3 {.  sqlit
3f70: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
3f80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
3f90: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
3fa0: 20 27 55 54 46 2d 38 27 3b 0a 20 20 20 20 43 52   'UTF-8';.    CR
3fb0: 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61  EATE TABLE abc(a
3fc0: 2c 20 62 2c 20 63 29 3b 0a 20 20 7d 20 64 62 32  , b, c);.  } db2
3fd0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 68  .} {}.do_test sh
3fe0: 61 72 65 64 2d 38 2e 31 2e 34 20 7b 0a 20 20 65  ared-8.1.4 {.  e
3ff0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
4000: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
4010: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20  e_master;.  }.} 
4020: 22 74 61 62 6c 65 20 61 62 63 20 61 62 63 20 5b  "table abc abc [
4030: 65 78 70 72 20 24 41 55 54 4f 56 41 43 55 55 4d  expr $AUTOVACUUM
4040: 3f 33 3a 32 5d 20 7b 43 52 45 41 54 45 20 54 41  ?3:2] {CREATE TA
4050: 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29  BLE abc(a, b, c)
4060: 7d 22 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  }".do_test share
4070: 64 2d 38 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20  d-8.1.5 {.  db2 
4080: 63 6c 6f 73 65 0a 20 20 65 78 65 63 73 71 6c 20  close.  execsql 
4090: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 65 6e 63  {.    PRAGMA enc
40a0: 6f 64 69 6e 67 3b 0a 20 20 7d 0a 7d 20 7b 55 54  oding;.  }.} {UT
40b0: 46 2d 38 7d 0a 66 69 6c 65 20 64 65 6c 65 74 65  F-8}.file delete
40c0: 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62   -force test2.db
40d0: 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61   test2.db-journa
40e0: 6c 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  l.do_test shared
40f0: 2d 38 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  -8.2.1 {.  execs
4100: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20  ql {.    ATTACH 
4110: 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61 75  'test2.db' AS au
4120: 78 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  x;.    SELECT * 
4130: 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f  FROM aux.sqlite_
4140: 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 7d  master;.  }.} {}
4150: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 2d  .do_test shared-
4160: 38 2e 32 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  8.2.2 {.  sqlite
4170: 33 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20  3 db2 test2.db. 
4180: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
4190: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
41a0: 20 27 55 54 46 2d 31 36 27 3b 0a 20 20 20 20 43   'UTF-16';.    C
41b0: 52 45 41 54 45 20 54 41 42 4c 45 20 64 65 66 28  REATE TABLE def(
41c0: 64 2c 20 65 2c 20 66 29 3b 0a 20 20 7d 20 64 62  d, e, f);.  } db
41d0: 32 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  2.  string range
41e0: 20 5b 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d   [execsql {PRAGM
41f0: 41 20 65 6e 63 6f 64 69 6e 67 3b 7d 20 64 62 32  A encoding;} db2
4200: 5d 20 30 20 65 6e 64 2d 32 0a 7d 20 7b 55 54 46  ] 0 end-2.} {UTF
4210: 2d 31 36 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61  -16}.do_test sha
4220: 72 65 64 2d 38 2e 32 2e 33 20 7b 0a 20 20 63 61  red-8.2.3 {.  ca
4230: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
4240: 45 43 54 20 2a 20 46 52 4f 4d 20 61 75 78 2e 73  ECT * FROM aux.s
4250: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
4260: 7d 0a 7d 20 7b 31 20 7b 61 74 74 61 63 68 65 64  }.} {1 {attached
4270: 20 64 61 74 61 62 61 73 65 73 20 6d 75 73 74 20   databases must 
4280: 75 73 65 20 74 68 65 20 73 61 6d 65 20 74 65 78  use the same tex
4290: 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 6d 61  t encoding as ma
42a0: 69 6e 20 64 61 74 61 62 61 73 65 7d 7d 0a 0a 63  in database}}..c
42b0: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
42c0: 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65  catch {db2 close
42d0: 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 73  }..finish_test.s
42e0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
42f0: 61 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e  ared_cache $::en
4300: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
4310: 65 0a 0a                                         e..