Annotation of embedaddon/sqlite3/test/alter3.test, revision 1.1.1.1
1.1 misho 1: # 2005 February 19
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 that SQLite can handle a subtle
13: # file format change that may be used in the future to implement
14: # "ALTER TABLE ... ADD COLUMN".
15: #
16: # $Id: alter3.test,v 1.11 2008/03/19 00:21:31 drh Exp $
17: #
18:
19: set testdir [file dirname $argv0]
20:
21: source $testdir/tester.tcl
22:
23: # If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
24: ifcapable !altertable {
25: finish_test
26: return
27: }
28:
29: # Determine if there is a codec available on this test.
30: #
31: if {[catch {sqlite3 -has-codec} r] || $r} {
32: set has_codec 1
33: } else {
34: set has_codec 0
35: }
36:
37:
38: # Test Organisation:
39: # ------------------
40: #
41: # alter3-1.*: Test that ALTER TABLE correctly modifies the CREATE TABLE sql.
42: # alter3-2.*: Test error messages.
43: # alter3-3.*: Test adding columns with default value NULL.
44: # alter3-4.*: Test adding columns with default values other than NULL.
45: # alter3-5.*: Test adding columns to tables in ATTACHed databases.
46: # alter3-6.*: Test that temp triggers are not accidentally dropped.
47: # alter3-7.*: Test that VACUUM resets the file-format.
48: #
49:
50: # This procedure returns the value of the file-format in file 'test.db'.
51: #
52: proc get_file_format {{fname test.db}} {
53: return [hexio_get_int [hexio_read $fname 44 4]]
54: }
55:
56: do_test alter3-1.1 {
57: execsql {
58: PRAGMA legacy_file_format=ON;
59: CREATE TABLE abc(a, b, c);
60: SELECT sql FROM sqlite_master;
61: }
62: } {{CREATE TABLE abc(a, b, c)}}
63: do_test alter3-1.2 {
64: execsql {ALTER TABLE abc ADD d INTEGER;}
65: execsql {
66: SELECT sql FROM sqlite_master;
67: }
68: } {{CREATE TABLE abc(a, b, c, d INTEGER)}}
69: do_test alter3-1.3 {
70: execsql {ALTER TABLE abc ADD e}
71: execsql {
72: SELECT sql FROM sqlite_master;
73: }
74: } {{CREATE TABLE abc(a, b, c, d INTEGER, e)}}
75: do_test alter3-1.4 {
76: execsql {
77: CREATE TABLE main.t1(a, b);
78: ALTER TABLE t1 ADD c;
79: SELECT sql FROM sqlite_master WHERE tbl_name = 't1';
80: }
81: } {{CREATE TABLE t1(a, b, c)}}
82: do_test alter3-1.5 {
83: execsql {
84: ALTER TABLE t1 ADD d CHECK (a>d);
85: SELECT sql FROM sqlite_master WHERE tbl_name = 't1';
86: }
87: } {{CREATE TABLE t1(a, b, c, d CHECK (a>d))}}
88: ifcapable foreignkey {
89: do_test alter3-1.6 {
90: execsql {
91: CREATE TABLE t2(a, b, UNIQUE(a, b));
92: ALTER TABLE t2 ADD c REFERENCES t1(c) ;
93: SELECT sql FROM sqlite_master WHERE tbl_name = 't2' AND type = 'table';
94: }
95: } {{CREATE TABLE t2(a, b, c REFERENCES t1(c), UNIQUE(a, b))}}
96: }
97: do_test alter3-1.7 {
98: execsql {
99: CREATE TABLE t3(a, b, UNIQUE(a, b));
100: ALTER TABLE t3 ADD COLUMN c VARCHAR(10, 20);
101: SELECT sql FROM sqlite_master WHERE tbl_name = 't3' AND type = 'table';
102: }
103: } {{CREATE TABLE t3(a, b, c VARCHAR(10, 20), UNIQUE(a, b))}}
104: do_test alter3-1.99 {
105: catchsql {
106: # May not exist if foriegn-keys are omitted at compile time.
107: DROP TABLE t2;
108: }
109: execsql {
110: DROP TABLE abc;
111: DROP TABLE t1;
112: DROP TABLE t3;
113: }
114: } {}
115:
116: do_test alter3-2.1 {
117: execsql {
118: CREATE TABLE t1(a, b);
119: }
120: catchsql {
121: ALTER TABLE t1 ADD c PRIMARY KEY;
122: }
123: } {1 {Cannot add a PRIMARY KEY column}}
124: do_test alter3-2.2 {
125: catchsql {
126: ALTER TABLE t1 ADD c UNIQUE
127: }
128: } {1 {Cannot add a UNIQUE column}}
129: do_test alter3-2.3 {
130: catchsql {
131: ALTER TABLE t1 ADD b VARCHAR(10)
132: }
133: } {1 {duplicate column name: b}}
134: do_test alter3-2.3 {
135: catchsql {
136: ALTER TABLE t1 ADD c NOT NULL;
137: }
138: } {1 {Cannot add a NOT NULL column with default value NULL}}
139: do_test alter3-2.4 {
140: catchsql {
141: ALTER TABLE t1 ADD c NOT NULL DEFAULT 10;
142: }
143: } {0 {}}
144: ifcapable view {
145: do_test alter3-2.5 {
146: execsql {
147: CREATE VIEW v1 AS SELECT * FROM t1;
148: }
149: catchsql {
150: alter table v1 add column d;
151: }
152: } {1 {Cannot add a column to a view}}
153: }
154: do_test alter3-2.6 {
155: catchsql {
156: alter table t1 add column d DEFAULT CURRENT_TIME;
157: }
158: } {1 {Cannot add a column with non-constant default}}
159: do_test alter3-2.99 {
160: execsql {
161: DROP TABLE t1;
162: }
163: } {}
164:
165: do_test alter3-3.1 {
166: execsql {
167: CREATE TABLE t1(a, b);
168: INSERT INTO t1 VALUES(1, 100);
169: INSERT INTO t1 VALUES(2, 300);
170: SELECT * FROM t1;
171: }
172: } {1 100 2 300}
173: do_test alter3-3.1 {
174: execsql {
175: PRAGMA schema_version = 10;
176: }
177: } {}
178: do_test alter3-3.2 {
179: execsql {
180: ALTER TABLE t1 ADD c;
181: SELECT * FROM t1;
182: }
183: } {1 100 {} 2 300 {}}
184: if {!$has_codec} {
185: do_test alter3-3.3 {
186: get_file_format
187: } {3}
188: }
189: ifcapable schema_version {
190: do_test alter3-3.4 {
191: execsql {
192: PRAGMA schema_version;
193: }
194: } {11}
195: }
196:
197: do_test alter3-4.1 {
198: db close
199: forcedelete test.db
200: set ::DB [sqlite3 db test.db]
201: execsql {
202: PRAGMA legacy_file_format=ON;
203: CREATE TABLE t1(a, b);
204: INSERT INTO t1 VALUES(1, 100);
205: INSERT INTO t1 VALUES(2, 300);
206: SELECT * FROM t1;
207: }
208: } {1 100 2 300}
209: do_test alter3-4.1 {
210: execsql {
211: PRAGMA schema_version = 20;
212: }
213: } {}
214: do_test alter3-4.2 {
215: execsql {
216: ALTER TABLE t1 ADD c DEFAULT 'hello world';
217: SELECT * FROM t1;
218: }
219: } {1 100 {hello world} 2 300 {hello world}}
220: if {!$has_codec} {
221: do_test alter3-4.3 {
222: get_file_format
223: } {3}
224: }
225: ifcapable schema_version {
226: do_test alter3-4.4 {
227: execsql {
228: PRAGMA schema_version;
229: }
230: } {21}
231: }
232: do_test alter3-4.99 {
233: execsql {
234: DROP TABLE t1;
235: }
236: } {}
237:
238: ifcapable attach {
239: do_test alter3-5.1 {
240: forcedelete test2.db
241: forcedelete test2.db-journal
242: execsql {
243: CREATE TABLE t1(a, b);
244: INSERT INTO t1 VALUES(1, 'one');
245: INSERT INTO t1 VALUES(2, 'two');
246: ATTACH 'test2.db' AS aux;
247: CREATE TABLE aux.t1 AS SELECT * FROM t1;
248: PRAGMA aux.schema_version = 30;
249: SELECT sql FROM aux.sqlite_master;
250: }
251: } {{CREATE TABLE t1(a,b)}}
252: do_test alter3-5.2 {
253: execsql {
254: ALTER TABLE aux.t1 ADD COLUMN c VARCHAR(128);
255: SELECT sql FROM aux.sqlite_master;
256: }
257: } {{CREATE TABLE t1(a,b, c VARCHAR(128))}}
258: do_test alter3-5.3 {
259: execsql {
260: SELECT * FROM aux.t1;
261: }
262: } {1 one {} 2 two {}}
263: ifcapable schema_version {
264: do_test alter3-5.4 {
265: execsql {
266: PRAGMA aux.schema_version;
267: }
268: } {31}
269: }
270: if {!$has_codec} {
271: do_test alter3-5.5 {
272: list [get_file_format test2.db] [get_file_format]
273: } {2 3}
274: }
275: do_test alter3-5.6 {
276: execsql {
277: ALTER TABLE aux.t1 ADD COLUMN d DEFAULT 1000;
278: SELECT sql FROM aux.sqlite_master;
279: }
280: } {{CREATE TABLE t1(a,b, c VARCHAR(128), d DEFAULT 1000)}}
281: do_test alter3-5.7 {
282: execsql {
283: SELECT * FROM aux.t1;
284: }
285: } {1 one {} 1000 2 two {} 1000}
286: ifcapable schema_version {
287: do_test alter3-5.8 {
288: execsql {
289: PRAGMA aux.schema_version;
290: }
291: } {32}
292: }
293: do_test alter3-5.9 {
294: execsql {
295: SELECT * FROM t1;
296: }
297: } {1 one 2 two}
298: do_test alter3-5.99 {
299: execsql {
300: DROP TABLE aux.t1;
301: DROP TABLE t1;
302: }
303: } {}
304: }
305:
306: #----------------------------------------------------------------
307: # Test that the table schema is correctly reloaded when a column
308: # is added to a table.
309: #
310: ifcapable trigger&&tempdb {
311: do_test alter3-6.1 {
312: execsql {
313: CREATE TABLE t1(a, b);
314: CREATE TABLE log(trig, a, b);
315:
316: CREATE TRIGGER t1_a AFTER INSERT ON t1 BEGIN
317: INSERT INTO log VALUES('a', new.a, new.b);
318: END;
319: CREATE TEMP TRIGGER t1_b AFTER INSERT ON t1 BEGIN
320: INSERT INTO log VALUES('b', new.a, new.b);
321: END;
322:
323: INSERT INTO t1 VALUES(1, 2);
324: SELECT * FROM log;
325: }
326: } {b 1 2 a 1 2}
327: do_test alter3-6.2 {
328: execsql {
329: ALTER TABLE t1 ADD COLUMN c DEFAULT 'c';
330: INSERT INTO t1(a, b) VALUES(3, 4);
331: SELECT * FROM log;
332: }
333: } {b 1 2 a 1 2 b 3 4 a 3 4}
334: }
335:
336: if {!$has_codec} {
337: ifcapable vacuum {
338: do_test alter3-7.1 {
339: execsql {
340: VACUUM;
341: }
342: get_file_format
343: } {1}
344: do_test alter3-7.2 {
345: execsql {
346: CREATE TABLE abc(a, b, c);
347: ALTER TABLE abc ADD d DEFAULT NULL;
348: }
349: get_file_format
350: } {2}
351: do_test alter3-7.3 {
352: execsql {
353: ALTER TABLE abc ADD e DEFAULT 10;
354: }
355: get_file_format
356: } {3}
357: do_test alter3-7.4 {
358: execsql {
359: ALTER TABLE abc ADD f DEFAULT NULL;
360: }
361: get_file_format
362: } {3}
363: do_test alter3-7.5 {
364: execsql {
365: VACUUM;
366: }
367: get_file_format
368: } {1}
369: }
370: }
371:
372: # Ticket #1183 - Make sure adding columns to large tables does not cause
373: # memory corruption (as was the case before this bug was fixed).
374: do_test alter3-8.1 {
375: execsql {
376: CREATE TABLE t4(c1);
377: }
378: } {}
379: set ::sql ""
380: do_test alter3-8.2 {
381: set cols c1
382: for {set i 2} {$i < 100} {incr i} {
383: execsql "
384: ALTER TABLE t4 ADD c$i
385: "
386: lappend cols c$i
387: }
388: set ::sql "CREATE TABLE t4([join $cols {, }])"
389: list
390: } {}
391: do_test alter3-8.2 {
392: execsql {
393: SELECT sql FROM sqlite_master WHERE name = 't4';
394: }
395: } [list $::sql]
396:
397: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>