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