xref: /sqlite-3.40.0/test/attach4.test (revision b73da5bd)
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    lappend L delete
79  } else {
80    lappend L wal
81  }
82  append S "
83    PRAGMA $name.journal_mode = WAL;
84    UPDATE $name.tbl SET x = '$name';
85  "
86}
87do_execsql_test 1.5 $S $L
88
89do_test 1.6 {
90  set L [list]
91  foreach {name f} $files {
92    lappend L [execsql "SELECT x FROM $name.tbl"] $f
93  }
94  set L
95} $files
96
97do_test 1.7 {
98  execsql BEGIN;
99  foreach {name f} $files {
100    execsql "UPDATE $name.tbl SET x = '$f'"
101  }
102  execsql COMMIT;
103} {}
104
105do_test 1.8 {
106  set L [list]
107  foreach {name f} $files {
108    lappend L $name [execsql "SELECT x FROM $name.tbl"]
109  }
110  set L
111} $files
112
113db close
114foreach {name f} $files { forcedelete $f }
115
116finish_test
117