/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 72529edb04115675894a7399609983ea46b73ba6:


0000: 23 20 32 30 30 33 20 41 70 72 69 6c 20 34 0a 23  # 2003 April 4.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  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 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 73 63 72 69 70 74 20 69 73 20   this script is 
01c0: 74 65 73 74 69 6e 67 20 74 68 65 20 41 54 54 41  testing the ATTA
01d0: 43 48 20 61 6e 64 20 44 45 54 41 43 48 20 63 6f  CH and DETACH co
01e0: 6d 6d 61 6e 64 73 0a 23 20 61 6e 64 20 72 65 6c  mmands.# and rel
01f0: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 61 6c 69  ated functionali
0200: 74 79 2e 0a 23 0a 23 20 24 49 64 3a 20 61 74 74  ty..#.# $Id: att
0210: 61 63 68 2e 74 65 73 74 2c 76 20 31 2e 34 37 20  ach.test,v 1.47 
0220: 32 30 30 37 2f 31 30 2f 30 39 20 30 38 3a 32 39  2007/10/09 08:29
0230: 3a 33 32 20 64 61 6e 69 65 6c 6b 31 39 37 37 20  :32 danielk1977 
0240: 45 78 70 20 24 0a 23 0a 0a 73 65 74 20 74 65 73  Exp $.#..set tes
0250: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0260: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0270: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0280: 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c 65  r.tcl..ifcapable
0290: 20 21 61 74 74 61 63 68 20 7b 0a 20 20 66 69 6e   !attach {.  fin
02a0: 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72  ish_test.  retur
02b0: 6e 0a 7d 0a 0a 66 6f 72 20 7b 73 65 74 20 69 20  n.}..for {set i 
02c0: 32 7d 20 7b 24 69 3c 3d 31 35 7d 20 7b 69 6e 63  2} {$i<=15} {inc
02d0: 72 20 69 7d 20 7b 0a 20 20 66 69 6c 65 20 64 65  r i} {.  file de
02e0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
02f0: 24 69 2e 64 62 0a 20 20 66 69 6c 65 20 64 65 6c  $i.db.  file del
0300: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 24  ete -force test$
0310: 69 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 0a 0a  i.db-journal.}..
0320: 73 65 74 20 62 74 72 65 65 5f 74 72 61 63 65 20  set btree_trace 
0330: 30 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  0.do_test attach
0340: 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.1 {.  execsql
0350: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
0360: 42 4c 45 20 74 31 28 61 2c 62 29 3b 0a 20 20 20  BLE t1(a,b);.   
0370: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0380: 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20  VALUES(1,2);.   
0390: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
03a0: 56 41 4c 55 45 53 28 33 2c 34 29 3b 0a 20 20 20  VALUES(3,4);.   
03b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
03c0: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  1;.  }.} {1 2 3 
03d0: 34 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  4}.do_test attac
03e0: 68 2d 31 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  h-1.2 {.  sqlite
03f0: 33 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20  3 db2 test2.db. 
0400: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
0410: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
0420: 2c 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,y);.    INSERT 
0430: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
0440: 2c 27 78 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ,'x');.    INSER
0450: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
0460: 28 32 2c 27 79 27 29 3b 0a 20 20 20 20 53 45 4c  (2,'y');.    SEL
0470: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
0480: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 78 20 32 20   } db2.} {1 x 2 
0490: 79 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  y}.do_test attac
04a0: 68 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  h-1.3 {.  execsq
04b0: 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 44  l {.    ATTACH D
04c0: 41 54 41 42 41 53 45 20 27 74 65 73 74 32 2e 64  ATABASE 'test2.d
04d0: 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 53  b' AS two;.    S
04e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
04f0: 2e 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 20  .t2;.  }.} {1 x 
0500: 32 20 79 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74  2 y}.do_test att
0510: 61 63 68 2d 31 2e 34 20 7b 0a 20 20 65 78 65 63  ach-1.4 {.  exec
0520: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
0530: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
0540: 7d 20 7b 31 20 78 20 32 20 79 7d 0a 64 6f 5f 74  } {1 x 2 y}.do_t
0550: 65 73 74 20 61 74 74 61 63 68 2d 31 2e 35 20 7b  est attach-1.5 {
0560: 0a 62 74 72 65 65 5f 62 72 65 61 6b 70 6f 69 6e  .btree_breakpoin
0570: 74 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  t.  execsql {.  
0580: 20 20 44 45 54 41 43 48 20 44 41 54 41 42 41 53    DETACH DATABAS
0590: 45 20 74 77 6f 3b 0a 20 20 20 20 53 45 4c 45 43  E two;.    SELEC
05a0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
05b0: 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f  .} {1 2 3 4}.do_
05c0: 74 65 73 74 20 61 74 74 61 63 68 2d 31 2e 36 20  test attach-1.6 
05d0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
05e0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
05f0: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e   t2;.  }.} {1 {n
0600: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 74 32  o such table: t2
0610: 7d 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  }}.do_test attac
0620: 68 2d 31 2e 37 20 7b 0a 20 20 63 61 74 63 68 73  h-1.7 {.  catchs
0630: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0640: 2a 20 46 52 4f 4d 20 74 77 6f 2e 74 32 3b 0a 20  * FROM two.t2;. 
0650: 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68   }.} {1 {no such
0660: 20 74 61 62 6c 65 3a 20 74 77 6f 2e 74 32 7d 7d   table: two.t2}}
0670: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d  .do_test attach-
0680: 31 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.8 {.  catchsql
0690: 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 44 41   {.    ATTACH DA
06a0: 54 41 42 41 53 45 20 27 74 65 73 74 33 2e 64 62  TABASE 'test3.db
06b0: 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20 7d 0a  ' AS three;.  }.
06c0: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
06d0: 20 61 74 74 61 63 68 2d 31 2e 39 20 7b 0a 20 20   attach-1.9 {.  
06e0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
06f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 68 72  ELECT * FROM thr
0700: 65 65 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ee.sqlite_master
0710: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64  ;.  }.} {0 {}}.d
0720: 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 31 2e  o_test attach-1.
0730: 31 30 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  10 {.  catchsql 
0740: 7b 0a 20 20 20 20 44 45 54 41 43 48 20 44 41 54  {.    DETACH DAT
0750: 41 42 41 53 45 20 5b 74 68 72 65 65 5d 3b 0a 20  ABASE [three];. 
0760: 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74   }.} {0 {}}.do_t
0770: 65 73 74 20 61 74 74 61 63 68 2d 31 2e 31 31 20  est attach-1.11 
0780: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0790: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
07a0: 62 27 20 41 53 20 64 62 32 3b 0a 20 20 20 20 41  b' AS db2;.    A
07b0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 27 20  TTACH 'test.db' 
07c0: 41 53 20 64 62 33 3b 0a 20 20 20 20 41 54 54 41  AS db3;.    ATTA
07d0: 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53 20  CH 'test.db' AS 
07e0: 64 62 34 3b 0a 20 20 20 20 41 54 54 41 43 48 20  db4;.    ATTACH 
07f0: 27 74 65 73 74 2e 64 62 27 20 41 53 20 64 62 35  'test.db' AS db5
0800: 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  ;.    ATTACH 'te
0810: 73 74 2e 64 62 27 20 41 53 20 64 62 36 3b 0a 20  st.db' AS db6;. 
0820: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
0830: 64 62 27 20 41 53 20 64 62 37 3b 0a 20 20 20 20  db' AS db7;.    
0840: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 27  ATTACH 'test.db'
0850: 20 41 53 20 64 62 38 3b 0a 20 20 20 20 41 54 54   AS db8;.    ATT
0860: 41 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53  ACH 'test.db' AS
0870: 20 64 62 39 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70   db9;.  }.} {}.p
0880: 72 6f 63 20 64 62 5f 6c 69 73 74 20 7b 64 62 7d  roc db_list {db}
0890: 20 7b 0a 20 20 73 65 74 20 6c 69 73 74 20 7b 7d   {.  set list {}
08a0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 69 64 78 20  .  foreach {idx 
08b0: 6e 61 6d 65 20 66 69 6c 65 7d 20 5b 65 78 65 63  name file} [exec
08c0: 73 71 6c 20 7b 50 52 41 47 4d 41 20 64 61 74 61  sql {PRAGMA data
08d0: 62 61 73 65 5f 6c 69 73 74 7d 20 24 64 62 5d 20  base_list} $db] 
08e0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 69  {.    lappend li
08f0: 73 74 20 24 69 64 78 20 24 6e 61 6d 65 0a 20 20  st $idx $name.  
0900: 7d 0a 20 20 72 65 74 75 72 6e 20 24 6c 69 73 74  }.  return $list
0910: 0a 7d 0a 69 66 63 61 70 61 62 6c 65 20 73 63 68  .}.ifcapable sch
0920: 65 6d 61 5f 70 72 61 67 6d 61 73 20 7b 0a 64 6f  ema_pragmas {.do
0930: 5f 74 65 73 74 20 61 74 74 61 63 68 2d 31 2e 31  _test attach-1.1
0940: 31 62 20 7b 0a 20 20 64 62 5f 6c 69 73 74 20 64  1b {.  db_list d
0950: 62 0a 7d 20 7b 30 20 6d 61 69 6e 20 32 20 64 62  b.} {0 main 2 db
0960: 32 20 33 20 64 62 33 20 34 20 64 62 34 20 35 20  2 3 db3 4 db4 5 
0970: 64 62 35 20 36 20 64 62 36 20 37 20 64 62 37 20  db5 6 db6 7 db7 
0980: 38 20 64 62 38 20 39 20 64 62 39 7d 0a 7d 20 3b  8 db8 9 db9}.} ;
0990: 23 20 69 66 63 61 70 61 62 6c 65 20 73 63 68 65  # ifcapable sche
09a0: 6d 61 5f 70 72 61 67 6d 61 73 20 0a 64 6f 5f 74  ma_pragmas .do_t
09b0: 65 73 74 20 61 74 74 61 63 68 2d 31 2e 31 32 20  est attach-1.12 
09c0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
09d0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
09e0: 64 62 27 20 61 73 20 64 62 32 3b 0a 20 20 7d 0a  db' as db2;.  }.
09f0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
0a00: 62 32 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  b2 is already in
0a10: 20 75 73 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 61   use}}.do_test a
0a20: 74 74 61 63 68 2d 31 2e 31 33 20 7b 0a 20 20 63  ttach-1.13 {.  c
0a30: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 41 54  atchsql {.    AT
0a40: 54 41 43 48 20 27 74 65 73 74 2e 64 62 27 20 61  TACH 'test.db' a
0a50: 73 20 64 62 35 3b 0a 20 20 7d 0a 7d 20 7b 31 20  s db5;.  }.} {1 
0a60: 7b 64 61 74 61 62 61 73 65 20 64 62 35 20 69 73  {database db5 is
0a70: 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 7d   already in use}
0a80: 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  }.do_test attach
0a90: 2d 31 2e 31 34 20 7b 0a 20 20 63 61 74 63 68 73  -1.14 {.  catchs
0aa0: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20  ql {.    ATTACH 
0ab0: 27 74 65 73 74 2e 64 62 27 20 61 73 20 64 62 39  'test.db' as db9
0ac0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ;.  }.} {1 {data
0ad0: 62 61 73 65 20 64 62 39 20 69 73 20 61 6c 72 65  base db9 is alre
0ae0: 61 64 79 20 69 6e 20 75 73 65 7d 7d 0a 64 6f 5f  ady in use}}.do_
0af0: 74 65 73 74 20 61 74 74 61 63 68 2d 31 2e 31 35  test attach-1.15
0b00: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0b10: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
0b20: 2e 64 62 27 20 61 73 20 6d 61 69 6e 3b 0a 20 20  .db' as main;.  
0b30: 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  }.} {1 {database
0b40: 20 6d 61 69 6e 20 69 73 20 61 6c 72 65 61 64 79   main is already
0b50: 20 69 6e 20 75 73 65 7d 7d 0a 69 66 63 61 70 61   in use}}.ifcapa
0b60: 62 6c 65 20 74 65 6d 70 64 62 20 7b 0a 20 20 64  ble tempdb {.  d
0b70: 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 31 2e  o_test attach-1.
0b80: 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  16 {.    catchsq
0b90: 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48  l {.      ATTACH
0ba0: 20 27 74 65 73 74 2e 64 62 27 20 61 73 20 74 65   'test.db' as te
0bb0: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  mp;.    }.  } {1
0bc0: 20 7b 64 61 74 61 62 61 73 65 20 74 65 6d 70 20   {database temp 
0bd0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
0be0: 65 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 61 74  e}}.}.do_test at
0bf0: 74 61 63 68 2d 31 2e 31 37 20 7b 0a 20 20 63 61  tach-1.17 {.  ca
0c00: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 41 54 54  tchsql {.    ATT
0c10: 41 43 48 20 27 74 65 73 74 2e 64 62 27 20 61 73  ACH 'test.db' as
0c20: 20 4d 41 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 31 20   MAIN;.  }.} {1 
0c30: 7b 64 61 74 61 62 61 73 65 20 4d 41 49 4e 20 69  {database MAIN i
0c40: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65  s already in use
0c50: 7d 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  }}.do_test attac
0c60: 68 2d 31 2e 31 38 20 7b 0a 20 20 63 61 74 63 68  h-1.18 {.  catch
0c70: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
0c80: 20 27 74 65 73 74 2e 64 62 27 20 61 73 20 64 62   'test.db' as db
0c90: 31 30 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27  10;.    ATTACH '
0ca0: 74 65 73 74 2e 64 62 27 20 61 73 20 64 62 31 31  test.db' as db11
0cb0: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64  ;.  }.} {0 {}}.d
0cc0: 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 31 2e  o_test attach-1.
0cd0: 31 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  19 {.  catchsql 
0ce0: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
0cf0: 73 74 2e 64 62 27 20 61 73 20 64 62 31 32 3b 0a  st.db' as db12;.
0d00: 20 20 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61    }.} {1 {too ma
0d10: 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ny attached data
0d20: 62 61 73 65 73 20 2d 20 6d 61 78 20 31 30 7d 7d  bases - max 10}}
0d30: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d  .do_test attach-
0d40: 31 2e 32 30 2e 31 20 7b 0a 20 20 65 78 65 63 73  1.20.1 {.  execs
0d50: 71 6c 20 7b 0a 20 20 20 20 44 45 54 41 43 48 20  ql {.    DETACH 
0d60: 64 62 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 69 66  db5;.  }.} {}.if
0d70: 63 61 70 61 62 6c 65 20 73 63 68 65 6d 61 5f 70  capable schema_p
0d80: 72 61 67 6d 61 73 20 7b 0a 64 6f 5f 74 65 73 74  ragmas {.do_test
0d90: 20 61 74 74 61 63 68 2d 31 2e 32 30 2e 32 20 7b   attach-1.20.2 {
0da0: 0a 20 20 64 62 5f 6c 69 73 74 20 64 62 0a 7d 20  .  db_list db.} 
0db0: 7b 30 20 6d 61 69 6e 20 32 20 64 62 32 20 33 20  {0 main 2 db2 3 
0dc0: 64 62 33 20 34 20 64 62 34 20 35 20 64 62 36 20  db3 4 db4 5 db6 
0dd0: 36 20 64 62 37 20 37 20 64 62 38 20 38 20 64 62  6 db7 7 db8 8 db
0de0: 39 20 39 20 64 62 31 30 20 31 30 20 64 62 31 31  9 9 db10 10 db11
0df0: 7d 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65  }.} ;# ifcapable
0e00: 20 73 63 68 65 6d 61 5f 70 72 61 67 6d 61 73 0a   schema_pragmas.
0e10: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
0e20: 61 74 74 61 63 68 2d 31 2e 32 30 2e 33 0a 69 66  attach-1.20.3.if
0e30: 63 61 70 61 62 6c 65 20 74 65 6d 70 64 62 20 7b  capable tempdb {
0e40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 73 65 6c 65  .  execsql {sele
0e50: 63 74 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  ct * from sqlite
0e60: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 7d 0a 7d 0a  _temp_master}.}.
0e70: 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 31  do_test attach-1
0e80: 2e 32 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .21 {.  catchsql
0e90: 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74   {.    ATTACH 't
0ea0: 65 73 74 2e 64 62 27 20 61 73 20 64 62 31 32 3b  est.db' as db12;
0eb0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  .  }.} {0 {}}.do
0ec0: 5f 74 65 73 74 20 61 74 74 61 63 68 2d 31 2e 32  _test attach-1.2
0ed0: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
0ee0: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
0ef0: 74 2e 64 62 27 20 61 73 20 64 62 31 33 3b 0a 20  t.db' as db13;. 
0f00: 20 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e   }.} {1 {too man
0f10: 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  y attached datab
0f20: 61 73 65 73 20 2d 20 6d 61 78 20 31 30 7d 7d 0a  ases - max 10}}.
0f30: 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 31  do_test attach-1
0f40: 2e 32 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .23 {.  catchsql
0f50: 20 7b 0a 20 20 20 20 44 45 54 41 43 48 20 22 64   {.    DETACH "d
0f60: 62 31 34 22 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  b14";.  }.} {1 {
0f70: 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
0f80: 3a 20 64 62 31 34 7d 7d 0a 64 6f 5f 74 65 73 74  : db14}}.do_test
0f90: 20 61 74 74 61 63 68 2d 31 2e 32 34 20 7b 0a 20   attach-1.24 {. 
0fa0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0fb0: 44 45 54 41 43 48 20 64 62 31 32 3b 0a 20 20 7d  DETACH db12;.  }
0fc0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
0fd0: 74 20 61 74 74 61 63 68 2d 31 2e 32 35 20 7b 0a  t attach-1.25 {.
0fe0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0ff0: 20 44 45 54 41 43 48 20 64 62 31 32 3b 0a 20 20   DETACH db12;.  
1000: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  }.} {1 {no such 
1010: 64 61 74 61 62 61 73 65 3a 20 64 62 31 32 7d 7d  database: db12}}
1020: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d  .do_test attach-
1030: 31 2e 32 36 20 7b 0a 20 20 63 61 74 63 68 73 71  1.26 {.  catchsq
1040: 6c 20 7b 0a 20 20 20 20 44 45 54 41 43 48 20 6d  l {.    DETACH m
1050: 61 69 6e 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63  ain;.  }.} {1 {c
1060: 61 6e 6e 6f 74 20 64 65 74 61 63 68 20 64 61 74  annot detach dat
1070: 61 62 61 73 65 20 6d 61 69 6e 7d 7d 0a 0a 69 66  abase main}}..if
1080: 63 61 70 61 62 6c 65 20 74 65 6d 70 64 62 20 7b  capable tempdb {
1090: 0a 20 20 64 6f 5f 74 65 73 74 20 61 74 74 61 63  .  do_test attac
10a0: 68 2d 31 2e 32 37 20 7b 0a 20 20 20 20 63 61 74  h-1.27 {.    cat
10b0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45  chsql {.      DE
10c0: 54 41 43 48 20 54 65 6d 70 3b 0a 20 20 20 20 7d  TACH Temp;.    }
10d0: 0a 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20  .  } {1 {cannot 
10e0: 64 65 74 61 63 68 20 64 61 74 61 62 61 73 65 20  detach database 
10f0: 54 65 6d 70 7d 7d 0a 7d 20 65 6c 73 65 20 7b 0a  Temp}}.} else {.
1100: 20 20 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68    do_test attach
1110: 2d 31 2e 32 37 20 7b 0a 20 20 20 20 63 61 74 63  -1.27 {.    catc
1120: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 54  hsql {.      DET
1130: 41 43 48 20 54 65 6d 70 3b 0a 20 20 20 20 7d 0a  ACH Temp;.    }.
1140: 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20    } {1 {no such 
1150: 64 61 74 61 62 61 73 65 3a 20 54 65 6d 70 7d 7d  database: Temp}}
1160: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 74 74 61  .}..do_test atta
1170: 63 68 2d 31 2e 32 38 20 7b 0a 20 20 63 61 74 63  ch-1.28 {.  catc
1180: 68 73 71 6c 20 7b 0a 20 20 20 20 44 45 54 41 43  hsql {.    DETAC
1190: 48 20 64 62 31 31 3b 0a 20 20 20 20 44 45 54 41  H db11;.    DETA
11a0: 43 48 20 64 62 31 30 3b 0a 20 20 20 20 44 45 54  CH db10;.    DET
11b0: 41 43 48 20 64 62 39 3b 0a 20 20 20 20 44 45 54  ACH db9;.    DET
11c0: 41 43 48 20 64 62 38 3b 0a 20 20 20 20 44 45 54  ACH db8;.    DET
11d0: 41 43 48 20 64 62 37 3b 0a 20 20 20 20 44 45 54  ACH db7;.    DET
11e0: 41 43 48 20 64 62 36 3b 0a 20 20 20 20 44 45 54  ACH db6;.    DET
11f0: 41 43 48 20 64 62 34 3b 0a 20 20 20 20 44 45 54  ACH db4;.    DET
1200: 41 43 48 20 64 62 33 3b 0a 20 20 20 20 44 45 54  ACH db3;.    DET
1210: 41 43 48 20 64 62 32 3b 0a 20 20 7d 0a 7d 20 7b  ACH db2;.  }.} {
1220: 30 20 7b 7d 7d 0a 69 66 63 61 70 61 62 6c 65 20  0 {}}.ifcapable 
1230: 73 63 68 65 6d 61 5f 70 72 61 67 6d 61 73 20 7b  schema_pragmas {
1240: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 74 65 6d  .  ifcapable tem
1250: 70 64 62 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  pdb {.    do_tes
1260: 74 20 61 74 74 61 63 68 2d 31 2e 32 39 20 7b 0a  t attach-1.29 {.
1270: 20 20 20 20 20 20 64 62 5f 6c 69 73 74 20 64 62        db_list db
1280: 0a 20 20 20 20 7d 20 7b 30 20 6d 61 69 6e 20 31  .    } {0 main 1
1290: 20 74 65 6d 70 7d 0a 20 20 7d 20 65 6c 73 65 20   temp}.  } else 
12a0: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 61 74  {.    do_test at
12b0: 74 61 63 68 2d 31 2e 32 39 20 7b 0a 20 20 20 20  tach-1.29 {.    
12c0: 20 20 64 62 5f 6c 69 73 74 20 64 62 0a 20 20 20    db_list db.   
12d0: 20 7d 20 7b 30 20 6d 61 69 6e 7d 0a 20 20 7d 0a   } {0 main}.  }.
12e0: 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 73  } ;# ifcapable s
12f0: 63 68 65 6d 61 5f 70 72 61 67 6d 61 73 0a 0a 69  chema_pragmas..i
1300: 66 63 61 70 61 62 6c 65 20 7b 74 72 69 67 67 65  fcapable {trigge
1310: 72 7d 20 7b 20 20 23 20 4f 6e 6c 79 20 64 6f 20  r} {  # Only do 
1320: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
1330: 73 74 73 20 69 66 20 74 72 69 67 67 65 72 73 20  sts if triggers 
1340: 61 72 65 20 65 6e 61 62 6c 65 64 0a 64 6f 5f 74  are enabled.do_t
1350: 65 73 74 20 61 74 74 61 63 68 2d 32 2e 31 20 7b  est attach-2.1 {
1360: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1370: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78   CREATE TABLE tx
1380: 28 78 31 2c 78 32 2c 79 31 2c 79 32 29 3b 0a 20  (x1,x2,y1,y2);. 
1390: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
13a0: 52 20 72 31 20 41 46 54 45 52 20 55 50 44 41 54  R r1 AFTER UPDAT
13b0: 45 20 4f 4e 20 74 32 20 46 4f 52 20 45 41 43 48  E ON t2 FOR EACH
13c0: 20 52 4f 57 20 42 45 47 49 4e 0a 20 20 20 20 20   ROW BEGIN.     
13d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 28   INSERT INTO tx(
13e0: 78 31 2c 78 32 2c 79 31 2c 79 32 29 20 56 41 4c  x1,x2,y1,y2) VAL
13f0: 55 45 53 28 4f 4c 44 2e 78 2c 4e 45 57 2e 78 2c  UES(OLD.x,NEW.x,
1400: 4f 4c 44 2e 79 2c 4e 45 57 2e 79 29 3b 0a 20 20  OLD.y,NEW.y);.  
1410: 20 20 45 4e 44 3b 0a 20 20 20 20 53 45 4c 45 43    END;.    SELEC
1420: 54 20 2a 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d  T * FROM tx;.  }
1430: 20 64 62 32 3b 0a 7d 20 7b 7d 0a 64 6f 5f 74 65   db2;.} {}.do_te
1440: 73 74 20 61 74 74 61 63 68 2d 32 2e 32 20 7b 0a  st attach-2.2 {.
1450: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1460: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 78 3d  UPDATE t2 SET x=
1470: 78 2b 31 30 3b 0a 20 20 20 20 53 45 4c 45 43 54  x+10;.    SELECT
1480: 20 2a 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20   * FROM tx;.  } 
1490: 64 62 32 3b 0a 7d 20 7b 31 20 31 31 20 78 20 78  db2;.} {1 11 x x
14a0: 20 32 20 31 32 20 79 20 79 7d 0a 64 6f 5f 74 65   2 12 y y}.do_te
14b0: 73 74 20 61 74 74 61 63 68 2d 32 2e 33 20 7b 0a  st attach-2.3 {.
14c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
14d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 28  CREATE TABLE tx(
14e0: 78 31 2c 78 32 2c 79 31 2c 79 32 29 3b 0a 20 20  x1,x2,y1,y2);.  
14f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1500: 74 78 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  tx;.  }.} {}.do_
1510: 74 65 73 74 20 61 74 74 61 63 68 2d 32 2e 34 20  test attach-2.4 
1520: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1530: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e    ATTACH 'test2.
1540: 64 62 27 20 41 53 20 64 62 32 3b 0a 20 20 7d 0a  db' AS db2;.  }.
1550: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74  } {}.do_test att
1560: 61 63 68 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63  ach-2.5 {.  exec
1570: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
1580: 20 64 62 32 2e 74 32 20 53 45 54 20 78 3d 78 2b   db2.t2 SET x=x+
1590: 31 30 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  10;.    SELECT *
15a0: 20 46 52 4f 4d 20 64 62 32 2e 74 78 3b 0a 20 20   FROM db2.tx;.  
15b0: 7d 0a 7d 20 7b 31 20 31 31 20 78 20 78 20 32 20  }.} {1 11 x x 2 
15c0: 31 32 20 79 20 79 20 31 31 20 32 31 20 78 20 78  12 y y 11 21 x x
15d0: 20 31 32 20 32 32 20 79 20 79 7d 0a 64 6f 5f 74   12 22 y y}.do_t
15e0: 65 73 74 20 61 74 74 61 63 68 2d 32 2e 36 20 7b  est attach-2.6 {
15f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1600: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
1610: 61 69 6e 2e 74 78 3b 0a 20 20 7d 0a 7d 20 7b 7d  ain.tx;.  }.} {}
1620: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d  .do_test attach-
1630: 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.7 {.  execsql 
1640: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  {.    SELECT typ
1650: 65 2c 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d  e, name, tbl_nam
1660: 65 20 46 52 4f 4d 20 64 62 32 2e 73 71 6c 69 74  e FROM db2.sqlit
1670: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20  e_master;.  }.} 
1680: 7b 74 61 62 6c 65 20 74 32 20 74 32 20 74 61 62  {table t2 t2 tab
1690: 6c 65 20 74 78 20 74 78 20 74 72 69 67 67 65 72  le tx tx trigger
16a0: 20 72 31 20 74 32 7d 0a 0a 69 66 63 61 70 61 62   r1 t2}..ifcapab
16b0: 6c 65 20 73 63 68 65 6d 61 5f 70 72 61 67 6d 61  le schema_pragma
16c0: 73 26 26 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f  s&&tempdb {.  do
16d0: 5f 74 65 73 74 20 61 74 74 61 63 68 2d 32 2e 38  _test attach-2.8
16e0: 20 7b 0a 20 20 20 20 64 62 5f 6c 69 73 74 20 64   {.    db_list d
16f0: 62 0a 20 20 7d 20 7b 30 20 6d 61 69 6e 20 31 20  b.  } {0 main 1 
1700: 74 65 6d 70 20 32 20 64 62 32 7d 0a 7d 20 3b 23  temp 2 db2}.} ;#
1710: 20 69 66 63 61 70 61 62 6c 65 20 73 63 68 65 6d   ifcapable schem
1720: 61 5f 70 72 61 67 6d 61 73 26 26 74 65 6d 70 64  a_pragmas&&tempd
1730: 62 0a 69 66 63 61 70 61 62 6c 65 20 73 63 68 65  b.ifcapable sche
1740: 6d 61 5f 70 72 61 67 6d 61 73 26 26 21 74 65 6d  ma_pragmas&&!tem
1750: 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  pdb {.  do_test 
1760: 61 74 74 61 63 68 2d 32 2e 38 20 7b 0a 20 20 20  attach-2.8 {.   
1770: 20 64 62 5f 6c 69 73 74 20 64 62 0a 20 20 7d 20   db_list db.  } 
1780: 7b 30 20 6d 61 69 6e 20 32 20 64 62 32 7d 0a 7d  {0 main 2 db2}.}
1790: 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 73 63   ;# ifcapable sc
17a0: 68 65 6d 61 5f 70 72 61 67 6d 61 73 26 26 21 74  hema_pragmas&&!t
17b0: 65 6d 70 64 62 0a 0a 64 6f 5f 74 65 73 74 20 61  empdb..do_test a
17c0: 74 74 61 63 68 2d 32 2e 39 20 7b 0a 20 20 65 78  ttach-2.9 {.  ex
17d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
17e0: 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
17f0: 32 28 78 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  2(x);.    SELECT
1800: 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1810: 20 78 3e 35 3b 0a 20 20 7d 20 64 62 32 0a 7d 20   x>5;.  } db2.} 
1820: 7b 32 31 20 78 20 32 32 20 79 7d 0a 64 6f 5f 74  {21 x 22 y}.do_t
1830: 65 73 74 20 61 74 74 61 63 68 2d 32 2e 31 30 20  est attach-2.10 
1840: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1850: 20 20 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e    SELECT type, n
1860: 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 46 52  ame, tbl_name FR
1870: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
1880: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 74 61 62  ;.  } db2.} {tab
1890: 6c 65 20 74 32 20 74 32 20 74 61 62 6c 65 20 74  le t2 t2 table t
18a0: 78 20 74 78 20 74 72 69 67 67 65 72 20 72 31 20  x tx trigger r1 
18b0: 74 32 20 69 6e 64 65 78 20 69 32 20 74 32 7d 0a  t2 index i2 t2}.
18c0: 23 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d  #do_test attach-
18d0: 32 2e 31 31 20 7b 0a 23 20 20 63 61 74 63 68 73  2.11 {.#  catchs
18e0: 71 6c 20 7b 20 0a 23 20 20 20 20 53 45 4c 45 43  ql { .#    SELEC
18f0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
1900: 45 20 78 3e 35 3b 0a 23 20 20 7d 0a 23 7d 20 7b  E x>5;.#  }.#} {
1910: 31 20 7b 64 61 74 61 62 61 73 65 20 73 63 68 65  1 {database sche
1920: 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 7d 7d  ma has changed}}
1930: 0a 69 66 63 61 70 61 62 6c 65 20 73 63 68 65 6d  .ifcapable schem
1940: 61 5f 70 72 61 67 6d 61 73 20 7b 0a 20 20 69 66  a_pragmas {.  if
1950: 63 61 70 61 62 6c 65 20 74 65 6d 70 64 62 20 7b  capable tempdb {
1960: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 61 74 74  .    do_test att
1970: 61 63 68 2d 32 2e 31 32 20 7b 0a 20 20 20 20 20  ach-2.12 {.     
1980: 20 64 62 5f 6c 69 73 74 20 64 62 0a 20 20 20 20   db_list db.    
1990: 7d 20 7b 30 20 6d 61 69 6e 20 31 20 74 65 6d 70  } {0 main 1 temp
19a0: 20 32 20 64 62 32 7d 0a 20 20 7d 20 65 6c 73 65   2 db2}.  } else
19b0: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 61   {.    do_test a
19c0: 74 74 61 63 68 2d 32 2e 31 32 20 7b 0a 20 20 20  ttach-2.12 {.   
19d0: 20 20 20 64 62 5f 6c 69 73 74 20 64 62 0a 20 20     db_list db.  
19e0: 20 20 7d 20 7b 30 20 6d 61 69 6e 20 32 20 64 62    } {0 main 2 db
19f0: 32 7d 0a 20 20 7d 0a 7d 20 3b 23 20 69 66 63 61  2}.  }.} ;# ifca
1a00: 70 61 62 6c 65 20 73 63 68 65 6d 61 5f 70 72 61  pable schema_pra
1a10: 67 6d 61 73 0a 64 6f 5f 74 65 73 74 20 61 74 74  gmas.do_test att
1a20: 61 63 68 2d 32 2e 31 33 20 7b 0a 20 20 63 61 74  ach-2.13 {.  cat
1a30: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
1a40: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
1a50: 52 45 20 78 3e 35 3b 0a 20 20 7d 0a 7d 20 7b 30  RE x>5;.  }.} {0
1a60: 20 7b 32 31 20 78 20 32 32 20 79 7d 7d 0a 64 6f   {21 x 22 y}}.do
1a70: 5f 74 65 73 74 20 61 74 74 61 63 68 2d 32 2e 31  _test attach-2.1
1a80: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
1a90: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 2c      SELECT type,
1aa0: 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 20   name, tbl_name 
1ab0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1ac0: 65 72 3b 0a 20 20 7d 0a 7d 20 7b 74 61 62 6c 65  er;.  }.} {table
1ad0: 20 74 31 20 74 31 20 74 61 62 6c 65 20 74 78 20   t1 t1 table tx 
1ae0: 74 78 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61  tx}.do_test atta
1af0: 63 68 2d 32 2e 31 35 20 7b 0a 20 20 65 78 65 63  ch-2.15 {.  exec
1b00: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1b10: 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 74 62 6c   type, name, tbl
1b20: 5f 6e 61 6d 65 20 46 52 4f 4d 20 64 62 32 2e 73  _name FROM db2.s
1b30: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
1b40: 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 32 20 74 32  }.} {table t2 t2
1b50: 20 74 61 62 6c 65 20 74 78 20 74 78 20 74 72 69   table tx tx tri
1b60: 67 67 65 72 20 72 31 20 74 32 20 69 6e 64 65 78  gger r1 t2 index
1b70: 20 69 32 20 74 32 7d 0a 64 6f 5f 74 65 73 74 20   i2 t2}.do_test 
1b80: 61 74 74 61 63 68 2d 32 2e 31 36 20 7b 0a 20 20  attach-2.16 {.  
1b90: 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
1ba0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1bb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54  execsql {.    AT
1bc0: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
1bd0: 41 53 20 64 62 32 3b 0a 20 20 20 20 53 45 4c 45  AS db2;.    SELE
1be0: 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 74  CT type, name, t
1bf0: 62 6c 5f 6e 61 6d 65 20 46 52 4f 4d 20 64 62 32  bl_name FROM db2
1c00: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a  .sqlite_master;.
1c10: 20 20 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 32 20    }.} {table t2 
1c20: 74 32 20 74 61 62 6c 65 20 74 78 20 74 78 20 74  t2 table tx tx t
1c30: 72 69 67 67 65 72 20 72 31 20 74 32 20 69 6e 64  rigger r1 t2 ind
1c40: 65 78 20 69 32 20 74 32 7d 0a 7d 20 3b 23 20 45  ex i2 t2}.} ;# E
1c50: 6e 64 20 6f 66 20 69 66 63 61 70 61 62 6c 65 20  nd of ifcapable 
1c60: 7b 74 72 69 67 67 65 72 7d 0a 0a 64 6f 5f 74 65  {trigger}..do_te
1c70: 73 74 20 61 74 74 61 63 68 2d 33 2e 31 20 7b 0a  st attach-3.1 {.
1c80: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32    db close.  db2
1c90: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
1ca0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71   db test.db.  sq
1cb0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e  lite3 db2 test2.
1cc0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
1cd0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1ce0: 20 74 31 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33   t1.  }.} {1 2 3
1cf0: 20 34 7d 0a 0a 23 20 49 66 20 77 65 20 61 72 65   4}..# If we are
1d00: 20 74 65 73 74 69 6e 67 20 61 20 76 65 72 73 69   testing a versi
1d10: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  on of the code t
1d20: 68 61 74 20 6c 61 63 6b 73 20 74 72 69 67 67 65  hat lacks trigge
1d30: 72 20 73 75 70 70 6f 72 74 2c 0a 23 20 61 64 6a  r support,.# adj
1d40: 75 73 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ust the database
1d50: 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1d60: 74 20 74 68 65 79 20 61 72 65 20 74 68 65 20 73  t they are the s
1d70: 61 6d 65 20 69 66 20 74 72 69 67 67 65 72 73 0a  ame if triggers.
1d80: 23 20 68 61 64 20 62 65 65 6e 20 65 6e 61 62 6c  # had been enabl
1d90: 65 64 2e 0a 69 66 63 61 70 61 62 6c 65 20 7b 21  ed..ifcapable {!
1da0: 74 72 69 67 67 65 72 7d 20 7b 0a 20 20 64 62 32  trigger} {.  db2
1db0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 44 45 4c 45   eval {.    DELE
1dc0: 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20  TE FROM t2;.    
1dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1de0: 41 4c 55 45 53 28 32 31 2c 20 27 78 27 29 3b 0a  ALUES(21, 'x');.
1df0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1e00: 74 32 20 56 41 4c 55 45 53 28 32 32 2c 20 27 79  t2 VALUES(22, 'y
1e10: 27 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ');.    CREATE T
1e20: 41 42 4c 45 20 74 78 28 78 31 2c 78 32 2c 79 31  ABLE tx(x1,x2,y1
1e30: 2c 79 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ,y2);.    INSERT
1e40: 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28   INTO tx VALUES(
1e50: 31 2c 20 31 31 2c 20 27 78 27 2c 20 27 78 27 29  1, 11, 'x', 'x')
1e60: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1e70: 4f 20 74 78 20 56 41 4c 55 45 53 28 32 2c 20 31  O tx VALUES(2, 1
1e80: 32 2c 20 27 79 27 2c 20 27 79 27 29 3b 0a 20 20  2, 'y', 'y');.  
1e90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78    INSERT INTO tx
1ea0: 20 56 41 4c 55 45 53 28 31 31 2c 20 32 31 2c 20   VALUES(11, 21, 
1eb0: 27 78 27 2c 20 27 78 27 29 3b 0a 20 20 20 20 49  'x', 'x');.    I
1ec0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41  NSERT INTO tx VA
1ed0: 4c 55 45 53 28 31 32 2c 20 32 32 2c 20 27 79 27  LUES(12, 22, 'y'
1ee0: 2c 20 27 79 27 29 3b 0a 20 20 20 20 43 52 45 41  , 'y');.    CREA
1ef0: 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
1f00: 32 28 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f  2(x);.  }.}..do_
1f10: 74 65 73 74 20 61 74 74 61 63 68 2d 33 2e 32 20  test attach-3.2 
1f20: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
1f30: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1f40: 20 74 32 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f   t2.  }.} {1 {no
1f50: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 74 32 7d   such table: t2}
1f60: 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  }.do_test attach
1f70: 2d 33 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  -3.3 {.  catchsq
1f80: 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 44  l {.    ATTACH D
1f90: 41 54 41 42 41 53 45 20 27 74 65 73 74 32 2e 64  ATABASE 'test2.d
1fa0: 62 27 20 41 53 20 64 62 32 3b 0a 20 20 20 20 53  b' AS db2;.    S
1fb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 0a  ELECT * FROM t2.
1fc0: 20 20 7d 0a 7d 20 7b 30 20 7b 32 31 20 78 20 32    }.} {0 {21 x 2
1fd0: 32 20 79 7d 7d 0a 0a 23 20 45 76 65 6e 20 74 68  2 y}}..# Even th
1fe0: 6f 75 67 68 20 27 64 62 27 20 68 61 73 20 73 74  ough 'db' has st
1ff0: 61 72 74 65 64 20 61 20 74 72 61 6e 73 61 63 74  arted a transact
2000: 69 6f 6e 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e  ion, it should n
2010: 6f 74 20 79 65 74 20 68 61 76 65 0a 23 20 61 20  ot yet have.# a 
2020: 6c 6f 63 6b 20 6f 6e 20 74 65 73 74 32 2e 64 62  lock on test2.db
2030: 20 73 6f 20 27 64 62 32 27 20 73 68 6f 75 6c 64   so 'db2' should
2040: 20 62 65 20 72 65 61 64 61 62 6c 65 2e 0a 64 6f   be readable..do
2050: 5f 74 65 73 74 20 61 74 74 61 63 68 2d 33 2e 34  _test attach-3.4
2060: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47   {.  execsql BEG
2070: 49 4e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  IN.  catchsql {.
2080: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2090: 4d 20 74 32 3b 0a 20 20 7d 20 64 62 32 3b 0a 7d  M t2;.  } db2;.}
20a0: 20 7b 30 20 7b 32 31 20 78 20 32 32 20 79 7d 7d   {0 {21 x 22 y}}
20b0: 0a 0a 23 20 52 65 61 64 69 6e 67 20 66 72 6f 6d  ..# Reading from
20c0: 20 74 65 73 74 32 2e 64 62 20 66 72 6f 6d 20 64   test2.db from d
20d0: 62 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  b within a trans
20e0: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  action should no
20f0: 74 0a 23 20 70 72 65 76 65 6e 74 20 74 65 73 74  t.# prevent test
2100: 32 2e 64 62 20 66 72 6f 6d 20 62 65 69 6e 67 20  2.db from being 
2110: 72 65 61 64 20 62 79 20 64 62 32 2e 0a 64 6f 5f  read by db2..do_
2120: 74 65 73 74 20 61 74 74 61 63 68 2d 33 2e 35 20  test attach-3.5 
2130: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
2140: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 62  ECT * FROM t2}.b
2150: 74 72 65 65 5f 62 72 65 61 6b 70 6f 69 6e 74 0a  tree_breakpoint.
2160: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
2170: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2180: 32 3b 0a 20 20 7d 20 64 62 32 3b 0a 7d 20 7b 30  2;.  } db2;.} {0
2190: 20 7b 32 31 20 78 20 32 32 20 79 7d 7d 0a 0a 23   {21 x 22 y}}..#
21a0: 20 4d 61 6b 69 6e 67 20 61 20 63 68 61 6e 67 65   Making a change
21b0: 20 74 6f 20 74 65 73 74 32 2e 64 62 20 74 68 72   to test2.db thr
21c0: 6f 75 67 68 20 64 62 20 20 63 61 75 73 65 73 20  ough db  causes 
21d0: 74 65 73 74 32 2e 64 62 20 74 6f 20 67 65 74 0a  test2.db to get.
21e0: 23 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  # a reserved loc
21f0: 6b 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 73 74  k.  It should st
2200: 69 6c 6c 20 62 65 20 61 63 63 65 73 73 69 62 6c  ill be accessibl
2210: 65 20 74 68 72 6f 75 67 68 20 64 62 32 2e 0a 64  e through db2..d
2220: 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 33 2e  o_test attach-3.
2230: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
2240: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
2250: 54 20 78 3d 78 2b 31 20 57 48 45 52 45 20 78 3d  T x=x+1 WHERE x=
2260: 35 30 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  50;.  }.  catchs
2270: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2280: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64  * FROM t2;.  } d
2290: 62 32 3b 0a 7d 20 7b 30 20 7b 32 31 20 78 20 32  b2;.} {0 {21 x 2
22a0: 32 20 79 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 61  2 y}}..do_test a
22b0: 74 74 61 63 68 2d 33 2e 37 20 7b 0a 20 20 65 78  ttach-3.7 {.  ex
22c0: 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 20  ecsql ROLLBACK. 
22d0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
22e0: 20 2a 20 46 52 4f 4d 20 74 32 7d 20 64 62 32 0a   * FROM t2} db2.
22f0: 7d 20 7b 32 31 20 78 20 32 32 20 79 7d 0a 0a 23  } {21 x 22 y}..#
2300: 20 53 74 61 72 74 20 74 72 61 6e 73 61 63 74 69   Start transacti
2310: 6f 6e 73 20 6f 6e 20 62 6f 74 68 20 64 62 20 61  ons on both db a
2320: 6e 64 20 64 62 32 2e 20 20 4f 6e 63 65 20 61 67  nd db2.  Once ag
2330: 61 69 6e 2c 20 6a 75 73 74 20 62 65 63 61 75 73  ain, just becaus
2340: 65 0a 23 20 77 65 20 6d 61 6b 65 20 61 20 63 68  e.# we make a ch
2350: 61 6e 67 65 20 74 6f 20 74 65 73 74 32 2e 64 62  ange to test2.db
2360: 20 75 73 69 6e 67 20 64 62 32 2c 20 6f 6e 6c 79   using db2, only
2370: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2380: 20 69 73 0a 23 20 6f 62 74 61 69 6e 65 64 2c 20   is.# obtained, 
2390: 73 6f 20 74 65 73 74 32 2e 64 62 20 73 68 6f 75  so test2.db shou
23a0: 6c 64 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ld still be read
23b0: 61 62 6c 65 20 75 73 69 6e 67 20 64 62 2e 0a 23  able using db..#
23c0: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d  .do_test attach-
23d0: 33 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.8 {.  execsql 
23e0: 42 45 47 49 4e 0a 20 20 65 78 65 63 73 71 6c 20  BEGIN.  execsql 
23f0: 42 45 47 49 4e 20 64 62 32 0a 20 20 65 78 65 63  BEGIN db2.  exec
2400: 73 71 6c 20 7b 55 50 44 41 54 45 20 74 32 20 53  sql {UPDATE t2 S
2410: 45 54 20 78 3d 30 20 57 48 45 52 45 20 30 7d 20  ET x=0 WHERE 0} 
2420: 64 62 32 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  db2.  catchsql {
2430: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
2440: 7d 0a 7d 20 7b 30 20 7b 32 31 20 78 20 32 32 20  }.} {0 {21 x 22 
2450: 79 7d 7d 0a 0a 23 20 49 74 20 69 73 20 61 6c 73  y}}..# It is als
2460: 6f 20 73 74 69 6c 6c 20 61 63 63 65 73 73 69 62  o still accessib
2470: 6c 65 20 66 72 6f 6d 20 64 62 32 2e 0a 64 6f 5f  le from db2..do_
2480: 74 65 73 74 20 61 74 74 61 63 68 2d 33 2e 39 20  test attach-3.9 
2490: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45  {.  catchsql {SE
24a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20  LECT * FROM t2} 
24b0: 64 62 32 0a 7d 20 7b 30 20 7b 32 31 20 78 20 32  db2.} {0 {21 x 2
24c0: 32 20 79 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 61  2 y}}..do_test a
24d0: 74 74 61 63 68 2d 33 2e 31 30 20 7b 0a 20 20 65  ttach-3.10 {.  e
24e0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
24f0: 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 31 20 32   FROM t1}.} {1 2
2500: 20 33 20 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 61   3 4}..do_test a
2510: 74 74 61 63 68 2d 33 2e 31 31 20 7b 0a 20 20 63  ttach-3.11 {.  c
2520: 61 74 63 68 73 71 6c 20 7b 55 50 44 41 54 45 20  atchsql {UPDATE 
2530: 74 31 20 53 45 54 20 61 3d 61 2b 31 7d 0a 7d 20  t1 SET a=a+1}.} 
2540: 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 61  {0 {}}.do_test a
2550: 74 74 61 63 68 2d 33 2e 31 32 20 7b 0a 20 20 65  ttach-3.12 {.  e
2560: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
2570: 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 32 20 32   FROM t1}.} {2 2
2580: 20 34 20 34 7d 0a 0a 23 20 64 62 32 20 68 61 73   4 4}..# db2 has
2590: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
25a0: 20 6f 6e 20 74 65 73 74 32 2e 64 62 2c 20 73 6f   on test2.db, so
25b0: 20 64 62 20 63 61 6e 6e 6f 74 20 77 72 69 74 65   db cannot write
25c0: 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 73 0a 23   to any tables.#
25d0: 20 69 6e 20 74 65 73 74 32 2e 64 62 2e 0a 64 6f   in test2.db..do
25e0: 5f 74 65 73 74 20 61 74 74 61 63 68 2d 33 2e 31  _test attach-3.1
25f0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
2600: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 78 3d  UPDATE t2 SET x=
2610: 78 2b 31 20 57 48 45 52 45 20 78 3d 35 30 7d 0a  x+1 WHERE x=50}.
2620: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
2630: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 23 20 43 68  s locked}}..# Ch
2640: 61 6e 67 65 20 66 6f 72 20 76 65 72 73 69 6f 6e  ange for version
2650: 20 33 2e 20 54 72 61 6e 73 61 63 74 69 6f 6e 20   3. Transaction 
2660: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 6f 6c  is no longer rol
2670: 6c 65 64 20 62 61 63 6b 0a 23 20 66 6f 72 20 61  led back.# for a
2680: 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65   locked database
2690: 2e 0a 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42  ..execsql {ROLLB
26a0: 41 43 4b 7d 0a 0a 23 20 64 62 20 69 73 20 61 62  ACK}..# db is ab
26b0: 6c 65 20 74 6f 20 72 65 72 65 61 64 20 69 74 73  le to reread its
26c0: 20 73 63 68 65 6d 61 20 62 65 63 61 75 73 65 20   schema because 
26d0: 64 62 32 20 73 74 69 6c 6c 20 6f 6e 6c 79 20 68  db2 still only h
26e0: 6f 6c 64 73 20 61 0a 23 20 72 65 73 65 72 76 65  olds a.# reserve
26f0: 64 20 6c 6f 63 6b 2e 0a 64 6f 5f 74 65 73 74 20  d lock..do_test 
2700: 61 74 74 61 63 68 2d 33 2e 31 34 20 7b 0a 20 20  attach-3.14 {.  
2710: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
2720: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 30   * FROM t1}.} {0
2730: 20 7b 31 20 32 20 33 20 34 7d 7d 0a 64 6f 5f 74   {1 2 3 4}}.do_t
2740: 65 73 74 20 61 74 74 61 63 68 2d 33 2e 31 35 20  est attach-3.15 
2750: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
2760: 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c  IT db2.  execsql
2770: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
2780: 74 31 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a  t1}.} {1 2 3 4}.
2790: 0a 23 73 65 74 20 62 74 72 65 65 5f 74 72 61 63  .#set btree_trac
27a0: 65 20 31 0a 0a 23 20 54 69 63 6b 65 74 20 23 33  e 1..# Ticket #3
27b0: 32 33 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  23.do_test attac
27c0: 68 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  h-4.1 {.  execsq
27d0: 6c 20 7b 44 45 54 41 43 48 20 64 62 32 7d 0a 20  l {DETACH db2}. 
27e0: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 73 71 6c   db2 close.  sql
27f0: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
2800: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
2810: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2820: 33 28 78 2c 79 29 3b 0a 20 20 20 20 43 52 45 41  3(x,y);.    CREA
2830: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
2840: 74 33 69 31 20 4f 4e 20 74 33 28 78 29 3b 0a 20  t3i1 ON t3(x);. 
2850: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2860: 33 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20  3 VALUES(1,2);. 
2870: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2880: 20 74 33 3b 0a 20 20 7d 20 64 62 32 3b 0a 7d 20   t3;.  } db2;.} 
2890: 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 61 74  {1 2}.do_test at
28a0: 74 61 63 68 2d 34 2e 32 20 7b 0a 20 20 65 78 65  tach-4.2 {.  exe
28b0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
28c0: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 62 29 3b  E TABLE t3(a,b);
28d0: 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51  .    CREATE UNIQ
28e0: 55 45 20 49 4e 44 45 58 20 74 33 69 31 62 20 4f  UE INDEX t3i1b O
28f0: 4e 20 74 33 28 61 29 3b 0a 20 20 20 20 49 4e 53  N t3(a);.    INS
2900: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
2910: 45 53 28 39 2c 31 30 29 3b 0a 20 20 20 20 53 45  ES(9,10);.    SE
2920: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a  LECT * FROM t3;.
2930: 20 20 7d 0a 7d 20 7b 39 20 31 30 7d 0a 64 6f 5f    }.} {9 10}.do_
2940: 74 65 73 74 20 61 74 74 61 63 68 2d 34 2e 33 20  test attach-4.3 
2950: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2960: 20 20 41 54 54 41 43 48 20 44 41 54 41 42 41 53    ATTACH DATABAS
2970: 45 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20  E 'test2.db' AS 
2980: 64 62 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  db2;.    SELECT 
2990: 2a 20 46 52 4f 4d 20 64 62 32 2e 74 33 3b 0a 20  * FROM db2.t3;. 
29a0: 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65   }.} {1 2}.do_te
29b0: 73 74 20 61 74 74 61 63 68 2d 34 2e 34 20 7b 0a  st attach-4.4 {.
29c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
29d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
29e0: 69 6e 2e 74 33 3b 0a 20 20 7d 0a 7d 20 7b 39 20  in.t3;.  }.} {9 
29f0: 31 30 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61  10}.do_test atta
2a00: 63 68 2d 34 2e 35 20 7b 0a 20 20 65 78 65 63 73  ch-4.5 {.  execs
2a10: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
2a20: 49 4e 54 4f 20 64 62 32 2e 74 33 20 56 41 4c 55  INTO db2.t3 VALU
2a30: 45 53 28 39 2c 31 30 29 3b 0a 20 20 20 20 53 45  ES(9,10);.    SE
2a40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 62 32 2e  LECT * FROM db2.
2a50: 74 33 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 39  t3;.  }.} {1 2 9
2a60: 20 31 30 7d 0a 65 78 65 63 73 71 6c 20 7b 0a 20   10}.execsql {. 
2a70: 20 44 45 54 41 43 48 20 64 62 32 3b 0a 7d 0a 69   DETACH db2;.}.i
2a80: 66 63 61 70 61 62 6c 65 20 7b 74 72 69 67 67 65  fcapable {trigge
2a90: 72 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 61  r} {.  do_test a
2aa0: 74 74 61 63 68 2d 34 2e 36 20 7b 0a 20 20 20 20  ttach-4.6 {.    
2ab0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
2ac0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
2ad0: 78 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  x);.      CREATE
2ae0: 20 54 52 49 47 47 45 52 20 74 33 72 33 20 41 46   TRIGGER t3r3 AF
2af0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 33  TER INSERT ON t3
2b00: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49   BEGIN.        I
2b10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
2b20: 4c 55 45 53 28 27 64 62 32 2e 27 20 7c 7c 20 4e  LUES('db2.' || N
2b30: 45 57 2e 78 29 3b 0a 20 20 20 20 20 20 45 4e 44  EW.x);.      END
2b40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2b50: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 36 2c  NTO t3 VALUES(6,
2b60: 37 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  7);.      SELECT
2b70: 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20   * FROM t4;.    
2b80: 7d 20 64 62 32 0a 20 20 7d 20 7b 64 62 32 2e 36  } db2.  } {db2.6
2b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 61 74 74 61  }.  do_test atta
2ba0: 63 68 2d 34 2e 37 20 7b 0a 20 20 20 20 65 78 65  ch-4.7 {.    exe
2bb0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  csql {.      CRE
2bc0: 41 54 45 20 54 41 42 4c 45 20 74 34 28 79 29 3b  ATE TABLE t4(y);
2bd0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52  .      CREATE TR
2be0: 49 47 47 45 52 20 74 33 72 33 20 41 46 54 45 52  IGGER t3r3 AFTER
2bf0: 20 49 4e 53 45 52 54 20 4f 4e 20 74 33 20 42 45   INSERT ON t3 BE
2c00: 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45  GIN.        INSE
2c10: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
2c20: 53 28 27 6d 61 69 6e 2e 27 20 7c 7c 20 4e 45 57  S('main.' || NEW
2c30: 2e 61 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a  .a);.      END;.
2c40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2c50: 4f 20 6d 61 69 6e 2e 74 33 20 56 41 4c 55 45 53  O main.t3 VALUES
2c60: 28 31 31 2c 31 32 29 3b 0a 20 20 20 20 20 20 53  (11,12);.      S
2c70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69  ELECT * FROM mai
2c80: 6e 2e 74 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  n.t4;.    }.  } 
2c90: 7b 6d 61 69 6e 2e 31 31 7d 0a 7d 0a 69 66 63 61  {main.11}.}.ifca
2ca0: 70 61 62 6c 65 20 7b 21 74 72 69 67 67 65 72 7d  pable {!trigger}
2cb0: 20 7b 0a 20 20 23 20 57 68 65 6e 20 77 65 20 64   {.  # When we d
2cc0: 6f 20 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67  o not have trigg
2cd0: 65 72 20 73 75 70 70 6f 72 74 2c 20 73 65 74 20  er support, set 
2ce0: 75 70 20 74 68 65 20 74 61 62 6c 65 20 6c 69 6b  up the table lik
2cf0: 65 20 74 68 65 79 0a 20 20 23 20 77 6f 75 6c 64  e they.  # would
2d00: 20 68 61 76 65 20 62 65 65 6e 20 68 61 64 20 74   have been had t
2d10: 72 69 67 67 65 72 73 20 62 65 65 6e 20 74 68 65  riggers been the
2d20: 72 65 2e 20 20 54 68 65 20 74 65 73 74 73 20 74  re.  The tests t
2d30: 68 61 74 20 66 6f 6c 6c 6f 77 20 6e 65 65 64 0a  hat follow need.
2d40: 20 20 23 20 74 68 69 73 20 73 65 74 75 70 2e 0a    # this setup..
2d50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2d60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
2d70: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
2d80: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 36 2c  NTO t3 VALUES(6,
2d90: 37 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  7);.    INSERT I
2da0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 64  NTO t4 VALUES('d
2db0: 62 32 2e 36 27 29 3b 0a 20 20 20 20 49 4e 53 45  b2.6');.    INSE
2dc0: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
2dd0: 53 28 27 64 62 32 2e 31 33 27 29 3b 0a 20 20 7d  S('db2.13');.  }
2de0: 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b   db2.  execsql {
2df0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2e00: 45 20 74 34 28 79 29 3b 0a 20 20 20 20 49 4e 53  E t4(y);.    INS
2e10: 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 33  ERT INTO main.t3
2e20: 20 56 41 4c 55 45 53 28 31 31 2c 31 32 29 3b 0a   VALUES(11,12);.
2e30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2e40: 74 34 20 56 41 4c 55 45 53 28 27 6d 61 69 6e 2e  t4 VALUES('main.
2e50: 31 31 27 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 20  11');.  }.}...# 
2e60: 54 68 69 73 20 6f 6e 65 20 69 73 20 74 72 69 63  This one is tric
2e70: 6b 79 2e 20 20 4f 6e 20 74 68 65 20 55 4e 49 4f  ky.  On the UNIO
2e80: 4e 20 41 4c 4c 20 73 65 6c 65 63 74 2c 20 77 65  N ALL select, we
2e90: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
2ea0: 72 65 0a 23 20 74 68 65 20 73 63 68 65 6d 61 20  re.# the schema 
2eb0: 66 6f 72 20 62 6f 74 68 20 6d 61 69 6e 20 61 6e  for both main an
2ec0: 64 20 64 62 32 20 69 73 20 76 61 6c 69 64 20 62  d db2 is valid b
2ed0: 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 74  efore starting t
2ee0: 6f 20 65 78 65 63 75 74 65 0a 23 20 74 68 65 20  o execute.# the 
2ef0: 66 69 72 73 74 20 71 75 65 72 79 20 6f 66 20 74  first query of t
2f00: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 49  he UNION ALL.  I
2f10: 66 20 77 65 20 77 61 69 74 20 74 6f 20 74 65 73  f we wait to tes
2f20: 74 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f  t the validity o
2f30: 66 0a 23 20 74 68 65 20 73 63 68 65 6d 61 20 66  f.# the schema f
2f40: 6f 72 20 6d 61 69 6e 20 75 6e 74 69 6c 20 61 66  or main until af
2f50: 74 65 72 20 74 68 65 20 66 69 72 73 74 20 71 75  ter the first qu
2f60: 65 72 79 20 68 61 73 20 72 75 6e 2c 20 74 68 61  ery has run, tha
2f70: 74 20 74 65 73 74 20 77 69 6c 6c 0a 23 20 66 61  t test will.# fa
2f80: 69 6c 20 61 6e 64 20 74 68 65 20 71 75 65 72 79  il and the query
2f90: 20 77 69 6c 6c 20 61 62 6f 72 74 20 62 75 74 20   will abort but 
2fa0: 77 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  we will have alr
2fb0: 65 61 64 79 20 6f 75 74 70 75 74 20 73 6f 6d 65  eady output some
2fc0: 0a 23 20 72 65 73 75 6c 74 73 2e 20 20 57 68 65  .# results.  Whe
2fd0: 6e 20 74 68 65 20 71 75 65 72 79 20 69 73 20 72  n the query is r
2fe0: 65 74 72 69 65 64 2c 20 74 68 65 20 72 65 73 75  etried, the resu
2ff0: 6c 74 73 20 77 69 6c 6c 20 62 65 20 72 65 70 65  lts will be repe
3000: 61 74 65 64 2e 0a 23 0a 69 66 63 61 70 61 62 6c  ated..#.ifcapabl
3010: 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 64 6f 5f  e compound {.do_
3020: 74 65 73 74 20 61 74 74 61 63 68 2d 34 2e 38 20  test attach-4.8 
3030: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3040: 20 20 41 54 54 41 43 48 20 44 41 54 41 42 41 53    ATTACH DATABAS
3050: 45 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20  E 'test2.db' AS 
3060: 64 62 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  db2;.    INSERT 
3070: 49 4e 54 4f 20 64 62 32 2e 74 33 20 56 41 4c 55  INTO db2.t3 VALU
3080: 45 53 28 31 33 2c 31 34 29 3b 0a 20 20 20 20 53  ES(13,14);.    S
3090: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 62 32  ELECT * FROM db2
30a0: 2e 74 34 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  .t4 UNION ALL SE
30b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6e  LECT * FROM main
30c0: 2e 74 34 3b 0a 20 20 7d 0a 7d 20 7b 64 62 32 2e  .t4;.  }.} {db2.
30d0: 36 20 64 62 32 2e 31 33 20 6d 61 69 6e 2e 31 31  6 db2.13 main.11
30e0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  }..do_test attac
30f0: 68 2d 34 2e 39 20 7b 0a 20 20 69 66 63 61 70 61  h-4.9 {.  ifcapa
3100: 62 6c 65 20 7b 21 74 72 69 67 67 65 72 7d 20 7b  ble {!trigger} {
3110: 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20  execsql {INSERT 
3120: 49 4e 54 4f 20 6d 61 69 6e 2e 74 34 20 56 41 4c  INTO main.t4 VAL
3130: 55 45 53 28 27 6d 61 69 6e 2e 31 35 27 29 7d 7d  UES('main.15')}}
3140: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3150: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
3160: 6e 2e 74 33 20 56 41 4c 55 45 53 28 31 35 2c 31  n.t3 VALUES(15,1
3170: 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  6);.    SELECT *
3180: 20 46 52 4f 4d 20 64 62 32 2e 74 34 20 55 4e 49   FROM db2.t4 UNI
3190: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20  ON ALL SELECT * 
31a0: 46 52 4f 4d 20 6d 61 69 6e 2e 74 34 3b 0a 20 20  FROM main.t4;.  
31b0: 7d 0a 7d 20 7b 64 62 32 2e 36 20 64 62 32 2e 31  }.} {db2.6 db2.1
31c0: 33 20 6d 61 69 6e 2e 31 31 20 6d 61 69 6e 2e 31  3 main.11 main.1
31d0: 35 7d 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c  5}.} ;# ifcapabl
31e0: 65 20 63 6f 6d 70 6f 75 6e 64 0a 0a 69 66 63 61  e compound..ifca
31f0: 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75 6e 64 20  pable !compound 
3200: 7b 0a 20 20 69 66 63 61 70 61 62 6c 65 20 7b 21  {.  ifcapable {!
3210: 74 72 69 67 67 65 72 7d 20 7b 65 78 65 63 73 71  trigger} {execsq
3220: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d  l {INSERT INTO m
3230: 61 69 6e 2e 74 34 20 56 41 4c 55 45 53 28 27 6d  ain.t4 VALUES('m
3240: 61 69 6e 2e 31 35 27 29 7d 7d 0a 20 20 65 78 65  ain.15')}}.  exe
3250: 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43  csql {.    ATTAC
3260: 48 20 44 41 54 41 42 41 53 45 20 27 74 65 73 74  H DATABASE 'test
3270: 32 2e 64 62 27 20 41 53 20 64 62 32 3b 0a 20 20  2.db' AS db2;.  
3280: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 62    INSERT INTO db
3290: 32 2e 74 33 20 56 41 4c 55 45 53 28 31 33 2c 31  2.t3 VALUES(13,1
32a0: 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
32b0: 4e 54 4f 20 6d 61 69 6e 2e 74 33 20 56 41 4c 55  NTO main.t3 VALU
32c0: 45 53 28 31 35 2c 31 36 29 3b 0a 20 20 7d 20 0a  ES(15,16);.  } .
32d0: 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 21  } ;# ifcapable !
32e0: 63 6f 6d 70 6f 75 6e 64 0a 0a 69 66 63 61 70 61  compound..ifcapa
32f0: 62 6c 65 20 76 69 65 77 20 7b 0a 64 6f 5f 74 65  ble view {.do_te
3300: 73 74 20 61 74 74 61 63 68 2d 34 2e 31 30 20 7b  st attach-4.10 {
3310: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3320: 20 44 45 54 41 43 48 20 44 41 54 41 42 41 53 45   DETACH DATABASE
3330: 20 64 62 32 3b 0a 20 20 7d 0a 20 20 65 78 65 63   db2;.  }.  exec
3340: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
3350: 20 56 49 45 57 20 76 33 20 41 53 20 53 45 4c 45   VIEW v3 AS SELE
3360: 43 54 20 78 2a 31 30 30 2b 79 20 46 52 4f 4d 20  CT x*100+y FROM 
3370: 74 33 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t3;.    SELECT *
3380: 20 46 52 4f 4d 20 76 33 3b 0a 20 20 7d 20 64 62   FROM v3;.  } db
3390: 32 0a 7d 20 7b 31 30 32 20 39 31 30 20 36 30 37  2.} {102 910 607
33a0: 20 31 33 31 34 7d 0a 64 6f 5f 74 65 73 74 20 61   1314}.do_test a
33b0: 74 74 61 63 68 2d 34 2e 31 31 20 7b 0a 20 20 65  ttach-4.11 {.  e
33c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
33d0: 41 54 45 20 56 49 45 57 20 76 33 20 41 53 20 53  ATE VIEW v3 AS S
33e0: 45 4c 45 43 54 20 61 2a 31 30 30 2b 62 20 46 52  ELECT a*100+b FR
33f0: 4f 4d 20 74 33 3b 0a 20 20 20 20 53 45 4c 45 43  OM t3;.    SELEC
3400: 54 20 2a 20 46 52 4f 4d 20 76 33 3b 0a 20 20 7d  T * FROM v3;.  }
3410: 0a 7d 20 7b 39 31 30 20 31 31 31 32 20 31 35 31  .} {910 1112 151
3420: 36 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  6}.do_test attac
3430: 68 2d 34 2e 31 32 20 7b 0a 20 20 65 78 65 63 73  h-4.12 {.  execs
3440: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20  ql {.    ATTACH 
3450: 44 41 54 41 42 41 53 45 20 27 74 65 73 74 32 2e  DATABASE 'test2.
3460: 64 62 27 20 41 53 20 64 62 32 3b 0a 20 20 20 20  db' AS db2;.    
3470: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 62  SELECT * FROM db
3480: 32 2e 76 33 3b 0a 20 20 7d 0a 7d 20 7b 31 30 32  2.v3;.  }.} {102
3490: 20 39 31 30 20 36 30 37 20 31 33 31 34 7d 0a 64   910 607 1314}.d
34a0: 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 34 2e  o_test attach-4.
34b0: 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  13 {.  execsql {
34c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
34d0: 4f 4d 20 6d 61 69 6e 2e 76 33 3b 0a 20 20 7d 0a  OM main.v3;.  }.
34e0: 7d 20 7b 39 31 30 20 31 31 31 32 20 31 35 31 36  } {910 1112 1516
34f0: 7d 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65  }.} ;# ifcapable
3500: 20 76 69 65 77 0a 0a 23 20 54 65 73 74 73 20 66   view..# Tests f
3510: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 46 69 78  or the sqliteFix
3520: 2e 2e 2e 28 29 20 72 6f 75 74 69 6e 65 73 20 69  ...() routines i
3530: 6e 20 61 74 74 61 63 68 2e 63 0a 23 0a 69 66 63  n attach.c.#.ifc
3540: 61 70 61 62 6c 65 20 7b 74 72 69 67 67 65 72 7d  apable {trigger}
3550: 20 7b 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63   {.do_test attac
3560: 68 2d 35 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f  h-5.1 {.  db clo
3570: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
3580: 74 65 73 74 2e 64 62 0a 20 20 64 62 32 20 63 6c  test.db.  db2 cl
3590: 6f 73 65 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  ose.  file delet
35a0: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64  e -force test2.d
35b0: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  b.  sqlite3 db2 
35c0: 74 65 73 74 32 2e 64 62 0a 20 20 63 61 74 63 68  test2.db.  catch
35d0: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
35e0: 20 44 41 54 41 42 41 53 45 20 27 74 65 73 74 2e   DATABASE 'test.
35f0: 64 62 27 20 41 53 20 6f 72 69 67 3b 0a 20 20 20  db' AS orig;.   
3600: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
3610: 72 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  r1 AFTER INSERT 
3620: 4f 4e 20 6f 72 69 67 2e 74 31 20 42 45 47 49 4e  ON orig.t1 BEGIN
3630: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 6e  .      SELECT 'n
3640: 6f 2d 6f 70 27 3b 0a 20 20 20 20 45 4e 44 3b 0a  o-op';.    END;.
3650: 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 74 72    } db2.} {1 {tr
3660: 69 67 67 65 72 20 72 31 20 63 61 6e 6e 6f 74 20  igger r1 cannot 
3670: 72 65 66 65 72 65 6e 63 65 20 6f 62 6a 65 63 74  reference object
3680: 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 6f 72  s in database or
3690: 69 67 7d 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74  ig}}.do_test att
36a0: 61 63 68 2d 35 2e 32 20 7b 0a 20 20 63 61 74 63  ach-5.2 {.  catc
36b0: 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  hsql {.    CREAT
36c0: 45 20 54 41 42 4c 45 20 74 35 28 78 2c 79 29 3b  E TABLE t5(x,y);
36d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
36e0: 47 45 52 20 72 35 20 41 46 54 45 52 20 49 4e 53  GER r5 AFTER INS
36f0: 45 52 54 20 4f 4e 20 74 35 20 42 45 47 49 4e 0a  ERT ON t5 BEGIN.
3700: 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 6e 6f        SELECT 'no
3710: 2d 6f 70 27 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  -op';.    END;. 
3720: 20 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 7d 7d 0a   } db2.} {0 {}}.
3730: 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 35  do_test attach-5
3740: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
3750: 7b 0a 20 20 20 20 44 52 4f 50 20 54 52 49 47 47  {.    DROP TRIGG
3760: 45 52 20 72 35 3b 0a 20 20 20 20 43 52 45 41 54  ER r5;.    CREAT
3770: 45 20 54 52 49 47 47 45 52 20 72 35 20 41 46 54  E TRIGGER r5 AFT
3780: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 35 20  ER INSERT ON t5 
3790: 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45  BEGIN.      SELE
37a0: 43 54 20 27 6e 6f 2d 6f 70 27 20 46 52 4f 4d 20  CT 'no-op' FROM 
37b0: 6f 72 69 67 2e 74 31 3b 0a 20 20 20 20 45 4e 44  orig.t1;.    END
37c0: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b  ;.  } db2.} {1 {
37d0: 74 72 69 67 67 65 72 20 72 35 20 63 61 6e 6e 6f  trigger r5 canno
37e0: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 6a 65  t reference obje
37f0: 63 74 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  cts in database 
3800: 6f 72 69 67 7d 7d 0a 69 66 63 61 70 61 62 6c 65  orig}}.ifcapable
3810: 20 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74   tempdb {.  do_t
3820: 65 73 74 20 61 74 74 61 63 68 2d 35 2e 34 20 7b  est attach-5.4 {
3830: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
3840: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d        CREATE TEM
3850: 50 20 54 41 42 4c 45 20 74 36 28 70 2c 71 2c 72  P TABLE t6(p,q,r
3860: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
3870: 54 52 49 47 47 45 52 20 72 35 20 41 46 54 45 52  TRIGGER r5 AFTER
3880: 20 49 4e 53 45 52 54 20 4f 4e 20 74 35 20 42 45   INSERT ON t5 BE
3890: 47 49 4e 0a 20 20 20 20 20 20 20 20 53 45 4c 45  GIN.        SELE
38a0: 43 54 20 27 6e 6f 2d 6f 70 27 20 46 52 4f 4d 20  CT 'no-op' FROM 
38b0: 74 65 6d 70 2e 74 36 3b 0a 20 20 20 20 20 20 45  temp.t6;.      E
38c0: 4e 44 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20  ND;.    } db2.  
38d0: 7d 20 7b 31 20 7b 74 72 69 67 67 65 72 20 72 35  } {1 {trigger r5
38e0: 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 65 6e 63   cannot referenc
38f0: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 64 61 74  e objects in dat
3900: 61 62 61 73 65 20 74 65 6d 70 7d 7d 0a 7d 0a 69  abase temp}}.}.i
3910: 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72  fcapable subquer
3920: 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 61 74  y {.  do_test at
3930: 74 61 63 68 2d 35 2e 35 20 7b 0a 20 20 20 20 63  tach-5.5 {.    c
3940: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
3950: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72  CREATE TRIGGER r
3960: 35 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  5 AFTER INSERT O
3970: 4e 20 74 35 20 42 45 47 49 4e 0a 20 20 20 20 20  N t5 BEGIN.     
3980: 20 20 20 53 45 4c 45 43 54 20 27 6e 6f 2d 6f 70     SELECT 'no-op
3990: 27 20 7c 7c 20 28 53 45 4c 45 43 54 20 2a 20 46  ' || (SELECT * F
39a0: 52 4f 4d 20 74 65 6d 70 2e 74 36 29 3b 0a 20 20  ROM temp.t6);.  
39b0: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 7d 20 64      END;.    } d
39c0: 62 32 0a 20 20 7d 20 7b 31 20 7b 74 72 69 67 67  b2.  } {1 {trigg
39d0: 65 72 20 72 35 20 63 61 6e 6e 6f 74 20 72 65 66  er r5 cannot ref
39e0: 65 72 65 6e 63 65 20 6f 62 6a 65 63 74 73 20 69  erence objects i
39f0: 6e 20 64 61 74 61 62 61 73 65 20 74 65 6d 70 7d  n database temp}
3a00: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 61 74 74 61  }.  do_test atta
3a10: 63 68 2d 35 2e 36 20 7b 0a 20 20 20 20 63 61 74  ch-5.6 {.    cat
3a20: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  chsql {.      CR
3a30: 45 41 54 45 20 54 52 49 47 47 45 52 20 72 35 20  EATE TRIGGER r5 
3a40: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
3a50: 74 35 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20  t5 BEGIN.       
3a60: 20 53 45 4c 45 43 54 20 27 6e 6f 2d 6f 70 27 20   SELECT 'no-op' 
3a70: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3c  FROM t1 WHERE x<
3a80: 28 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46  (SELECT min(x) F
3a90: 52 4f 4d 20 74 65 6d 70 2e 74 36 29 3b 0a 20 20  ROM temp.t6);.  
3aa0: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 7d 20 64      END;.    } d
3ab0: 62 32 0a 20 20 7d 20 7b 31 20 7b 74 72 69 67 67  b2.  } {1 {trigg
3ac0: 65 72 20 72 35 20 63 61 6e 6e 6f 74 20 72 65 66  er r5 cannot ref
3ad0: 65 72 65 6e 63 65 20 6f 62 6a 65 63 74 73 20 69  erence objects i
3ae0: 6e 20 64 61 74 61 62 61 73 65 20 74 65 6d 70 7d  n database temp}
3af0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 61 74 74 61  }.  do_test atta
3b00: 63 68 2d 35 2e 37 20 7b 0a 20 20 20 20 63 61 74  ch-5.7 {.    cat
3b10: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  chsql {.      CR
3b20: 45 41 54 45 20 54 52 49 47 47 45 52 20 72 35 20  EATE TRIGGER r5 
3b30: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
3b40: 74 35 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20  t5 BEGIN.       
3b50: 20 53 45 4c 45 43 54 20 27 6e 6f 2d 6f 70 27 20   SELECT 'no-op' 
3b60: 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
3b70: 20 31 20 48 41 56 49 4e 47 20 78 3c 28 53 45 4c   1 HAVING x<(SEL
3b80: 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
3b90: 74 65 6d 70 2e 74 36 29 3b 0a 20 20 20 20 20 20  temp.t6);.      
3ba0: 45 4e 44 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20  END;.    } db2. 
3bb0: 20 7d 20 7b 31 20 7b 74 72 69 67 67 65 72 20 72   } {1 {trigger r
3bc0: 35 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 65 6e  5 cannot referen
3bd0: 63 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 64 61  ce objects in da
3be0: 74 61 62 61 73 65 20 74 65 6d 70 7d 7d 0a 20 20  tabase temp}}.  
3bf0: 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 35  do_test attach-5
3c00: 2e 37 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .7 {.    catchsq
3c10: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
3c20: 20 54 52 49 47 47 45 52 20 72 35 20 41 46 54 45   TRIGGER r5 AFTE
3c30: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 35 20 42  R INSERT ON t5 B
3c40: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 53 45 4c  EGIN.        SEL
3c50: 45 43 54 20 6d 61 78 28 31 2c 78 2c 28 53 45 4c  ECT max(1,x,(SEL
3c60: 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
3c70: 74 65 6d 70 2e 74 36 29 29 20 46 52 4f 4d 20 74  temp.t6)) FROM t
3c80: 31 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20  1;.      END;.  
3c90: 20 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b    } db2.  } {1 {
3ca0: 74 72 69 67 67 65 72 20 72 35 20 63 61 6e 6e 6f  trigger r5 canno
3cb0: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 6a 65  t reference obje
3cc0: 63 74 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  cts in database 
3cd0: 74 65 6d 70 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  temp}}.  do_test
3ce0: 20 61 74 74 61 63 68 2d 35 2e 38 20 7b 0a 20 20   attach-5.8 {.  
3cf0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
3d00: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
3d10: 52 20 72 35 20 41 46 54 45 52 20 49 4e 53 45 52  R r5 AFTER INSER
3d20: 54 20 4f 4e 20 74 35 20 42 45 47 49 4e 0a 20 20  T ON t5 BEGIN.  
3d30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3d40: 4f 20 74 31 20 56 41 4c 55 45 53 28 28 53 45 4c  O t1 VALUES((SEL
3d50: 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
3d60: 74 65 6d 70 2e 74 36 29 2c 35 29 3b 0a 20 20 20  temp.t6),5);.   
3d70: 20 20 20 45 4e 44 3b 0a 20 20 20 20 7d 20 64 62     END;.    } db
3d80: 32 0a 20 20 7d 20 7b 31 20 7b 74 72 69 67 67 65  2.  } {1 {trigge
3d90: 72 20 72 35 20 63 61 6e 6e 6f 74 20 72 65 66 65  r r5 cannot refe
3da0: 72 65 6e 63 65 20 6f 62 6a 65 63 74 73 20 69 6e  rence objects in
3db0: 20 64 61 74 61 62 61 73 65 20 74 65 6d 70 7d 7d   database temp}}
3dc0: 0a 20 20 64 6f 5f 74 65 73 74 20 61 74 74 61 63  .  do_test attac
3dd0: 68 2d 35 2e 39 20 7b 0a 20 20 20 20 63 61 74 63  h-5.9 {.    catc
3de0: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  hsql {.      CRE
3df0: 41 54 45 20 54 52 49 47 47 45 52 20 72 35 20 41  ATE TRIGGER r5 A
3e00: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
3e10: 35 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20  5 BEGIN.        
3e20: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
3e30: 48 45 52 45 20 78 3c 28 53 45 4c 45 43 54 20 6d  HERE x<(SELECT m
3e40: 69 6e 28 78 29 20 46 52 4f 4d 20 74 65 6d 70 2e  in(x) FROM temp.
3e50: 74 36 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a  t6);.      END;.
3e60: 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31      } db2.  } {1
3e70: 20 7b 74 72 69 67 67 65 72 20 72 35 20 63 61 6e   {trigger r5 can
3e80: 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62  not reference ob
3e90: 6a 65 63 74 73 20 69 6e 20 64 61 74 61 62 61 73  jects in databas
3ea0: 65 20 74 65 6d 70 7d 7d 0a 7d 20 3b 23 20 65 6e  e temp}}.} ;# en
3eb0: 64 69 66 20 73 75 62 71 75 65 72 79 0a 7d 20 3b  dif subquery.} ;
3ec0: 23 20 65 6e 64 69 66 20 74 72 69 67 67 65 72 0a  # endif trigger.
3ed0: 0a 23 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  .# Check to make
3ee0: 20 73 75 72 65 20 77 65 20 67 65 74 20 61 20 73   sure we get a s
3ef0: 65 6e 73 69 62 6c 65 20 65 72 72 6f 72 20 69 66  ensible error if
3f00: 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 0a   unable to open.
3f10: 23 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  # the file that 
3f20: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
3f30: 20 61 74 74 61 63 68 2e 0a 23 0a 64 6f 5f 74 65   attach..#.do_te
3f40: 73 74 20 61 74 74 61 63 68 2d 36 2e 31 20 7b 0a  st attach-6.1 {.
3f50: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
3f60: 20 41 54 54 41 43 48 20 44 41 54 41 42 41 53 45   ATTACH DATABASE
3f70: 20 27 6e 6f 2d 73 75 63 68 2d 66 69 6c 65 27 20   'no-such-file' 
3f80: 41 53 20 6e 6f 73 75 63 68 3b 0a 20 20 7d 0a 7d  AS nosuch;.  }.}
3f90: 20 7b 30 20 7b 7d 7d 0a 69 66 20 7b 24 74 63 6c   {0 {}}.if {$tcl
3fa0: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
3fb0: 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 20  rm)=="unix"} {. 
3fc0: 20 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d   do_test attach-
3fd0: 36 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  6.2 {.    sqlite
3fe0: 33 20 64 62 78 20 63 61 6e 6e 6f 74 2d 72 65 61  3 dbx cannot-rea
3ff0: 64 0a 20 20 20 20 64 62 78 20 65 76 61 6c 20 7b  d.    dbx eval {
4000: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4010: 61 2c 62 2c 63 29 7d 0a 20 20 20 20 64 62 78 20  a,b,c)}.    dbx 
4020: 63 6c 6f 73 65 0a 20 20 20 20 66 69 6c 65 20 61  close.    file a
4030: 74 74 72 69 62 75 74 65 73 20 63 61 6e 6e 6f 74  ttributes cannot
4040: 2d 72 65 61 64 20 2d 70 65 72 6d 69 73 73 69 6f  -read -permissio
4050: 6e 20 30 30 30 30 0a 20 20 20 20 69 66 20 7b 5b  n 0000.    if {[
4060: 66 69 6c 65 20 77 72 69 74 61 62 6c 65 20 63 61  file writable ca
4070: 6e 6e 6f 74 2d 72 65 61 64 5d 7d 20 7b 0a 20 20  nnot-read]} {.  
4080: 20 20 20 20 70 75 74 73 20 22 5c 6e 2a 2a 2a 2a      puts "\n****
4090: 20 54 65 73 74 73 20 64 6f 20 6e 6f 74 20 77 6f   Tests do not wo
40a0: 72 6b 20 77 68 65 6e 20 72 75 6e 20 61 73 20 72  rk when run as r
40b0: 6f 6f 74 20 2a 2a 2a 2a 22 0a 20 20 20 20 20 20  oot ****".      
40c0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
40d0: 63 65 20 63 61 6e 6e 6f 74 2d 72 65 61 64 0a 20  ce cannot-read. 
40e0: 20 20 20 20 20 65 78 69 74 20 31 0a 20 20 20 20       exit 1.    
40f0: 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  }.    catchsql {
4100: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 44 41  .      ATTACH DA
4110: 54 41 42 41 53 45 20 27 63 61 6e 6e 6f 74 2d 72  TABASE 'cannot-r
4120: 65 61 64 27 20 41 53 20 6e 6f 72 65 61 64 3b 0a  ead' AS noread;.
4130: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 75 6e      }.  } {1 {un
4140: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
4150: 61 62 61 73 65 3a 20 63 61 6e 6e 6f 74 2d 72 65  abase: cannot-re
4160: 61 64 7d 7d 0a 20 20 66 69 6c 65 20 64 65 6c 65  ad}}.  file dele
4170: 74 65 20 2d 66 6f 72 63 65 20 63 61 6e 6e 6f 74  te -force cannot
4180: 2d 72 65 61 64 0a 7d 0a 0a 23 20 43 68 65 63 6b  -read.}..# Check
4190: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
41a0: 67 65 20 69 66 20 77 65 20 74 72 79 20 74 6f 20  ge if we try to 
41b0: 61 63 63 65 73 73 20 61 20 64 61 74 61 62 61 73  access a databas
41c0: 65 20 74 68 61 74 20 68 61 73 0a 23 20 6e 6f 74  e that has.# not
41d0: 20 62 65 65 6e 20 61 74 74 61 63 68 65 64 2e 0a   been attached..
41e0: 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 2d 36  do_test attach-6
41f0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
4200: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
4210: 4c 45 20 6e 6f 5f 73 75 63 68 5f 64 62 2e 74 31  LE no_such_db.t1
4220: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 7d 0a 7d  (a, b, c);.  }.}
4230: 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20 64 61 74   {1 {unknown dat
4240: 61 62 61 73 65 20 6e 6f 5f 73 75 63 68 5f 64 62  abase no_such_db
4250: 7d 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 32 7d  }}.for {set i 2}
4260: 20 7b 24 69 3c 3d 31 35 7d 20 7b 69 6e 63 72 20   {$i<=15} {incr 
4270: 69 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62  i} {.  catch {db
4280: 24 69 20 63 6c 6f 73 65 7d 0a 7d 0a 64 62 20 63  $i close}.}.db c
4290: 6c 6f 73 65 0a 66 69 6c 65 20 64 65 6c 65 74 65  lose.file delete
42a0: 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62   -force test2.db
42b0: 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f  .file delete -fo
42c0: 72 63 65 20 6e 6f 2d 73 75 63 68 2d 66 69 6c 65  rce no-such-file
42d0: 0a 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71  ..ifcapable subq
42e0: 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74  uery {.  do_test
42f0: 20 61 74 74 61 63 68 2d 37 2e 31 20 7b 0a 20 20   attach-7.1 {.  
4300: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
4310: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
4320: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  t.db-journal.   
4330: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
4340: 2e 64 62 0a 20 20 20 20 63 61 74 63 68 73 71 6c  .db.    catchsql
4350: 20 7b 0a 20 20 20 20 20 20 44 45 54 41 43 48 20   {.      DETACH 
4360: 52 41 49 53 45 20 28 20 49 47 4e 4f 52 45 20 29  RAISE ( IGNORE )
4370: 20 49 4e 20 28 20 53 45 4c 45 43 54 20 22 41 41   IN ( SELECT "AA
4380: 41 41 41 41 22 20 2e 20 2a 20 4f 52 44 45 52 20  AAAA" . * ORDER 
4390: 42 59 20 0a 20 20 20 20 20 20 52 45 47 49 53 54  BY .      REGIST
43a0: 45 52 20 4c 49 4d 49 54 20 22 41 41 41 41 41 41  ER LIMIT "AAAAAA
43b0: 22 20 2e 20 22 41 41 41 41 41 41 22 20 4f 46 46  " . "AAAAAA" OFF
43c0: 53 45 54 20 52 41 49 53 45 20 28 20 49 47 4e 4f  SET RAISE ( IGNO
43d0: 52 45 20 29 20 4e 4f 54 20 4e 55 4c 4c 20 29 0a  RE ) NOT NULL ).
43e0: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 69 6e      }.  } {1 {in
43f0: 76 61 6c 69 64 20 6e 61 6d 65 3a 20 22 52 41 49  valid name: "RAI
4400: 53 45 20 28 20 49 47 4e 4f 52 45 20 29 20 49 4e  SE ( IGNORE ) IN
4410: 20 28 20 53 45 4c 45 43 54 20 22 41 41 41 41 41   ( SELECT "AAAAA
4420: 41 22 20 2e 20 2a 20 4f 52 44 45 52 20 42 59 20  A" . * ORDER BY 
4430: 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52 20  .      REGISTER 
4440: 4c 49 4d 49 54 20 22 41 41 41 41 41 41 22 20 2e  LIMIT "AAAAAA" .
4450: 20 22 41 41 41 41 41 41 22 20 4f 46 46 53 45 54   "AAAAAA" OFFSET
4460: 20 52 41 49 53 45 20 28 20 49 47 4e 4f 52 45 20   RAISE ( IGNORE 
4470: 29 20 4e 4f 54 20 4e 55 4c 4c 20 29 22 7d 7d 0a  ) NOT NULL )"}}.
4480: 7d 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        }.finish_test.