/ Hex Artifact Content
Login

Artifact d6ba4ca1827ea36a1ac23a99e3c36eeac9165450:


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: 64 62 20 63 6c 6f 73 65 0a 0a 69 66 63 61 70 61  db close..ifcapa
01f0: 62 6c 65 20 21 73 68 61 72 65 64 5f 63 61 63 68  ble !shared_cach
0200: 65 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73  e {.  finish_tes
0210: 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 73 65 74  t.  return.}.set
0220: 20 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72 65 64   ::enable_shared
0230: 5f 63 61 63 68 65 20 5b 73 71 6c 69 74 65 33 5f  _cache [sqlite3_
0240: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
0250: 63 68 65 20 31 5d 0a 0a 23 20 54 65 73 74 20 74  che 1]..# Test t
0260: 68 61 74 20 69 66 20 77 65 20 64 65 6c 65 74 65  hat if we delete
0270: 20 61 6c 6c 20 72 6f 77 73 20 66 72 6f 6d 20 61   all rows from a
0280: 20 74 61 62 6c 65 20 61 6e 79 20 72 65 61 64 2d   table any read-
0290: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 0a 23 20 63  uncommitted .# c
02a0: 75 72 73 6f 72 73 20 61 72 65 20 63 6f 72 72 65  ursors are corre
02b0: 63 74 6c 79 20 69 6e 76 61 6c 69 64 61 74 65 64  ctly invalidated
02c0: 2e 20 54 65 73 74 20 6f 6e 20 62 6f 74 68 20 74  . Test on both t
02d0: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 62  able and index b
02e0: 74 72 65 65 73 2e 0a 64 6f 5f 74 65 73 74 20 73  trees..do_test s
02f0: 68 61 72 65 64 32 2d 31 2e 31 20 7b 0a 20 20 73  hared2-1.1 {.  s
0300: 71 6c 69 74 65 33 20 64 62 31 20 74 65 73 74 2e  qlite3 db1 test.
0310: 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  db.  sqlite3 db2
0320: 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 53 65   test.db..  # Se
0330: 74 20 75 70 20 73 6f 6d 65 20 64 61 74 61 2e 20  t up some data. 
0340: 54 61 62 6c 65 20 22 6e 75 6d 62 65 72 73 22 20  Table "numbers" 
0350: 68 61 73 20 36 34 20 72 6f 77 73 20 61 66 74 65  has 64 rows afte
0360: 72 20 74 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20  r this block .  
0370: 23 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  # is executed.. 
0380: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0390: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
03a0: 20 54 41 42 4c 45 20 6e 75 6d 62 65 72 73 28 61   TABLE numbers(a
03b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
03c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
03d0: 4f 20 6e 75 6d 62 65 72 73 28 6f 69 64 29 20 56  O numbers(oid) V
03e0: 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20  ALUES(NULL);.   
03f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 75 6d   INSERT INTO num
0400: 62 65 72 73 28 6f 69 64 29 20 53 45 4c 45 43 54  bers(oid) SELECT
0410: 20 4e 55 4c 4c 20 46 52 4f 4d 20 6e 75 6d 62 65   NULL FROM numbe
0420: 72 73 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  rs;.    INSERT I
0430: 4e 54 4f 20 6e 75 6d 62 65 72 73 28 6f 69 64 29  NTO numbers(oid)
0440: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f   SELECT NULL FRO
0450: 4d 20 6e 75 6d 62 65 72 73 3b 0a 20 20 20 20 49  M numbers;.    I
0460: 4e 53 45 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65  NSERT INTO numbe
0470: 72 73 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e  rs(oid) SELECT N
0480: 55 4c 4c 20 46 52 4f 4d 20 6e 75 6d 62 65 72 73  ULL FROM numbers
0490: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
04a0: 4f 20 6e 75 6d 62 65 72 73 28 6f 69 64 29 20 53  O numbers(oid) S
04b0: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
04c0: 6e 75 6d 62 65 72 73 3b 0a 20 20 20 20 49 4e 53  numbers;.    INS
04d0: 45 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73  ERT INTO numbers
04e0: 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c  (oid) SELECT NUL
04f0: 4c 20 46 52 4f 4d 20 6e 75 6d 62 65 72 73 3b 0a  L FROM numbers;.
0500: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0510: 6e 75 6d 62 65 72 73 28 6f 69 64 29 20 53 45 4c  numbers(oid) SEL
0520: 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 6e 75  ECT NULL FROM nu
0530: 6d 62 65 72 73 3b 0a 20 20 20 20 55 50 44 41 54  mbers;.    UPDAT
0540: 45 20 6e 75 6d 62 65 72 73 20 73 65 74 20 61 20  E numbers set a 
0550: 3d 20 6f 69 64 2c 20 62 20 3d 20 27 61 62 63 64  = oid, b = 'abcd
0560: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
0570: 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39  uvwxyz0123456789
0580: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
0590: 20 7d 20 64 62 31 0a 7d 20 7b 7d 0a 64 6f 5f 74   } db1.} {}.do_t
05a0: 65 73 74 20 73 68 61 72 65 64 32 2d 31 2e 32 20  est shared2-1.2 
05b0: 7b 0a 20 20 23 20 50 75 74 20 63 6f 6e 6e 65 63  {.  # Put connec
05c0: 74 69 6f 6e 20 32 20 69 6e 20 72 65 61 64 2d 75  tion 2 in read-u
05d0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
05e0: 61 6e 64 20 73 74 61 72 74 20 61 20 53 45 4c 45  and start a SELE
05f0: 43 54 20 6f 6e 20 74 61 62 6c 65 20 0a 20 20 23  CT on table .  #
0600: 20 27 6e 75 6d 62 65 72 73 27 2e 20 48 61 6c 66   'numbers'. Half
0610: 20 77 61 79 20 74 68 72 6f 75 67 68 20 74 68 65   way through the
0620: 20 53 45 4c 45 43 54 2c 20 75 73 65 20 63 6f 6e   SELECT, use con
0630: 6e 65 63 74 69 6f 6e 20 31 20 74 6f 20 64 65 6c  nection 1 to del
0640: 65 74 65 20 74 68 65 0a 20 20 23 20 63 6f 6e 74  ete the.  # cont
0650: 65 6e 74 73 20 6f 66 20 74 68 69 73 20 74 61 62  ents of this tab
0660: 6c 65 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  le..  execsql {.
0670: 20 20 20 20 70 72 61 67 6d 61 20 72 65 61 64 5f      pragma read_
0680: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b  uncommitted = 1;
0690: 0a 20 20 7d 20 64 62 32 0a 20 20 73 65 74 20 63  .  } db2.  set c
06a0: 6f 75 6e 74 20 5b 65 78 65 63 73 71 6c 20 7b 53  ount [execsql {S
06b0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
06c0: 52 4f 4d 20 6e 75 6d 62 65 72 73 7d 20 64 62 32  ROM numbers} db2
06d0: 5d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45  ].  db2 eval {SE
06e0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 6e 75 6d 62  LECT a FROM numb
06f0: 65 72 73 20 4f 52 44 45 52 20 42 59 20 6f 69 64  ers ORDER BY oid
0700: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 61 3d 3d  } {.    if {$a==
0710: 33 32 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63  32} {.      exec
0720: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42 45  sql {.        BE
0730: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 44 45 4c  GIN;.        DEL
0740: 45 54 45 20 46 52 4f 4d 20 6e 75 6d 62 65 72 73  ETE FROM numbers
0750: 3b 0a 20 20 20 20 20 20 7d 20 64 62 31 0a 20 20  ;.      } db1.  
0760: 20 20 7d 0a 20 20 7d 0a 20 20 6c 69 73 74 20 24    }.  }.  list $
0770: 61 20 24 63 6f 75 6e 74 0a 7d 20 7b 33 32 20 36  a $count.} {32 6
0780: 34 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  4}.do_test share
0790: 64 32 2d 31 2e 33 20 7b 0a 20 20 23 20 53 61 6d  d2-1.3 {.  # Sam
07a0: 65 20 74 65 73 74 20 61 73 20 31 2e 32 2c 20 65  e test as 1.2, e
07b0: 78 63 65 70 74 20 73 63 61 6e 20 75 73 69 6e 67  xcept scan using
07c0: 20 74 68 65 20 69 6e 64 65 78 20 74 68 69 73 20   the index this 
07d0: 74 69 6d 65 2e 0a 20 20 65 78 65 63 73 71 6c 20  time..  execsql 
07e0: 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  {.    ROLLBACK;.
07f0: 20 20 7d 20 64 62 31 0a 20 20 73 65 74 20 63 6f    } db1.  set co
0800: 75 6e 74 20 5b 65 78 65 63 73 71 6c 20 7b 53 45  unt [execsql {SE
0810: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
0820: 4f 4d 20 6e 75 6d 62 65 72 73 7d 20 64 62 32 5d  OM numbers} db2]
0830: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45 4c  .  db2 eval {SEL
0840: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6e 75  ECT a, b FROM nu
0850: 6d 62 65 72 73 20 4f 52 44 45 52 20 42 59 20 61  mbers ORDER BY a
0860: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 61 3d 3d  } {.    if {$a==
0870: 33 32 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63  32} {.      exec
0880: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 44 45  sql {.        DE
0890: 4c 45 54 45 20 46 52 4f 4d 20 6e 75 6d 62 65 72  LETE FROM number
08a0: 73 3b 0a 20 20 20 20 20 20 7d 20 64 62 31 0a 20  s;.      } db1. 
08b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 69 73 74 20     }.  }.  list 
08c0: 24 61 20 24 63 6f 75 6e 74 0a 7d 20 7b 33 32 20  $a $count.} {32 
08d0: 36 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  64}..#----------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 0a 23 20 54 68 65 73 65 20 74 65 73 74 73 2c  -.# These tests,
0930: 20 73 68 61 72 65 64 32 2e 32 2e 2a 2c 20 74 65   shared2.2.*, te
0940: 73 74 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 77  st the outcome w
0950: 68 65 6e 20 64 61 74 61 20 69 73 20 61 64 64 65  hen data is adde
0960: 64 20 74 6f 20 6f 72 20 0a 23 20 72 65 6d 6f 76  d to or .# remov
0970: 65 64 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  ed from a table 
0980: 64 75 65 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63  due to a rollbac
0990: 6b 20 77 68 69 6c 65 20 61 20 72 65 61 64 2d 75  k while a read-u
09a0: 6e 63 6f 6d 6d 69 74 74 65 64 20 0a 23 20 63 75  ncommitted .# cu
09b0: 72 73 6f 72 20 69 73 20 73 63 61 6e 6e 69 6e 67  rsor is scanning
09c0: 20 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73   it..#.do_test s
09d0: 68 61 72 65 64 32 2d 32 2e 31 20 7b 0a 20 20 65  hared2-2.1 {.  e
09e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
09f0: 45 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73  ERT INTO numbers
0a00: 20 56 41 4c 55 45 53 28 31 2c 20 27 4d 65 64 69   VALUES(1, 'Medi
0a10: 75 6d 20 6c 65 6e 67 74 68 20 74 65 78 74 20 66  um length text f
0a20: 69 65 6c 64 27 29 3b 0a 20 20 20 20 49 4e 53 45  ield');.    INSE
0a30: 52 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73 20  RT INTO numbers 
0a40: 56 41 4c 55 45 53 28 32 2c 20 27 4d 65 64 69 75  VALUES(2, 'Mediu
0a50: 6d 20 6c 65 6e 67 74 68 20 74 65 78 74 20 66 69  m length text fi
0a60: 65 6c 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  eld');.    INSER
0a70: 54 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73 20 56  T INTO numbers V
0a80: 41 4c 55 45 53 28 33 2c 20 27 4d 65 64 69 75 6d  ALUES(3, 'Medium
0a90: 20 6c 65 6e 67 74 68 20 74 65 78 74 20 66 69 65   length text fie
0aa0: 6c 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ld');.    INSERT
0ab0: 20 49 4e 54 4f 20 6e 75 6d 62 65 72 73 20 56 41   INTO numbers VA
0ac0: 4c 55 45 53 28 34 2c 20 27 4d 65 64 69 75 6d 20  LUES(4, 'Medium 
0ad0: 6c 65 6e 67 74 68 20 74 65 78 74 20 66 69 65 6c  length text fiel
0ae0: 64 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  d');.    BEGIN;.
0af0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0b00: 6e 75 6d 62 65 72 73 20 57 48 45 52 45 20 28 61  numbers WHERE (a
0b10: 25 32 29 3d 30 3b 0a 20 20 7d 20 64 62 31 0a 20  %2)=0;.  } db1. 
0b20: 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a   set res [list].
0b30: 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20    db2 eval {.   
0b40: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6e   SELECT a FROM n
0b50: 75 6d 62 65 72 73 20 4f 52 44 45 52 20 42 59 20  umbers ORDER BY 
0b60: 61 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 6c 61 70  a;.  } {.    lap
0b70: 70 65 6e 64 20 72 65 73 20 24 61 0a 20 20 20 20  pend res $a.    
0b80: 69 66 20 7b 24 61 3d 3d 33 7d 20 7b 0a 20 20 20  if {$a==3} {.   
0b90: 20 20 20 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c     execsql {ROLL
0ba0: 42 41 43 4b 7d 20 64 62 31 0a 20 20 20 20 7d 0a  BACK} db1.    }.
0bb0: 20 20 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 20    }.  set res.} 
0bc0: 7b 31 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20  {1 3 4}.do_test 
0bd0: 73 68 61 72 65 64 32 2d 32 2e 32 20 7b 0a 20 20  shared2-2.2 {.  
0be0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
0bf0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
0c00: 49 4e 54 4f 20 6e 75 6d 62 65 72 73 20 56 41 4c  INTO numbers VAL
0c10: 55 45 53 28 35 2c 20 27 4d 65 64 69 75 6d 20 6c  UES(5, 'Medium l
0c20: 65 6e 67 74 68 20 74 65 78 74 20 66 69 65 6c 64  ength text field
0c30: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
0c40: 4e 54 4f 20 6e 75 6d 62 65 72 73 20 56 41 4c 55  NTO numbers VALU
0c50: 45 53 28 36 2c 20 27 4d 65 64 69 75 6d 20 6c 65  ES(6, 'Medium le
0c60: 6e 67 74 68 20 74 65 78 74 20 66 69 65 6c 64 27  ngth text field'
0c70: 29 3b 0a 20 20 7d 20 64 62 31 0a 20 20 73 65 74  );.  } db1.  set
0c80: 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 64 62   res [list].  db
0c90: 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  2 eval {.    SEL
0ca0: 45 43 54 20 61 20 46 52 4f 4d 20 6e 75 6d 62 65  ECT a FROM numbe
0cb0: 72 73 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20  rs ORDER BY a;. 
0cc0: 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64   } {.    lappend
0cd0: 20 72 65 73 20 24 61 0a 20 20 20 20 69 66 20 7b   res $a.    if {
0ce0: 24 61 3d 3d 35 7d 20 7b 0a 20 20 20 20 20 20 65  $a==5} {.      e
0cf0: 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b  xecsql {ROLLBACK
0d00: 7d 20 64 62 31 0a 20 20 20 20 7d 0a 20 20 7d 0a  } db1.    }.  }.
0d10: 20 20 73 65 74 20 72 65 73 0a 7d 20 7b 31 20 32    set res.} {1 2
0d20: 20 33 20 34 20 35 7d 0a 0a 64 62 31 20 63 6c 6f   3 4 5}..db1 clo
0d30: 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f  se.db2 close..do
0d40: 5f 74 65 73 74 20 73 68 61 72 65 64 32 2d 33 2e  _test shared2-3.
0d50: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  2 {.  sqlite3_en
0d60: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
0d70: 65 20 31 0a 7d 20 7b 31 7d 0a 0a 66 69 6c 65 20  e 1.} {1}..file 
0d80: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
0d90: 73 74 2e 64 62 0a 0a 73 71 6c 69 74 65 33 20 64  st.db..sqlite3 d
0da0: 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73  b test.db.do_tes
0db0: 74 20 73 68 61 72 65 64 32 2d 34 2e 31 20 7b 0a  t shared2-4.1 {.
0dc0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0dd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28  CREATE TABLE t0(
0de0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
0df0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20  E TABLE t1(a, b 
0e00: 44 45 46 41 55 4c 54 20 27 68 65 6c 6c 6f 20 77  DEFAULT 'hello w
0e10: 6f 72 6c 64 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  orld');.  }.} {}
0e20: 0a 64 62 20 63 6c 6f 73 65 0a 0a 73 71 6c 69 74  .db close..sqlit
0e30: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73 71  e3 db test.db.sq
0e40: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
0e50: 62 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65  b..do_test share
0e60: 64 32 2d 34 2e 32 20 7b 0a 20 20 65 78 65 63 73  d2-4.2 {.  execs
0e70: 71 6c 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62  ql { SELECT a, b
0e80: 20 46 52 4f 4d 20 74 30 20 7d 20 64 62 0a 20 20   FROM t0 } db.  
0e90: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0ea0: 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55   INTO t1(a) VALU
0eb0: 45 53 28 31 29 20 7d 20 64 62 32 0a 7d 20 7b 7d  ES(1) } db2.} {}
0ec0: 0a 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  ..do_test shared
0ed0: 32 2d 34 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c  2-4.3 {.  db2 cl
0ee0: 6f 73 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d  ose.  db close.}
0ef0: 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e 65 20 70 6f   {}..# At one po
0f00: 69 6e 74 2c 20 74 68 69 73 20 77 61 73 20 63 61  int, this was ca
0f10: 75 73 69 6e 67 20 61 20 63 72 61 73 68 2e 0a 23  using a crash..#
0f20: 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 32  .do_test shared2
0f30: 2d 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  -5.1 {.  sqlite3
0f40: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71   db test.db.  sq
0f50: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
0f60: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  b.  execsql { CR
0f70: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
0f80: 20 62 2c 20 63 29 20 7d 0a 20 20 0a 20 20 23 20   b, c) }.  .  # 
0f90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
0fa0: 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 63 72  atement would cr
0fb0: 61 73 68 20 77 68 65 6e 20 61 74 74 65 6d 70 74  ash when attempt
0fc0: 69 6e 67 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ing to sqlite3_f
0fd0: 72 65 65 28 29 0a 20 20 23 20 61 20 70 6f 69 6e  ree().  # a poin
0fe0: 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 66 72  ter allocated fr
0ff0: 6f 6d 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 62  om a lookaside b
1000: 75 66 66 65 72 2e 0a 20 20 65 78 65 63 73 71 6c  uffer..  execsql
1010: 20 7b 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   { CREATE INDEX 
1020: 69 31 20 4f 4e 20 74 32 28 61 29 20 7d 20 64 62  i1 ON t2(a) } db
1030: 32 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65  2.} {}..db close
1040: 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 73 71 6c 69  .db2 close..sqli
1050: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
1060: 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61 62 6c  d_cache $::enabl
1070: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 0a 66  e_shared_cache.f
1080: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.