/ Hex Artifact Content
Login

Artifact 48a802ed9c009bcc36ad62646680a55c18403b3e:


0000: 23 20 32 30 30 33 20 4a 75 6c 79 20 31 0a 23 0a  # 2003 July 1.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01a0: 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20   The.# focus of 
01b0: 74 68 69 73 20 73 63 72 69 70 74 20 69 73 20 74  this script is t
01c0: 65 73 74 69 6e 67 20 74 68 65 20 41 54 54 41 43  esting the ATTAC
01d0: 48 20 61 6e 64 20 44 45 54 41 43 48 20 63 6f 6d  H and DETACH com
01e0: 6d 61 6e 64 73 0a 23 20 61 6e 64 20 72 65 6c 61  mands.# and rela
01f0: 74 65 64 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  ted functionalit
0200: 79 2e 0a 23 0a 23 20 24 49 64 3a 20 61 74 74 61  y..#.# $Id: atta
0210: 63 68 32 2e 74 65 73 74 2c 76 20 31 2e 32 38 20  ch2.test,v 1.28 
0220: 32 30 30 34 2f 31 31 2f 30 35 20 30 33 3a 35 36  2004/11/05 03:56
0230: 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a 23 0a  :02 drh Exp $.#.
0240: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0250: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0260: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0270: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 0a  ir/tester.tcl...
0280: 23 20 54 69 63 6b 65 74 20 23 33 35 34 0a 23 0a  # Ticket #354.#.
0290: 23 20 44 61 74 61 62 61 73 65 73 20 74 65 73 74  # Databases test
02a0: 2e 64 62 20 61 6e 64 20 74 65 73 74 32 2e 64 62  .db and test2.db
02b0: 20 63 6f 6e 74 61 69 6e 20 69 64 65 6e 74 69 63   contain identic
02c0: 61 6c 20 73 63 68 65 6d 61 73 2e 20 20 4d 61 6b  al schemas.  Mak
02d0: 65 0a 23 20 73 75 72 65 20 77 65 20 63 61 6e 20  e.# sure we can 
02e0: 61 74 74 61 63 68 20 74 65 73 74 32 2e 64 62 20  attach test2.db 
02f0: 66 72 6f 6d 20 74 65 73 74 2e 64 62 2e 0a 23 0a  from test.db..#.
0300: 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32 2d  do_test attach2-
0310: 31 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  1.1 {.  db eval 
0320: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0330: 4c 45 20 74 31 28 61 2c 62 29 3b 0a 20 20 20 20  LE t1(a,b);.    
0340: 43 52 45 41 54 45 20 49 4e 44 45 58 20 78 31 20  CREATE INDEX x1 
0350: 4f 4e 20 74 31 28 61 29 3b 0a 20 20 7d 0a 20 20  ON t1(a);.  }.  
0360: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
0370: 63 65 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69  ce test2.db.  fi
0380: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
0390: 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61   test2.db-journa
03a0: 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  l.  sqlite3 db2 
03b0: 74 65 73 74 32 2e 64 62 0a 20 20 64 62 32 20 65  test2.db.  db2 e
03c0: 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  val {.    CREATE
03d0: 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29 3b 0a   TABLE t1(a,b);.
03e0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
03f0: 20 78 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   x1 ON t1(a);.  
0400: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  }.  catchsql {. 
0410: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
0420: 2e 64 62 27 20 41 53 20 74 32 3b 0a 20 20 7d 0a  .db' AS t2;.  }.
0430: 7d 20 7b 30 20 7b 7d 7d 0a 0a 23 20 54 69 63 6b  } {0 {}}..# Tick
0440: 65 74 20 23 35 31 34 0a 23 0a 70 72 6f 63 20 64  et #514.#.proc d
0450: 62 5f 6c 69 73 74 20 7b 64 62 7d 20 7b 0a 20 20  b_list {db} {.  
0460: 73 65 74 20 6c 69 73 74 20 7b 7d 0a 20 20 66 6f  set list {}.  fo
0470: 72 65 61 63 68 20 7b 69 64 78 20 6e 61 6d 65 20  reach {idx name 
0480: 66 69 6c 65 7d 20 5b 65 78 65 63 73 71 6c 20 7b  file} [execsql {
0490: 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f  PRAGMA database_
04a0: 6c 69 73 74 7d 20 24 64 62 5d 20 7b 0a 20 20 20  list} $db] {.   
04b0: 20 6c 61 70 70 65 6e 64 20 6c 69 73 74 20 24 69   lappend list $i
04c0: 64 78 20 24 6e 61 6d 65 0a 20 20 7d 0a 20 20 72  dx $name.  }.  r
04d0: 65 74 75 72 6e 20 24 6c 69 73 74 0a 7d 0a 64 62  eturn $list.}.db
04e0: 20 65 76 61 6c 20 7b 44 45 54 41 43 48 20 74 32   eval {DETACH t2
04f0: 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  }.do_test attach
0500: 32 2d 32 2e 31 20 7b 0a 20 20 23 20 6c 6f 63 6b  2-2.1 {.  # lock
0510: 20 74 65 73 74 32 2e 64 62 20 74 68 65 6e 20 74   test2.db then t
0520: 72 79 20 74 6f 20 61 74 74 61 63 68 20 69 74 2e  ry to attach it.
0530: 20 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e    This is no lon
0540: 67 65 72 20 61 6e 20 65 72 72 6f 72 20 62 65 63  ger an error bec
0550: 61 75 73 65 0a 20 20 23 20 64 62 32 20 6a 75 73  ause.  # db2 jus
0560: 74 20 52 45 53 45 52 56 45 53 20 74 68 65 20 64  t RESERVES the d
0570: 61 74 61 62 61 73 65 2e 20 20 49 74 20 64 6f 65  atabase.  It doe
0580: 73 20 6e 6f 74 20 6f 62 74 61 69 6e 20 61 20 77  s not obtain a w
0590: 72 69 74 65 2d 6c 6f 63 6b 20 75 6e 74 69 6c 0a  rite-lock until.
05a0: 20 20 23 20 77 65 20 43 4f 4d 4d 49 54 2e 0a 20    # we COMMIT.. 
05b0: 20 64 62 32 20 65 76 61 6c 20 7b 42 45 47 49 4e   db2 eval {BEGIN
05c0: 7d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 55 50  }.  db2 eval {UP
05d0: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
05e0: 30 20 57 48 45 52 45 20 30 7d 0a 20 20 63 61 74  0 WHERE 0}.  cat
05f0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41  chsql {.    ATTA
0600: 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53  CH 'test2.db' AS
0610: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d   t2;.  }.} {0 {}
0620: 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  }.do_test attach
0630: 32 2d 32 2e 32 20 7b 0a 20 20 23 20 6d 61 6b 65  2-2.2 {.  # make
0640: 20 73 75 72 65 20 74 65 73 74 32 2e 64 62 20 64   sure test2.db d
0650: 69 64 20 67 65 74 20 61 74 74 61 63 68 65 64 2e  id get attached.
0660: 0a 20 20 64 62 5f 6c 69 73 74 20 64 62 0a 7d 20  .  db_list db.} 
0670: 7b 30 20 6d 61 69 6e 20 32 20 74 32 7d 0a 64 62  {0 main 2 t2}.db
0680: 32 20 65 76 61 6c 20 7b 43 4f 4d 4d 49 54 7d 0a  2 eval {COMMIT}.
0690: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32  .do_test attach2
06a0: 2d 32 2e 35 20 7b 0a 20 20 23 20 4d 61 6b 65 20  -2.5 {.  # Make 
06b0: 73 75 72 65 20 77 65 20 63 61 6e 20 72 65 61 64  sure we can read
06c0: 20 74 65 73 74 32 2e 64 62 20 66 72 6f 6d 20 64   test2.db from d
06d0: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  b.  catchsql {. 
06e0: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
06f0: 52 4f 4d 20 74 32 2e 73 71 6c 69 74 65 5f 6d 61  ROM t2.sqlite_ma
0700: 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b  ster;.  }.} {0 {
0710: 74 31 20 78 31 7d 7d 0a 64 6f 5f 74 65 73 74 20  t1 x1}}.do_test 
0720: 61 74 74 61 63 68 32 2d 32 2e 36 20 7b 0a 20 20  attach2-2.6 {.  
0730: 23 20 6c 6f 63 6b 20 74 65 73 74 32 2e 64 62 20  # lock test2.db 
0740: 61 6e 64 20 74 72 79 20 74 6f 20 72 65 61 64 20  and try to read 
0750: 66 72 6f 6d 20 69 74 2e 20 20 54 68 69 73 20 73  from it.  This s
0760: 68 6f 75 6c 64 20 73 74 69 6c 6c 20 77 6f 72 6b  hould still work
0770: 20 62 65 63 61 75 73 65 0a 20 20 23 20 74 68 65   because.  # the
0780: 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c 79 20 61 20   lock is only a 
0790: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
07a0: 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 70 72 65  ich does not pre
07b0: 76 65 6e 74 20 72 65 61 64 69 6e 67 2e 0a 20 20  vent reading..  
07c0: 23 0a 20 20 64 62 32 20 65 76 61 6c 20 42 45 47  #.  db2 eval BEG
07d0: 49 4e 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 55  IN.  db2 eval {U
07e0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
07f0: 20 30 20 57 48 45 52 45 20 30 7d 0a 20 20 63 61   0 WHERE 0}.  ca
0800: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
0810: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 74 32  ECT name FROM t2
0820: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a  .sqlite_master;.
0830: 20 20 7d 0a 7d 20 7b 30 20 7b 74 31 20 78 31 7d    }.} {0 {t1 x1}
0840: 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  }.do_test attach
0850: 32 2d 32 2e 37 20 7b 0a 20 20 23 20 62 75 74 20  2-2.7 {.  # but 
0860: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61  we can still rea
0870: 64 20 66 72 6f 6d 20 74 65 73 74 31 2e 64 62 20  d from test1.db 
0880: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 65 73 74  even though test
0890: 32 2e 64 62 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  2.db is locked..
08a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
08b0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
08c0: 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  M main.sqlite_ma
08d0: 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b  ster;.  }.} {0 {
08e0: 74 31 20 78 31 7d 7d 0a 64 6f 5f 74 65 73 74 20  t1 x1}}.do_test 
08f0: 61 74 74 61 63 68 32 2d 32 2e 38 20 7b 0a 20 20  attach2-2.8 {.  
0900: 23 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  # start a transa
0910: 63 74 69 6f 6e 20 6f 6e 20 74 65 73 74 2e 64 62  ction on test.db
0920: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 65 73   even though tes
0930: 74 32 2e 64 62 20 69 73 20 6c 6f 63 6b 65 64 2e  t2.db is locked.
0940: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0950: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
0960: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0970: 45 53 28 38 2c 39 29 3b 0a 20 20 7d 0a 7d 20 7b  ES(8,9);.  }.} {
0980: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 61 74  0 {}}.do_test at
0990: 74 61 63 68 32 2d 32 2e 39 20 7b 0a 20 20 65 78  tach2-2.9 {.  ex
09a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
09b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20 7d  CT * FROM t1.  }
09c0: 0a 7d 20 7b 38 20 39 7d 0a 64 6f 5f 74 65 73 74  .} {8 9}.do_test
09d0: 20 61 74 74 61 63 68 32 2d 32 2e 31 30 20 7b 0a   attach2-2.10 {.
09e0: 20 20 23 20 6e 6f 77 20 74 72 79 20 74 6f 20 77    # now try to w
09f0: 72 69 74 65 20 74 6f 20 74 65 73 74 32 2e 64 62  rite to test2.db
0a00: 2e 20 20 74 68 65 20 77 72 69 74 65 20 73 68 6f  .  the write sho
0a10: 75 6c 64 20 66 61 69 6c 0a 20 20 63 61 74 63 68  uld fail.  catch
0a20: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
0a30: 20 49 4e 54 4f 20 74 32 2e 74 31 20 56 41 4c 55   INTO t2.t1 VALU
0a40: 45 53 28 31 2c 32 29 3b 0a 20 20 7d 0a 7d 20 7b  ES(1,2);.  }.} {
0a50: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0a60: 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ocked}}.do_test 
0a70: 61 74 74 61 63 68 32 2d 32 2e 31 31 20 7b 0a 20  attach2-2.11 {. 
0a80: 20 23 20 77 68 65 6e 20 74 68 65 20 77 72 69 74   # when the writ
0a90: 65 20 66 61 69 6c 65 64 20 69 6e 20 74 68 65 20  e failed in the 
0aa0: 70 72 65 76 69 6f 75 73 20 74 65 73 74 2c 20 74  previous test, t
0ab0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
0ac0: 68 6f 75 6c 64 0a 20 20 23 20 68 61 76 65 20 72  hould.  # have r
0ad0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 23 20  olled back..  # 
0ae0: 0a 20 20 23 20 55 70 64 61 74 65 20 66 6f 72 20  .  # Update for 
0af0: 76 65 72 73 69 6f 6e 20 33 3a 20 41 20 74 72 61  version 3: A tra
0b00: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  nsaction is no l
0b10: 6f 6e 67 65 72 20 72 6f 6c 6c 65 64 20 62 61 63  onger rolled bac
0b20: 6b 20 69 66 20 61 0a 20 20 23 20 20 20 20 20 20  k if a.  #      
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 64 61 74 61 62 61 73 65 20 69 73 20 66 6f 75   database is fou
0b50: 6e 64 20 74 6f 20 62 65 20 62 75 73 79 2e 0a 20  nd to be busy.. 
0b60: 20 65 78 65 63 73 71 6c 20 7b 72 6f 6c 6c 62 61   execsql {rollba
0b70: 63 6b 7d 0a 20 20 64 62 32 20 65 76 61 6c 20 52  ck}.  db2 eval R
0b80: 4f 4c 4c 42 41 43 4b 0a 20 20 65 78 65 63 73 71  OLLBACK.  execsq
0b90: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
0ba0: 20 46 52 4f 4d 20 74 31 0a 20 20 7d 0a 7d 20 7b   FROM t1.  }.} {
0bb0: 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  }.do_test attach
0bc0: 32 2d 32 2e 31 32 20 7b 0a 20 20 63 61 74 63 68  2-2.12 {.  catch
0bd0: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
0be0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f  .  }.} {1 {canno
0bf0: 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72  t commit - no tr
0c00: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
0c10: 69 76 65 7d 7d 0a 0a 23 20 54 69 63 6b 65 74 20  ive}}..# Ticket 
0c20: 23 35 37 34 3a 20 20 4d 61 6b 65 20 73 75 72 65  #574:  Make sure
0c30: 20 69 74 20 77 6f 72 6b 73 20 75 73 69 6e 67 20   it works using 
0c40: 74 68 65 20 6e 6f 6e 2d 63 61 6c 6c 62 61 63 6b  the non-callback
0c50: 20 41 50 49 0a 23 0a 64 6f 5f 74 65 73 74 20 61   API.#.do_test a
0c60: 74 74 61 63 68 32 2d 33 2e 31 20 7b 0a 20 20 64  ttach2-3.1 {.  d
0c70: 62 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 44 42  b close.  set DB
0c80: 20 5b 73 71 6c 69 74 65 33 20 64 62 20 74 65 73   [sqlite3 db tes
0c90: 74 2e 64 62 5d 0a 20 20 73 65 74 20 72 63 20 5b  t.db].  set rc [
0ca0: 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 70  catch {sqlite3_p
0cb0: 72 65 70 61 72 65 20 24 44 42 20 22 41 54 54 41  repare $DB "ATTA
0cc0: 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53  CH 'test2.db' AS
0cd0: 20 74 32 22 20 2d 31 20 54 41 49 4c 7d 20 56 4d   t2" -1 TAIL} VM
0ce0: 5d 0a 20 20 69 66 20 7b 24 72 63 7d 20 7b 6c 61  ].  if {$rc} {la
0cf0: 70 70 65 6e 64 20 72 63 20 24 56 4d 7d 0a 20 20  ppend rc $VM}.  
0d00: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
0d10: 20 24 56 4d 0a 20 20 73 65 74 20 72 63 0a 7d 20   $VM.  set rc.} 
0d20: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74 61  {0}.do_test atta
0d30: 63 68 32 2d 33 2e 32 20 7b 0a 20 20 73 65 74 20  ch2-3.2 {.  set 
0d40: 72 63 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74  rc [catch {sqlit
0d50: 65 33 5f 70 72 65 70 61 72 65 20 24 44 42 20 22  e3_prepare $DB "
0d60: 44 45 54 41 43 48 20 74 32 22 20 2d 31 20 54 41  DETACH t2" -1 TA
0d70: 49 4c 7d 20 56 4d 5d 0a 20 20 69 66 20 7b 24 72  IL} VM].  if {$r
0d80: 63 7d 20 7b 6c 61 70 70 65 6e 64 20 72 63 20 24  c} {lappend rc $
0d90: 56 4d 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  VM}.  sqlite3_fi
0da0: 6e 61 6c 69 7a 65 20 24 56 4d 0a 20 20 73 65 74  nalize $VM.  set
0db0: 20 72 63 0a 7d 20 7b 30 7d 0a 0a 64 62 20 63 6c   rc.} {0}..db cl
0dc0: 6f 73 65 0a 66 6f 72 20 7b 73 65 74 20 69 20 32  ose.for {set i 2
0dd0: 7d 20 7b 24 69 3c 3d 31 35 7d 20 7b 69 6e 63 72  } {$i<=15} {incr
0de0: 20 69 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 64   i} {.  catch {d
0df0: 62 24 69 20 63 6c 6f 73 65 7d 0a 7d 0a 0a 23 20  b$i close}.}..# 
0e00: 41 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 76  A procedure to v
0e10: 65 72 69 66 79 20 74 68 65 20 73 74 61 74 75 73  erify the status
0e20: 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 61 20 64   of locks on a d
0e30: 61 74 61 62 61 73 65 2e 0a 23 0a 70 72 6f 63 20  atabase..#.proc 
0e40: 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7b 74 65 73  lock_status {tes
0e50: 74 6e 75 6d 20 64 62 20 65 78 70 65 63 74 65 64  tnum db expected
0e60: 5f 72 65 73 75 6c 74 7d 20 7b 0a 20 20 64 6f 5f  _result} {.  do_
0e70: 74 65 73 74 20 61 74 74 61 63 68 32 2d 24 74 65  test attach2-$te
0e80: 73 74 6e 75 6d 20 5b 73 75 62 73 74 20 7b 0a 20  stnum [subst {. 
0e90: 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47     execsql {PRAG
0ea0: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 7d 20  MA lock_status} 
0eb0: 24 64 62 0a 20 20 7d 5d 20 24 65 78 70 65 63 74  $db.  }] $expect
0ec0: 65 64 5f 72 65 73 75 6c 74 0a 7d 0a 73 65 74 20  ed_result.}.set 
0ed0: 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 20  sqlite_os_trace 
0ee0: 30 0a 0a 23 20 54 65 73 74 73 20 61 74 74 61 63  0..# Tests attac
0ef0: 68 32 2d 34 2e 2a 20 74 65 73 74 20 74 68 61 74  h2-4.* test that
0f00: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 77 6f 72 6b   read-locks work
0f10: 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 20   correctly with 
0f20: 61 74 74 61 63 68 65 64 0a 23 20 64 61 74 61 62  attached.# datab
0f30: 61 73 65 73 2e 0a 64 6f 5f 74 65 73 74 20 61 74  ases..do_test at
0f40: 74 61 63 68 32 2d 34 2e 31 20 7b 0a 20 20 73 71  tach2-4.1 {.  sq
0f50: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
0f60: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
0f70: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
0f80: 20 7b 41 54 54 41 43 48 20 27 74 65 73 74 32 2e   {ATTACH 'test2.
0f90: 64 62 27 20 61 73 20 66 69 6c 65 32 7d 0a 20 20  db' as file2}.  
0fa0: 65 78 65 63 73 71 6c 20 7b 41 54 54 41 43 48 20  execsql {ATTACH 
0fb0: 27 74 65 73 74 32 2e 64 62 27 20 61 73 20 66 69  'test2.db' as fi
0fc0: 6c 65 32 7d 20 64 62 32 0a 7d 20 7b 7d 0a 0a 6c  le2} db2.} {}..l
0fd0: 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e 31 2e 31  ock_status 4.1.1
0fe0: 20 64 62 20 7b 6d 61 69 6e 20 75 6e 6c 6f 63 6b   db {main unlock
0ff0: 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 20 66  ed temp closed f
1000: 69 6c 65 32 20 75 6e 6c 6f 63 6b 65 64 7d 0a 6c  ile2 unlocked}.l
1010: 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e 31 2e 32  ock_status 4.1.2
1020: 20 64 62 32 20 7b 6d 61 69 6e 20 75 6e 6c 6f 63   db2 {main unloc
1030: 6b 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 20  ked temp closed 
1040: 66 69 6c 65 32 20 75 6e 6c 6f 63 6b 65 64 7d 0a  file2 unlocked}.
1050: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32  .do_test attach2
1060: 2d 34 2e 32 20 7b 0a 20 20 23 20 48 61 6e 64 6c  -4.2 {.  # Handl
1070: 65 20 27 64 62 27 20 72 65 61 64 2d 6c 6f 63 6b  e 'db' read-lock
1080: 73 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  s test.db.  exec
1090: 73 71 6c 20 7b 42 45 47 49 4e 7d 0a 20 20 65 78  sql {BEGIN}.  ex
10a0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
10b0: 46 52 4f 4d 20 74 31 7d 0a 20 20 23 20 4c 6f 63  FROM t1}.  # Loc
10c0: 6b 20 73 74 61 74 75 73 3a 0a 20 20 23 20 20 20  k status:.  #   
10d0: 20 64 62 20 20 2d 20 73 68 61 72 65 64 28 6d 61   db  - shared(ma
10e0: 69 6e 29 0a 20 20 23 20 20 20 20 64 62 32 20 2d  in).  #    db2 -
10f0: 0a 7d 20 7b 7d 0a 0a 6c 6f 63 6b 5f 73 74 61 74  .} {}..lock_stat
1100: 75 73 20 34 2e 32 2e 31 20 64 62 20 7b 6d 61 69  us 4.2.1 db {mai
1110: 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c  n shared temp cl
1120: 6f 73 65 64 20 66 69 6c 65 32 20 75 6e 6c 6f 63  osed file2 unloc
1130: 6b 65 64 7d 0a 6c 6f 63 6b 5f 73 74 61 74 75 73  ked}.lock_status
1140: 20 34 2e 32 2e 32 20 64 62 32 20 7b 6d 61 69 6e   4.2.2 db2 {main
1150: 20 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20 63   unlocked temp c
1160: 6c 6f 73 65 64 20 66 69 6c 65 32 20 75 6e 6c 6f  losed file2 unlo
1170: 63 6b 65 64 7d 0a 0a 64 6f 5f 74 65 73 74 20 61  cked}..do_test a
1180: 74 74 61 63 68 32 2d 34 2e 33 20 7b 0a 20 20 23  ttach2-4.3 {.  #
1190: 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 68   The read lock h
11a0: 65 6c 64 20 62 79 20 64 62 20 64 6f 65 73 20 6e  eld by db does n
11b0: 6f 74 20 70 72 65 76 65 6e 74 20 64 62 32 20 66  ot prevent db2 f
11c0: 72 6f 6d 20 72 65 61 64 69 6e 67 20 74 65 73 74  rom reading test
11d0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  .db.  execsql {S
11e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
11f0: 20 64 62 32 0a 7d 20 7b 7d 0a 0a 6c 6f 63 6b 5f   db2.} {}..lock_
1200: 73 74 61 74 75 73 20 34 2e 33 2e 31 20 64 62 20  status 4.3.1 db 
1210: 7b 6d 61 69 6e 20 73 68 61 72 65 64 20 74 65 6d  {main shared tem
1220: 70 20 63 6c 6f 73 65 64 20 66 69 6c 65 32 20 75  p closed file2 u
1230: 6e 6c 6f 63 6b 65 64 7d 0a 6c 6f 63 6b 5f 73 74  nlocked}.lock_st
1240: 61 74 75 73 20 34 2e 33 2e 32 20 64 62 32 20 7b  atus 4.3.2 db2 {
1250: 6d 61 69 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 65  main unlocked te
1260: 6d 70 20 63 6c 6f 73 65 64 20 66 69 6c 65 32 20  mp closed file2 
1270: 75 6e 6c 6f 63 6b 65 64 7d 0a 0a 64 6f 5f 74 65  unlocked}..do_te
1280: 73 74 20 61 74 74 61 63 68 32 2d 34 2e 34 20 7b  st attach2-4.4 {
1290: 0a 20 20 23 20 64 62 20 69 73 20 68 6f 6c 64 69  .  # db is holdi
12a0: 6e 67 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ng a read lock o
12b0: 6e 20 74 65 73 74 2e 64 62 2c 20 73 6f 20 77 65  n test.db, so we
12c0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
12d0: 62 6c 65 0a 20 20 23 20 74 6f 20 63 6f 6d 6d 69  ble.  # to commi
12e0: 74 20 61 20 77 72 69 74 65 20 74 6f 20 74 65 73  t a write to tes
12f0: 74 2e 64 62 20 66 72 6f 6d 20 64 62 32 0a 20 20  t.db from db2.  
1300: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
1310: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1320: 4c 55 45 53 28 31 2c 20 32 29 0a 20 20 7d 20 64  LUES(1, 2).  } d
1330: 62 32 20 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  b2 .} {1 {databa
1340: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1350: 6c 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e 34 2e  lock_status 4.4.
1360: 31 20 64 62 20 7b 6d 61 69 6e 20 73 68 61 72 65  1 db {main share
1370: 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 20 66 69  d temp closed fi
1380: 6c 65 32 20 75 6e 6c 6f 63 6b 65 64 7d 0a 6c 6f  le2 unlocked}.lo
1390: 63 6b 5f 73 74 61 74 75 73 20 34 2e 34 2e 32 20  ck_status 4.4.2 
13a0: 64 62 32 20 7b 6d 61 69 6e 20 75 6e 6c 6f 63 6b  db2 {main unlock
13b0: 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 20 66  ed temp closed f
13c0: 69 6c 65 32 20 75 6e 6c 6f 63 6b 65 64 7d 0a 0a  ile2 unlocked}..
13d0: 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32 2d  do_test attach2-
13e0: 34 2e 35 20 7b 0a 20 20 23 20 48 61 6e 64 6c 65  4.5 {.  # Handle
13f0: 20 27 64 62 32 27 20 72 65 73 65 72 76 65 73 20   'db2' reserves 
1400: 66 69 6c 65 32 2e 0a 20 20 65 78 65 63 73 71 6c  file2..  execsql
1410: 20 7b 42 45 47 49 4e 7d 20 64 62 32 0a 20 20 65   {BEGIN} db2.  e
1420: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
1430: 4e 54 4f 20 66 69 6c 65 32 2e 74 31 20 56 41 4c  NTO file2.t1 VAL
1440: 55 45 53 28 31 2c 20 32 29 7d 20 64 62 32 0a 20  UES(1, 2)} db2. 
1450: 20 23 20 4c 6f 63 6b 20 73 74 61 74 75 73 3a 0a   # Lock status:.
1460: 20 20 23 20 20 20 20 64 62 20 20 2d 20 73 68 61    #    db  - sha
1470: 72 65 64 28 6d 61 69 6e 29 0a 20 20 23 20 20 20  red(main).  #   
1480: 20 64 62 32 20 2d 20 72 65 73 65 72 76 65 64 28   db2 - reserved(
1490: 66 69 6c 65 32 29 0a 7d 20 7b 7d 0a 0a 6c 6f 63  file2).} {}..loc
14a0: 6b 5f 73 74 61 74 75 73 20 34 2e 35 2e 31 20 64  k_status 4.5.1 d
14b0: 62 20 7b 6d 61 69 6e 20 73 68 61 72 65 64 20 74  b {main shared t
14c0: 65 6d 70 20 63 6c 6f 73 65 64 20 66 69 6c 65 32  emp closed file2
14d0: 20 75 6e 6c 6f 63 6b 65 64 7d 0a 6c 6f 63 6b 5f   unlocked}.lock_
14e0: 73 74 61 74 75 73 20 34 2e 35 2e 32 20 64 62 32  status 4.5.2 db2
14f0: 20 7b 6d 61 69 6e 20 75 6e 6c 6f 63 6b 65 64 20   {main unlocked 
1500: 74 65 6d 70 20 63 6c 6f 73 65 64 20 66 69 6c 65  temp closed file
1510: 32 20 72 65 73 65 72 76 65 64 7d 0a 0a 64 6f 5f  2 reserved}..do_
1520: 74 65 73 74 20 61 74 74 61 63 68 32 2d 34 2e 36  test attach2-4.6
1530: 2e 31 20 7b 0a 20 20 23 20 52 65 61 64 73 20 61  .1 {.  # Reads a
1540: 72 65 20 61 6c 6c 6f 77 65 64 20 61 67 61 69 6e  re allowed again
1550: 73 74 20 61 20 72 65 73 65 72 76 65 64 20 64 61  st a reserved da
1560: 74 61 62 61 73 65 2e 0a 20 20 63 61 74 63 68 73  tabase..  catchs
1570: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1580: 2a 20 46 52 4f 4d 20 66 69 6c 65 32 2e 74 31 3b  * FROM file2.t1;
1590: 0a 20 20 7d 0a 20 20 23 20 4c 6f 63 6b 20 73 74  .  }.  # Lock st
15a0: 61 74 75 73 3a 0a 20 20 23 20 20 20 20 64 62 20  atus:.  #    db 
15b0: 20 2d 20 73 68 61 72 65 64 28 6d 61 69 6e 29 2c   - shared(main),
15c0: 20 73 68 61 72 65 64 28 66 69 6c 65 32 29 0a 20   shared(file2). 
15d0: 20 23 20 20 20 20 64 62 32 20 2d 20 72 65 73 65   #    db2 - rese
15e0: 72 76 65 64 28 66 69 6c 65 32 29 0a 7d 20 7b 30  rved(file2).} {0
15f0: 20 7b 7d 7d 0a 0a 6c 6f 63 6b 5f 73 74 61 74 75   {}}..lock_statu
1600: 73 20 34 2e 36 2e 31 2e 31 20 64 62 20 7b 6d 61  s 4.6.1.1 db {ma
1610: 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20 63  in shared temp c
1620: 6c 6f 73 65 64 20 66 69 6c 65 32 20 73 68 61 72  losed file2 shar
1630: 65 64 7d 0a 6c 6f 63 6b 5f 73 74 61 74 75 73 20  ed}.lock_status 
1640: 34 2e 36 2e 31 2e 32 20 64 62 32 20 7b 6d 61 69  4.6.1.2 db2 {mai
1650: 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20  n unlocked temp 
1660: 63 6c 6f 73 65 64 20 66 69 6c 65 32 20 72 65 73  closed file2 res
1670: 65 72 76 65 64 7d 0a 0a 64 6f 5f 74 65 73 74 20  erved}..do_test 
1680: 61 74 74 61 63 68 32 2d 34 2e 36 2e 32 20 7b 0a  attach2-4.6.2 {.
1690: 20 20 23 20 57 72 69 74 65 73 20 61 67 61 69 6e    # Writes again
16a0: 73 74 20 61 20 72 65 73 65 72 76 65 64 20 64 61  st a reserved da
16b0: 74 61 62 61 73 65 20 61 72 65 20 6e 6f 74 20 61  tabase are not a
16c0: 6c 6c 6f 77 65 64 2e 0a 20 20 63 61 74 63 68 73  llowed..  catchs
16d0: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
16e0: 66 69 6c 65 32 2e 74 31 20 53 45 54 20 61 3d 30  file2.t1 SET a=0
16f0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ;.  }.} {1 {data
1700: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
1710: 0a 0a 6c 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e  ..lock_status 4.
1720: 36 2e 32 2e 31 20 64 62 20 7b 6d 61 69 6e 20 73  6.2.1 db {main s
1730: 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  hared temp close
1740: 64 20 66 69 6c 65 32 20 73 68 61 72 65 64 7d 0a  d file2 shared}.
1750: 6c 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e 36 2e  lock_status 4.6.
1760: 32 2e 32 20 64 62 32 20 7b 6d 61 69 6e 20 75 6e  2.2 db2 {main un
1770: 6c 6f 63 6b 65 64 20 74 65 6d 70 20 63 6c 6f 73  locked temp clos
1780: 65 64 20 66 69 6c 65 32 20 72 65 73 65 72 76 65  ed file2 reserve
1790: 64 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 74 74 61  d}..do_test atta
17a0: 63 68 32 2d 34 2e 37 20 7b 0a 20 20 23 20 45 6e  ch2-4.7 {.  # En
17b0: 73 75 72 65 20 68 61 6e 64 6c 65 20 27 64 62 27  sure handle 'db'
17c0: 20 72 65 74 61 69 6e 73 20 74 68 65 20 6c 6f 63   retains the loc
17d0: 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 66 69  k on the main fi
17e0: 6c 65 20 61 66 74 65 72 0a 20 20 23 20 66 61 69  le after.  # fai
17f0: 6c 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20 61  ling to obtain a
1800: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 66   write-lock on f
1810: 69 6c 65 32 2e 0a 20 20 63 61 74 63 68 73 71 6c  ile2..  catchsql
1820: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
1830: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1840: 32 29 0a 20 20 7d 20 64 62 32 20 0a 7d 20 7b 30  2).  } db2 .} {0
1850: 20 7b 7d 7d 0a 0a 6c 6f 63 6b 5f 73 74 61 74 75   {}}..lock_statu
1860: 73 20 34 2e 37 2e 31 20 64 62 20 7b 6d 61 69 6e  s 4.7.1 db {main
1870: 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f   shared temp clo
1880: 73 65 64 20 66 69 6c 65 32 20 73 68 61 72 65 64  sed file2 shared
1890: 7d 0a 6c 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e  }.lock_status 4.
18a0: 37 2e 32 20 64 62 32 20 7b 6d 61 69 6e 20 72 65  7.2 db2 {main re
18b0: 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
18c0: 65 64 20 66 69 6c 65 32 20 72 65 73 65 72 76 65  ed file2 reserve
18d0: 64 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 74 74 61  d}..do_test atta
18e0: 63 68 32 2d 34 2e 38 20 7b 0a 20 20 23 20 57 65  ch2-4.8 {.  # We
18f0: 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1900: 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 74 65   able to read te
1910: 73 74 2e 64 62 20 66 72 6f 6d 20 64 62 32 0a 20  st.db from db2. 
1920: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
1930: 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32 0a   * FROM t1} db2.
1940: 7d 20 7b 31 20 32 7d 0a 0a 6c 6f 63 6b 5f 73 74  } {1 2}..lock_st
1950: 61 74 75 73 20 34 2e 38 2e 31 20 64 62 20 7b 6d  atus 4.8.1 db {m
1960: 61 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20  ain shared temp 
1970: 63 6c 6f 73 65 64 20 66 69 6c 65 32 20 73 68 61  closed file2 sha
1980: 72 65 64 7d 0a 6c 6f 63 6b 5f 73 74 61 74 75 73  red}.lock_status
1990: 20 34 2e 38 2e 32 20 64 62 32 20 7b 6d 61 69 6e   4.8.2 db2 {main
19a0: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
19b0: 6c 6f 73 65 64 20 66 69 6c 65 32 20 72 65 73 65  losed file2 rese
19c0: 72 76 65 64 7d 0a 0a 64 6f 5f 74 65 73 74 20 61  rved}..do_test a
19d0: 74 74 61 63 68 32 2d 34 2e 39 20 7b 0a 20 20 23  ttach2-4.9 {.  #
19e0: 20 54 72 79 20 74 6f 20 75 70 67 72 61 64 65 20   Try to upgrade 
19f0: 74 68 65 20 68 61 6e 64 6c 65 20 27 64 62 27 20  the handle 'db' 
1a00: 6c 6f 63 6b 2e 0a 20 20 63 61 74 63 68 73 71 6c  lock..  catchsql
1a10: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
1a20: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1a30: 32 29 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  2).  }.} {1 {dat
1a40: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1a50: 7d 0a 0a 6c 6f 63 6b 5f 73 74 61 74 75 73 20 34  }..lock_status 4
1a60: 2e 39 2e 31 20 64 62 20 7b 6d 61 69 6e 20 73 68  .9.1 db {main sh
1a70: 61 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64  ared temp closed
1a80: 20 66 69 6c 65 32 20 73 68 61 72 65 64 7d 0a 6c   file2 shared}.l
1a90: 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e 39 2e 32  ock_status 4.9.2
1aa0: 20 64 62 32 20 7b 6d 61 69 6e 20 72 65 73 65 72   db2 {main reser
1ab0: 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 20  ved temp closed 
1ac0: 66 69 6c 65 32 20 72 65 73 65 72 76 65 64 7d 0a  file2 reserved}.
1ad0: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32  .do_test attach2
1ae0: 2d 34 2e 31 30 20 7b 0a 20 20 23 20 57 65 20 63  -4.10 {.  # We c
1af0: 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 64 62 32  annot commit db2
1b00: 20 77 68 69 6c 65 20 64 62 20 69 73 20 68 6f 6c   while db is hol
1b10: 64 69 6e 67 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ding a read-lock
1b20: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 43 4f 4d  .  catchsql {COM
1b30: 4d 49 54 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  MIT} db2.} {1 {d
1b40: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
1b50: 64 7d 7d 0a 0a 6c 6f 63 6b 5f 73 74 61 74 75 73  d}}..lock_status
1b60: 20 34 2e 31 30 2e 31 20 64 62 20 7b 6d 61 69 6e   4.10.1 db {main
1b70: 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f   shared temp clo
1b80: 73 65 64 20 66 69 6c 65 32 20 73 68 61 72 65 64  sed file2 shared
1b90: 7d 0a 6c 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e  }.lock_status 4.
1ba0: 31 30 2e 32 20 64 62 32 20 7b 6d 61 69 6e 20 70  10.2 db2 {main p
1bb0: 65 6e 64 69 6e 67 20 74 65 6d 70 20 63 6c 6f 73  ending temp clos
1bc0: 65 64 20 66 69 6c 65 32 20 72 65 73 65 72 76 65  ed file2 reserve
1bd0: 64 7d 0a 0a 73 65 74 20 73 71 6c 69 74 65 5f 6f  d}..set sqlite_o
1be0: 73 5f 74 72 61 63 65 20 30 0a 64 6f 5f 74 65 73  s_trace 0.do_tes
1bf0: 74 20 61 74 74 61 63 68 32 2d 34 2e 31 31 20 7b  t attach2-4.11 {
1c00: 0a 20 20 23 20 64 62 20 69 73 20 61 62 6c 65 20  .  # db is able 
1c10: 74 6f 20 63 6f 6d 6d 69 74 2e 0a 20 20 63 61 74  to commit..  cat
1c20: 63 68 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 0a 7d  chsql {COMMIT}.}
1c30: 20 7b 30 20 7b 7d 7d 0a 0a 6c 6f 63 6b 5f 73 74   {0 {}}..lock_st
1c40: 61 74 75 73 20 34 2e 31 31 2e 31 20 64 62 20 7b  atus 4.11.1 db {
1c50: 6d 61 69 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 65  main unlocked te
1c60: 6d 70 20 63 6c 6f 73 65 64 20 66 69 6c 65 32 20  mp closed file2 
1c70: 75 6e 6c 6f 63 6b 65 64 7d 0a 6c 6f 63 6b 5f 73  unlocked}.lock_s
1c80: 74 61 74 75 73 20 34 2e 31 31 2e 32 20 64 62 32  tatus 4.11.2 db2
1c90: 20 7b 6d 61 69 6e 20 70 65 6e 64 69 6e 67 20 74   {main pending t
1ca0: 65 6d 70 20 63 6c 6f 73 65 64 20 66 69 6c 65 32  emp closed file2
1cb0: 20 72 65 73 65 72 76 65 64 7d 0a 0a 64 6f 5f 74   reserved}..do_t
1cc0: 65 73 74 20 61 74 74 61 63 68 32 2d 34 2e 31 32  est attach2-4.12
1cd0: 20 7b 0a 20 20 23 20 4e 6f 77 20 77 65 20 63 61   {.  # Now we ca
1ce0: 6e 20 63 6f 6d 6d 69 74 20 64 62 32 0a 20 20 63  n commit db2.  c
1cf0: 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d  atchsql {COMMIT}
1d00: 20 64 62 32 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 6c   db2.} {0 {}}..l
1d10: 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e 31 32 2e  ock_status 4.12.
1d20: 31 20 64 62 20 7b 6d 61 69 6e 20 75 6e 6c 6f 63  1 db {main unloc
1d30: 6b 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 20  ked temp closed 
1d40: 66 69 6c 65 32 20 75 6e 6c 6f 63 6b 65 64 7d 0a  file2 unlocked}.
1d50: 6c 6f 63 6b 5f 73 74 61 74 75 73 20 34 2e 31 32  lock_status 4.12
1d60: 2e 32 20 64 62 32 20 7b 6d 61 69 6e 20 75 6e 6c  .2 db2 {main unl
1d70: 6f 63 6b 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  ocked temp close
1d80: 64 20 66 69 6c 65 32 20 75 6e 6c 6f 63 6b 65 64  d file2 unlocked
1d90: 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63  }..do_test attac
1da0: 68 32 2d 34 2e 31 33 20 7b 0a 20 20 65 78 65 63  h2-4.13 {.  exec
1db0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
1dc0: 4f 4d 20 66 69 6c 65 32 2e 74 31 7d 0a 7d 20 7b  OM file2.t1}.} {
1dd0: 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 61 74 74  1 2}.do_test att
1de0: 61 63 68 32 2d 34 2e 31 34 20 7b 0a 20 20 65 78  ach2-4.14 {.  ex
1df0: 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e  ecsql {INSERT IN
1e00: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1e10: 32 29 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  2)}.} {}.do_test
1e20: 20 61 74 74 61 63 68 32 2d 34 2e 31 35 20 7b 0a   attach2-4.15 {.
1e30: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
1e40: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 62 32  T * FROM t1} db2
1e50: 0a 7d 20 7b 31 20 32 20 31 20 32 7d 0a 0a 64 62  .} {1 2 1 2}..db
1e60: 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65   close.db2 close
1e70: 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f  .file delete -fo
1e80: 72 63 65 20 74 65 73 74 32 2e 64 62 0a 0a 23 20  rce test2.db..# 
1e90: 54 68 65 73 65 20 74 65 73 74 73 20 2d 20 61 74  These tests - at
1ea0: 74 61 63 68 32 2d 35 2e 2a 20 2d 20 63 68 65 63  tach2-5.* - chec
1eb0: 6b 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65  k that the maste
1ec0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1ed0: 73 20 64 65 6c 65 74 65 64 0a 23 20 63 6f 72 72  s deleted.# corr
1ee0: 65 63 74 6c 79 20 77 68 65 6e 20 61 20 6d 75 6c  ectly when a mul
1ef0: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
1f00: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
1f10: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
1f20: 0a 23 0a 23 20 55 70 64 61 74 65 3a 20 49 74 27  .#.# Update: It'
1f30: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
1f40: 72 65 61 74 65 64 20 69 66 20 61 20 72 6f 6c 6c  reated if a roll
1f50: 62 61 63 6b 20 6f 63 63 75 72 73 2c 20 73 6f 20  back occurs, so 
1f60: 74 68 61 74 20 74 65 73 74 0a 23 20 64 6f 65 73  that test.# does
1f70: 6e 27 74 20 72 65 61 6c 6c 79 20 70 72 6f 76 65  n't really prove
1f80: 20 74 6f 6f 20 6d 75 63 68 2e 0a 66 6f 72 65 61   too much..forea
1f90: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
1fa0: 64 62 2a 5d 20 7b 66 69 6c 65 20 64 65 6c 65 74  db*] {file delet
1fb0: 65 20 2d 66 6f 72 63 65 20 24 66 7d 0a 64 6f 5f  e -force $f}.do_
1fc0: 74 65 73 74 20 61 74 74 61 63 68 32 2d 35 2e 31  test attach2-5.1
1fd0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
1fe0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
1ff0: 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27  l {.    ATTACH '
2000: 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78  test.db2' AS aux
2010: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
2020: 73 74 20 61 74 74 61 63 68 32 2d 35 2e 32 20 7b  st attach2-5.2 {
2030: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2040: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
2050: 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 2c 20  TE TABLE tbl(a, 
2060: 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54  b, c);.    CREAT
2070: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 62 6c 28  E TABLE aux.tbl(
2080: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 4f  a, b, c);.    CO
2090: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  MMIT;.  }.} {}.d
20a0: 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32 2d 35  o_test attach2-5
20b0: 2e 33 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67 6c  .3 {.  lsort [gl
20c0: 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20 7b  ob test.db*].} {
20d0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32  test.db test.db2
20e0: 7d 0a 65 78 65 63 73 71 6c 20 7b 70 72 61 67 6d  }.execsql {pragm
20f0: 61 20 76 64 62 65 5f 74 72 61 63 65 3d 6f 6e 7d  a vdbe_trace=on}
2100: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32  .do_test attach2
2110: 2d 35 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.4 {.  execsql
2120: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
2130: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 61 75 78    DROP TABLE aux
2140: 2e 74 62 6c 3b 0a 20 20 20 20 44 52 4f 50 20 54  .tbl;.    DROP T
2150: 41 42 4c 45 20 74 62 6c 3b 0a 20 20 20 20 52 4f  ABLE tbl;.    RO
2160: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7d  LLBACK;.  }.} {}
2170: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32  .do_test attach2
2180: 2d 35 2e 35 20 7b 0a 20 20 6c 73 6f 72 74 20 5b  -5.5 {.  lsort [
2190: 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d  glob test.db*].}
21a0: 20 7b 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64   {test.db test.d
21b0: 62 32 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68 61  b2}..# Check tha
21c0: 74 20 61 20 64 61 74 61 62 61 73 65 20 63 61 6e  t a database can
21d0: 6e 6f 74 20 62 65 20 41 54 54 41 43 48 65 64 20  not be ATTACHed 
21e0: 6f 72 20 44 45 54 41 43 48 65 64 20 64 75 72 69  or DETACHed duri
21f0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
2200: 2e 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68  ..do_test attach
2210: 32 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  2-6.1 {.  execsq
2220: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
2230: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
2240: 61 74 74 61 63 68 32 2d 36 2e 32 20 7b 0a 20 20  attach2-6.2 {.  
2250: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 41  catchsql {.    A
2260: 54 54 41 43 48 20 27 74 65 73 74 33 2e 64 62 27  TTACH 'test3.db'
2270: 20 61 73 20 61 75 78 32 3b 0a 20 20 7d 0a 7d 20   as aux2;.  }.} 
2280: 7b 31 20 7b 63 61 6e 6e 6f 74 20 41 54 54 41 43  {1 {cannot ATTAC
2290: 48 20 64 61 74 61 62 61 73 65 20 77 69 74 68 69  H database withi
22a0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 7d 7d 0a  n transaction}}.
22b0: 0a 64 6f 5f 74 65 73 74 20 61 74 74 61 63 68 32  .do_test attach2
22c0: 2d 36 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  -6.3 {.  catchsq
22d0: 6c 20 7b 0a 20 20 20 20 44 45 54 41 43 48 20 61  l {.    DETACH a
22e0: 75 78 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61  ux;.  }.} {1 {ca
22f0: 6e 6e 6f 74 20 44 45 54 41 43 48 20 64 61 74 61  nnot DETACH data
2300: 62 61 73 65 20 77 69 74 68 69 6e 20 74 72 61 6e  base within tran
2310: 73 61 63 74 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73  saction}}.do_tes
2320: 74 20 61 74 74 61 63 68 32 2d 36 2e 34 20 7b 0a  t attach2-6.4 {.
2330: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2340: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 44 45 54 41  COMMIT;.    DETA
2350: 43 48 20 61 75 78 3b 0a 20 20 7d 0a 7d 20 7b 7d  CH aux;.  }.} {}
2360: 0a 0a 64 62 20 63 6c 6f 73 65 0a 0a 66 69 6e 69  ..db close..fini
2370: 73 68 5f 74 65 73 74 0a                          sh_test.