Annotation of embedaddon/sqlite3/test/trigger9.test, revision 1.1.1.1
1.1 misho 1: # 2008 January 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. Specifically,
12: # it tests some compiler optimizations for SQL statements featuring
13: # triggers:
14: #
15: #
16: #
17:
18: # trigger9-1.* - Test that if there are no references to OLD.* cols, or a
19: # reference to only OLD.rowid, the data is not loaded.
20: #
21: # trigger9-2.* - Test that for NEW.* records populated by UPDATE
22: # statements, unused fields are populated with NULL values.
23: #
24: # trigger9-3.* - Test that the temporary tables used for OLD.* references
25: # in "INSTEAD OF" triggers have NULL values in unused
26: # fields.
27: #
28:
29: set testdir [file dirname $argv0]
30: source $testdir/tester.tcl
31: ifcapable {!trigger} {
32: finish_test
33: return
34: }
35:
36: proc has_rowdata {sql} {
37: expr {[lsearch [execsql "explain $sql"] RowData]>=0}
38: }
39:
40: do_test trigger9-1.1 {
41: execsql {
42: PRAGMA page_size = 1024;
43: CREATE TABLE t1(x, y, z);
44: INSERT INTO t1 VALUES('1', randstr(10000,10000), '2');
45: INSERT INTO t1 VALUES('2', randstr(10000,10000), '4');
46: INSERT INTO t1 VALUES('3', randstr(10000,10000), '6');
47: CREATE TABLE t2(x);
48: }
49: } {}
50:
51: do_test trigger9-1.2.1 {
52: execsql {
53: BEGIN;
54: CREATE TRIGGER trig1 BEFORE DELETE ON t1 BEGIN
55: INSERT INTO t2 VALUES(old.rowid);
56: END;
57: DELETE FROM t1;
58: SELECT * FROM t2;
59: }
60: } {1 2 3}
61: do_test trigger9-1.2.3 {
62: has_rowdata {DELETE FROM t1}
63: } 0
64: do_test trigger9-1.2.4 { execsql { ROLLBACK } } {}
65:
66: do_test trigger9-1.3.1 {
67: execsql {
68: BEGIN;
69: CREATE TRIGGER trig1 BEFORE DELETE ON t1 BEGIN
70: INSERT INTO t2 VALUES(old.x);
71: END;
72: DELETE FROM t1;
73: SELECT * FROM t2;
74: }
75: } {1 2 3}
76: do_test trigger9-1.3.2 {
77: has_rowdata {DELETE FROM t1}
78: } 0
79: do_test trigger9-1.3.3 { execsql { ROLLBACK } } {}
80:
81: do_test trigger9-1.4.1 {
82: execsql {
83: BEGIN;
84: CREATE TRIGGER trig1 BEFORE DELETE ON t1 WHEN old.x='1' BEGIN
85: INSERT INTO t2 VALUES(old.rowid);
86: END;
87: DELETE FROM t1;
88: SELECT * FROM t2;
89: }
90: } {1}
91: do_test trigger9-1.4.2 {
92: has_rowdata {DELETE FROM t1}
93: } 0
94: do_test trigger9-1.4.3 { execsql { ROLLBACK } } {}
95:
96: do_test trigger9-1.5.1 {
97: execsql {
98: BEGIN;
99: CREATE TRIGGER trig1 BEFORE UPDATE ON t1 BEGIN
100: INSERT INTO t2 VALUES(old.rowid);
101: END;
102: UPDATE t1 SET y = '';
103: SELECT * FROM t2;
104: }
105: } {1 2 3}
106: do_test trigger9-1.5.2 {
107: has_rowdata {UPDATE t1 SET y = ''}
108: } 0
109: do_test trigger9-1.5.3 { execsql { ROLLBACK } } {}
110:
111: do_test trigger9-1.6.1 {
112: execsql {
113: BEGIN;
114: CREATE TRIGGER trig1 BEFORE UPDATE ON t1 BEGIN
115: INSERT INTO t2 VALUES(old.x);
116: END;
117: UPDATE t1 SET y = '';
118: SELECT * FROM t2;
119: }
120: } {1 2 3}
121: do_test trigger9-1.6.2 {
122: has_rowdata {UPDATE t1 SET y = ''}
123: } 0
124: do_test trigger9-1.6.3 { execsql { ROLLBACK } } {}
125:
126: do_test trigger9-1.7.1 {
127: execsql {
128: BEGIN;
129: CREATE TRIGGER trig1 BEFORE UPDATE ON t1 WHEN old.x>='2' BEGIN
130: INSERT INTO t2 VALUES(old.x);
131: END;
132: UPDATE t1 SET y = '';
133: SELECT * FROM t2;
134: }
135: } {2 3}
136: do_test trigger9-1.7.2 {
137: has_rowdata {UPDATE t1 SET y = ''}
138: } 0
139: do_test trigger9-1.7.3 { execsql { ROLLBACK } } {}
140:
141: do_test trigger9-3.1 {
142: execsql {
143: CREATE TABLE t3(a, b);
144: INSERT INTO t3 VALUES(1, 'one');
145: INSERT INTO t3 VALUES(2, 'two');
146: INSERT INTO t3 VALUES(3, 'three');
147: }
148: } {}
149: do_test trigger9-3.2 {
150: execsql {
151: BEGIN;
152: CREATE VIEW v1 AS SELECT * FROM t3;
153: CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
154: INSERT INTO t2 VALUES(old.a);
155: END;
156: UPDATE v1 SET b = 'hello';
157: SELECT * FROM t2;
158: ROLLBACK;
159: }
160: } {1 2 3}
161: do_test trigger9-3.3 {
162: # In this test the 'c' column of the view is not required by
163: # the INSTEAD OF trigger, but the expression is reused internally as
164: # part of the view's WHERE clause. Check that this does not cause
165: # a problem.
166: #
167: execsql {
168: BEGIN;
169: CREATE VIEW v1 AS SELECT a, b AS c FROM t3 WHERE c > 'one';
170: CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
171: INSERT INTO t2 VALUES(old.a);
172: END;
173: UPDATE v1 SET c = 'hello';
174: SELECT * FROM t2;
175: ROLLBACK;
176: }
177: } {2 3}
178: do_test trigger9-3.4 {
179: execsql {
180: BEGIN;
181: INSERT INTO t3 VALUES(3, 'three');
182: INSERT INTO t3 VALUES(3, 'four');
183: CREATE VIEW v1 AS SELECT DISTINCT a, b FROM t3;
184: CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
185: INSERT INTO t2 VALUES(old.a);
186: END;
187: UPDATE v1 SET b = 'hello';
188: SELECT * FROM t2;
189: ROLLBACK;
190: }
191: } {1 2 3 3}
192:
193: ifcapable compound {
194: do_test trigger9-3.5 {
195: execsql {
196: BEGIN;
197: INSERT INTO t3 VALUES(1, 'uno');
198: CREATE VIEW v1 AS SELECT a, b FROM t3 EXCEPT SELECT 1, 'one';
199: CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
200: INSERT INTO t2 VALUES(old.a);
201: END;
202: UPDATE v1 SET b = 'hello';
203: SELECT * FROM t2;
204: ROLLBACK;
205: }
206: } {1 2 3}
207: do_test trigger9-3.6 {
208: execsql {
209: BEGIN;
210: INSERT INTO t3 VALUES(1, 'zero');
211: CREATE VIEW v1 AS
212: SELECT sum(a) AS a, max(b) AS b FROM t3 GROUP BY t3.a HAVING b>'two';
213: CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
214: INSERT INTO t2 VALUES(old.a);
215: END;
216: UPDATE v1 SET b = 'hello';
217: SELECT * FROM t2;
218: ROLLBACK;
219: }
220: } {2}
221: }
222:
223: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>