OLD | NEW |
| (Empty) |
1 # 2005 January 13 | |
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 file is testing corner cases of the INSERT statement. | |
13 # | |
14 # $Id: insert3.test,v 1.9 2009/04/23 14:58:40 danielk1977 Exp $ | |
15 | |
16 set testdir [file dirname $argv0] | |
17 source $testdir/tester.tcl | |
18 | |
19 # All the tests in this file require trigger support | |
20 # | |
21 ifcapable {trigger} { | |
22 | |
23 # Create a table and a corresponding insert trigger. Do a self-insert | |
24 # into the table. | |
25 # | |
26 do_test insert3-1.0 { | |
27 execsql { | |
28 CREATE TABLE t1(a,b); | |
29 CREATE TABLE log(x UNIQUE, y); | |
30 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN | |
31 UPDATE log SET y=y+1 WHERE x=new.a; | |
32 INSERT OR IGNORE INTO log VALUES(new.a, 1); | |
33 END; | |
34 INSERT INTO t1 VALUES('hello','world'); | |
35 INSERT INTO t1 VALUES(5,10); | |
36 SELECT * FROM log ORDER BY x; | |
37 } | |
38 } {5 1 hello 1} | |
39 do_test insert3-1.1 { | |
40 execsql { | |
41 INSERT INTO t1 SELECT a, b+10 FROM t1; | |
42 SELECT * FROM log ORDER BY x; | |
43 } | |
44 } {5 2 hello 2} | |
45 do_test insert3-1.2 { | |
46 execsql { | |
47 CREATE TABLE log2(x PRIMARY KEY,y); | |
48 CREATE TRIGGER r2 BEFORE INSERT ON t1 BEGIN | |
49 UPDATE log2 SET y=y+1 WHERE x=new.b; | |
50 INSERT OR IGNORE INTO log2 VALUES(new.b,1); | |
51 END; | |
52 INSERT INTO t1 VALUES(453,'hi'); | |
53 SELECT * FROM log ORDER BY x; | |
54 } | |
55 } {5 2 453 1 hello 2} | |
56 do_test insert3-1.3 { | |
57 execsql { | |
58 SELECT * FROM log2 ORDER BY x; | |
59 } | |
60 } {hi 1} | |
61 ifcapable compound { | |
62 do_test insert3-1.4.1 { | |
63 execsql { | |
64 INSERT INTO t1 SELECT * FROM t1; | |
65 SELECT 'a:', x, y FROM log UNION ALL | |
66 SELECT 'b:', x, y FROM log2 ORDER BY x; | |
67 } | |
68 } {a: 5 4 b: 10 2 b: 20 1 a: 453 2 a: hello 4 b: hi 2 b: world 1} | |
69 do_test insert3-1.4.2 { | |
70 execsql { | |
71 SELECT 'a:', x, y FROM log UNION ALL | |
72 SELECT 'b:', x, y FROM log2 ORDER BY x, y; | |
73 } | |
74 } {a: 5 4 b: 10 2 b: 20 1 a: 453 2 a: hello 4 b: hi 2 b: world 1} | |
75 do_test insert3-1.5 { | |
76 execsql { | |
77 INSERT INTO t1(a) VALUES('xyz'); | |
78 SELECT * FROM log ORDER BY x; | |
79 } | |
80 } {5 4 453 2 hello 4 xyz 1} | |
81 } | |
82 | |
83 do_test insert3-2.1 { | |
84 execsql { | |
85 CREATE TABLE t2( | |
86 a INTEGER PRIMARY KEY, | |
87 b DEFAULT 'b', | |
88 c DEFAULT 'c' | |
89 ); | |
90 CREATE TABLE t2dup(a,b,c); | |
91 CREATE TRIGGER t2r1 BEFORE INSERT ON t2 BEGIN | |
92 INSERT INTO t2dup(a,b,c) VALUES(new.a,new.b,new.c); | |
93 END; | |
94 INSERT INTO t2(a) VALUES(123); | |
95 INSERT INTO t2(b) VALUES(234); | |
96 INSERT INTO t2(c) VALUES(345); | |
97 SELECT * FROM t2dup; | |
98 } | |
99 } {123 b c -1 234 c -1 b 345} | |
100 do_test insert3-2.2 { | |
101 execsql { | |
102 DELETE FROM t2dup; | |
103 INSERT INTO t2(a) SELECT 1 FROM t1 LIMIT 1; | |
104 INSERT INTO t2(b) SELECT 987 FROM t1 LIMIT 1; | |
105 INSERT INTO t2(c) SELECT 876 FROM t1 LIMIT 1; | |
106 SELECT * FROM t2dup; | |
107 } | |
108 } {1 b c -1 987 c -1 b 876} | |
109 | |
110 # Test for proper detection of malformed WHEN clauses on INSERT triggers. | |
111 # | |
112 do_test insert3-3.1 { | |
113 execsql { | |
114 CREATE TABLE t3(a,b,c); | |
115 CREATE TRIGGER t3r1 BEFORE INSERT on t3 WHEN nosuchcol BEGIN | |
116 SELECT 'illegal WHEN clause'; | |
117 END; | |
118 } | |
119 } {} | |
120 do_test insert3-3.2 { | |
121 catchsql { | |
122 INSERT INTO t3 VALUES(1,2,3) | |
123 } | |
124 } {1 {no such column: nosuchcol}} | |
125 do_test insert3-3.3 { | |
126 execsql { | |
127 CREATE TABLE t4(a,b,c); | |
128 CREATE TRIGGER t4r1 AFTER INSERT on t4 WHEN nosuchcol BEGIN | |
129 SELECT 'illegal WHEN clause'; | |
130 END; | |
131 } | |
132 } {} | |
133 do_test insert3-3.4 { | |
134 catchsql { | |
135 INSERT INTO t4 VALUES(1,2,3) | |
136 } | |
137 } {1 {no such column: nosuchcol}} | |
138 | |
139 } ;# ifcapable {trigger} | |
140 | |
141 # Tests for the INSERT INTO ... DEFAULT VALUES construct | |
142 # | |
143 do_test insert3-3.5 { | |
144 execsql { | |
145 CREATE TABLE t5( | |
146 a INTEGER PRIMARY KEY, | |
147 b DEFAULT 'xyz' | |
148 ); | |
149 INSERT INTO t5 DEFAULT VALUES; | |
150 SELECT * FROM t5; | |
151 } | |
152 } {1 xyz} | |
153 do_test insert3-3.6 { | |
154 execsql { | |
155 INSERT INTO t5 DEFAULT VALUES; | |
156 SELECT * FROM t5; | |
157 } | |
158 } {1 xyz 2 xyz} | |
159 | |
160 ifcapable bloblit { | |
161 do_test insert3-3.7 { | |
162 execsql { | |
163 CREATE TABLE t6(x,y DEFAULT 4.3, z DEFAULT x'6869'); | |
164 INSERT INTO t6 DEFAULT VALUES; | |
165 SELECT * FROM t6; | |
166 } | |
167 } {{} 4.3 hi} | |
168 } | |
169 | |
170 foreach tab [db eval {SELECT name FROM sqlite_master WHERE type = 'table'}] { | |
171 db eval "DROP TABLE $tab" | |
172 } | |
173 db close | |
174 sqlite3 db test.db | |
175 | |
176 #------------------------------------------------------------------------- | |
177 # While developing tests for a different feature (savepoint) the following | |
178 # sequence was found to cause an assert() in btree.c to fail. These | |
179 # tests are included to ensure that that bug is fixed. | |
180 # | |
181 do_test insert3-4.1 { | |
182 execsql { | |
183 CREATE TABLE t1(a, b, c); | |
184 CREATE INDEX i1 ON t1(a, b); | |
185 BEGIN; | |
186 INSERT INTO t1 VALUES(randstr(10,400),randstr(10,400),randstr(10,400)); | |
187 } | |
188 set r "randstr(10,400)" | |
189 for {set ii 0} {$ii < 10} {incr ii} { | |
190 execsql "INSERT INTO t1 SELECT $r, $r, $r FROM t1" | |
191 } | |
192 execsql { COMMIT } | |
193 } {} | |
194 do_test insert3-4.2 { | |
195 execsql { | |
196 PRAGMA cache_size = 10; | |
197 BEGIN; | |
198 UPDATE t1 SET a = randstr(10,10) WHERE (rowid%4)==0; | |
199 DELETE FROM t1 WHERE rowid%2; | |
200 INSERT INTO t1 SELECT randstr(10,400), randstr(10,400), c FROM t1; | |
201 COMMIT; | |
202 } | |
203 } {} | |
204 | |
205 finish_test | |
OLD | NEW |