xref: /sqlite-3.40.0/test/attach4.test (revision 50f79f56)
1# 200 July 1
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.  The
12# focus of this script is attaching many database files to a single
13# connection.
14#
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19set testprefix attach4
20
21ifcapable !attach {
22  finish_test
23  return
24}
25
26puts "Testing with SQLITE_MAX_ATTACHED=$SQLITE_MAX_ATTACHED"
27
28set files {main test.db}
29for {set ii 0} {$ii < $SQLITE_MAX_ATTACHED} {incr ii} {
30  lappend files aux$ii "test.db$ii"
31}
32
33do_test 1.1 {
34  sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
35} $SQLITE_MAX_ATTACHED
36
37do_test 1.2.1 {
38  db close
39  foreach {name f} $files { forcedelete $f }
40  sqlite3 db test.db
41
42  foreach {name f} $files {
43    if {$name == "main"} continue
44    execsql "ATTACH '$f' AS $name"
45  }
46
47  db eval {PRAGMA database_list} {
48    lappend L $name [file tail $file]
49  }
50  set L
51} $files
52
53do_catchsql_test 1.2.2 {
54  ATTACH 'x.db' AS next;
55} [list 1 "too many attached databases - max $SQLITE_MAX_ATTACHED"]
56
57do_test 1.3 {
58  execsql BEGIN;
59  foreach {name f} $files {
60    execsql "CREATE TABLE $name.tbl(x)"
61    execsql "INSERT INTO $name.tbl VALUES('$f')"
62  }
63  execsql COMMIT;
64} {}
65
66do_test 1.4 {
67  set L [list]
68  foreach {name f} $files {
69    lappend L $name [execsql "SELECT x FROM $name.tbl"]
70  }
71  set L
72} $files
73
74set L [list]
75set S ""
76foreach {name f} $files {
77  if {[permutation] == "journaltest"} {
78    set mode delete
79  } else {
80    set mode wal
81  }
82  ifcapable !wal { set mode delete }
83  lappend L $mode
84  append S "
85    PRAGMA $name.journal_mode = WAL;
86    UPDATE $name.tbl SET x = '$name';
87  "
88}
89do_execsql_test 1.5 $S $L
90
91do_test 1.6 {
92  set L [list]
93  foreach {name f} $files {
94    lappend L [execsql "SELECT x FROM $name.tbl"] $f
95  }
96  set L
97} $files
98
99do_test 1.7 {
100  execsql BEGIN;
101  foreach {name f} $files {
102    execsql "UPDATE $name.tbl SET x = '$f'"
103  }
104  execsql COMMIT;
105} {}
106
107do_test 1.8 {
108  set L [list]
109  foreach {name f} $files {
110    lappend L $name [execsql "SELECT x FROM $name.tbl"]
111  }
112  set L
113} $files
114
115db close
116foreach {name f} $files { forcedelete $f }
117
118finish_test
119