xref: /illumos-gate/usr/src/lib/libsqlite/test/trigger1.test (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
1*1da57d55SToomas Soome#
2c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
3c5c4113dSnw141292# a legal notice, here is a blessing:
4c5c4113dSnw141292#
5c5c4113dSnw141292#    May you do good and not evil.
6c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
7c5c4113dSnw141292#    May you share freely, never taking more than you give.
8c5c4113dSnw141292#
9c5c4113dSnw141292#***********************************************************************
10c5c4113dSnw141292#
11c5c4113dSnw141292# This file tests creating and dropping triggers, and interaction thereof
12c5c4113dSnw141292# with the database COMMIT/ROLLBACK logic.
13c5c4113dSnw141292#
14c5c4113dSnw141292# 1. CREATE and DROP TRIGGER tests
15c5c4113dSnw141292# trig-1.1: Error if table does not exist
16c5c4113dSnw141292# trig-1.2: Error if trigger already exists
17c5c4113dSnw141292# trig-1.3: Created triggers are deleted if the transaction is rolled back
18c5c4113dSnw141292# trig-1.4: DROP TRIGGER removes trigger
19c5c4113dSnw141292# trig-1.5: Dropped triggers are restored if the transaction is rolled back
20c5c4113dSnw141292# trig-1.6: Error if dropped trigger doesn't exist
21c5c4113dSnw141292# trig-1.7: Dropping the table automatically drops all triggers
22c5c4113dSnw141292# trig-1.8: A trigger created on a TEMP table is not inserted into sqlite_master
23c5c4113dSnw141292# trig-1.9: Ensure that we cannot create a trigger on sqlite_master
24c5c4113dSnw141292# trig-1.10:
25c5c4113dSnw141292# trig-1.11:
26c5c4113dSnw141292# trig-1.12: Ensure that INSTEAD OF triggers cannot be created on tables
27c5c4113dSnw141292# trig-1.13: Ensure that AFTER triggers cannot be created on views
28c5c4113dSnw141292# trig-1.14: Ensure that BEFORE triggers cannot be created on views
29c5c4113dSnw141292#
30c5c4113dSnw141292
31c5c4113dSnw141292set testdir [file dirname $argv0]
32c5c4113dSnw141292source $testdir/tester.tcl
33c5c4113dSnw141292
34c5c4113dSnw141292do_test trigger1-1.1.2 {
35c5c4113dSnw141292   catchsql {
36c5c4113dSnw141292     CREATE TRIGGER trig UPDATE ON no_such_table BEGIN
37c5c4113dSnw141292       SELECT * from sqlite_master;
38c5c4113dSnw141292     END;
39c5c4113dSnw141292   }
40c5c4113dSnw141292} {1 {no such table: no_such_table}}
41c5c4113dSnw141292do_test trigger1-1.1.2 {
42c5c4113dSnw141292   catchsql {
43c5c4113dSnw141292     CREATE TEMP TRIGGER trig UPDATE ON no_such_table BEGIN
44c5c4113dSnw141292       SELECT * from sqlite_master;
45c5c4113dSnw141292     END;
46c5c4113dSnw141292   }
47c5c4113dSnw141292} {1 {no such table: no_such_table}}
48c5c4113dSnw141292
49c5c4113dSnw141292execsql {
50c5c4113dSnw141292    CREATE TABLE t1(a);
51c5c4113dSnw141292}
52c5c4113dSnw141292execsql {
53c5c4113dSnw141292	CREATE TRIGGER tr1 INSERT ON t1 BEGIN
54c5c4113dSnw141292	  INSERT INTO t1 values(1);
55c5c4113dSnw141292 	END;
56c5c4113dSnw141292}
57c5c4113dSnw141292do_test trigger1-1.2 {
58c5c4113dSnw141292    catchsql {
59c5c4113dSnw141292	CREATE TRIGGER tr1 DELETE ON t1 BEGIN
60c5c4113dSnw141292	    SELECT * FROM sqlite_master;
61c5c4113dSnw141292 	END
62c5c4113dSnw141292     }
63c5c4113dSnw141292} {1 {trigger tr1 already exists}}
64c5c4113dSnw141292
65c5c4113dSnw141292do_test trigger1-1.3 {
66c5c4113dSnw141292    catchsql {
67c5c4113dSnw141292	BEGIN;
68c5c4113dSnw141292	CREATE TRIGGER tr2 INSERT ON t1 BEGIN
69c5c4113dSnw141292	    SELECT * from sqlite_master; END;
70c5c4113dSnw141292        ROLLBACK;
71c5c4113dSnw141292	CREATE TRIGGER tr2 INSERT ON t1 BEGIN
72c5c4113dSnw141292	    SELECT * from sqlite_master; END;
73c5c4113dSnw141292    }
74c5c4113dSnw141292} {0 {}}
75c5c4113dSnw141292
76c5c4113dSnw141292do_test trigger1-1.4 {
77c5c4113dSnw141292    catchsql {
78c5c4113dSnw141292	DROP TRIGGER tr1;
79c5c4113dSnw141292	CREATE TRIGGER tr1 DELETE ON t1 BEGIN
80c5c4113dSnw141292	    SELECT * FROM sqlite_master;
81c5c4113dSnw141292	END
82c5c4113dSnw141292    }
83c5c4113dSnw141292} {0 {}}
84c5c4113dSnw141292
85c5c4113dSnw141292do_test trigger1-1.5 {
86c5c4113dSnw141292    execsql {
87c5c4113dSnw141292	BEGIN;
88c5c4113dSnw141292	DROP TRIGGER tr2;
89c5c4113dSnw141292	ROLLBACK;
90c5c4113dSnw141292	DROP TRIGGER tr2;
91c5c4113dSnw141292    }
92c5c4113dSnw141292} {}
93c5c4113dSnw141292
94c5c4113dSnw141292do_test trigger1-1.6 {
95c5c4113dSnw141292    catchsql {
96c5c4113dSnw141292	DROP TRIGGER biggles;
97c5c4113dSnw141292    }
98c5c4113dSnw141292} {1 {no such trigger: biggles}}
99c5c4113dSnw141292
100c5c4113dSnw141292do_test trigger1-1.7 {
101c5c4113dSnw141292    catchsql {
102c5c4113dSnw141292	DROP TABLE t1;
103c5c4113dSnw141292	DROP TRIGGER tr1;
104c5c4113dSnw141292    }
105c5c4113dSnw141292} {1 {no such trigger: tr1}}
106c5c4113dSnw141292
107c5c4113dSnw141292execsql {
108c5c4113dSnw141292  CREATE TEMP TABLE temp_table(a);
109c5c4113dSnw141292}
110c5c4113dSnw141292do_test trigger1-1.8 {
111c5c4113dSnw141292  execsql {
112c5c4113dSnw141292	CREATE TRIGGER temp_trig UPDATE ON temp_table BEGIN
113c5c4113dSnw141292	    SELECT * from sqlite_master;
114c5c4113dSnw141292	END;
115c5c4113dSnw141292	SELECT count(*) FROM sqlite_master WHERE name = 'temp_trig';
116c5c4113dSnw141292  }
117c5c4113dSnw141292} {0}
118c5c4113dSnw141292
119c5c4113dSnw141292do_test trigger1-1.9 {
120c5c4113dSnw141292  catchsql {
121c5c4113dSnw141292    CREATE TRIGGER tr1 AFTER UPDATE ON sqlite_master BEGIN
122c5c4113dSnw141292       SELECT * FROM sqlite_master;
123c5c4113dSnw141292    END;
124c5c4113dSnw141292  }
125c5c4113dSnw141292} {1 {cannot create trigger on system table}}
126c5c4113dSnw141292
127c5c4113dSnw141292# Check to make sure that a DELETE statement within the body of
128c5c4113dSnw141292# a trigger does not mess up the DELETE that caused the trigger to
129c5c4113dSnw141292# run in the first place.
130c5c4113dSnw141292#
131c5c4113dSnw141292do_test trigger1-1.10 {
132c5c4113dSnw141292  execsql {
133c5c4113dSnw141292    create table t1(a,b);
134c5c4113dSnw141292    insert into t1 values(1,'a');
135c5c4113dSnw141292    insert into t1 values(2,'b');
136c5c4113dSnw141292    insert into t1 values(3,'c');
137c5c4113dSnw141292    insert into t1 values(4,'d');
138c5c4113dSnw141292    create trigger r1 after delete on t1 for each row begin
139c5c4113dSnw141292      delete from t1 WHERE a=old.a+2;
140c5c4113dSnw141292    end;
141c5c4113dSnw141292    delete from t1 where a in (1,3);
142c5c4113dSnw141292    select * from t1;
143c5c4113dSnw141292    drop table t1;
144c5c4113dSnw141292  }
145c5c4113dSnw141292} {2 b 4 d}
146c5c4113dSnw141292do_test trigger1-1.11 {
147c5c4113dSnw141292  execsql {
148c5c4113dSnw141292    create table t1(a,b);
149c5c4113dSnw141292    insert into t1 values(1,'a');
150c5c4113dSnw141292    insert into t1 values(2,'b');
151c5c4113dSnw141292    insert into t1 values(3,'c');
152c5c4113dSnw141292    insert into t1 values(4,'d');
153c5c4113dSnw141292    create trigger r1 after update on t1 for each row begin
154c5c4113dSnw141292      delete from t1 WHERE a=old.a+2;
155c5c4113dSnw141292    end;
156c5c4113dSnw141292    update t1 set b='x-' || b where a in (1,3);
157c5c4113dSnw141292    select * from t1;
158c5c4113dSnw141292    drop table t1;
159c5c4113dSnw141292  }
160c5c4113dSnw141292} {1 x-a 2 b 4 d}
161c5c4113dSnw141292
162c5c4113dSnw141292# Ensure that we cannot create INSTEAD OF triggers on tables
163c5c4113dSnw141292do_test trigger1-1.12 {
164c5c4113dSnw141292  catchsql {
165c5c4113dSnw141292    create table t1(a,b);
166c5c4113dSnw141292    create trigger t1t instead of update on t1 for each row begin
167c5c4113dSnw141292      delete from t1 WHERE a=old.a+2;
168c5c4113dSnw141292    end;
169c5c4113dSnw141292  }
170c5c4113dSnw141292} {1 {cannot create INSTEAD OF trigger on table: t1}}
171c5c4113dSnw141292# Ensure that we cannot create BEFORE triggers on views
172c5c4113dSnw141292do_test trigger1-1.13 {
173c5c4113dSnw141292  catchsql {
174c5c4113dSnw141292    create view v1 as select * from t1;
175c5c4113dSnw141292    create trigger v1t before update on v1 for each row begin
176c5c4113dSnw141292      delete from t1 WHERE a=old.a+2;
177c5c4113dSnw141292    end;
178c5c4113dSnw141292  }
179c5c4113dSnw141292} {1 {cannot create BEFORE trigger on view: v1}}
180c5c4113dSnw141292# Ensure that we cannot create AFTER triggers on views
181c5c4113dSnw141292do_test trigger1-1.14 {
182c5c4113dSnw141292  catchsql {
183c5c4113dSnw141292    drop view v1;
184c5c4113dSnw141292    create view v1 as select * from t1;
185c5c4113dSnw141292    create trigger v1t AFTER update on v1 for each row begin
186c5c4113dSnw141292      delete from t1 WHERE a=old.a+2;
187c5c4113dSnw141292    end;
188c5c4113dSnw141292  }
189c5c4113dSnw141292} {1 {cannot create AFTER trigger on view: v1}}
190c5c4113dSnw141292
191c5c4113dSnw141292# Check for memory leaks in the trigger parser
192c5c4113dSnw141292#
193c5c4113dSnw141292do_test trigger1-2.1 {
194c5c4113dSnw141292  catchsql {
195c5c4113dSnw141292    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
196c5c4113dSnw141292      SELECT * FROM;  -- Syntax error
197c5c4113dSnw141292    END;
198c5c4113dSnw141292  }
199c5c4113dSnw141292} {1 {near ";": syntax error}}
200c5c4113dSnw141292do_test trigger1-2.2 {
201c5c4113dSnw141292  catchsql {
202c5c4113dSnw141292    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
203c5c4113dSnw141292      SELECT * FROM t1;
204c5c4113dSnw141292      SELECT * FROM;  -- Syntax error
205c5c4113dSnw141292    END;
206c5c4113dSnw141292  }
207c5c4113dSnw141292} {1 {near ";": syntax error}}
208c5c4113dSnw141292
209c5c4113dSnw141292# Create a trigger that refers to a table that might not exist.
210c5c4113dSnw141292#
211c5c4113dSnw141292do_test trigger1-3.1 {
212c5c4113dSnw141292  execsql {
213c5c4113dSnw141292    CREATE TEMP TABLE t2(x,y);
214c5c4113dSnw141292  }
215c5c4113dSnw141292  catchsql {
216c5c4113dSnw141292    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
217c5c4113dSnw141292      INSERT INTO t2 VALUES(NEW.a,NEW.b);
218c5c4113dSnw141292    END;
219c5c4113dSnw141292  }
220c5c4113dSnw141292} {0 {}}
221c5c4113dSnw141292do_test trigger-3.2 {
222c5c4113dSnw141292  catchsql {
223c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2);
224c5c4113dSnw141292    SELECT * FROM t2;
225c5c4113dSnw141292  }
226c5c4113dSnw141292} {1 {no such table: main.t2}}
227c5c4113dSnw141292do_test trigger-3.3 {
228c5c4113dSnw141292  db close
229c5c4113dSnw141292  set rc [catch {sqlite db test.db} err]
230c5c4113dSnw141292  if {$rc} {lappend rc $err}
231c5c4113dSnw141292  set rc
232c5c4113dSnw141292} {0}
233c5c4113dSnw141292do_test trigger-3.4 {
234c5c4113dSnw141292  catchsql {
235c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2);
236c5c4113dSnw141292    SELECT * FROM t2;
237c5c4113dSnw141292  }
238c5c4113dSnw141292} {1 {no such table: main.t2}}
239c5c4113dSnw141292do_test trigger-3.5 {
240c5c4113dSnw141292  catchsql {
241c5c4113dSnw141292    CREATE TEMP TABLE t2(x,y);
242c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2);
243c5c4113dSnw141292    SELECT * FROM t2;
244c5c4113dSnw141292  }
245c5c4113dSnw141292} {1 {no such table: main.t2}}
246c5c4113dSnw141292do_test trigger-3.6 {
247c5c4113dSnw141292  catchsql {
248c5c4113dSnw141292    DROP TRIGGER r1;
249c5c4113dSnw141292    CREATE TEMP TRIGGER r1 AFTER INSERT ON t1 BEGIN
250c5c4113dSnw141292      INSERT INTO t2 VALUES(NEW.a,NEW.b);
251c5c4113dSnw141292    END;
252c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2);
253c5c4113dSnw141292    SELECT * FROM t2;
254c5c4113dSnw141292  }
255c5c4113dSnw141292} {0 {1 2}}
256c5c4113dSnw141292do_test trigger-3.7 {
257c5c4113dSnw141292  execsql {
258c5c4113dSnw141292    DROP TABLE t2;
259c5c4113dSnw141292    CREATE TABLE t2(x,y);
260c5c4113dSnw141292    SELECT * FROM t2;
261c5c4113dSnw141292  }
262c5c4113dSnw141292} {}
263c5c4113dSnw141292do_test trigger-3.8 {
264c5c4113dSnw141292  execsql {
265c5c4113dSnw141292    INSERT INTO t1 VALUES(3,4);
266c5c4113dSnw141292    SELECT * FROM t1 UNION ALL SELECT * FROM t2;
267c5c4113dSnw141292  }
268c5c4113dSnw141292} {1 2 3 4 3 4}
269c5c4113dSnw141292do_test trigger-3.9 {
270c5c4113dSnw141292  db close
271c5c4113dSnw141292  sqlite db test.db
272c5c4113dSnw141292  execsql {
273c5c4113dSnw141292    INSERT INTO t1 VALUES(5,6);
274c5c4113dSnw141292    SELECT * FROM t1 UNION ALL SELECT * FROM t2;
275c5c4113dSnw141292  }
276c5c4113dSnw141292} {1 2 3 4 5 6 3 4}
277c5c4113dSnw141292
278c5c4113dSnw141292do_test trigger-4.1 {
279c5c4113dSnw141292  execsql {
280c5c4113dSnw141292    CREATE TEMP TRIGGER r1 BEFORE INSERT ON t1 BEGIN
281c5c4113dSnw141292      INSERT INTO t2 VALUES(NEW.a,NEW.b);
282c5c4113dSnw141292    END;
283c5c4113dSnw141292    INSERT INTO t1 VALUES(7,8);
284c5c4113dSnw141292    SELECT * FROM t2;
285c5c4113dSnw141292  }
286c5c4113dSnw141292} {3 4 7 8}
287c5c4113dSnw141292do_test trigger-4.2 {
288c5c4113dSnw141292  sqlite db2 test.db
289c5c4113dSnw141292  execsql {
290c5c4113dSnw141292    INSERT INTO t1 VALUES(9,10);
291c5c4113dSnw141292  } db2;
292c5c4113dSnw141292  db2 close
293c5c4113dSnw141292  execsql {
294c5c4113dSnw141292    SELECT * FROM t2;
295c5c4113dSnw141292  }
296c5c4113dSnw141292} {3 4 7 8}
297c5c4113dSnw141292do_test trigger-4.3 {
298c5c4113dSnw141292  execsql {
299c5c4113dSnw141292    DROP TABLE t1;
300c5c4113dSnw141292    SELECT * FROM t2;
301c5c4113dSnw141292  };
302c5c4113dSnw141292} {3 4 7 8}
303c5c4113dSnw141292do_test trigger-4.4 {
304c5c4113dSnw141292  db close
305c5c4113dSnw141292  sqlite db test.db
306c5c4113dSnw141292  execsql {
307c5c4113dSnw141292    SELECT * FROM t2;
308c5c4113dSnw141292  };
309c5c4113dSnw141292} {3 4 7 8}
310c5c4113dSnw141292
311c5c4113dSnw141292integrity_check trigger-5.1
312c5c4113dSnw141292
313c5c4113dSnw141292# Create a trigger with the same name as a table.  Make sure the
314c5c4113dSnw141292# trigger works.  Then drop the trigger.  Make sure the table is
315c5c4113dSnw141292# still there.
316c5c4113dSnw141292#
317c5c4113dSnw141292do_test trigger-6.1 {
318c5c4113dSnw141292  execsql {SELECT type, name FROM sqlite_master}
319c5c4113dSnw141292} {view v1 table t2}
320c5c4113dSnw141292do_test trigger-6.2 {
321c5c4113dSnw141292  execsql {
322c5c4113dSnw141292    CREATE TRIGGER t2 BEFORE DELETE ON t2 BEGIN
323c5c4113dSnw141292      SELECT RAISE(ABORT,'deletes are not allows');
324c5c4113dSnw141292    END;
325c5c4113dSnw141292    SELECT type, name FROM sqlite_master;
326c5c4113dSnw141292  }
327c5c4113dSnw141292} {view v1 table t2 trigger t2}
328c5c4113dSnw141292do_test trigger-6.3 {
329c5c4113dSnw141292  catchsql {DELETE FROM t2}
330c5c4113dSnw141292} {1 {deletes are not allows}}
331c5c4113dSnw141292do_test trigger-6.4 {
332c5c4113dSnw141292  execsql {SELECT * FROM t2}
333c5c4113dSnw141292} {3 4 7 8}
334c5c4113dSnw141292do_test trigger-6.5 {
335c5c4113dSnw141292  db close
336c5c4113dSnw141292  sqlite db test.db
337c5c4113dSnw141292  execsql {SELECT type, name FROM sqlite_master}
338c5c4113dSnw141292} {view v1 table t2 trigger t2}
339c5c4113dSnw141292do_test trigger-6.6 {
340c5c4113dSnw141292  execsql {
341c5c4113dSnw141292    DROP TRIGGER t2;
342c5c4113dSnw141292    SELECT type, name FROM sqlite_master;
343c5c4113dSnw141292  }
344c5c4113dSnw141292} {view v1 table t2}
345c5c4113dSnw141292do_test trigger-6.7 {
346c5c4113dSnw141292  execsql {SELECT * FROM t2}
347c5c4113dSnw141292} {3 4 7 8}
348c5c4113dSnw141292do_test trigger-6.8 {
349c5c4113dSnw141292  db close
350c5c4113dSnw141292  sqlite db test.db
351c5c4113dSnw141292  execsql {SELECT * FROM t2}
352c5c4113dSnw141292} {3 4 7 8}
353c5c4113dSnw141292
354c5c4113dSnw141292integrity_check trigger-7.1
355c5c4113dSnw141292
356c5c4113dSnw141292# Check to make sure the name of a trigger can be quoted so that keywords
357c5c4113dSnw141292# can be used as trigger names.  Ticket #468
358c5c4113dSnw141292#
359c5c4113dSnw141292do_test trigger-8.1 {
360c5c4113dSnw141292  execsql {
361c5c4113dSnw141292    CREATE TRIGGER 'trigger' AFTER INSERT ON t2 BEGIN SELECT 1; END;
362c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='trigger';
363c5c4113dSnw141292  }
364c5c4113dSnw141292} {trigger}
365c5c4113dSnw141292do_test trigger-8.2 {
366c5c4113dSnw141292  execsql {
367c5c4113dSnw141292    DROP TRIGGER 'trigger';
368c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='trigger';
369c5c4113dSnw141292  }
370c5c4113dSnw141292} {}
371c5c4113dSnw141292do_test trigger-8.3 {
372c5c4113dSnw141292  execsql {
373c5c4113dSnw141292    CREATE TRIGGER "trigger" AFTER INSERT ON t2 BEGIN SELECT 1; END;
374c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='trigger';
375c5c4113dSnw141292  }
376c5c4113dSnw141292} {trigger}
377c5c4113dSnw141292do_test trigger-8.4 {
378c5c4113dSnw141292  execsql {
379c5c4113dSnw141292    DROP TRIGGER "trigger";
380c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='trigger';
381c5c4113dSnw141292  }
382c5c4113dSnw141292} {}
383c5c4113dSnw141292do_test trigger-8.5 {
384c5c4113dSnw141292  execsql {
385c5c4113dSnw141292    CREATE TRIGGER [trigger] AFTER INSERT ON t2 BEGIN SELECT 1; END;
386c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='trigger';
387c5c4113dSnw141292  }
388c5c4113dSnw141292} {trigger}
389c5c4113dSnw141292do_test trigger-8.6 {
390c5c4113dSnw141292  execsql {
391c5c4113dSnw141292    DROP TRIGGER [trigger];
392c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='trigger';
393c5c4113dSnw141292  }
394c5c4113dSnw141292} {}
395c5c4113dSnw141292
396c5c4113dSnw141292# Make sure REPLACE works inside of triggers.
397c5c4113dSnw141292#
398c5c4113dSnw141292do_test trigger-9.1 {
399c5c4113dSnw141292  execsql {
400c5c4113dSnw141292    CREATE TABLE t3(a,b);
401c5c4113dSnw141292    CREATE TABLE t4(x UNIQUE, b);
402c5c4113dSnw141292    CREATE TRIGGER r34 AFTER INSERT ON t3 BEGIN
403c5c4113dSnw141292      REPLACE INTO t4 VALUES(new.a,new.b);
404c5c4113dSnw141292    END;
405c5c4113dSnw141292    INSERT INTO t3 VALUES(1,2);
406c5c4113dSnw141292    SELECT * FROM t3 UNION ALL SELECT 99, 99 UNION ALL SELECT * FROM t4;
407c5c4113dSnw141292  }
408c5c4113dSnw141292} {1 2 99 99 1 2}
409c5c4113dSnw141292do_test trigger-9.2 {
410c5c4113dSnw141292  execsql {
411c5c4113dSnw141292    INSERT INTO t3 VALUES(1,3);
412c5c4113dSnw141292    SELECT * FROM t3 UNION ALL SELECT 99, 99 UNION ALL SELECT * FROM t4;
413c5c4113dSnw141292  }
414c5c4113dSnw141292} {1 2 1 3 99 99 1 3}
415c5c4113dSnw141292
416c5c4113dSnw141292execsql {
417c5c4113dSnw141292  DROP TABLE t2;
418c5c4113dSnw141292  DROP TABLE t3;
419c5c4113dSnw141292  DROP TABLE t4;
420c5c4113dSnw141292}
421c5c4113dSnw141292
422c5c4113dSnw141292# Ticket #764. At one stage TEMP triggers would fail to re-install when the
423c5c4113dSnw141292# schema was reloaded. The following tests ensure that TEMP triggers are
424c5c4113dSnw141292# correctly re-installed.
425c5c4113dSnw141292#
426c5c4113dSnw141292# Also verify that references within trigger programs are resolved at
427c5c4113dSnw141292# statement compile time, not trigger installation time. This means, for
428c5c4113dSnw141292# example, that you can drop and re-create tables referenced by triggers.
429c5c4113dSnw141292do_test trigger-10.0 {
430c5c4113dSnw141292  file delete -force test2.db
431c5c4113dSnw141292  file delete -force test2.db-journal
432c5c4113dSnw141292  sqlite db2 test2.db
433c5c4113dSnw141292  execsql {CREATE TABLE t3(a, b, c);} db2
434c5c4113dSnw141292  db2 close
435c5c4113dSnw141292  execsql {
436c5c4113dSnw141292    ATTACH 'test2.db' AS aux;
437c5c4113dSnw141292  }
438c5c4113dSnw141292} {}
439c5c4113dSnw141292do_test trigger-10.1 {
440c5c4113dSnw141292  execsql {
441c5c4113dSnw141292    CREATE TABLE t1(a, b, c);
442c5c4113dSnw141292    CREATE temp TABLE t2(a, b, c);
443c5c4113dSnw141292    CREATE TABLE insert_log(db, a, b, c);
444c5c4113dSnw141292  }
445c5c4113dSnw141292} {}
446c5c4113dSnw141292do_test trigger-10.2 {
447c5c4113dSnw141292  execsql {
448c5c4113dSnw141292    CREATE TEMP TRIGGER trig1 AFTER INSERT ON t1 BEGIN
449c5c4113dSnw141292      INSERT INTO insert_log VALUES('main', new.a, new.b, new.c);
450c5c4113dSnw141292    END;
451c5c4113dSnw141292    CREATE TEMP TRIGGER trig2 AFTER INSERT ON t2 BEGIN
452c5c4113dSnw141292      INSERT INTO insert_log VALUES('temp', new.a, new.b, new.c);
453c5c4113dSnw141292    END;
454c5c4113dSnw141292    CREATE TEMP TRIGGER trig3 AFTER INSERT ON t3 BEGIN
455c5c4113dSnw141292      INSERT INTO insert_log VALUES('aux', new.a, new.b, new.c);
456c5c4113dSnw141292    END;
457c5c4113dSnw141292  }
458c5c4113dSnw141292} {}
459c5c4113dSnw141292do_test trigger-10.3 {
460c5c4113dSnw141292  execsql {
461c5c4113dSnw141292    INSERT INTO t1 VALUES(1, 2, 3);
462c5c4113dSnw141292    INSERT INTO t2 VALUES(4, 5, 6);
463c5c4113dSnw141292    INSERT INTO t3  VALUES(7, 8, 9);
464c5c4113dSnw141292  }
465c5c4113dSnw141292} {}
466c5c4113dSnw141292do_test trigger-10.4 {
467c5c4113dSnw141292  execsql {
468c5c4113dSnw141292    SELECT * FROM insert_log;
469c5c4113dSnw141292  }
470c5c4113dSnw141292} {main 1 2 3 temp 4 5 6 aux 7 8 9}
471c5c4113dSnw141292do_test trigger-10.5 {
472c5c4113dSnw141292  execsql {
473c5c4113dSnw141292    BEGIN;
474c5c4113dSnw141292    INSERT INTO t1 VALUES(1, 2, 3);
475c5c4113dSnw141292    INSERT INTO t2 VALUES(4, 5, 6);
476c5c4113dSnw141292    INSERT INTO t3  VALUES(7, 8, 9);
477c5c4113dSnw141292    ROLLBACK;
478c5c4113dSnw141292  }
479c5c4113dSnw141292} {}
480c5c4113dSnw141292do_test trigger-10.6 {
481c5c4113dSnw141292  execsql {
482c5c4113dSnw141292    SELECT * FROM insert_log;
483c5c4113dSnw141292  }
484c5c4113dSnw141292} {main 1 2 3 temp 4 5 6 aux 7 8 9}
485c5c4113dSnw141292do_test trigger-10.7 {
486c5c4113dSnw141292  execsql {
487c5c4113dSnw141292    DELETE FROM insert_log;
488c5c4113dSnw141292    INSERT INTO t1 VALUES(11, 12, 13);
489c5c4113dSnw141292    INSERT INTO t2 VALUES(14, 15, 16);
490c5c4113dSnw141292    INSERT INTO t3 VALUES(17, 18, 19);
491c5c4113dSnw141292  }
492c5c4113dSnw141292} {}
493c5c4113dSnw141292do_test trigger-10.8 {
494c5c4113dSnw141292  execsql {
495c5c4113dSnw141292    SELECT * FROM insert_log;
496c5c4113dSnw141292  }
497c5c4113dSnw141292} {main 11 12 13 temp 14 15 16 aux 17 18 19}
498c5c4113dSnw141292do_test trigger-10.8 {
499c5c4113dSnw141292# Drop and re-create the insert_log table in a different database. Note
500c5c4113dSnw141292# that we can change the column names because the trigger programs don't
501c5c4113dSnw141292# use them explicitly.
502c5c4113dSnw141292  execsql {
503c5c4113dSnw141292    DROP TABLE insert_log;
504c5c4113dSnw141292    CREATE temp TABLE insert_log(db, d, e, f);
505c5c4113dSnw141292  }
506c5c4113dSnw141292} {}
507c5c4113dSnw141292do_test trigger-10.10 {
508c5c4113dSnw141292  execsql {
509c5c4113dSnw141292    INSERT INTO t1 VALUES(21, 22, 23);
510c5c4113dSnw141292    INSERT INTO t2 VALUES(24, 25, 26);
511c5c4113dSnw141292    INSERT INTO t3  VALUES(27, 28, 29);
512c5c4113dSnw141292  }
513c5c4113dSnw141292} {}
514c5c4113dSnw141292do_test trigger-10.11 {
515c5c4113dSnw141292  execsql {
516c5c4113dSnw141292    SELECT * FROM insert_log;
517c5c4113dSnw141292  }
518c5c4113dSnw141292} {main 21 22 23 temp 24 25 26 aux 27 28 29}
519c5c4113dSnw141292
520c5c4113dSnw141292finish_test
521