/ Hex Artifact Content
Login

Artifact 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69e281:


0000: 23 20 32 30 31 33 20 4d 61 79 20 31 34 0a 23 0a  # 2013 May 14.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0120: 2a 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 0a 23 0a 23 20 54 65 73 74 20 73 6f 6d  ***.#.# Test som
0170: 65 20 73 70 65 63 69 66 69 63 20 63 69 72 63 75  e specific circu
0180: 6d 73 74 61 6e 63 65 73 20 74 6f 20 64 6f 20 77  mstances to do w
0190: 69 74 68 20 73 68 61 72 65 64 20 63 61 63 68 65  ith shared cache
01a0: 20 6d 6f 64 65 2e 0a 23 0a 0a 0a 73 65 74 20 74   mode..#...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 69 66 20 7b 5b 72 75 6e  ter.tcl.if {[run
01f0: 5f 74 68 72 65 61 64 5f 74 65 73 74 73 5d 3d 3d  _thread_tests]==
0200: 30 7d 20 7b 20 66 69 6e 69 73 68 5f 74 65 73 74  0} { finish_test
0210: 20 3b 20 72 65 74 75 72 6e 20 7d 0a 64 62 20 63   ; return }.db c
0220: 6c 6f 73 65 0a 73 65 74 20 3a 3a 74 65 73 74 70  lose.set ::testp
0230: 72 65 66 69 78 20 73 68 61 72 65 64 41 0a 0a 69  refix sharedA..i
0240: 66 20 7b 5b 61 74 6f 6d 69 63 5f 62 61 74 63 68  f {[atomic_batch
0250: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 5d 7d  _write test.db]}
0260: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0270: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 74  .  return.}..set
0280: 20 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72 65 64   ::enable_shared
0290: 5f 63 61 63 68 65 20 5b 73 71 6c 69 74 65 33 5f  _cache [sqlite3_
02a0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
02b0: 63 68 65 20 31 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  che 1]..#-------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 30 2e 31  --.#.do_test 0.1
0310: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 31   {.  sqlite3 db1
0320: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
0330: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 0a  e3 db2 test.db..
0340: 20 20 64 62 31 20 65 76 61 6c 20 7b 0a 20 20 20    db1 eval {.   
0350: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0360: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
0370: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
0380: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b  andomblob(100));
0390: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
03a0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
03b0: 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20  mblob(100) FROM 
03c0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
03d0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
03e0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52  ndomblob(100) FR
03f0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
0400: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0410: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
0420: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
0430: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0440: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
0450: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
0460: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0470: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
0480: 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(100) FROM t1;.
0490: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
04a0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
04b0: 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74  blob(100) FROM t
04c0: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  1;.    CREATE IN
04d0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 29 3b  DEX i1 ON t1(x);
04e0: 0a 20 20 7d 0a 0a 20 20 64 62 31 20 65 76 61 6c  .  }..  db1 eval
04f0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
0500: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31 3b    DROP INDEX i1;
0510: 0a 20 20 7d 0a 0a 20 20 64 62 32 20 63 6c 6f 73  .  }..  db2 clos
0520: 65 0a 0a 20 20 64 62 31 20 65 76 61 6c 20 7b 0a  e..  db1 eval {.
0530: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0540: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
0550: 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74  blob(100) FROM t
0560: 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  1;.    ROLLBACK;
0570: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
0580: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
0590: 0a 7d 20 7b 6f 6b 7d 0a 0a 64 62 31 20 63 6c 6f  .} {ok}..db1 clo
05a0: 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  se.forcedelete t
05b0: 65 73 74 2e 64 62 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  est.db...#------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 31 2e  ---.#.do_test 1.
0610: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  1 {.  sqlite3 db
0620: 31 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69  1 test.db.  sqli
0630: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
0640: 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20    db2 eval {.   
0650: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0660: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
0670: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0680: 32 33 29 3b 0a 20 20 7d 0a 20 20 64 62 31 20 65  23);.  }.  db1 e
0690: 76 61 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  val { .    SELEC
06a0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
06b0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
06c0: 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 7d 0a 7d   ON t1(x);.  }.}
06d0: 20 7b 31 32 33 7d 0a 0a 64 6f 5f 74 65 73 74 20   {123}..do_test 
06e0: 31 2e 32 20 7b 0a 20 20 64 62 32 20 65 76 61 6c  1.2 {.  db2 eval
06f0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0700: 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 3b 20   t1 ORDER BY x; 
0710: 7d 0a 0a 20 20 64 62 31 20 65 76 61 6c 20 7b 0a  }..  db1 eval {.
0720: 20 20 20 20 42 45 47 49 4e 3b 20 44 52 4f 50 20      BEGIN; DROP 
0730: 49 4e 44 45 58 20 69 31 3b 0a 20 20 7d 0a 20 20  INDEX i1;.  }.  
0740: 64 62 31 20 63 6c 6f 73 65 0a 0a 20 20 64 62 32  db1 close..  db2
0750: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
0760: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
0770: 59 20 78 3b 20 7d 0a 7d 20 7b 31 32 33 7d 0a 0a  Y x; }.} {123}..
0780: 64 6f 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 20  do_test 1.3 {.  
0790: 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a  db2 close.} {}..
07a0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 73  ----------.#.# s
07f0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
0800: 6c 28 29 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  l() loops throug
0810: 68 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 62  h all attached b
0820: 2d 74 72 65 65 73 20 61 6e 64 20 72 6f 6c 6c 73  -trees and rolls
0830: 0a 23 20 62 61 63 6b 20 65 61 63 68 20 6f 6e 65  .# back each one
0840: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
0850: 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  en if the SQLITE
0860: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 66  _InternChanges f
0870: 6c 61 67 20 69 73 0a 23 20 73 65 74 2c 20 69 74  lag is.# set, it
0880: 20 72 65 73 65 74 73 20 74 68 65 20 73 63 68 65   resets the sche
0890: 6d 61 2e 20 20 42 6f 74 68 20 6f 66 20 74 68 65  ma.  Both of the
08a0: 20 61 62 6f 76 65 20 73 74 65 70 73 20 6d 75 73   above steps mus
08b0: 74 20 62 65 20 64 6f 6e 65 0a 23 20 77 68 69 6c  t be done.# whil
08c0: 65 20 68 6f 6c 64 69 6e 67 20 61 20 6d 75 74 65  e holding a mute
08d0: 78 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 6f  x, otherwise ano
08e0: 74 68 65 72 20 74 68 72 65 61 64 20 6d 69 67 68  ther thread migh
08f0: 74 20 73 6c 69 70 20 69 6e 20 61 6e 64 0a 23 20  t slip in and.# 
0900: 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 6e  try to use the n
0910: 65 77 20 73 63 68 65 6d 61 20 77 69 74 68 20 74  ew schema with t
0920: 68 65 20 6f 6c 64 20 64 61 74 61 2e 0a 23 0a 23  he old data..#.#
0930: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
0940: 65 71 75 65 6e 63 65 20 6f 66 20 74 65 73 74 73  equence of tests
0950: 20 61 74 74 65 6d 70 74 20 74 6f 20 76 65 72 69   attempt to veri
0960: 66 79 20 74 68 61 74 20 74 68 65 20 61 63 74 69  fy that the acti
0970: 6f 6e 73 0a 23 20 74 61 6b 65 6e 20 62 79 20 73  ons.# taken by s
0980: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
0990: 6c 28 29 20 61 72 65 20 74 68 72 65 61 64 2d 61  l() are thread-a
09a0: 74 6f 6d 69 63 20 28 74 68 61 74 20 74 68 65 79  tomic (that they
09b0: 20 63 61 6e 6e 6f 74 20 62 65 0a 23 20 69 6e 74   cannot be.# int
09c0: 65 72 72 75 70 74 65 64 20 62 79 20 61 20 73 65  errupted by a se
09d0: 70 61 72 61 74 65 20 74 68 72 65 61 64 2e 29 20  parate thread.) 
09e0: 20 0a 23 0a 23 20 4e 6f 74 65 20 74 68 61 74 20   .#.# Note that 
09f0: 61 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  a TCL interprete
0a00: 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
0a10: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 74 68  ed within the th
0a20: 72 65 61 64 20 69 6e 20 77 68 69 63 68 0a 23 20  read in which.# 
0a30: 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  it was originall
0a40: 79 20 63 72 65 61 74 65 64 20 28 62 65 63 61 75  y created (becau
0a50: 73 65 20 69 74 20 75 73 65 73 20 74 68 72 65 61  se it uses threa
0a60: 64 2d 6c 6f 63 61 6c 2d 73 74 6f 72 61 67 65 29  d-local-storage)
0a70: 2e 20 20 0a 23 20 54 68 65 20 74 76 66 73 20 63  .  .# The tvfs c
0a80: 61 6c 6c 62 61 63 6b 73 20 6d 75 73 74 20 74 68  allbacks must th
0a90: 65 72 65 66 6f 72 65 20 6f 6e 6c 79 20 72 75 6e  erefore only run
0aa0: 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 74 68 72   on the main thr
0ab0: 65 61 64 2e 20 20 0a 23 20 54 68 65 72 65 20 69  ead.  .# There i
0ac0: 73 20 73 6f 6d 65 20 74 72 69 63 6b 65 72 79 20  s some trickery 
0ad0: 69 6e 20 74 68 65 20 72 65 61 64 5f 63 61 6c 6c  in the read_call
0ae0: 62 61 63 6b 20 70 72 6f 63 65 64 75 72 65 20 74  back procedure t
0af0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 0a 23 20  o ensure that.# 
0b00: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
0b10: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 66 73  ..#.testvfs tvfs
0b20: 0a 0a 23 20 53 65 74 20 75 70 20 74 77 6f 20 64  ..# Set up two d
0b30: 61 74 61 62 61 73 65 73 20 61 6e 64 20 74 77 6f  atabases and two
0b40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
0b50: 74 69 6f 6e 73 2e 0a 23 0a 23 20 20 20 64 62 31  tions..#.#   db1
0b60: 3a 20 20 6d 61 69 6e 28 74 65 73 74 2e 64 62 29  :  main(test.db)
0b70: 2c 20 74 77 6f 28 74 65 73 74 32 2e 64 62 29 0a  , two(test2.db).
0b80: 23 20 20 20 64 62 32 3a 20 20 6d 61 69 6e 28 74  #   db2:  main(t
0b90: 65 73 74 2e 64 62 29 0a 23 0a 23 20 54 68 65 20  est.db).#.# The 
0ba0: 63 61 63 68 65 20 66 6f 72 20 74 65 73 74 2e 64  cache for test.d
0bb0: 62 20 69 73 20 73 68 61 72 65 64 20 62 65 74 77  b is shared betw
0bc0: 65 65 6e 20 64 62 31 20 61 6e 64 20 64 62 32 2e  een db1 and db2.
0bd0: 0a 23 0a 64 6f 5f 74 65 73 74 20 32 2e 31 20 7b  .#.do_test 2.1 {
0be0: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
0bf0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a  est.db test.db2.
0c00: 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 74 65    sqlite3 db1 te
0c10: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66 73 0a  st.db -vfs tvfs.
0c20: 20 20 64 62 31 20 65 76 61 6c 20 7b 20 41 54 54    db1 eval { ATT
0c30: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
0c40: 53 20 74 77 6f 20 7d 0a 0a 20 20 64 62 31 20 65  S two }..  db1 e
0c50: 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  val {.    CREATE
0c60: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
0c70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0c80: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
0c90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0ca0: 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e  ALUES(2);.    IN
0cb0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0cc0: 55 45 53 28 33 29 3b 0a 20 20 20 20 43 52 45 41  UES(3);.    CREA
0cd0: 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74 32 28  TE TABLE two.t2(
0ce0: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
0cf0: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20  NTO t2 SELECT * 
0d00: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a 20 20  FROM t1;.  }..  
0d10: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
0d20: 2e 64 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20  .db -vfs tvfs.  
0d30: 64 62 32 20 65 76 61 6c 20 7b 20 53 45 4c 45 43  db2 eval { SELEC
0d40: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
0d50: 7b 31 20 32 20 33 7d 0a 0a 23 20 43 72 65 61 74  {1 2 3}..# Creat
0d60: 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  e a prepared sta
0d70: 74 65 6d 65 6e 74 20 6f 6e 20 64 62 32 20 74 68  tement on db2 th
0d80: 61 74 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  at will attempt 
0d90: 61 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a  a schema change.
0da0: 23 20 69 6e 20 74 65 73 74 2e 64 62 2e 20 20 4d  # in test.db.  M
0db0: 65 61 6e 77 68 69 6c 65 2c 20 73 74 61 72 74 20  eanwhile, start 
0dc0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
0dd0: 20 64 62 31 20 74 68 61 74 20 63 68 61 6e 67 65   db1 that change
0de0: 73 0a 23 20 74 68 65 20 73 63 68 65 6d 61 20 6f  s.# the schema o
0df0: 66 20 74 65 73 74 2e 64 62 20 61 6e 64 20 74 68  f test.db and th
0e00: 61 74 20 63 72 65 61 74 65 73 20 61 20 72 6f 6c  at creates a rol
0e10: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
0e20: 20 74 65 73 74 32 2e 64 62 0a 23 0a 64 6f 5f 74   test2.db.#.do_t
0e30: 65 73 74 20 32 2e 32 20 7b 0a 20 20 73 65 74 20  est 2.2 {.  set 
0e40: 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  ::STMT [sqlite3_
0e50: 70 72 65 70 61 72 65 20 64 62 32 20 22 43 52 45  prepare db2 "CRE
0e60: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0e70: 74 31 28 78 29 22 20 2d 31 20 74 61 69 6c 5d 0a  t1(x)" -1 tail].
0e80: 20 20 64 62 31 20 65 76 61 6c 20 7b 0a 20 20 20    db1 eval {.   
0e90: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
0ea0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
0eb0: 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e   t1(x);.      IN
0ec0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0ed0: 55 45 53 28 27 76 61 6c 75 65 21 27 29 3b 0a 20  UES('value!');. 
0ee0: 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 53 65 74 20 75   }.} {}..# Set u
0ef0: 70 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  p a callback tha
0f00: 74 20 77 69 6c 6c 20 63 61 75 73 65 20 64 62 32  t will cause db2
0f10: 20 74 6f 20 74 72 79 20 74 6f 20 65 78 65 63 75   to try to execu
0f20: 74 65 20 69 74 73 0a 23 20 73 63 68 65 6d 61 20  te its.# schema 
0f30: 63 68 61 6e 67 65 20 77 68 65 6e 20 64 62 31 20  change when db1 
0f40: 61 63 63 65 73 73 65 73 20 74 68 65 20 6a 6f 75  accesses the jou
0f50: 72 6e 61 6c 20 66 69 6c 65 20 6f 66 20 74 65 73  rnal file of tes
0f60: 74 32 2e 64 62 2e 0a 23 0a 23 20 54 68 69 73 20  t2.db..#.# This 
0f70: 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 20 62 65  callback will be
0f80: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 74   invoked after t
0f90: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 65  he content of te
0fa0: 73 74 2e 64 62 20 68 61 73 0a 23 20 62 65 20 72  st.db has.# be r
0fb0: 6f 6c 6c 65 64 20 62 61 63 6b 20 62 75 74 20 62  olled back but b
0fc0: 65 66 6f 72 65 20 74 68 65 20 73 63 68 65 6d 61  efore the schema
0fd0: 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 2e   has been reset.
0fe0: 20 20 49 66 20 74 68 65 0a 23 20 73 71 6c 69 74    If the.# sqlit
0ff0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 29 20  e3RollbackAll() 
1000: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6e 6f 74  operation is not
1010: 20 74 68 72 65 61 64 2d 61 74 6f 6d 69 63 2c 20   thread-atomic, 
1020: 74 68 65 6e 20 74 68 65 0a 23 20 64 62 32 20 73  then the.# db2 s
1030: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
1040: 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 20 73 65  callback will se
1050: 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 20 77 69  e old content wi
1060: 74 68 20 74 68 65 20 6e 65 77 65 72 0a 23 20 73  th the newer.# s
1070: 63 68 65 6d 61 2c 20 77 68 69 63 68 20 69 73 20  chema, which is 
1080: 77 72 6f 6e 67 2e 0a 23 0a 74 76 66 73 20 66 69  wrong..#.tvfs fi
1090: 6c 74 65 72 20 78 52 65 61 64 0a 74 76 66 73 20  lter xRead.tvfs 
10a0: 73 63 72 69 70 74 20 72 65 61 64 5f 63 61 6c 6c  script read_call
10b0: 62 61 63 6b 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f  back.unset -noco
10c0: 6d 70 6c 61 69 6e 20 3a 3a 73 6f 6d 65 5f 74 69  mplain ::some_ti
10d0: 6d 65 5f 6c 61 73 74 65 72 0a 75 6e 73 65 74 20  me_laster.unset 
10e0: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 74 68  -nocomplain ::th
10f0: 72 65 61 64 5f 72 65 73 75 6c 74 0a 70 72 6f 63  read_result.proc
1100: 20 72 65 61 64 5f 63 61 6c 6c 62 61 63 6b 20 7b   read_callback {
1110: 63 61 6c 6c 20 66 69 6c 65 20 61 72 67 73 7d 20  call file args} 
1120: 7b 20 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  { .  if {[string
1130: 20 6d 61 74 63 68 20 2a 74 65 73 74 2e 64 62 32   match *test.db2
1140: 2d 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 7d  -journal $file]}
1150: 20 7b 0a 20 20 20 20 74 76 66 73 20 66 69 6c 74   {.    tvfs filt
1160: 65 72 20 7b 7d 20 20 20 3b 23 20 45 6e 73 75 72  er {}   ;# Ensur
1170: 65 20 74 68 61 74 20 74 76 66 73 20 63 61 6c 6c  e that tvfs call
1180: 62 61 63 6b 73 20 74 6f 20 64 6f 20 72 75 6e 20  backs to do run 
1190: 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  on the.         
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 63               # c
11b0: 68 69 6c 64 20 74 68 72 65 61 64 0a 20 20 20 20  hild thread.    
11c0: 73 71 6c 74 68 72 65 61 64 20 73 70 61 77 6e 20  sqlthread spawn 
11d0: 3a 3a 74 68 72 65 61 64 5f 72 65 73 75 6c 74 20  ::thread_result 
11e0: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
11f0: 64 73 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ds {.      sqlit
1200: 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a  e3_step $::STMT.
1210: 20 20 20 20 20 20 73 65 74 20 72 63 20 5b 73 71        set rc [sq
1220: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
1230: 3a 3a 53 54 4d 54 5d 0a 20 20 20 20 7d 5d 0a 20  ::STMT].    }]. 
1240: 20 20 20 61 66 74 65 72 20 31 30 30 30 20 7b 20     after 1000 { 
1250: 73 65 74 20 3a 3a 73 6f 6d 65 5f 74 69 6d 65 5f  set ::some_time_
1260: 6c 61 74 65 72 20 31 20 7d 0a 20 20 20 20 76 77  later 1 }.    vw
1270: 61 69 74 20 3a 3a 73 6f 6d 65 5f 74 69 6d 65 5f  ait ::some_time_
1280: 6c 61 74 65 72 0a 20 20 7d 0a 7d 0a 64 6f 5f 74  later.  }.}.do_t
1290: 65 73 74 20 32 2e 33 20 7b 20 64 62 31 20 65 76  est 2.3 { db1 ev
12a0: 61 6c 20 52 4f 4c 4c 42 41 43 4b 20 7d 20 7b 7d  al ROLLBACK } {}
12b0: 0a 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20  ..# Verify that 
12c0: 74 68 65 20 64 62 32 20 73 74 61 74 65 6d 65 6e  the db2 statemen
12d0: 74 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  t invoked by the
12e0: 20 63 61 6c 6c 62 61 63 6b 20 64 65 74 65 63 74   callback detect
12f0: 65 64 20 74 68 65 0a 23 20 73 63 68 65 6d 61 20  ed the.# schema 
1300: 63 68 61 6e 67 65 2e 0a 23 0a 69 66 20 7b 5b 69  change..#.if {[i
1310: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 68 72  nfo exists ::thr
1320: 65 61 64 5f 72 65 73 75 6c 74 5d 3d 3d 30 7d 20  ead_result]==0} 
1330: 7b 20 76 77 61 69 74 20 3a 3a 74 68 72 65 61 64  { vwait ::thread
1340: 5f 72 65 73 75 6c 74 20 7d 0a 64 6f 5f 74 65 73  _result }.do_tes
1350: 74 20 32 2e 34 20 7b 20 0a 20 20 6c 69 73 74 20  t 2.4 { .  list 
1360: 24 3a 3a 74 68 72 65 61 64 5f 72 65 73 75 6c 74  $::thread_result
1370: 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   [sqlite3_errmsg
1380: 20 64 62 32 5d 20 0a 7d 20 7b 53 51 4c 49 54 45   db2] .} {SQLITE
1390: 5f 53 43 48 45 4d 41 20 7b 64 61 74 61 62 61 73  _SCHEMA {databas
13a0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
13b0: 6e 67 65 64 7d 7d 0a 0a 64 62 31 20 63 6c 6f 73  nged}}..db1 clos
13c0: 65 0a 64 62 32 20 63 6c 6f 73 65 0a 74 76 66 73  e.db2 close.tvfs
13d0: 20 64 65 6c 65 74 65 0a 0a 73 71 6c 69 74 65 33   delete..sqlite3
13e0: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
13f0: 61 63 68 65 20 24 3a 3a 65 6e 61 62 6c 65 5f 73  ache $::enable_s
1400: 68 61 72 65 64 5f 63 61 63 68 65 0a 66 69 6e 69  hared_cache.fini
1410: 73 68 5f 74 65 73 74 0a                          sh_test.