/ Hex Artifact Content
Login

Artifact 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21:


0000: 23 20 32 30 31 32 20 4f 63 74 6f 62 65 72 20 35  # 2012 October 5
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 0a 23 0a 23 20 54 68 65 20 74  ******.#.# The t
0170: 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
0180: 65 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74  e are intended t
0190: 6f 20 73 68 6f 77 20 69 66 20 74 77 6f 20 63 6f  o show if two co
01a0: 6e 6e 65 63 74 69 6f 6e 73 20 61 74 74 61 63 68  nnections attach
01b0: 0a 23 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  .# to the same s
01c0: 68 61 72 65 64 20 63 61 63 68 65 20 75 73 69 6e  hared cache usin
01d0: 67 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61  g different data
01e0: 62 61 73 65 20 6e 61 6d 65 73 2c 20 76 69 65 77  base names, view
01f0: 73 20 61 6e 64 0a 23 20 76 69 72 74 75 61 6c 20  s and.# virtual 
0200: 74 61 62 6c 65 73 20 6d 61 79 20 73 74 69 6c 6c  tables may still
0210: 20 62 65 20 61 63 63 65 73 73 65 64 2e 0a 23 0a   be accessed..#.
0220: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0230: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0240: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0250: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f  ir/tester.tcl.so
0260: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 6c 6f  urce $testdir/lo
0270: 63 6b 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 65  ck_common.tcl.se
0280: 74 20 74 65 73 74 70 72 65 66 69 78 20 73 68 61  t testprefix sha
0290: 72 65 64 39 0a 0a 69 66 63 61 70 61 62 6c 65 20  red9..ifcapable 
02a0: 21 76 69 65 77 7c 7c 21 74 72 69 67 67 65 72 20  !view||!trigger 
02b0: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  {.  finish_test.
02c0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 62 20 63    return.}..db c
02d0: 6c 6f 73 65 0a 73 65 74 20 65 6e 61 62 6c 65 5f  lose.set enable_
02e0: 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b 73 71  shared_cache [sq
02f0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
0300: 72 65 64 5f 63 61 63 68 65 20 31 5d 0a 0a 73 71  red_cache 1]..sq
0310: 6c 69 74 65 33 20 64 62 31 20 74 65 73 74 2e 64  lite3 db1 test.d
0320: 62 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  b.sqlite3 db2 te
0330: 73 74 2e 64 62 0a 66 6f 72 63 65 64 65 6c 65 74  st.db.forcedelet
0340: 65 20 74 65 73 74 2e 64 62 32 0a 0a 64 6f 5f 74  e test.db2..do_t
0350: 65 73 74 20 31 2e 31 20 7b 0a 20 20 64 62 31 20  est 1.1 {.  db1 
0360: 65 76 61 6c 20 7b 0a 20 20 20 20 41 54 54 41 43  eval {.    ATTAC
0370: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
0380: 27 66 72 65 64 27 3b 0a 20 20 20 20 43 52 45 41  'fred';.    CREA
0390: 54 45 20 54 41 42 4c 45 20 66 72 65 64 2e 74 31  TE TABLE fred.t1
03a0: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  (a, b, c);.    C
03b0: 52 45 41 54 45 20 56 49 45 57 20 66 72 65 64 2e  REATE VIEW fred.
03c0: 76 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  v1 AS SELECT * F
03d0: 52 4f 4d 20 74 31 3b 0a 0a 20 20 20 20 43 52 45  ROM t1;..    CRE
03e0: 41 54 45 20 54 41 42 4c 45 20 66 72 65 64 2e 74  ATE TABLE fred.t
03f0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
0400: 41 54 45 20 54 41 42 4c 45 20 66 72 65 64 2e 74  ATE TABLE fred.t
0410: 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  3(a, b);.    CRE
0420: 41 54 45 20 54 52 49 47 47 45 52 20 66 72 65 64  ATE TRIGGER fred
0430: 2e 74 72 69 67 20 41 46 54 45 52 20 49 4e 53 45  .trig AFTER INSE
0440: 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20  RT ON t2 BEGIN. 
0450: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
0460: 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t3;.      INSER
0470: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
0480: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
0490: 45 4e 44 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  END;.    INSERT 
04a0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
04b0: 2c 20 32 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 2);.    SELECT
04c0: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a   * FROM t3;.  }.
04d0: 7d 20 7b 31 20 32 7d 0a 0a 64 6f 5f 74 65 73 74  } {1 2}..do_test
04e0: 20 31 2e 32 20 7b 20 64 62 32 20 65 76 61 6c 20   1.2 { db2 eval 
04f0: 22 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62  "ATTACH 'test.db
0500: 32 27 20 41 53 20 27 6a 6f 6e 65 73 27 22 20 7d  2' AS 'jones'" }
0510: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 33 20   {}.do_test 1.3 
0520: 7b 20 64 62 32 20 65 76 61 6c 20 22 53 45 4c 45  { db2 eval "SELE
0530: 43 54 20 2a 20 46 52 4f 4d 20 76 31 22 20 20 20  CT * FROM v1"   
0540: 20 20 20 20 20 20 20 20 20 20 7d 20 7b 7d 0a 64            } {}.d
0550: 6f 5f 74 65 73 74 20 31 2e 34 20 7b 20 64 62 32  o_test 1.4 { db2
0560: 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e   eval "INSERT IN
0570: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20  TO t2 VALUES(3, 
0580: 34 29 22 20 20 7d 20 7b 7d 0a 0a 69 66 63 61 70  4)"  } {}..ifcap
0590: 61 62 6c 65 20 66 74 73 33 20 7b 0a 20 20 64 6f  able fts3 {.  do
05a0: 5f 74 65 73 74 20 31 2e 35 20 7b 0a 20 20 20 20  _test 1.5 {.    
05b0: 64 62 31 20 65 76 61 6c 20 7b 0a 20 20 20 20 20  db1 eval {.     
05c0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
05d0: 54 41 42 4c 45 20 66 72 65 64 2e 74 34 20 55 53  TABLE fred.t4 US
05e0: 49 4e 47 20 66 74 73 34 3b 0a 20 20 20 20 20 20  ING fts4;.      
05f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
0600: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77 6f 72  ALUES('hello wor
0610: 6c 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  ld');.    }.  } 
0620: 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e  {}..  do_test 1.
0630: 36 20 7b 0a 20 20 20 20 64 62 32 20 65 76 61 6c  6 {.    db2 eval
0640: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
0650: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27  INTO t4 VALUES('
0660: 73 68 61 72 65 64 20 63 61 63 68 65 27 29 3b 0a  shared cache');.
0670: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
0680: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 74 34 20  ROM t4 WHERE t4 
0690: 4d 41 54 43 48 20 27 68 65 6c 6c 6f 27 3b 0a 20  MATCH 'hello';. 
06a0: 20 20 20 7d 0a 20 20 7d 20 7b 7b 68 65 6c 6c 6f     }.  } {{hello
06b0: 20 77 6f 72 6c 64 7d 7d 0a 0a 20 20 64 6f 5f 74   world}}..  do_t
06c0: 65 73 74 20 31 2e 37 20 7b 0a 20 20 20 20 64 62  est 1.7 {.    db
06d0: 31 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 53  1 eval {.      S
06e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20  ELECT * FROM t4 
06f0: 57 48 45 52 45 20 74 34 20 4d 41 54 43 48 20 27  WHERE t4 MATCH '
0700: 63 2a 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  c*';.    }.  } {
0710: 7b 73 68 61 72 65 64 20 63 61 63 68 65 7d 7d 0a  {shared cache}}.
0720: 7d 0a 0a 64 62 31 20 63 6c 6f 73 65 0a 64 62 32  }..db1 close.db2
0730: 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   close..#-------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0780: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
0790: 6e 67 20 74 65 73 74 73 20 61 74 74 65 6d 70 74  ng tests attempt
07a0: 20 74 6f 20 66 69 6e 64 20 61 20 73 69 6d 69 6c   to find a simil
07b0: 61 72 20 70 72 6f 62 6c 65 6d 20 77 69 74 68 20  ar problem with 
07c0: 63 6f 6c 6c 61 74 69 6f 6e 20 0a 23 20 73 65 71  collation .# seq
07d0: 75 65 6e 63 65 20 6e 61 6d 65 73 20 2d 20 70 6f  uence names - po
07e0: 69 6e 74 65 72 73 20 74 6f 20 64 61 74 61 62 61  inters to databa
07f0: 73 65 20 68 61 6e 64 6c 65 20 73 70 65 63 69 66  se handle specif
0800: 69 63 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6c  ic allocations l
0810: 65 61 6b 69 6e 67 20 0a 23 20 69 6e 74 6f 20 73  eaking .# into s
0820: 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 20 61 6e  chema objects an
0830: 64 20 62 65 69 6e 67 20 75 73 65 64 20 61 66 74  d being used aft
0840: 65 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  er the original 
0850: 68 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 0a  handle has been.
0860: 23 20 63 6c 6f 73 65 64 2e 0a 23 0a 66 6f 72 63  # closed..#.forc
0870: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
0880: 74 65 73 74 2e 64 62 32 0a 73 71 6c 69 74 65 33  test.db2.sqlite3
0890: 20 64 62 31 20 74 65 73 74 2e 64 62 0a 73 71 6c   db1 test.db.sql
08a0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
08b0: 0a 66 6f 72 65 61 63 68 20 78 20 7b 63 6f 6c 6c  .foreach x {coll
08c0: 61 74 65 31 20 63 6f 6c 6c 61 74 65 32 20 63 6f  ate1 collate2 co
08d0: 6c 6c 61 74 65 33 7d 20 7b 0a 20 20 70 72 6f 63  llate3} {.  proc
08e0: 20 24 78 20 7b 61 20 62 7d 20 7b 20 73 74 72 69   $x {a b} { stri
08f0: 6e 67 20 63 6f 6d 70 61 72 65 20 24 61 20 24 62  ng compare $a $b
0900: 20 7d 0a 20 20 64 62 31 20 63 6f 6c 6c 61 74 65   }.  db1 collate
0910: 20 24 78 20 24 78 0a 20 20 64 62 32 20 63 6f 6c   $x $x.  db2 col
0920: 6c 61 74 65 20 24 78 20 24 78 0a 7d 0a 64 6f 5f  late $x $x.}.do_
0930: 74 65 73 74 20 32 2e 31 20 7b 0a 20 20 64 62 31  test 2.1 {.  db1
0940: 20 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41   eval {.    CREA
0950: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0960: 2c 20 63 20 43 4f 4c 4c 41 54 45 20 63 6f 6c 6c  , c COLLATE coll
0970: 61 74 65 31 29 3b 0a 20 20 20 20 43 52 45 41 54  ate1);.    CREAT
0980: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
0990: 28 61 20 43 4f 4c 4c 41 54 45 20 63 6f 6c 6c 61  (a COLLATE colla
09a0: 74 65 32 2c 20 63 2c 20 62 29 3b 0a 20 20 7d 0a  te2, c, b);.  }.
09b0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 32 2e 32  } {}.do_test 2.2
09c0: 20 7b 0a 20 20 64 62 31 20 63 6c 6f 73 65 0a 20   {.  db1 close. 
09d0: 20 64 62 32 20 65 76 61 6c 20 22 49 4e 53 45 52   db2 eval "INSER
09e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09f0: 28 27 61 62 63 27 2c 20 27 64 65 66 27 2c 20 27  ('abc', 'def', '
0a00: 67 68 69 27 29 22 0a 7d 20 7b 7d 0a 64 62 32 20  ghi')".} {}.db2 
0a10: 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  close..#--------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  -.# At one point
0a70: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
0a80: 77 6f 75 6c 64 20 63 61 75 73 65 20 61 20 63 6f  would cause a co
0a90: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0aa0: 20 62 65 6c 6f 6e 67 69 6e 67 0a 23 20 74 6f 20   belonging.# to 
0ab0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 31 5d  connection [db1]
0ac0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 62   to be invoked b
0ad0: 79 20 61 20 63 61 6c 6c 20 74 6f 20 5b 64 62 32  y a call to [db2
0ae0: 20 65 76 61 6c 5d 2e 20 57 68 69 63 68 20 69 73   eval]. Which is
0af0: 20 61 0a 23 20 70 72 6f 62 6c 65 6d 20 69 66 20   a.# problem if 
0b00: 5b 64 62 31 5d 20 68 61 73 20 61 6c 72 65 61 64  [db1] has alread
0b10: 79 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 0a 23  y been closed..#
0b20: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
0b30: 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 73 71  t.db test.db2.sq
0b40: 6c 69 74 65 33 20 64 62 31 20 74 65 73 74 2e 64  lite3 db1 test.d
0b50: 62 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  b.sqlite3 db2 te
0b60: 73 74 2e 64 62 0a 0a 70 72 6f 63 20 6d 79 63 6f  st.db..proc myco
0b70: 6c 6c 61 74 65 5f 64 62 31 20 7b 61 20 62 7d 20  llate_db1 {a b} 
0b80: 7b 73 65 74 20 3a 3a 69 6e 76 6f 6b 65 64 5f 6d  {set ::invoked_m
0b90: 79 63 6f 6c 6c 61 74 65 5f 64 62 31 20 31 20 3b  ycollate_db1 1 ;
0ba0: 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20   string compare 
0bb0: 24 61 20 24 62 7d 0a 70 72 6f 63 20 6d 79 63 6f  $a $b}.proc myco
0bc0: 6c 6c 61 74 65 5f 64 62 32 20 7b 61 20 62 7d 20  llate_db2 {a b} 
0bd0: 7b 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20  {string compare 
0be0: 24 61 20 24 62 7d 0a 0a 64 62 31 20 63 6f 6c 6c  $a $b}..db1 coll
0bf0: 61 74 65 20 6d 79 63 6f 6c 6c 61 74 65 20 6d 79  ate mycollate my
0c00: 63 6f 6c 6c 61 74 65 5f 64 62 31 0a 64 62 32 20  collate_db1.db2 
0c10: 63 6f 6c 6c 61 74 65 20 6d 79 63 6f 6c 6c 61 74  collate mycollat
0c20: 65 20 6d 79 63 6f 6c 6c 61 74 65 5f 64 62 32 0a  e mycollate_db2.
0c30: 0a 64 6f 5f 74 65 73 74 20 32 2e 33 20 7b 0a 20  .do_test 2.3 {. 
0c40: 20 73 65 74 20 3a 3a 69 6e 76 6f 6b 65 64 5f 6d   set ::invoked_m
0c50: 79 63 6f 6c 6c 61 74 65 5f 64 62 31 20 30 0a 20  ycollate_db1 0. 
0c60: 20 64 62 31 20 65 76 61 6c 20 7b 0a 20 20 20 20   db1 eval {.    
0c70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0c80: 61 20 43 4f 4c 4c 41 54 45 20 6d 79 63 6f 6c 6c  a COLLATE mycoll
0c90: 61 74 65 2c 20 43 48 45 43 4b 20 28 61 20 49 4e  ate, CHECK (a IN
0ca0: 20 28 27 6f 6e 65 27 2c 20 27 74 77 6f 27 2c 20   ('one', 'two', 
0cb0: 27 74 68 72 65 65 27 29 29 29 3b 0a 20 20 20 20  'three')));.    
0cc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0cd0: 41 4c 55 45 53 28 27 6f 6e 65 27 29 3b 0a 20 20  ALUES('one');.  
0ce0: 7d 0a 20 20 64 62 31 20 63 6c 6f 73 65 0a 20 20  }.  db1 close.  
0cf0: 73 65 74 20 3a 3a 69 6e 76 6f 6b 65 64 5f 6d 79  set ::invoked_my
0d00: 63 6f 6c 6c 61 74 65 5f 64 62 31 0a 7d 20 7b 31  collate_db1.} {1
0d10: 7d 0a 64 6f 5f 74 65 73 74 20 32 2e 34 20 7b 0a  }.do_test 2.4 {.
0d20: 20 20 73 65 74 20 3a 3a 69 6e 76 6f 6b 65 64 5f    set ::invoked_
0d30: 6d 79 63 6f 6c 6c 61 74 65 5f 64 62 31 20 30 0a  mycollate_db1 0.
0d40: 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20    db2 eval {.   
0d50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0d60: 56 41 4c 55 45 53 28 27 74 77 6f 27 29 3b 0a 20  VALUES('two');. 
0d70: 20 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   }.  db2 close. 
0d80: 20 73 65 74 20 3a 3a 69 6e 76 6f 6b 65 64 5f 6d   set ::invoked_m
0d90: 79 63 6f 6c 6c 61 74 65 5f 64 62 31 0a 7d 20 7b  ycollate_db1.} {
0da0: 30 7d 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  0}..forcedelete 
0db0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32  test.db test.db2
0dc0: 0a 73 71 6c 69 74 65 33 20 64 62 31 20 74 65 73  .sqlite3 db1 tes
0dd0: 74 2e 64 62 0a 73 71 6c 69 74 65 33 20 64 62 32  t.db.sqlite3 db2
0de0: 20 74 65 73 74 2e 64 62 0a 64 62 31 20 63 6f 6c   test.db.db1 col
0df0: 6c 61 74 65 20 6d 79 63 6f 6c 6c 61 74 65 20 6d  late mycollate m
0e00: 79 63 6f 6c 6c 61 74 65 5f 64 62 31 0a 64 62 32  ycollate_db1.db2
0e10: 20 63 6f 6c 6c 61 74 65 20 6d 79 63 6f 6c 6c 61   collate mycolla
0e20: 74 65 20 6d 79 63 6f 6c 6c 61 74 65 5f 64 62 32  te mycollate_db2
0e30: 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 31 33 20 7b  ..do_test 2.13 {
0e40: 0a 20 20 73 65 74 20 3a 3a 69 6e 76 6f 6b 65 64  .  set ::invoked
0e50: 5f 6d 79 63 6f 6c 6c 61 74 65 5f 64 62 31 20 30  _mycollate_db1 0
0e60: 0a 20 20 64 62 31 20 65 76 61 6c 20 7b 0a 20 20  .  db1 eval {.  
0e70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0e80: 31 28 61 2c 20 43 48 45 43 4b 20 28 61 20 43 4f  1(a, CHECK (a CO
0e90: 4c 4c 41 54 45 20 6d 79 63 6f 6c 6c 61 74 65 20  LLATE mycollate 
0ea0: 49 4e 20 28 27 6f 6e 65 27 2c 20 27 74 77 6f 27  IN ('one', 'two'
0eb0: 2c 20 27 74 68 72 65 65 27 29 29 29 3b 0a 20 20  , 'three')));.  
0ec0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0ed0: 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 29 3b 0a   VALUES('one');.
0ee0: 20 20 7d 0a 20 20 64 62 31 20 63 6c 6f 73 65 0a    }.  db1 close.
0ef0: 20 20 73 65 74 20 3a 3a 69 6e 76 6f 6b 65 64 5f    set ::invoked_
0f00: 6d 79 63 6f 6c 6c 61 74 65 5f 64 62 31 0a 7d 20  mycollate_db1.} 
0f10: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 32 2e 31 34  {1}.do_test 2.14
0f20: 20 7b 0a 20 20 73 65 74 20 3a 3a 69 6e 76 6f 6b   {.  set ::invok
0f30: 65 64 5f 6d 79 63 6f 6c 6c 61 74 65 5f 64 62 31  ed_mycollate_db1
0f40: 20 30 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a   0.  db2 eval {.
0f50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0f60: 74 31 20 56 41 4c 55 45 53 28 27 74 77 6f 27 29  t1 VALUES('two')
0f70: 3b 0a 20 20 7d 0a 20 20 64 62 32 20 63 6c 6f 73  ;.  }.  db2 clos
0f80: 65 0a 20 20 73 65 74 20 3a 3a 69 6e 76 6f 6b 65  e.  set ::invoke
0f90: 64 5f 6d 79 63 6f 6c 6c 61 74 65 5f 64 62 31 0a  d_mycollate_db1.
0fa0: 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  } {0}..#--------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 0a 23 20 54 68 69 73 20 74 65 73 74 20 76 65  -.# This test ve
1000: 72 69 66 69 65 73 20 74 68 61 74 20 61 20 62 75  rifies that a bu
1010: 67 20 63 61 75 73 69 6e 67 20 61 20 62 75 73 79  g causing a busy
1020: 2d 68 61 6e 64 6c 65 72 20 62 65 6c 6f 6e 67 69  -handler belongi
1030: 6e 67 20 74 6f 20 6f 6e 65 0a 23 20 73 68 61 72  ng to one.# shar
1040: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
1050: 69 6f 6e 20 74 6f 20 62 65 20 65 78 65 63 75 74  ion to be execut
1060: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
1070: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 65  f an sqlite3_ste
1080: 70 28 29 0a 23 20 6f 6e 20 61 6e 6f 74 68 65 72  p().# on another
1090: 20 68 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e   has been fixed.
10a0: 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .#.forcedelete t
10b0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a  est.db test.db2.
10c0: 73 71 6c 69 74 65 33 20 64 62 31 20 74 65 73 74  sqlite3 db1 test
10d0: 2e 64 62 0a 73 71 6c 69 74 65 33 20 64 62 32 20  .db.sqlite3 db2 
10e0: 74 65 73 74 2e 64 62 0a 0a 70 72 6f 63 20 62 75  test.db..proc bu
10f0: 73 79 68 61 6e 64 6c 65 72 20 7b 68 61 6e 64 6c  syhandler {handl
1100: 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20  e args} {.  set 
1110: 3a 3a 62 75 73 79 68 61 6e 64 6c 65 72 5f 69 6e  ::busyhandler_in
1120: 76 6f 6b 65 64 5f 66 6f 72 20 24 68 61 6e 64 6c  voked_for $handl
1130: 65 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64  e.  return 1.}.d
1140: 62 31 20 62 75 73 79 20 5b 6c 69 73 74 20 62 75  b1 busy [list bu
1150: 73 79 68 61 6e 64 6c 65 72 20 64 62 31 5d 0a 64  syhandler db1].d
1160: 62 32 20 62 75 73 79 20 5b 6c 69 73 74 20 62 75  b2 busy [list bu
1170: 73 79 68 61 6e 64 6c 65 72 20 64 62 32 5d 0a 0a  syhandler db2]..
1180: 64 6f 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20  do_test 3.1 {.  
1190: 64 62 31 20 65 76 61 6c 20 7b 0a 20 20 20 20 42  db1 eval {.    B
11a0: 45 47 49 4e 3b 20 0a 20 20 20 20 20 20 43 52 45  EGIN; .      CRE
11b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
11c0: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
11d0: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
11e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
11f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1200: 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2);.      INSERT
1210: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1220: 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 23 20 4b  1, 2);.  }.  # K
1230: 65 65 70 20 74 68 69 73 20 6e 65 78 74 20 43 4f  eep this next CO
1240: 4d 4d 49 54 20 61 73 20 61 20 73 65 70 61 72 61  MMIT as a separa
1250: 74 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  te statement. Th
1260: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
1270: 43 4f 4d 4d 49 54 0a 20 20 23 20 68 61 73 20 61  COMMIT.  # has a
1280: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70  lready been comp
1290: 69 6c 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 20  iled and loaded 
12a0: 69 6e 74 6f 20 74 68 65 20 74 63 6c 20 69 6e 74  into the tcl int
12b0: 65 72 66 61 63 65 20 73 74 61 74 65 6d 65 6e 74  erface statement
12c0: 20 0a 20 20 23 20 63 61 63 68 65 20 77 68 65 6e   .  # cache when
12d0: 20 69 74 20 69 73 20 61 74 74 65 6d 70 74 65 64   it is attempted
12e0: 20 62 65 6c 6f 77 2e 0a 20 20 64 62 31 20 65 76   below..  db1 ev
12f0: 61 6c 20 43 4f 4d 4d 49 54 0a 20 20 64 62 31 20  al COMMIT.  db1 
1300: 65 76 61 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  eval {.    BEGIN
1310: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1320: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
1330: 20 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64   4);.  }.} {}..d
1340: 6f 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20 20 73  o_test 3.2 {.  s
1350: 65 74 20 3a 3a 74 66 20 5b 6c 61 75 6e 63 68 5f  et ::tf [launch_
1360: 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20 20 74  testfixture].  t
1370: 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a 74 66  estfixture $::tf
1380: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
1390: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 64 62  b test.db.    db
13a0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 42 45   eval {.      BE
13b0: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  GIN;.        SEL
13c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
13d0: 20 20 20 7d 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d     }.  }.} {1 2}
13e0: 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 33 20 7b 0a  ..do_test 3.3 {.
13f0: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 53 45 4c    db2 eval { SEL
1400: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a  ECT * FROM t2 }.
1410: 7d 20 7b 31 20 32 7d 0a 0a 64 6f 5f 74 65 73 74  } {1 2}..do_test
1420: 20 33 2e 34 20 7b 0a 20 20 6c 69 73 74 20 5b 63   3.4 {.  list [c
1430: 61 74 63 68 20 7b 20 64 62 31 20 65 76 61 6c 20  atch { db1 eval 
1440: 43 4f 4d 4d 49 54 20 7d 20 6d 73 67 5d 20 24 6d  COMMIT } msg] $m
1450: 73 67 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  sg.} {1 {databas
1460: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 23  e is locked}}..#
1470: 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
1480: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 6f 75 6c  e following woul
1490: 64 20 66 61 69 6c 2c 20 73 68 6f 77 69 6e 67 20  d fail, showing 
14a0: 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
14b0: 6e 64 6c 65 72 0a 23 20 62 65 6c 6f 6e 67 69 6e  ndler.# belongin
14c0: 67 20 74 6f 20 5b 64 62 32 5d 20 77 61 73 20 69  g to [db2] was i
14d0: 6e 76 6f 6b 65 64 20 69 6e 73 74 65 61 64 2e 0a  nvoked instead..
14e0: 64 6f 5f 74 65 73 74 20 33 2e 35 20 7b 0a 20 20  do_test 3.5 {.  
14f0: 73 65 74 20 3a 3a 62 75 73 79 68 61 6e 64 6c 65  set ::busyhandle
1500: 72 5f 69 6e 76 6f 6b 65 64 5f 66 6f 72 0a 7d 20  r_invoked_for.} 
1510: 7b 64 62 31 7d 0a 64 6f 5f 74 65 73 74 20 33 2e  {db1}.do_test 3.
1520: 36 20 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 74  6 {.  close $::t
1530: 66 0a 20 20 64 62 31 20 65 76 61 6c 20 43 4f 4d  f.  db1 eval COM
1540: 4d 49 54 0a 7d 20 7b 7d 0a 20 20 0a 64 62 31 20  MIT.} {}.  .db1 
1550: 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a  close.db2 close.
1560: 0a 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  .sqlite3_enable_
1570: 73 68 61 72 65 64 5f 63 61 63 68 65 20 24 3a 3a  shared_cache $::
1580: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
1590: 63 68 65 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  che.finish_test.