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