Annotation of embedaddon/sqlite3/test/attach3.test, revision 1.1.1.1
1.1 misho 1: # 2003 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 testing the ATTACH and DETACH commands
13: # and schema changes to attached databases.
14: #
15: # $Id: attach3.test,v 1.18 2007/10/09 08:29:32 danielk1977 Exp $
16: #
17:
18: set testdir [file dirname $argv0]
19: source $testdir/tester.tcl
20:
21: ifcapable !attach {
22: finish_test
23: return
24: }
25:
26: # The tests in this file were written before SQLite supported recursive
27: # trigger invocation, and some tests depend on that to pass. So disable
28: # recursive triggers for this file.
29: catchsql { pragma recursive_triggers = off }
30:
31: # Create tables t1 and t2 in the main database
32: execsql {
33: CREATE TABLE t1(a, b);
34: CREATE TABLE t2(c, d);
35: }
36:
37: # Create tables t1 and t2 in database file test2.db
38: forcedelete test2.db
39: forcedelete test2.db-journal
40: sqlite3 db2 test2.db
41: execsql {
42: CREATE TABLE t1(a, b);
43: CREATE TABLE t2(c, d);
44: } db2
45: db2 close
46:
47: # Create a table in the auxilary database.
48: do_test attach3-1.1 {
49: execsql {
50: ATTACH 'test2.db' AS aux;
51: }
52: } {}
53: do_test attach3-1.2 {
54: execsql {
55: CREATE TABLE aux.t3(e, f);
56: }
57: } {}
58: do_test attach3-1.3 {
59: execsql {
60: SELECT * FROM sqlite_master WHERE name = 't3';
61: }
62: } {}
63: do_test attach3-1.4 {
64: execsql {
65: SELECT * FROM aux.sqlite_master WHERE name = 't3';
66: }
67: } "table t3 t3 [expr $AUTOVACUUM?5:4] {CREATE TABLE t3(e, f)}"
68: do_test attach3-1.5 {
69: execsql {
70: INSERT INTO t3 VALUES(1, 2);
71: SELECT * FROM t3;
72: }
73: } {1 2}
74:
75: # Create an index on the auxilary database table.
76: do_test attach3-2.1 {
77: execsql {
78: CREATE INDEX aux.i1 on t3(e);
79: }
80: } {}
81: do_test attach3-2.2 {
82: execsql {
83: SELECT * FROM sqlite_master WHERE name = 'i1';
84: }
85: } {}
86: do_test attach3-2.3 {
87: execsql {
88: SELECT * FROM aux.sqlite_master WHERE name = 'i1';
89: }
90: } "index i1 t3 [expr $AUTOVACUUM?6:5] {CREATE INDEX i1 on t3(e)}"
91:
92: # Drop the index on the aux database table.
93: do_test attach3-3.1 {
94: execsql {
95: DROP INDEX aux.i1;
96: SELECT * FROM aux.sqlite_master WHERE name = 'i1';
97: }
98: } {}
99: do_test attach3-3.2 {
100: execsql {
101: CREATE INDEX aux.i1 on t3(e);
102: SELECT * FROM aux.sqlite_master WHERE name = 'i1';
103: }
104: } "index i1 t3 [expr $AUTOVACUUM?6:5] {CREATE INDEX i1 on t3(e)}"
105: do_test attach3-3.3 {
106: execsql {
107: DROP INDEX i1;
108: SELECT * FROM aux.sqlite_master WHERE name = 'i1';
109: }
110: } {}
111:
112: # Drop tables t1 and t2 in the auxilary database.
113: do_test attach3-4.1 {
114: execsql {
115: DROP TABLE aux.t1;
116: SELECT name FROM aux.sqlite_master;
117: }
118: } {t2 t3}
119: do_test attach3-4.2 {
120: # This will drop main.t2
121: execsql {
122: DROP TABLE t2;
123: SELECT name FROM aux.sqlite_master;
124: }
125: } {t2 t3}
126: do_test attach3-4.3 {
127: execsql {
128: DROP TABLE t2;
129: SELECT name FROM aux.sqlite_master;
130: }
131: } {t3}
132:
133: # Create a view in the auxilary database.
134: ifcapable view {
135: do_test attach3-5.1 {
136: execsql {
137: CREATE VIEW aux.v1 AS SELECT * FROM t3;
138: }
139: } {}
140: do_test attach3-5.2 {
141: execsql {
142: SELECT * FROM aux.sqlite_master WHERE name = 'v1';
143: }
144: } {view v1 v1 0 {CREATE VIEW v1 AS SELECT * FROM t3}}
145: do_test attach3-5.3 {
146: execsql {
147: INSERT INTO aux.t3 VALUES('hello', 'world');
148: SELECT * FROM v1;
149: }
150: } {1 2 hello world}
151:
152: # Drop the view
153: do_test attach3-6.1 {
154: execsql {
155: DROP VIEW aux.v1;
156: }
157: } {}
158: do_test attach3-6.2 {
159: execsql {
160: SELECT * FROM aux.sqlite_master WHERE name = 'v1';
161: }
162: } {}
163: } ;# ifcapable view
164:
165: ifcapable {trigger} {
166: # Create a trigger in the auxilary database.
167: do_test attach3-7.1 {
168: execsql {
169: CREATE TRIGGER aux.tr1 AFTER INSERT ON t3 BEGIN
170: INSERT INTO t3 VALUES(new.e*2, new.f*2);
171: END;
172: }
173: } {}
174: do_test attach3-7.2 {
175: execsql {
176: DELETE FROM t3;
177: INSERT INTO t3 VALUES(10, 20);
178: SELECT * FROM t3;
179: }
180: } {10 20 20 40}
181: do_test attach3-5.3 {
182: execsql {
183: SELECT * FROM aux.sqlite_master WHERE name = 'tr1';
184: }
185: } {trigger tr1 t3 0 {CREATE TRIGGER tr1 AFTER INSERT ON t3 BEGIN
186: INSERT INTO t3 VALUES(new.e*2, new.f*2);
187: END}}
188:
189: # Drop the trigger
190: do_test attach3-8.1 {
191: execsql {
192: DROP TRIGGER aux.tr1;
193: }
194: } {}
195: do_test attach3-8.2 {
196: execsql {
197: SELECT * FROM aux.sqlite_master WHERE name = 'tr1';
198: }
199: } {}
200:
201: ifcapable tempdb {
202: # Try to trick SQLite into dropping the wrong temp trigger.
203: do_test attach3-9.0 {
204: execsql {
205: CREATE TABLE main.t4(a, b, c);
206: CREATE TABLE aux.t4(a, b, c);
207: CREATE TEMP TRIGGER tst_trigger BEFORE INSERT ON aux.t4 BEGIN
208: SELECT 'hello world';
209: END;
210: SELECT count(*) FROM sqlite_temp_master;
211: }
212: } {1}
213: do_test attach3-9.1 {
214: execsql {
215: DROP TABLE main.t4;
216: SELECT count(*) FROM sqlite_temp_master;
217: }
218: } {1}
219: do_test attach3-9.2 {
220: execsql {
221: DROP TABLE aux.t4;
222: SELECT count(*) FROM sqlite_temp_master;
223: }
224: } {0}
225: }
226: } ;# endif trigger
227:
228: # Make sure the aux.sqlite_master table is read-only
229: do_test attach3-10.0 {
230: catchsql {
231: INSERT INTO aux.sqlite_master VALUES(1, 2, 3, 4, 5);
232: }
233: } {1 {table sqlite_master may not be modified}}
234:
235: # Failure to attach leaves us in a workable state.
236: # Ticket #811
237: #
238: do_test attach3-11.0 {
239: catchsql {
240: ATTACH DATABASE '/nodir/nofile.x' AS notadb;
241: }
242: } {1 {unable to open database: /nodir/nofile.x}}
243: do_test attach3-11.1 {
244: catchsql {
245: ATTACH DATABASE ':memory:' AS notadb;
246: }
247: } {0 {}}
248: do_test attach3-11.2 {
249: catchsql {
250: DETACH DATABASE notadb;
251: }
252: } {0 {}}
253:
254: # Return a list of attached databases
255: #
256: proc db_list {} {
257: set x [execsql {
258: PRAGMA database_list;
259: }]
260: set y {}
261: foreach {n id file} $x {lappend y $id}
262: return $y
263: }
264:
265: ifcapable schema_pragmas&&tempdb {
266:
267: ifcapable !trigger {
268: execsql {create temp table dummy(dummy)}
269: }
270:
271: # Ticket #1825
272: #
273: do_test attach3-12.1 {
274: db_list
275: } {main temp aux}
276: do_test attach3-12.2 {
277: execsql {
278: ATTACH DATABASE ? AS ?
279: }
280: db_list
281: } {main temp aux {}}
282: do_test attach3-12.3 {
283: execsql {
284: DETACH aux
285: }
286: db_list
287: } {main temp {}}
288: do_test attach3-12.4 {
289: execsql {
290: DETACH ?
291: }
292: db_list
293: } {main temp}
294: do_test attach3-12.5 {
295: execsql {
296: ATTACH DATABASE '' AS ''
297: }
298: db_list
299: } {main temp {}}
300: do_test attach3-12.6 {
301: execsql {
302: DETACH ''
303: }
304: db_list
305: } {main temp}
306: do_test attach3-12.7 {
307: execsql {
308: ATTACH DATABASE '' AS ?
309: }
310: db_list
311: } {main temp {}}
312: do_test attach3-12.8 {
313: execsql {
314: DETACH ''
315: }
316: db_list
317: } {main temp}
318: do_test attach3-12.9 {
319: execsql {
320: ATTACH DATABASE '' AS NULL
321: }
322: db_list
323: } {main temp {}}
324: do_test attach3-12.10 {
325: breakpoint
326: execsql {
327: DETACH ?
328: }
329: db_list
330: } {main temp}
331: do_test attach3-12.11 {
332: catchsql {
333: DETACH NULL
334: }
335: } {1 {no such database: }}
336: do_test attach3-12.12 {
337: catchsql {
338: ATTACH null AS null;
339: ATTACH '' AS '';
340: }
341: } {1 {database is already in use}}
342: do_test attach3-12.13 {
343: db_list
344: } {main temp {}}
345: do_test attach3-12.14 {
346: execsql {
347: DETACH '';
348: }
349: db_list
350: } {main temp}
351:
352: } ;# ifcapable pragma
353:
354: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>