Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(413)

Side by Side Diff: third_party/sqlite/sqlite-src-3080704/test/without_rowid4.test

Issue 883353008: [sql] Import reference version of SQLite 3.8.7.4. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Hold back encoding change which is messing up patch. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # 2013-11-04
2 #
1 # The author disclaims copyright to this source code. In place of 3 # The author disclaims copyright to this source code. In place of
2 # a legal notice, here is a blessing: 4 # a legal notice, here is a blessing:
3 # 5 #
4 # May you do good and not evil. 6 # May you do good and not evil.
5 # May you find forgiveness for yourself and forgive others. 7 # May you find forgiveness for yourself and forgive others.
6 # May you share freely, never taking more than you give. 8 # May you share freely, never taking more than you give.
7 # 9 #
8 #*********************************************************************** 10 #***********************************************************************
9 # 11 #
10 # Regression testing of FOR EACH ROW table triggers 12 # Regression testing of FOR EACH ROW table triggers on WITHOUT ROWID
13 # tables.
11 # 14 #
12 # 1. Trigger execution order tests. 15 # 1. Trigger execution order tests.
13 # These tests ensure that BEFORE and AFTER triggers are fired at the correct 16 # These tests ensure that BEFORE and AFTER triggers are fired at the correct
14 # times relative to each other and the triggering statement. 17 # times relative to each other and the triggering statement.
15 # 18 #
16 # trigger2-1.1.*: ON UPDATE trigger execution model. 19 # without_rowid4-1.1.*: ON UPDATE trigger execution model.
17 # trigger2-1.2.*: DELETE trigger execution model. 20 # without_rowid4-1.2.*: DELETE trigger execution model.
18 # trigger2-1.3.*: INSERT trigger execution model. 21 # without_rowid4-1.3.*: INSERT trigger execution model.
19 # 22 #
20 # 2. Trigger program execution tests. 23 # 2. Trigger program execution tests.
21 # These tests ensure that trigger programs execute correctly (ie. that a 24 # These tests ensure that trigger programs execute correctly (ie. that a
22 # trigger program can correctly execute INSERT, UPDATE, DELETE * SELECT 25 # trigger program can correctly execute INSERT, UPDATE, DELETE * SELECT
23 # statements, and combinations thereof). 26 # statements, and combinations thereof).
24 # 27 #
25 # 3. Selective trigger execution 28 # 3. Selective trigger execution
26 # This tests that conditional triggers (ie. UPDATE OF triggers and triggers 29 # This tests that conditional triggers (ie. UPDATE OF triggers and triggers
27 # with WHEN clauses) are fired only fired when they are supposed to be. 30 # with WHEN clauses) are fired only fired when they are supposed to be.
28 # 31 #
29 # trigger2-3.1: UPDATE OF triggers 32 # without_rowid4-3.1: UPDATE OF triggers
30 # trigger2-3.2: WHEN clause 33 # without_rowid4-3.2: WHEN clause
31 # 34 #
32 # 4. Cascaded trigger execution 35 # 4. Cascaded trigger execution
33 # Tests that trigger-programs may cause other triggers to fire. Also that a 36 # Tests that trigger-programs may cause other triggers to fire. Also that a
34 # trigger-program is never executed recursively. 37 # trigger-program is never executed recursively.
35 # 38 #
36 # trigger2-4.1: Trivial cascading trigger 39 # without_rowid4-4.1: Trivial cascading trigger
37 # trigger2-4.2: Trivial recursive trigger handling 40 # without_rowid4-4.2: Trivial recursive trigger handling
38 # 41 #
39 # 5. Count changes behaviour. 42 # 5. Count changes behaviour.
40 # Verify that rows altered by triggers are not included in the return value 43 # Verify that rows altered by triggers are not included in the return value
41 # of the "count changes" interface. 44 # of the "count changes" interface.
42 # 45 #
43 # 6. ON CONFLICT clause handling 46 # 6. ON CONFLICT clause handling
44 # trigger2-6.1[a-f]: INSERT statements 47 # without_rowid4-6.1[a-f]: INSERT statements
45 # trigger2-6.2[a-f]: UPDATE statements 48 # without_rowid4-6.2[a-f]: UPDATE statements
46 # 49 #
47 # 7. & 8. Triggers on views fire correctly. 50 # 7. & 8. Triggers on views fire correctly.
48 # 51 #
49 52
50 set testdir [file dirname $argv0] 53 set testdir [file dirname $argv0]
51 source $testdir/tester.tcl 54 source $testdir/tester.tcl
52 ifcapable {!trigger} { 55 ifcapable {!trigger} {
53 finish_test 56 finish_test
54 return 57 return
55 } 58 }
56 59
57 # The tests in this file were written before SQLite supported recursive 60 # The tests in this file were written before SQLite supported recursive
58 # trigger invocation, and some tests depend on that to pass. So disable 61 # trigger invocation, and some tests depend on that to pass. So disable
59 # recursive triggers for this file. 62 # recursive triggers for this file.
60 catchsql { pragma recursive_triggers = off } 63 catchsql { pragma recursive_triggers = off }
61 64
62 # 1. 65 # 1.
63 ifcapable subquery { 66 ifcapable subquery {
64 set ii 0 67 set ii 0
65 set tbl_definitions [list \ 68 set tbl_definitions [list \
66 » {CREATE TABLE tbl (a, b);} \ 69 » {CREATE TABLE tbl (a INTEGER PRIMARY KEY, b) WITHOUT rowid;} \
67 » {CREATE TABLE tbl (a INTEGER PRIMARY KEY, b);} \ 70 {CREATE TABLE tbl (a, b PRIMARY KEY) WITHOUT rowid;} \
68 {CREATE TABLE tbl (a, b PRIMARY KEY);} \ 71 » {CREATE TABLE tbl (a PRIMARY KEY, b) WITHOUT rowid;
69 » {CREATE TABLE tbl (a, b); CREATE INDEX tbl_idx ON tbl(b);} \ 72 CREATE INDEX tbl_idx ON tbl(b);} \
70 ] 73 ]
71 ifcapable tempdb { 74 ifcapable tempdb {
72 lappend tbl_definitions \ 75 lappend tbl_definitions \
73 {CREATE TEMP TABLE tbl (a, b); CREATE INDEX tbl_idx ON tbl(b);} 76 {CREATE TEMP TABLE tbl (a PRIMARY KEY, b) WITHOUT rowid;
74 lappend tbl_definitions {CREATE TEMP TABLE tbl (a, b);} 77 CREATE INDEX tbl_idx ON tbl(b);}
75 lappend tbl_definitions \ 78 lappend tbl_definitions \
76 {CREATE TEMPORARY TABLE tbl (a INTEGER PRIMARY KEY, b);} 79 {CREATE TEMP TABLE tbl (a PRIMARY KEY, b) WITHOUT rowid}
80 lappend tbl_definitions \
81 {CREATE TEMPORARY TABLE tbl (a INTEGER PRIMARY KEY, b) WITHOUT rowid;}
77 } 82 }
78 foreach tbl_defn $tbl_definitions { 83 foreach tbl_defn $tbl_definitions {
79 incr ii 84 incr ii
80 catchsql { DROP INDEX tbl_idx; } 85 catchsql { DROP INDEX tbl_idx; }
81 catchsql { 86 catchsql {
82 DROP TABLE rlog; 87 DROP TABLE rlog;
83 DROP TABLE clog; 88 DROP TABLE clog;
84 DROP TABLE tbl; 89 DROP TABLE tbl;
85 DROP TABLE other_tbl; 90 DROP TABLE other_tbl;
86 } 91 }
(...skipping 29 matching lines...) Expand all
116 WHEN old.a = 1 121 WHEN old.a = 1
117 BEGIN 122 BEGIN
118 INSERT INTO clog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM clog), 123 INSERT INTO clog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM clog),
119 old.a, old.b, 124 old.a, old.b,
120 (SELECT coalesce(sum(a),0) FROM tbl), 125 (SELECT coalesce(sum(a),0) FROM tbl),
121 (SELECT coalesce(sum(b),0) FROM tbl), 126 (SELECT coalesce(sum(b),0) FROM tbl),
122 new.a, new.b); 127 new.a, new.b);
123 END; 128 END;
124 } 129 }
125 130
126 do_test trigger2-1.$ii.1 { 131 do_test without_rowid4-1.$ii.1 {
127 set r {} 132 set r {}
128 foreach v [execsql { 133 foreach v [execsql {
129 UPDATE tbl SET a = a * 10, b = b * 10; 134 UPDATE tbl SET a = a * 10, b = b * 10;
130 SELECT * FROM rlog ORDER BY idx; 135 SELECT * FROM rlog ORDER BY idx;
131 SELECT * FROM clog ORDER BY idx; 136 SELECT * FROM clog ORDER BY idx;
132 }] { 137 }] {
133 lappend r [expr {int($v)}] 138 lappend r [expr {int($v)}]
134 } 139 }
135 set r 140 set r
136 } [list 1 1 2 4 6 10 20 \ 141 } [list 1 1 2 4 6 10 20 \
(...skipping 18 matching lines...) Expand all
155 160
156 CREATE TRIGGER delete_after_row AFTER DELETE ON tbl FOR EACH ROW 161 CREATE TRIGGER delete_after_row AFTER DELETE ON tbl FOR EACH ROW
157 BEGIN 162 BEGIN
158 INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 163 INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
159 old.a, old.b, 164 old.a, old.b,
160 (SELECT coalesce(sum(a),0) FROM tbl), 165 (SELECT coalesce(sum(a),0) FROM tbl),
161 (SELECT coalesce(sum(b),0) FROM tbl), 166 (SELECT coalesce(sum(b),0) FROM tbl),
162 0, 0); 167 0, 0);
163 END; 168 END;
164 } 169 }
165 do_test trigger2-1.$ii.2 { 170 do_test without_rowid4-1.$ii.2 {
166 set r {} 171 set r {}
167 foreach v [execsql { 172 foreach v [execsql {
168 DELETE FROM tbl; 173 DELETE FROM tbl;
169 SELECT * FROM rlog; 174 SELECT * FROM rlog;
170 }] { 175 }] {
171 lappend r [expr {int($v)}] 176 lappend r [expr {int($v)}]
172 } 177 }
173 set r 178 set r
174 } [list 1 100 100 400 300 0 0 \ 179 } [list 1 100 100 400 300 0 0 \
175 2 100 100 300 200 0 0 \ 180 2 100 100 300 200 0 0 \
(...skipping 13 matching lines...) Expand all
189 194
190 CREATE TRIGGER insert_after_row AFTER INSERT ON tbl FOR EACH ROW 195 CREATE TRIGGER insert_after_row AFTER INSERT ON tbl FOR EACH ROW
191 BEGIN 196 BEGIN
192 INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 197 INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
193 0, 0, 198 0, 0,
194 (SELECT coalesce(sum(a),0) FROM tbl), 199 (SELECT coalesce(sum(a),0) FROM tbl),
195 (SELECT coalesce(sum(b),0) FROM tbl), 200 (SELECT coalesce(sum(b),0) FROM tbl),
196 new.a, new.b); 201 new.a, new.b);
197 END; 202 END;
198 } 203 }
199 do_test trigger2-1.$ii.3 { 204 do_test without_rowid4-1.$ii.3 {
200 execsql { 205 execsql {
201 206
202 CREATE TABLE other_tbl(a, b); 207 CREATE TABLE other_tbl(a, b);
203 INSERT INTO other_tbl VALUES(1, 2); 208 INSERT INTO other_tbl VALUES(1, 2);
204 INSERT INTO other_tbl VALUES(3, 4); 209 INSERT INTO other_tbl VALUES(3, 4);
205 -- INSERT INTO tbl SELECT * FROM other_tbl; 210 -- INSERT INTO tbl SELECT * FROM other_tbl;
206 INSERT INTO tbl VALUES(5, 6); 211 INSERT INTO tbl VALUES(5, 6);
207 DROP TABLE other_tbl; 212 DROP TABLE other_tbl;
208 213
209 SELECT * FROM rlog; 214 SELECT * FROM rlog;
210 } 215 }
211 } [list 1 0 0 0 0 5 6 \ 216 } [list 1 0 0 0 0 5 6 \
212 2 0 0 5 6 5 6 ] 217 2 0 0 5 6 5 6 ]
213 218
214 integrity_check trigger2-1.$ii.4 219 integrity_check without_rowid4-1.$ii.4
215 } 220 }
216 catchsql { 221 catchsql {
217 DROP TABLE rlog; 222 DROP TABLE rlog;
218 DROP TABLE clog; 223 DROP TABLE clog;
219 DROP TABLE tbl; 224 DROP TABLE tbl;
220 DROP TABLE other_tbl; 225 DROP TABLE other_tbl;
221 } 226 }
222 } 227 }
223 228
224 # 2. 229 # 2.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 regsub -all old\.a $tr_program_cooked $oldA tr_program_cooked 297 regsub -all old\.a $tr_program_cooked $oldA tr_program_cooked
293 regsub -all old\.b $tr_program_cooked $oldB tr_program_cooked 298 regsub -all old\.b $tr_program_cooked $oldB tr_program_cooked
294 regsub -all old\.c $tr_program_cooked $oldC tr_program_cooked 299 regsub -all old\.c $tr_program_cooked $oldC tr_program_cooked
295 300
296 catchsql { 301 catchsql {
297 DROP TABLE tbl; 302 DROP TABLE tbl;
298 DROP TABLE log; 303 DROP TABLE log;
299 } 304 }
300 305
301 execsql { 306 execsql {
302 CREATE TABLE tbl(a PRIMARY KEY, b, c); 307 CREATE TABLE tbl(a PRIMARY KEY, b, c) WITHOUT rowid;
303 CREATE TABLE log(a, b, c); 308 CREATE TABLE log(a, b, c);
304 } 309 }
305 310
306 set query {SELECT * FROM tbl; SELECT * FROM log;} 311 set query {SELECT * FROM tbl; SELECT * FROM log;}
307 set prep "$prep; INSERT INTO log VALUES(1, 2, 3);\ 312 set prep "$prep; INSERT INTO log VALUES(1, 2, 3);\
308 INSERT INTO log VALUES(10, 20, 30);" 313 INSERT INTO log VALUES(10, 20, 30);"
309 314
310 # Check execution of BEFORE programs: 315 # Check execution of BEFORE programs:
311 316
312 set before_data [ execsql "$prep $tr_program_cooked $statement $query" ] 317 set before_data [ execsql "$prep $tr_program_cooked $statement $query" ]
313 318
314 execsql "DELETE FROM tbl; DELETE FROM log; $prep"; 319 execsql "DELETE FROM tbl; DELETE FROM log; $prep";
315 execsql "CREATE TRIGGER the_trigger BEFORE [string range $statement 0 6]\ 320 execsql "CREATE TRIGGER the_trigger BEFORE [string range $statement 0 6]\
316 ON tbl BEGIN $tr_program_fixed END;" 321 ON tbl BEGIN $tr_program_fixed END;"
317 322
318 do_test trigger2-2.$ii-before "execsql {$statement $query}" $before_data 323 do_test without_rowid4-2.$ii-before "execsql {$statement $query}" $before_da ta
319 324
320 execsql "DROP TRIGGER the_trigger;" 325 execsql "DROP TRIGGER the_trigger;"
321 execsql "DELETE FROM tbl; DELETE FROM log;" 326 execsql "DELETE FROM tbl; DELETE FROM log;"
322 327
323 # Check execution of AFTER programs 328 # Check execution of AFTER programs
324 set after_data [ execsql "$prep $statement $tr_program_cooked $query" ] 329 set after_data [ execsql "$prep $statement $tr_program_cooked $query" ]
325 330
326 execsql "DELETE FROM tbl; DELETE FROM log; $prep"; 331 execsql "DELETE FROM tbl; DELETE FROM log; $prep";
327 execsql "CREATE TRIGGER the_trigger AFTER [string range $statement 0 6]\ 332 execsql "CREATE TRIGGER the_trigger AFTER [string range $statement 0 6]\
328 ON tbl BEGIN $tr_program_fixed END;" 333 ON tbl BEGIN $tr_program_fixed END;"
329 334
330 do_test trigger2-2.$ii-after "execsql {$statement $query}" $after_data 335 do_test without_rowid4-2.$ii-after "execsql {$statement $query}" $after_data
331 execsql "DROP TRIGGER the_trigger;" 336 execsql "DROP TRIGGER the_trigger;"
332 337
333 integrity_check trigger2-2.$ii-integrity 338 integrity_check without_rowid4-2.$ii-integrity
334 } 339 }
335 } 340 }
336 catchsql { 341 catchsql {
337 DROP TABLE tbl; 342 DROP TABLE tbl;
338 DROP TABLE log; 343 DROP TABLE log;
339 } 344 }
340 345
341 # 3. 346 # 3.
342 347
343 # trigger2-3.1: UPDATE OF triggers 348 # without_rowid4-3.1: UPDATE OF triggers
344 execsql { 349 execsql {
345 CREATE TABLE tbl (a, b, c, d); 350 CREATE TABLE tbl (a, b, c, d, PRIMARY KEY(a,b,c,d)) WITHOUT rowid;
346 CREATE TABLE log (a); 351 CREATE TABLE log (a);
347 INSERT INTO log VALUES (0); 352 INSERT INTO log VALUES (0);
348 INSERT INTO tbl VALUES (0, 0, 0, 0); 353 INSERT INTO tbl VALUES (0, 0, 0, 0);
349 INSERT INTO tbl VALUES (1, 0, 0, 0); 354 INSERT INTO tbl VALUES (1, 0, 0, 0);
350 CREATE TRIGGER tbl_after_update_cd BEFORE UPDATE OF c, d ON tbl 355 CREATE TRIGGER tbl_after_update_cd BEFORE UPDATE OF c, d ON tbl
351 BEGIN 356 BEGIN
352 UPDATE log SET a = a + 1; 357 UPDATE log SET a = a + 1;
353 END; 358 END;
354 } 359 }
355 do_test trigger2-3.1 { 360 do_test without_rowid4-3.1 {
356 execsql { 361 execsql {
357 UPDATE tbl SET b = 1, c = 10; -- 2 362 UPDATE tbl SET b = 1, c = 10; -- 2
358 UPDATE tbl SET b = 10; -- 0 363 UPDATE tbl SET b = 10; -- 0
359 UPDATE tbl SET d = 4 WHERE a = 0; --1 364 UPDATE tbl SET d = 4 WHERE a = 0; --1
360 UPDATE tbl SET a = 4, b = 10; --0 365 UPDATE tbl SET a = 4, b = 10; --0
361 SELECT * FROM log; 366 SELECT * FROM log;
362 } 367 }
363 } {3} 368 } {3}
364 execsql { 369 execsql {
365 DROP TABLE tbl; 370 DROP TABLE tbl;
366 DROP TABLE log; 371 DROP TABLE log;
367 } 372 }
368 373
369 # trigger2-3.2: WHEN clause 374 # without_rowid4-3.2: WHEN clause
370 set when_triggers [list {t1 BEFORE INSERT ON tbl WHEN new.a > 20}] 375 set when_triggers [list {t1 BEFORE INSERT ON tbl WHEN new.a > 20}]
371 ifcapable subquery { 376 ifcapable subquery {
372 lappend when_triggers \ 377 lappend when_triggers \
373 {t2 BEFORE INSERT ON tbl WHEN (SELECT count(*) FROM tbl) = 0} 378 {t2 BEFORE INSERT ON tbl WHEN (SELECT count(*) FROM tbl) = 0}
374 } 379 }
375 380
376 execsql { 381 execsql {
377 CREATE TABLE tbl (a, b, c, d); 382 CREATE TABLE tbl (a, b, c, d);
378 CREATE TABLE log (a); 383 CREATE TABLE log (a);
379 INSERT INTO log VALUES (0); 384 INSERT INTO log VALUES (0);
380 } 385 }
381 386
382 foreach trig $when_triggers { 387 foreach trig $when_triggers {
383 execsql "CREATE TRIGGER $trig BEGIN UPDATE log set a = a + 1; END;" 388 execsql "CREATE TRIGGER $trig BEGIN UPDATE log set a = a + 1; END;"
384 } 389 }
385 390
386 ifcapable subquery { 391 ifcapable subquery {
387 set t232 {1 0 1} 392 set t232 {1 0 1}
388 } else { 393 } else {
389 set t232 {0 0 1} 394 set t232 {0 0 1}
390 } 395 }
391 do_test trigger2-3.2 { 396 do_test without_rowid4-3.2 {
392 execsql { 397 execsql {
393 398
394 INSERT INTO tbl VALUES(0, 0, 0, 0); -- 1 (ifcapable subquery) 399 INSERT INTO tbl VALUES(0, 0, 0, 0); -- 1 (ifcapable subquery)
395 SELECT * FROM log; 400 SELECT * FROM log;
396 UPDATE log SET a = 0; 401 UPDATE log SET a = 0;
397 402
398 INSERT INTO tbl VALUES(0, 0, 0, 0); -- 0 403 INSERT INTO tbl VALUES(0, 0, 0, 0); -- 0
399 SELECT * FROM log; 404 SELECT * FROM log;
400 UPDATE log SET a = 0; 405 UPDATE log SET a = 0;
401 406
402 INSERT INTO tbl VALUES(200, 0, 0, 0); -- 1 407 INSERT INTO tbl VALUES(200, 0, 0, 0); -- 1
403 SELECT * FROM log; 408 SELECT * FROM log;
404 UPDATE log SET a = 0; 409 UPDATE log SET a = 0;
405 } 410 }
406 } $t232 411 } $t232
407 execsql { 412 execsql {
408 DROP TABLE tbl; 413 DROP TABLE tbl;
409 DROP TABLE log; 414 DROP TABLE log;
410 } 415 }
411 integrity_check trigger2-3.3 416 integrity_check without_rowid4-3.3
412 417
413 # Simple cascaded trigger 418 # Simple cascaded trigger
414 execsql { 419 execsql {
415 CREATE TABLE tblA(a, b); 420 CREATE TABLE tblA(a, b, PRIMARY KEY(a,b)) WITHOUT rowid;
416 CREATE TABLE tblB(a, b); 421 CREATE TABLE tblB(a, b, PRIMARY KEY(a,b)) WITHOUT rowid;
417 CREATE TABLE tblC(a, b); 422 CREATE TABLE tblC(a, b, PRIMARY KEY(a,b)) WITHOUT rowid;
418 423
419 CREATE TRIGGER tr1 BEFORE INSERT ON tblA BEGIN 424 CREATE TRIGGER tr1 BEFORE INSERT ON tblA BEGIN
420 INSERT INTO tblB values(new.a, new.b); 425 INSERT INTO tblB values(new.a, new.b);
421 END; 426 END;
422 427
423 CREATE TRIGGER tr2 BEFORE INSERT ON tblB BEGIN 428 CREATE TRIGGER tr2 BEFORE INSERT ON tblB BEGIN
424 INSERT INTO tblC values(new.a, new.b); 429 INSERT INTO tblC values(new.a, new.b);
425 END; 430 END;
426 } 431 }
427 do_test trigger2-4.1 { 432 do_test without_rowid4-4.1 {
428 execsql { 433 execsql {
429 INSERT INTO tblA values(1, 2); 434 INSERT INTO tblA values(1, 2);
430 SELECT * FROM tblA; 435 SELECT * FROM tblA;
431 SELECT * FROM tblB; 436 SELECT * FROM tblB;
432 SELECT * FROM tblC; 437 SELECT * FROM tblC;
433 } 438 }
434 } {1 2 1 2 1 2} 439 } {1 2 1 2 1 2}
435 execsql { 440 execsql {
436 DROP TABLE tblA; 441 DROP TABLE tblA;
437 DROP TABLE tblB; 442 DROP TABLE tblB;
438 DROP TABLE tblC; 443 DROP TABLE tblC;
439 } 444 }
440 445
441 # Simple recursive trigger 446 # Simple recursive trigger
442 execsql { 447 execsql {
443 CREATE TABLE tbl(a, b, c); 448 CREATE TABLE tbl(a, b, c, PRIMARY KEY(c,a,b)) WITHOUT rowid;
444 CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl 449 CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl
445 BEGIN 450 BEGIN
446 INSERT INTO tbl VALUES (new.a, new.b, new.c); 451 INSERT INTO tbl VALUES (new.a, new.b, new.c+1);
447 END; 452 END;
448 } 453 }
449 do_test trigger2-4.2 { 454 do_test without_rowid4-4.2 {
450 execsql { 455 execsql {
451 INSERT INTO tbl VALUES (1, 2, 3); 456 INSERT INTO tbl VALUES (1, 2, 3);
452 select * from tbl; 457 select * from tbl;
453 } 458 }
454 } {1 2 3 1 2 3} 459 } {1 2 3 1 2 4}
455 execsql { 460 execsql {
456 DROP TABLE tbl; 461 DROP TABLE tbl;
457 } 462 }
458 463
459 # 5. 464 # 5.
460 execsql { 465 execsql {
461 CREATE TABLE tbl(a, b, c); 466 CREATE TABLE tbl(a, b, c, PRIMARY KEY(c,a,b)) WITHOUT rowid;
462 CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl 467 CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl
463 BEGIN 468 BEGIN
464 INSERT INTO tbl VALUES (1, 2, 3); 469 INSERT INTO tbl VALUES (1, 2, 3);
465 INSERT INTO tbl VALUES (2, 2, 3); 470 INSERT INTO tbl VALUES (2, 2, 3);
466 UPDATE tbl set b = 10 WHERE a = 1; 471 UPDATE tbl set b = 10 WHERE a = 1;
467 DELETE FROM tbl WHERE a = 1; 472 DELETE FROM tbl WHERE a = 1;
468 DELETE FROM tbl; 473 DELETE FROM tbl;
469 END; 474 END;
470 } 475 }
471 do_test trigger2-5 { 476 do_test without_rowid4-5 {
472 execsql { 477 execsql {
473 INSERT INTO tbl VALUES(100, 200, 300); 478 INSERT INTO tbl VALUES(100, 200, 300);
474 } 479 }
475 db changes 480 db changes
476 } {1} 481 } {1}
477 execsql { 482 execsql {
478 DROP TABLE tbl; 483 DROP TABLE tbl;
479 } 484 }
480 485
481 ifcapable conflict { 486 ifcapable conflict {
482 # Handling of ON CONFLICT by INSERT statements inside triggers 487 # Handling of ON CONFLICT by INSERT statements inside triggers
483 execsql { 488 execsql {
484 CREATE TABLE tbl (a primary key, b, c); 489 CREATE TABLE tbl (a PRIMARY KEY, b, c) WITHOUT rowid;
485 CREATE TRIGGER ai_tbl AFTER INSERT ON tbl BEGIN 490 CREATE TRIGGER ai_tbl AFTER INSERT ON tbl BEGIN
486 INSERT OR IGNORE INTO tbl values (new.a, 0, 0); 491 INSERT OR IGNORE INTO tbl values (new.a, 0, 0);
487 END; 492 END;
488 } 493 }
489 do_test trigger2-6.1a { 494 do_test without_rowid4-6.1a {
490 execsql { 495 execsql {
491 BEGIN; 496 BEGIN;
492 INSERT INTO tbl values (1, 2, 3); 497 INSERT INTO tbl values (1, 2, 3);
493 SELECT * from tbl; 498 SELECT * from tbl;
494 } 499 }
495 } {1 2 3} 500 } {1 2 3}
496 do_test trigger2-6.1b { 501 do_test without_rowid4-6.1b {
497 catchsql { 502 catchsql {
498 INSERT OR ABORT INTO tbl values (2, 2, 3); 503 INSERT OR ABORT INTO tbl values (2, 2, 3);
499 } 504 }
500 } {1 {column a is not unique}} 505 } {1 {UNIQUE constraint failed: tbl.a}}
501 do_test trigger2-6.1c { 506 do_test without_rowid4-6.1c {
502 execsql { 507 execsql {
503 SELECT * from tbl; 508 SELECT * from tbl;
504 } 509 }
505 } {1 2 3} 510 } {1 2 3}
506 do_test trigger2-6.1d { 511 do_test without_rowid4-6.1d {
507 catchsql { 512 catchsql {
508 INSERT OR FAIL INTO tbl values (2, 2, 3); 513 INSERT OR FAIL INTO tbl values (2, 2, 3);
509 } 514 }
510 } {1 {column a is not unique}} 515 } {1 {UNIQUE constraint failed: tbl.a}}
511 do_test trigger2-6.1e { 516 do_test without_rowid4-6.1e {
512 execsql { 517 execsql {
513 SELECT * from tbl; 518 SELECT * from tbl;
514 } 519 }
515 } {1 2 3 2 2 3} 520 } {1 2 3 2 2 3}
516 do_test trigger2-6.1f { 521 do_test without_rowid4-6.1f {
517 execsql { 522 execsql {
518 INSERT OR REPLACE INTO tbl values (2, 2, 3); 523 INSERT OR REPLACE INTO tbl values (2, 2, 3);
519 SELECT * from tbl; 524 SELECT * from tbl;
520 } 525 }
521 } {1 2 3 2 0 0} 526 } {1 2 3 2 0 0}
522 do_test trigger2-6.1g { 527 do_test without_rowid4-6.1g {
523 catchsql { 528 catchsql {
524 INSERT OR ROLLBACK INTO tbl values (3, 2, 3); 529 INSERT OR ROLLBACK INTO tbl values (3, 2, 3);
525 } 530 }
526 } {1 {column a is not unique}} 531 } {1 {UNIQUE constraint failed: tbl.a}}
527 do_test trigger2-6.1h { 532 do_test without_rowid4-6.1h {
528 execsql { 533 execsql {
529 SELECT * from tbl; 534 SELECT * from tbl;
530 } 535 }
531 } {} 536 } {}
532 execsql {DELETE FROM tbl} 537 execsql {DELETE FROM tbl}
533 538
534 539
535 # Handling of ON CONFLICT by UPDATE statements inside triggers 540 # Handling of ON CONFLICT by UPDATE statements inside triggers
536 execsql { 541 execsql {
537 INSERT INTO tbl values (4, 2, 3); 542 INSERT INTO tbl values (4, 2, 3);
538 INSERT INTO tbl values (6, 3, 4); 543 INSERT INTO tbl values (6, 3, 4);
539 CREATE TRIGGER au_tbl AFTER UPDATE ON tbl BEGIN 544 CREATE TRIGGER au_tbl AFTER UPDATE ON tbl BEGIN
540 UPDATE OR IGNORE tbl SET a = new.a, c = 10; 545 UPDATE OR IGNORE tbl SET a = new.a, c = 10;
541 END; 546 END;
542 } 547 }
543 do_test trigger2-6.2a { 548 do_test without_rowid4-6.2a {
544 execsql { 549 execsql {
545 BEGIN; 550 BEGIN;
546 UPDATE tbl SET a = 1 WHERE a = 4; 551 UPDATE tbl SET a = 1 WHERE a = 4;
547 SELECT * from tbl; 552 SELECT * from tbl;
548 } 553 }
549 } {1 2 10 6 3 4} 554 } {1 2 10 6 3 4}
550 do_test trigger2-6.2b { 555 do_test without_rowid4-6.2b {
551 catchsql { 556 catchsql {
552 UPDATE OR ABORT tbl SET a = 4 WHERE a = 1; 557 UPDATE OR ABORT tbl SET a = 4 WHERE a = 1;
553 } 558 }
554 } {1 {column a is not unique}} 559 } {1 {UNIQUE constraint failed: tbl.a}}
555 do_test trigger2-6.2c { 560 do_test without_rowid4-6.2c {
556 execsql { 561 execsql {
557 SELECT * from tbl; 562 SELECT * from tbl;
558 } 563 }
559 } {1 2 10 6 3 4} 564 } {1 2 10 6 3 4}
560 do_test trigger2-6.2d { 565 do_test without_rowid4-6.2d {
561 catchsql { 566 catchsql {
562 UPDATE OR FAIL tbl SET a = 4 WHERE a = 1; 567 UPDATE OR FAIL tbl SET a = 4 WHERE a = 1;
563 } 568 }
564 } {1 {column a is not unique}} 569 } {1 {UNIQUE constraint failed: tbl.a}}
565 do_test trigger2-6.2e { 570 do_test without_rowid4-6.2e {
566 execsql { 571 execsql {
567 SELECT * from tbl; 572 SELECT * from tbl;
568 } 573 }
569 } {4 2 10 6 3 4} 574 } {4 2 10 6 3 4}
570 do_test trigger2-6.2f.1 { 575 do_test without_rowid4-6.2f.1 {
571 execsql { 576 execsql {
572 UPDATE OR REPLACE tbl SET a = 1 WHERE a = 4; 577 UPDATE OR REPLACE tbl SET a = 1 WHERE a = 4;
573 SELECT * from tbl; 578 SELECT * from tbl;
574 } 579 }
575 } {1 3 10} 580 } {1 3 10}
576 do_test trigger2-6.2f.2 { 581 do_test without_rowid4-6.2f.2 {
577 execsql { 582 execsql {
578 INSERT INTO tbl VALUES (2, 3, 4); 583 INSERT INTO tbl VALUES (2, 3, 4);
579 SELECT * FROM tbl; 584 SELECT * FROM tbl;
580 } 585 }
581 } {1 3 10 2 3 4} 586 } {1 3 10 2 3 4}
582 do_test trigger2-6.2g { 587 do_test without_rowid4-6.2g {
583 catchsql { 588 catchsql {
584 UPDATE OR ROLLBACK tbl SET a = 4 WHERE a = 1; 589 UPDATE OR ROLLBACK tbl SET a = 4 WHERE a = 1;
585 } 590 }
586 } {1 {column a is not unique}} 591 } {1 {UNIQUE constraint failed: tbl.a}}
587 do_test trigger2-6.2h { 592 do_test without_rowid4-6.2h {
588 execsql { 593 execsql {
589 SELECT * from tbl; 594 SELECT * from tbl;
590 } 595 }
591 } {4 2 3 6 3 4} 596 } {4 2 3 6 3 4}
592 execsql { 597 execsql {
593 DROP TABLE tbl; 598 DROP TABLE tbl;
594 } 599 }
595 } ; # ifcapable conflict 600 } ; # ifcapable conflict
596 601
597 # 7. Triggers on views 602 # 7. Triggers on views
598 ifcapable view { 603 ifcapable view {
599 604
600 do_test trigger2-7.1 { 605 do_test without_rowid4-7.1 {
601 execsql { 606 execsql {
602 CREATE TABLE ab(a, b); 607 CREATE TABLE ab(a, b, PRIMARY KEY(a,b)) WITHOUT rowid;
603 CREATE TABLE cd(c, d); 608 CREATE TABLE cd(c, d, PRIMARY KEY(c,d)) WITHOUT rowid;
604 INSERT INTO ab VALUES (1, 2); 609 INSERT INTO ab VALUES (1, 2);
605 INSERT INTO ab VALUES (0, 0); 610 INSERT INTO ab VALUES (0, 0);
606 INSERT INTO cd VALUES (3, 4); 611 INSERT INTO cd VALUES (3, 4);
607 612
608 CREATE TABLE tlog(ii INTEGER PRIMARY KEY, 613 CREATE TABLE tlog(ii INTEGER PRIMARY KEY,
609 olda, oldb, oldc, oldd, newa, newb, newc, newd); 614 olda, oldb, oldc, oldd, newa, newb, newc, newd);
610 615
611 CREATE VIEW abcd AS SELECT a, b, c, d FROM ab, cd; 616 CREATE VIEW abcd AS SELECT a, b, c, d FROM ab, cd;
612 617
613 CREATE TRIGGER before_update INSTEAD OF UPDATE ON abcd BEGIN 618 CREATE TRIGGER before_update INSTEAD OF UPDATE ON abcd BEGIN
(...skipping 18 matching lines...) Expand all
632 INSERT INTO tlog VALUES(NULL, 637 INSERT INTO tlog VALUES(NULL,
633 0, 0, 0, 0, new.a, new.b, new.c, new.d); 638 0, 0, 0, 0, new.a, new.b, new.c, new.d);
634 END; 639 END;
635 CREATE TRIGGER after_insert INSTEAD OF INSERT ON abcd BEGIN 640 CREATE TRIGGER after_insert INSTEAD OF INSERT ON abcd BEGIN
636 INSERT INTO tlog VALUES(NULL, 641 INSERT INTO tlog VALUES(NULL,
637 0, 0, 0, 0, new.a, new.b, new.c, new.d); 642 0, 0, 0, 0, new.a, new.b, new.c, new.d);
638 END; 643 END;
639 } 644 }
640 } {}; 645 } {};
641 646
642 do_test trigger2-7.2 { 647 do_test without_rowid4-7.2 {
643 execsql { 648 execsql {
644 UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1; 649 UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1;
645 DELETE FROM abcd WHERE a = 1; 650 DELETE FROM abcd WHERE a = 1;
646 INSERT INTO abcd VALUES(10, 20, 30, 40); 651 INSERT INTO abcd VALUES(10, 20, 30, 40);
647 SELECT * FROM tlog; 652 SELECT * FROM tlog;
648 } 653 }
649 } [ list 1 1 2 3 4 100 25 3 4 \ 654 } [ list 1 1 2 3 4 100 25 3 4 \
650 2 1 2 3 4 100 25 3 4 \ 655 2 1 2 3 4 100 25 3 4 \
651 3 1 2 3 4 0 0 0 0 \ 656 3 1 2 3 4 0 0 0 0 \
652 4 1 2 3 4 0 0 0 0 \ 657 4 1 2 3 4 0 0 0 0 \
653 5 0 0 0 0 10 20 30 40 \ 658 5 0 0 0 0 10 20 30 40 \
654 6 0 0 0 0 10 20 30 40 ] 659 6 0 0 0 0 10 20 30 40 ]
655 660
656 do_test trigger2-7.3 { 661 do_test without_rowid4-7.3 {
657 execsql { 662 execsql {
658 DELETE FROM tlog; 663 DELETE FROM tlog;
659 INSERT INTO abcd VALUES(10, 20, 30, 40); 664 INSERT INTO abcd VALUES(10, 20, 30, 40);
660 UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1; 665 UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1;
661 DELETE FROM abcd WHERE a = 1; 666 DELETE FROM abcd WHERE a = 1;
662 SELECT * FROM tlog; 667 SELECT * FROM tlog;
663 } 668 }
664 } [ list \ 669 } [ list \
665 1 0 0 0 0 10 20 30 40 \ 670 1 0 0 0 0 10 20 30 40 \
666 2 0 0 0 0 10 20 30 40 \ 671 2 0 0 0 0 10 20 30 40 \
667 3 1 2 3 4 100 25 3 4 \ 672 3 1 2 3 4 100 25 3 4 \
668 4 1 2 3 4 100 25 3 4 \ 673 4 1 2 3 4 100 25 3 4 \
669 5 1 2 3 4 0 0 0 0 \ 674 5 1 2 3 4 0 0 0 0 \
670 6 1 2 3 4 0 0 0 0 \ 675 6 1 2 3 4 0 0 0 0 \
671 ] 676 ]
672 do_test trigger2-7.4 { 677 do_test without_rowid4-7.4 {
673 execsql { 678 execsql {
674 DELETE FROM tlog; 679 DELETE FROM tlog;
675 DELETE FROM abcd WHERE a = 1; 680 DELETE FROM abcd WHERE a = 1;
676 INSERT INTO abcd VALUES(10, 20, 30, 40); 681 INSERT INTO abcd VALUES(10, 20, 30, 40);
677 UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1; 682 UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1;
678 SELECT * FROM tlog; 683 SELECT * FROM tlog;
679 } 684 }
680 } [ list \ 685 } [ list \
681 1 1 2 3 4 0 0 0 0 \ 686 1 1 2 3 4 0 0 0 0 \
682 2 1 2 3 4 0 0 0 0 \ 687 2 1 2 3 4 0 0 0 0 \
683 3 0 0 0 0 10 20 30 40 \ 688 3 0 0 0 0 10 20 30 40 \
684 4 0 0 0 0 10 20 30 40 \ 689 4 0 0 0 0 10 20 30 40 \
685 5 1 2 3 4 100 25 3 4 \ 690 5 1 2 3 4 100 25 3 4 \
686 6 1 2 3 4 100 25 3 4 \ 691 6 1 2 3 4 100 25 3 4 \
687 ] 692 ]
688 693
689 do_test trigger2-8.1 { 694 do_test without_rowid4-8.1 {
690 execsql { 695 execsql {
691 CREATE TABLE t1(a,b,c); 696 CREATE TABLE t1(a,b,c, PRIMARY KEY(a,b,c)) WITHOUT rowid;
692 INSERT INTO t1 VALUES(1,2,3); 697 INSERT INTO t1 VALUES(1,2,3);
693 CREATE VIEW v1 AS 698 CREATE VIEW v1 AS
694 SELECT a+b AS x, b+c AS y, a+c AS z FROM t1; 699 SELECT a+b AS x, b+c AS y, a+c AS z FROM t1;
695 SELECT * FROM v1; 700 SELECT * FROM v1;
696 } 701 }
697 } {3 5 4} 702 } {3 5 4}
698 do_test trigger2-8.2 { 703 do_test without_rowid4-8.2 {
699 execsql { 704 execsql {
700 CREATE TABLE v1log(a,b,c,d,e,f); 705 CREATE TABLE v1log(a,b,c,d,e,f);
701 CREATE TRIGGER r1 INSTEAD OF DELETE ON v1 BEGIN 706 CREATE TRIGGER r1 INSTEAD OF DELETE ON v1 BEGIN
702 INSERT INTO v1log VALUES(OLD.x,NULL,OLD.y,NULL,OLD.z,NULL); 707 INSERT INTO v1log VALUES(OLD.x,NULL,OLD.y,NULL,OLD.z,NULL);
703 END; 708 END;
704 DELETE FROM v1 WHERE x=1; 709 DELETE FROM v1 WHERE x=1;
705 SELECT * FROM v1log; 710 SELECT * FROM v1log;
706 } 711 }
707 } {} 712 } {}
708 do_test trigger2-8.3 { 713 do_test without_rowid4-8.3 {
709 execsql { 714 execsql {
710 DELETE FROM v1 WHERE x=3; 715 DELETE FROM v1 WHERE x=3;
711 SELECT * FROM v1log; 716 SELECT * FROM v1log;
712 } 717 }
713 } {3 {} 5 {} 4 {}} 718 } {3 {} 5 {} 4 {}}
714 do_test trigger2-8.4 { 719 do_test without_rowid4-8.4 {
715 execsql { 720 execsql {
716 INSERT INTO t1 VALUES(4,5,6); 721 INSERT INTO t1 VALUES(4,5,6);
717 DELETE FROM v1log; 722 DELETE FROM v1log;
718 DELETE FROM v1 WHERE y=11; 723 DELETE FROM v1 WHERE y=11;
719 SELECT * FROM v1log; 724 SELECT * FROM v1log;
720 } 725 }
721 } {9 {} 11 {} 10 {}} 726 } {9 {} 11 {} 10 {}}
722 do_test trigger2-8.5 { 727 do_test without_rowid4-8.5 {
723 execsql { 728 execsql {
724 CREATE TRIGGER r2 INSTEAD OF INSERT ON v1 BEGIN 729 CREATE TRIGGER r2 INSTEAD OF INSERT ON v1 BEGIN
725 INSERT INTO v1log VALUES(NULL,NEW.x,NULL,NEW.y,NULL,NEW.z); 730 INSERT INTO v1log VALUES(NULL,NEW.x,NULL,NEW.y,NULL,NEW.z);
726 END; 731 END;
727 DELETE FROM v1log; 732 DELETE FROM v1log;
728 INSERT INTO v1 VALUES(1,2,3); 733 INSERT INTO v1 VALUES(1,2,3);
729 SELECT * FROM v1log; 734 SELECT * FROM v1log;
730 } 735 }
731 } {{} 1 {} 2 {} 3} 736 } {{} 1 {} 2 {} 3}
732 do_test trigger2-8.6 { 737 do_test without_rowid4-8.6 {
733 execsql { 738 execsql {
734 CREATE TRIGGER r3 INSTEAD OF UPDATE ON v1 BEGIN 739 CREATE TRIGGER r3 INSTEAD OF UPDATE ON v1 BEGIN
735 INSERT INTO v1log VALUES(OLD.x,NEW.x,OLD.y,NEW.y,OLD.z,NEW.z); 740 INSERT INTO v1log VALUES(OLD.x,NEW.x,OLD.y,NEW.y,OLD.z,NEW.z);
736 END; 741 END;
737 DELETE FROM v1log; 742 DELETE FROM v1log;
738 UPDATE v1 SET x=x+100, y=y+200, z=z+300; 743 UPDATE v1 SET x=x+100, y=y+200, z=z+300;
739 SELECT * FROM v1log; 744 SELECT * FROM v1log;
740 } 745 }
741 } {3 103 5 205 4 304 9 109 11 211 10 310} 746 } {3 103 5 205 4 304 9 109 11 211 10 310}
742 747
743 # At one point the following was causing a segfault. 748 # At one point the following was causing a segfault.
744 do_test trigger2-9.1 { 749 do_test without_rowid4-9.1 {
745 execsql { 750 execsql {
746 CREATE TABLE t3(a TEXT, b TEXT); 751 CREATE TABLE t3(a TEXT, b TEXT);
747 CREATE VIEW v3 AS SELECT t3.a FROM t3; 752 CREATE VIEW v3 AS SELECT t3.a FROM t3;
748 CREATE TRIGGER trig1 INSTEAD OF DELETE ON v3 BEGIN 753 CREATE TRIGGER trig1 INSTEAD OF DELETE ON v3 BEGIN
749 SELECT 1; 754 SELECT 1;
750 END; 755 END;
751 DELETE FROM v3 WHERE a = 1; 756 DELETE FROM v3 WHERE a = 1;
752 } 757 }
753 } {} 758 } {}
754 759
755 } ;# ifcapable view 760 } ;# ifcapable view
756 761
757 integrity_check trigger2-9.9 762 integrity_check without_rowid4-9.9
758 763
759 finish_test 764 finish_test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698