/ Hex Artifact Content
Login

Artifact 8f71d4eb4d5261280de92284df74172545c852cc:


0000: 23 20 32 30 30 35 20 4a 61 6e 75 61 72 79 20 31  # 2005 January 1
0010: 39 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  9.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you 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 2a 2a 2a 2a 0a 23 0a 23 20 24 49 64 3a  *******.#.# $Id:
0170: 20 73 68 61 72 65 64 32 2e 74 65 73 74 2c 76 20   shared2.test,v 
0180: 31 2e 38 20 32 30 30 39 2f 30 36 2f 30 35 20 31  1.8 2009/06/05 1
0190: 37 3a 30 39 3a 31 32 20 64 72 68 20 45 78 70 20  7:09:12 drh Exp 
01a0: 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b  $..set testdir [
01b0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72  file dirname $ar
01c0: 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73  gv0].source $tes
01d0: 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a  tdir/tester.tcl.
01e0: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
01f0: 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a  lock_common.tcl.
0200: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
0210: 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63  malloc_common.tc
0220: 6c 0a 64 62 20 63 6c 6f 73 65 0a 0a 69 66 63 61  l.db close..ifca
0230: 70 61 62 6c 65 20 21 73 68 61 72 65 64 5f 63 61  pable !shared_ca
0240: 63 68 65 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74  che {.  finish_t
0250: 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 73  est.  return.}.s
0260: 65 74 20 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72  et ::enable_shar
0270: 65 64 5f 63 61 63 68 65 20 5b 73 71 6c 69 74 65  ed_cache [sqlite
0280: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0290: 63 61 63 68 65 20 31 5d 0a 0a 23 20 54 65 73 74  cache 1]..# Test
02a0: 20 74 68 61 74 20 69 66 20 77 65 20 64 65 6c 65   that if we dele
02b0: 74 65 20 61 6c 6c 20 72 6f 77 73 20 66 72 6f 6d  te all rows from
02c0: 20 61 20 74 61 62 6c 65 20 61 6e 79 20 72 65 61   a table any rea
02d0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 0a 23  d-uncommitted .#
02e0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 72   cursors are cor
02f0: 72 65 63 74 6c 79 20 69 6e 76 61 6c 69 64 61 74  rectly invalidat
0300: 65 64 2e 20 54 65 73 74 20 6f 6e 20 62 6f 74 68  ed. Test on both
0310: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
0320: 20 62 74 72 65 65 73 2e 0a 64 6f 5f 74 65 73 74   btrees..do_test
0330: 20 73 68 61 72 65 64 32 2d 31 2e 31 20 7b 0a 20   shared2-1.1 {. 
0340: 20 73 71 6c 69 74 65 33 20 64 62 31 20 74 65 73   sqlite3 db1 tes
0350: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
0360: 62 32 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  b2 test.db..  # 
0370: 53 65 74 20 75 70 20 73 6f 6d 65 20 64 61 74 61  Set up some data
0380: 2e 20 54 61 62 6c 65 20 22 6e 75 6d 62 65 72 73  . Table "numbers
0390: 22 20 68 61 73 20 36 34 20 72 6f 77 73 20 61 66  " has 64 rows af
03a0: 74 65 72 20 74 68 69 73 20 62 6c 6f 63 6b 20 0a  ter this block .
03b0: 20 20 23 20 69 73 20 65 78 65 63 75 74 65 64 2e    # is executed.
03c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
03d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
03e0: 54 45 20 54 41 42 4c 45 20 6e 75 6d 62 65 72 73  TE TABLE numbers
03f0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
0400: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
0410: 4e 54 4f 20 6e 75 6d 62 65 72 73 28 6f 69 64 29  NTO numbers(oid)
0420: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20   VALUES(NULL);. 
0430: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e     INSERT INTO n
0440: 75 6d 62 65 72 73 28 6f 69 64 29 20 53 45 4c 45  umbers(oid) SELE
0450: 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 6e 75 6d  CT NULL FROM num
0460: 62 65 72 73 3b 0a 20 20 20 20 49 4e 53 45 52 54  bers;.    INSERT
0470: 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73 28 6f 69   INTO numbers(oi
0480: 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46  d) SELECT NULL F
0490: 52 4f 4d 20 6e 75 6d 62 65 72 73 3b 0a 20 20 20  ROM numbers;.   
04a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 75 6d   INSERT INTO num
04b0: 62 65 72 73 28 6f 69 64 29 20 53 45 4c 45 43 54  bers(oid) SELECT
04c0: 20 4e 55 4c 4c 20 46 52 4f 4d 20 6e 75 6d 62 65   NULL FROM numbe
04d0: 72 73 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  rs;.    INSERT I
04e0: 4e 54 4f 20 6e 75 6d 62 65 72 73 28 6f 69 64 29  NTO numbers(oid)
04f0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f   SELECT NULL FRO
0500: 4d 20 6e 75 6d 62 65 72 73 3b 0a 20 20 20 20 49  M numbers;.    I
0510: 4e 53 45 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65  NSERT INTO numbe
0520: 72 73 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e  rs(oid) SELECT N
0530: 55 4c 4c 20 46 52 4f 4d 20 6e 75 6d 62 65 72 73  ULL FROM numbers
0540: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0550: 4f 20 6e 75 6d 62 65 72 73 28 6f 69 64 29 20 53  O numbers(oid) S
0560: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
0570: 6e 75 6d 62 65 72 73 3b 0a 20 20 20 20 55 50 44  numbers;.    UPD
0580: 41 54 45 20 6e 75 6d 62 65 72 73 20 73 65 74 20  ATE numbers set 
0590: 61 20 3d 20 6f 69 64 2c 20 62 20 3d 20 27 61 62  a = oid, b = 'ab
05a0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
05b0: 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37  stuvwxyz01234567
05c0: 38 39 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  89';.    COMMIT;
05d0: 0a 20 20 7d 20 64 62 31 0a 7d 20 7b 7d 0a 64 6f  .  } db1.} {}.do
05e0: 5f 74 65 73 74 20 73 68 61 72 65 64 32 2d 31 2e  _test shared2-1.
05f0: 32 20 7b 0a 20 20 23 20 50 75 74 20 63 6f 6e 6e  2 {.  # Put conn
0600: 65 63 74 69 6f 6e 20 32 20 69 6e 20 72 65 61 64  ection 2 in read
0610: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64  -uncommitted mod
0620: 65 20 61 6e 64 20 73 74 61 72 74 20 61 20 53 45  e and start a SE
0630: 4c 45 43 54 20 6f 6e 20 74 61 62 6c 65 20 0a 20  LECT on table . 
0640: 20 23 20 27 6e 75 6d 62 65 72 73 27 2e 20 48 61   # 'numbers'. Ha
0650: 6c 66 20 77 61 79 20 74 68 72 6f 75 67 68 20 74  lf way through t
0660: 68 65 20 53 45 4c 45 43 54 2c 20 75 73 65 20 63  he SELECT, use c
0670: 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 74 6f 20 64  onnection 1 to d
0680: 65 6c 65 74 65 20 74 68 65 0a 20 20 23 20 63 6f  elete the.  # co
0690: 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 74  ntents of this t
06a0: 61 62 6c 65 2e 0a 20 20 65 78 65 63 73 71 6c 20  able..  execsql 
06b0: 7b 0a 20 20 20 20 70 72 61 67 6d 61 20 72 65 61  {.    pragma rea
06c0: 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20  d_uncommitted = 
06d0: 31 3b 0a 20 20 7d 20 64 62 32 0a 20 20 73 65 74  1;.  } db2.  set
06e0: 20 63 6f 75 6e 74 20 5b 65 78 65 63 73 71 6c 20   count [execsql 
06f0: 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  {SELECT count(*)
0700: 20 46 52 4f 4d 20 6e 75 6d 62 65 72 73 7d 20 64   FROM numbers} d
0710: 62 32 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b  b2].  db2 eval {
0720: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6e 75  SELECT a FROM nu
0730: 6d 62 65 72 73 20 4f 52 44 45 52 20 42 59 20 6f  mbers ORDER BY o
0740: 69 64 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 61  id} {.    if {$a
0750: 3d 3d 33 32 7d 20 7b 0a 20 20 20 20 20 20 65 78  ==32} {.      ex
0760: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
0770: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 44  BEGIN;.        D
0780: 45 4c 45 54 45 20 46 52 4f 4d 20 6e 75 6d 62 65  ELETE FROM numbe
0790: 72 73 3b 0a 20 20 20 20 20 20 7d 20 64 62 31 0a  rs;.      } db1.
07a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 69 73 74      }.  }.  list
07b0: 20 24 61 20 24 63 6f 75 6e 74 0a 7d 20 7b 33 32   $a $count.} {32
07c0: 20 36 34 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61   64}.do_test sha
07d0: 72 65 64 32 2d 31 2e 33 20 7b 0a 20 20 23 20 53  red2-1.3 {.  # S
07e0: 61 6d 65 20 74 65 73 74 20 61 73 20 31 2e 32 2c  ame test as 1.2,
07f0: 20 65 78 63 65 70 74 20 73 63 61 6e 20 75 73 69   except scan usi
0800: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 74 68 69  ng the index thi
0810: 73 20 74 69 6d 65 2e 0a 20 20 65 78 65 63 73 71  s time..  execsq
0820: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
0830: 3b 0a 20 20 7d 20 64 62 31 0a 20 20 73 65 74 20  ;.  } db1.  set 
0840: 63 6f 75 6e 74 20 5b 65 78 65 63 73 71 6c 20 7b  count [execsql {
0850: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
0860: 46 52 4f 4d 20 6e 75 6d 62 65 72 73 7d 20 64 62  FROM numbers} db
0870: 32 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53  2].  db2 eval {S
0880: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
0890: 6e 75 6d 62 65 72 73 20 4f 52 44 45 52 20 42 59  numbers ORDER BY
08a0: 20 61 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 61   a} {.    if {$a
08b0: 3d 3d 33 32 7d 20 7b 0a 20 20 20 20 20 20 65 78  ==32} {.      ex
08c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
08d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6e 75 6d 62  DELETE FROM numb
08e0: 65 72 73 3b 0a 20 20 20 20 20 20 7d 20 64 62 31  ers;.      } db1
08f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 69 73  .    }.  }.  lis
0900: 74 20 24 61 20 24 63 6f 75 6e 74 0a 7d 20 7b 33  t $a $count.} {3
0910: 32 20 36 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  2 64}..#--------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 0a 23 20 54 68 65 73 65 20 74 65 73 74  ---.# These test
0970: 73 2c 20 73 68 61 72 65 64 32 2e 32 2e 2a 2c 20  s, shared2.2.*, 
0980: 74 65 73 74 20 74 68 65 20 6f 75 74 63 6f 6d 65  test the outcome
0990: 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 61 64   when data is ad
09a0: 64 65 64 20 74 6f 20 6f 72 20 0a 23 20 72 65 6d  ded to or .# rem
09b0: 6f 76 65 64 20 66 72 6f 6d 20 61 20 74 61 62 6c  oved from a tabl
09c0: 65 20 64 75 65 20 74 6f 20 61 20 72 6f 6c 6c 62  e due to a rollb
09d0: 61 63 6b 20 77 68 69 6c 65 20 61 20 72 65 61 64  ack while a read
09e0: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 0a 23 20  -uncommitted .# 
09f0: 63 75 72 73 6f 72 20 69 73 20 73 63 61 6e 6e 69  cursor is scanni
0a00: 6e 67 20 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  ng it..#.do_test
0a10: 20 73 68 61 72 65 64 32 2d 32 2e 31 20 7b 0a 20   shared2-2.1 {. 
0a20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
0a30: 4e 53 45 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65  NSERT INTO numbe
0a40: 72 73 20 56 41 4c 55 45 53 28 31 2c 20 27 4d 65  rs VALUES(1, 'Me
0a50: 64 69 75 6d 20 6c 65 6e 67 74 68 20 74 65 78 74  dium length text
0a60: 20 66 69 65 6c 64 27 29 3b 0a 20 20 20 20 49 4e   field');.    IN
0a70: 53 45 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72  SERT INTO number
0a80: 73 20 56 41 4c 55 45 53 28 32 2c 20 27 4d 65 64  s VALUES(2, 'Med
0a90: 69 75 6d 20 6c 65 6e 67 74 68 20 74 65 78 74 20  ium length text 
0aa0: 66 69 65 6c 64 27 29 3b 0a 20 20 20 20 49 4e 53  field');.    INS
0ab0: 45 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73  ERT INTO numbers
0ac0: 20 56 41 4c 55 45 53 28 33 2c 20 27 4d 65 64 69   VALUES(3, 'Medi
0ad0: 75 6d 20 6c 65 6e 67 74 68 20 74 65 78 74 20 66  um length text f
0ae0: 69 65 6c 64 27 29 3b 0a 20 20 20 20 49 4e 53 45  ield');.    INSE
0af0: 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73 20  RT INTO numbers 
0b00: 56 41 4c 55 45 53 28 34 2c 20 27 4d 65 64 69 75  VALUES(4, 'Mediu
0b10: 6d 20 6c 65 6e 67 74 68 20 74 65 78 74 20 66 69  m length text fi
0b20: 65 6c 64 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  eld');.    BEGIN
0b30: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
0b40: 4d 20 6e 75 6d 62 65 72 73 20 57 48 45 52 45 20  M numbers WHERE 
0b50: 28 61 25 32 29 3d 30 3b 0a 20 20 7d 20 64 62 31  (a%2)=0;.  } db1
0b60: 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74  .  set res [list
0b70: 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20  ].  db2 eval {. 
0b80: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
0b90: 20 6e 75 6d 62 65 72 73 20 4f 52 44 45 52 20 42   numbers ORDER B
0ba0: 59 20 61 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 6c  Y a;.  } {.    l
0bb0: 61 70 70 65 6e 64 20 72 65 73 20 24 61 0a 20 20  append res $a.  
0bc0: 20 20 69 66 20 7b 24 61 3d 3d 33 7d 20 7b 0a 20    if {$a==3} {. 
0bd0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 52 4f       execsql {RO
0be0: 4c 4c 42 41 43 4b 7d 20 64 62 31 0a 20 20 20 20  LLBACK} db1.    
0bf0: 7d 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73 0a  }.  }.  set res.
0c00: 7d 20 7b 31 20 33 20 34 7d 0a 64 6f 5f 74 65 73  } {1 3 4}.do_tes
0c10: 74 20 73 68 61 72 65 64 32 2d 32 2e 32 20 7b 0a  t shared2-2.2 {.
0c20: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0c30: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
0c40: 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73 20 56  T INTO numbers V
0c50: 41 4c 55 45 53 28 35 2c 20 27 4d 65 64 69 75 6d  ALUES(5, 'Medium
0c60: 20 6c 65 6e 67 74 68 20 74 65 78 74 20 66 69 65   length text fie
0c70: 6c 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ld');.    INSERT
0c80: 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73 20 56 41   INTO numbers VA
0c90: 4c 55 45 53 28 36 2c 20 27 4d 65 64 69 75 6d 20  LUES(6, 'Medium 
0ca0: 6c 65 6e 67 74 68 20 74 65 78 74 20 66 69 65 6c  length text fiel
0cb0: 64 27 29 3b 0a 20 20 7d 20 64 62 31 0a 20 20 73  d');.  } db1.  s
0cc0: 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20  et res [list].  
0cd0: 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 53  db2 eval {.    S
0ce0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6e 75 6d  ELECT a FROM num
0cf0: 62 65 72 73 20 4f 52 44 45 52 20 42 59 20 61 3b  bers ORDER BY a;
0d00: 0a 20 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65  .  } {.    lappe
0d10: 6e 64 20 72 65 73 20 24 61 0a 20 20 20 20 69 66  nd res $a.    if
0d20: 20 7b 24 61 3d 3d 35 7d 20 7b 0a 20 20 20 20 20   {$a==5} {.     
0d30: 20 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41   execsql {ROLLBA
0d40: 43 4b 7d 20 64 62 31 0a 20 20 20 20 7d 0a 20 20  CK} db1.    }.  
0d50: 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 20 7b 31  }.  set res.} {1
0d60: 20 32 20 33 20 34 20 35 7d 0a 0a 64 62 31 20 63   2 3 4 5}..db1 c
0d70: 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a  lose.db2 close..
0d80: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 32 2d  do_test shared2-
0d90: 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  3.2 {.  sqlite3_
0da0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
0db0: 63 68 65 20 31 0a 7d 20 7b 31 7d 0a 0a 66 6f 72  che 1.} {1}..for
0dc0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
0dd0: 0a 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  ..sqlite3 db tes
0de0: 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 73 68 61  t.db.do_test sha
0df0: 72 65 64 32 2d 34 2e 31 20 7b 0a 20 20 65 78 65  red2-4.1 {.  exe
0e00: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0e10: 45 20 54 41 42 4c 45 20 74 30 28 61 2c 20 62 29  E TABLE t0(a, b)
0e20: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
0e30: 4c 45 20 74 31 28 61 2c 20 62 20 44 45 46 41 55  LE t1(a, b DEFAU
0e40: 4c 54 20 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27  LT 'hello world'
0e50: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 62 20 63  );.  }.} {}.db c
0e60: 6c 6f 73 65 0a 0a 73 71 6c 69 74 65 33 20 64 62  lose..sqlite3 db
0e70: 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33   test.db.sqlite3
0e80: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 0a 64 6f   db2 test.db..do
0e90: 5f 74 65 73 74 20 73 68 61 72 65 64 32 2d 34 2e  _test shared2-4.
0ea0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
0eb0: 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
0ec0: 20 74 30 20 7d 20 64 62 0a 20 20 65 78 65 63 73   t0 } db.  execs
0ed0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
0ee0: 20 74 31 28 61 29 20 56 41 4c 55 45 53 28 31 29   t1(a) VALUES(1)
0ef0: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 0a 64 6f 5f   } db2.} {}..do_
0f00: 74 65 73 74 20 73 68 61 72 65 64 32 2d 34 2e 33  test shared2-4.3
0f10: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
0f20: 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a   db close.} {}..
0f30: 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20  # At one point, 
0f40: 74 68 69 73 20 77 61 73 20 63 61 75 73 69 6e 67  this was causing
0f50: 20 61 20 63 72 61 73 68 2e 0a 23 0a 64 6f 5f 74   a crash..#.do_t
0f60: 65 73 74 20 73 68 61 72 65 64 32 2d 35 2e 31 20  est shared2-5.1 
0f70: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
0f80: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
0f90: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
0fa0: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
0fb0: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20 63  TABLE t2(a, b, c
0fc0: 29 20 7d 0a 20 20 0a 20 20 23 20 54 68 65 20 66  ) }.  .  # The f
0fd0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
0fe0: 6e 74 20 77 6f 75 6c 64 20 63 72 61 73 68 20 77  nt would crash w
0ff0: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
1000: 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
1010: 0a 20 20 23 20 61 20 70 6f 69 6e 74 65 72 20 61  .  # a pointer a
1020: 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 61 20  llocated from a 
1030: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
1040: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  ..  execsql { CR
1050: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1060: 20 74 32 28 61 29 20 7d 20 64 62 32 0a 7d 20 7b   t2(a) } db2.} {
1070: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  }..db close.db2 
1080: 63 6c 6f 73 65 0a 0a 23 20 54 68 65 20 66 6f 6c  close..# The fol
1090: 6c 6f 77 69 6e 67 20 74 65 73 74 20 76 65 72 69  lowing test veri
10a0: 66 69 65 73 20 74 68 61 74 20 73 68 61 72 65 64  fies that shared
10b0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 64 6f 65 73  -cache mode does
10c0: 20 6e 6f 74 20 61 75 74 6f 6d 61 74 69 63 61 6c   not automatical
10d0: 6c 79 0a 23 20 74 75 72 6e 20 6f 6e 20 65 78 63  ly.# turn on exc
10e0: 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d  lusive-locking m
10f0: 6f 64 65 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ode for some rea
1100: 73 6f 6e 2e 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  son..do_multicli
1110: 65 6e 74 5f 74 65 73 74 20 7b 74 6e 7d 20 7b 0a  ent_test {tn} {.
1120: 20 20 73 71 6c 31 20 7b 20 43 52 45 41 54 45 20    sql1 { CREATE 
1130: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 20 7d  TABLE t1(a, b) }
1140: 0a 20 20 73 71 6c 32 20 7b 20 43 52 45 41 54 45  .  sql2 { CREATE
1150: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 20   TABLE t2(a, b) 
1160: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  }.  do_test shar
1170: 65 64 32 2d 36 2e 24 74 6e 2e 31 20 7b 20 73 71  ed2-6.$tn.1 { sq
1180: 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l1 { SELECT * FR
1190: 4f 4d 20 74 32 20 7d 20 7d 20 7b 7d 0a 20 20 64  OM t2 } } {}.  d
11a0: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 32 2d 36  o_test shared2-6
11b0: 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20  .$tn.2 { sql2 { 
11c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
11d0: 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 73 71 6c 69 74   } } {}.}..sqlit
11e0: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
11f0: 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61 62 6c 65  _cache $::enable
1200: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 0a 66 69  _shared_cache.fi
1210: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.