xref: /sqlite-3.40.0/test/trigger2.test (revision fe599b05)
1c3f9bad2Sdanielk1977# The author disclaims copyright to this source code.  In place of
2c3f9bad2Sdanielk1977# a legal notice, here is a blessing:
3c3f9bad2Sdanielk1977#
4c3f9bad2Sdanielk1977#    May you do good and not evil.
5c3f9bad2Sdanielk1977#    May you find forgiveness for yourself and forgive others.
6c3f9bad2Sdanielk1977#    May you share freely, never taking more than you give.
7c3f9bad2Sdanielk1977#
8c3f9bad2Sdanielk1977#***********************************************************************
9c3f9bad2Sdanielk1977#
10c3f9bad2Sdanielk1977# Regression testing of FOR EACH ROW table triggers
11c3f9bad2Sdanielk1977#
12c3f9bad2Sdanielk1977# 1. Trigger execution order tests.
13c3f9bad2Sdanielk1977# These tests ensure that BEFORE and AFTER triggers are fired at the correct
14c3f9bad2Sdanielk1977# times relative to each other and the triggering statement.
15c3f9bad2Sdanielk1977#
1641a3bd0aSdrh# trigger2-1.1.*: ON UPDATE trigger execution model.
1741a3bd0aSdrh# trigger2-1.2.*: DELETE trigger execution model.
1841a3bd0aSdrh# trigger2-1.3.*: INSERT trigger execution model.
19c3f9bad2Sdanielk1977#
20c3f9bad2Sdanielk1977# 2. Trigger program execution tests.
21c3f9bad2Sdanielk1977# These tests ensure that trigger programs execute correctly (ie. that a
22c3f9bad2Sdanielk1977# trigger program can correctly execute INSERT, UPDATE, DELETE * SELECT
23c3f9bad2Sdanielk1977# statements, and combinations thereof).
24c3f9bad2Sdanielk1977#
25c3f9bad2Sdanielk1977# 3. Selective trigger execution
26c3f9bad2Sdanielk1977# This tests that conditional triggers (ie. UPDATE OF triggers and triggers
27c3f9bad2Sdanielk1977# with WHEN clauses) are fired only fired when they are supposed to be.
28c3f9bad2Sdanielk1977#
2941a3bd0aSdrh# trigger2-3.1: UPDATE OF triggers
3041a3bd0aSdrh# trigger2-3.2: WHEN clause
31c3f9bad2Sdanielk1977#
32c3f9bad2Sdanielk1977# 4. Cascaded trigger execution
33c3f9bad2Sdanielk1977# Tests that trigger-programs may cause other triggers to fire. Also that a
34c3f9bad2Sdanielk1977# trigger-program is never executed recursively.
35c3f9bad2Sdanielk1977#
3641a3bd0aSdrh# trigger2-4.1: Trivial cascading trigger
3741a3bd0aSdrh# trigger2-4.2: Trivial recursive trigger handling
38c3f9bad2Sdanielk1977#
39c3f9bad2Sdanielk1977# 5. Count changes behaviour.
40c3f9bad2Sdanielk1977# Verify that rows altered by triggers are not included in the return value
41c3f9bad2Sdanielk1977# of the "count changes" interface.
42c3f9bad2Sdanielk1977#
43c3f9bad2Sdanielk1977# 6. ON CONFLICT clause handling
4441a3bd0aSdrh# trigger2-6.1[a-f]: INSERT statements
4541a3bd0aSdrh# trigger2-6.2[a-f]: UPDATE statements
46c3f9bad2Sdanielk1977#
470fa8ddbdSdanielk1977# 7. & 8. Triggers on views fire correctly.
48c3f9bad2Sdanielk1977#
49c3f9bad2Sdanielk1977
50c3f9bad2Sdanielk1977set testdir [file dirname $argv0]
51c3f9bad2Sdanielk1977source $testdir/tester.tcl
52*fe599b05Sdanset testprefix trigger2
53b7f9164eSdrhifcapable {!trigger} {
54b7f9164eSdrh  finish_test
55b7f9164eSdrh  return
56b7f9164eSdrh}
57c3f9bad2Sdanielk1977
5876d462eeSdan# The tests in this file were written before SQLite supported recursive
5976d462eeSdan# trigger invocation, and some tests depend on that to pass. So disable
6076d462eeSdan# recursive triggers for this file.
615bde73c4Sdancatchsql { pragma recursive_triggers = off }
6276d462eeSdan
63c3f9bad2Sdanielk1977# 1.
64e61b9f4fSdanielk1977ifcapable subquery {
65c3f9bad2Sdanielk1977  set ii 0
6653c0f748Sdanielk1977  set tbl_definitions [list \
6753c0f748Sdanielk1977  	{CREATE TABLE tbl (a, b);}                                      \
6853c0f748Sdanielk1977  	{CREATE TABLE tbl (a INTEGER PRIMARY KEY, b);}                  \
6953c0f748Sdanielk1977        {CREATE TABLE tbl (a, b PRIMARY KEY);}                          \
7053c0f748Sdanielk1977  	{CREATE TABLE tbl (a, b); CREATE INDEX tbl_idx ON tbl(b);}      \
7153c0f748Sdanielk1977  ]
7253c0f748Sdanielk1977  ifcapable tempdb {
7353c0f748Sdanielk1977    lappend tbl_definitions \
748bf8dc92Sdrh        {CREATE TEMP TABLE tbl (a, b); CREATE INDEX tbl_idx ON tbl(b);}
7553c0f748Sdanielk1977    lappend tbl_definitions {CREATE TEMP TABLE tbl (a, b);}
7653c0f748Sdanielk1977    lappend tbl_definitions \
7753c0f748Sdanielk1977        {CREATE TEMPORARY TABLE tbl (a INTEGER PRIMARY KEY, b);}
7853c0f748Sdanielk1977  }
7953c0f748Sdanielk1977  foreach tbl_defn $tbl_definitions {
80c3f9bad2Sdanielk1977    incr ii
81c3f9bad2Sdanielk1977    catchsql { DROP INDEX tbl_idx; }
82c3f9bad2Sdanielk1977    catchsql {
83c3f9bad2Sdanielk1977      DROP TABLE rlog;
84c3f9bad2Sdanielk1977      DROP TABLE clog;
85c3f9bad2Sdanielk1977      DROP TABLE tbl;
86c3f9bad2Sdanielk1977      DROP TABLE other_tbl;
87c3f9bad2Sdanielk1977    }
88c3f9bad2Sdanielk1977
89c3f9bad2Sdanielk1977    execsql $tbl_defn
90c3f9bad2Sdanielk1977
91c3f9bad2Sdanielk1977    execsql {
92c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES(1, 2);
93c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES(3, 4);
94c3f9bad2Sdanielk1977
95c3f9bad2Sdanielk1977      CREATE TABLE rlog (idx, old_a, old_b, db_sum_a, db_sum_b, new_a, new_b);
96c3f9bad2Sdanielk1977      CREATE TABLE clog (idx, old_a, old_b, db_sum_a, db_sum_b, new_a, new_b);
97c3f9bad2Sdanielk1977
98c3f9bad2Sdanielk1977      CREATE TRIGGER before_update_row BEFORE UPDATE ON tbl FOR EACH ROW
99c3f9bad2Sdanielk1977        BEGIN
100f5905aa7Sdrh        INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
101c3f9bad2Sdanielk1977  	  old.a, old.b,
102c2bd913aSdrh  	  (SELECT coalesce(sum(a),0) FROM tbl),
103c2bd913aSdrh          (SELECT coalesce(sum(b),0) FROM tbl),
104c3f9bad2Sdanielk1977  	  new.a, new.b);
105c3f9bad2Sdanielk1977      END;
106c3f9bad2Sdanielk1977
107c3f9bad2Sdanielk1977      CREATE TRIGGER after_update_row AFTER UPDATE ON tbl FOR EACH ROW
108c3f9bad2Sdanielk1977        BEGIN
109f5905aa7Sdrh        INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
110c3f9bad2Sdanielk1977  	  old.a, old.b,
111c2bd913aSdrh  	  (SELECT coalesce(sum(a),0) FROM tbl),
112c2bd913aSdrh          (SELECT coalesce(sum(b),0) FROM tbl),
113c3f9bad2Sdanielk1977  	  new.a, new.b);
114c3f9bad2Sdanielk1977      END;
115c3f9bad2Sdanielk1977
116c3f9bad2Sdanielk1977      CREATE TRIGGER conditional_update_row AFTER UPDATE ON tbl FOR EACH ROW
117c3f9bad2Sdanielk1977        WHEN old.a = 1
118c3f9bad2Sdanielk1977        BEGIN
119f5905aa7Sdrh        INSERT INTO clog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM clog),
120c3f9bad2Sdanielk1977  	  old.a, old.b,
121c2bd913aSdrh  	  (SELECT coalesce(sum(a),0) FROM tbl),
122c2bd913aSdrh          (SELECT coalesce(sum(b),0) FROM tbl),
123c3f9bad2Sdanielk1977  	  new.a, new.b);
124c3f9bad2Sdanielk1977      END;
125c3f9bad2Sdanielk1977    }
126c3f9bad2Sdanielk1977
1278bf8dc92Sdrh    do_test trigger2-1.$ii.1 {
12892febd92Sdrh      set r {}
12992febd92Sdrh      foreach v [execsql {
130c3f9bad2Sdanielk1977        UPDATE tbl SET a = a * 10, b = b * 10;
131c3f9bad2Sdanielk1977        SELECT * FROM rlog ORDER BY idx;
132c3f9bad2Sdanielk1977        SELECT * FROM clog ORDER BY idx;
13392febd92Sdrh      }] {
13492febd92Sdrh        lappend r [expr {int($v)}]
135c3f9bad2Sdanielk1977      }
13692febd92Sdrh      set r
137c3f9bad2Sdanielk1977    } [list 1 1 2  4  6 10 20 \
138c3f9bad2Sdanielk1977            2 1 2 13 24 10 20 \
139c3f9bad2Sdanielk1977  	    3 3 4 13 24 30 40 \
140c3f9bad2Sdanielk1977  	    4 3 4 40 60 30 40 \
141c3f9bad2Sdanielk1977            1 1 2 13 24 10 20 ]
142c3f9bad2Sdanielk1977
143c3f9bad2Sdanielk1977    execsql {
144c3f9bad2Sdanielk1977      DELETE FROM rlog;
145c3f9bad2Sdanielk1977      DELETE FROM tbl;
146c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES (100, 100);
147c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES (300, 200);
148c3f9bad2Sdanielk1977      CREATE TRIGGER delete_before_row BEFORE DELETE ON tbl FOR EACH ROW
149c3f9bad2Sdanielk1977        BEGIN
150f5905aa7Sdrh        INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
151c3f9bad2Sdanielk1977  	  old.a, old.b,
152c2bd913aSdrh  	  (SELECT coalesce(sum(a),0) FROM tbl),
153c2bd913aSdrh          (SELECT coalesce(sum(b),0) FROM tbl),
154c3f9bad2Sdanielk1977  	  0, 0);
155c3f9bad2Sdanielk1977      END;
156c3f9bad2Sdanielk1977
157c3f9bad2Sdanielk1977      CREATE TRIGGER delete_after_row AFTER DELETE ON tbl FOR EACH ROW
158c3f9bad2Sdanielk1977        BEGIN
159f5905aa7Sdrh        INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
160c3f9bad2Sdanielk1977  	  old.a, old.b,
161c2bd913aSdrh  	  (SELECT coalesce(sum(a),0) FROM tbl),
162c2bd913aSdrh          (SELECT coalesce(sum(b),0) FROM tbl),
163c3f9bad2Sdanielk1977  	  0, 0);
164c3f9bad2Sdanielk1977      END;
165c3f9bad2Sdanielk1977    }
1668bf8dc92Sdrh    do_test trigger2-1.$ii.2 {
16792febd92Sdrh      set r {}
16892febd92Sdrh      foreach v [execsql {
169c3f9bad2Sdanielk1977        DELETE FROM tbl;
170c3f9bad2Sdanielk1977        SELECT * FROM rlog;
17192febd92Sdrh      }] {
17292febd92Sdrh        lappend r [expr {int($v)}]
173c3f9bad2Sdanielk1977      }
17492febd92Sdrh      set r
175c3f9bad2Sdanielk1977    } [list 1 100 100 400 300 0 0 \
176c3f9bad2Sdanielk1977            2 100 100 300 200 0 0 \
177c3f9bad2Sdanielk1977            3 300 200 300 200 0 0 \
178c3f9bad2Sdanielk1977            4 300 200 0 0 0 0 ]
179c3f9bad2Sdanielk1977
180c3f9bad2Sdanielk1977    execsql {
181c3f9bad2Sdanielk1977      DELETE FROM rlog;
182c3f9bad2Sdanielk1977      CREATE TRIGGER insert_before_row BEFORE INSERT ON tbl FOR EACH ROW
183c3f9bad2Sdanielk1977        BEGIN
184f5905aa7Sdrh        INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
185c3f9bad2Sdanielk1977  	  0, 0,
186c2bd913aSdrh  	  (SELECT coalesce(sum(a),0) FROM tbl),
187c2bd913aSdrh          (SELECT coalesce(sum(b),0) FROM tbl),
188c3f9bad2Sdanielk1977  	  new.a, new.b);
189c3f9bad2Sdanielk1977      END;
190c3f9bad2Sdanielk1977
191c3f9bad2Sdanielk1977      CREATE TRIGGER insert_after_row AFTER INSERT ON tbl FOR EACH ROW
192c3f9bad2Sdanielk1977        BEGIN
193f5905aa7Sdrh        INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
194c3f9bad2Sdanielk1977  	  0, 0,
195c2bd913aSdrh  	  (SELECT coalesce(sum(a),0) FROM tbl),
196c2bd913aSdrh          (SELECT coalesce(sum(b),0) FROM tbl),
197c3f9bad2Sdanielk1977  	  new.a, new.b);
198c3f9bad2Sdanielk1977      END;
199c3f9bad2Sdanielk1977    }
2008bf8dc92Sdrh    do_test trigger2-1.$ii.3 {
201c3f9bad2Sdanielk1977      execsql {
202c3f9bad2Sdanielk1977
203c3f9bad2Sdanielk1977        CREATE TABLE other_tbl(a, b);
204c3f9bad2Sdanielk1977        INSERT INTO other_tbl VALUES(1, 2);
205c3f9bad2Sdanielk1977        INSERT INTO other_tbl VALUES(3, 4);
206c3f9bad2Sdanielk1977        -- INSERT INTO tbl SELECT * FROM other_tbl;
207c3f9bad2Sdanielk1977        INSERT INTO tbl VALUES(5, 6);
208c3f9bad2Sdanielk1977        DROP TABLE other_tbl;
209c3f9bad2Sdanielk1977
210c3f9bad2Sdanielk1977        SELECT * FROM rlog;
211c3f9bad2Sdanielk1977      }
2123d1d95e6Sdrh    } [list 1 0 0 0 0 5 6 \
2133d1d95e6Sdrh            2 0 0 5 6 5 6 ]
2148bf8dc92Sdrh
21540e016e4Sdrh    integrity_check trigger2-1.$ii.4
216c3f9bad2Sdanielk1977  }
217c3f9bad2Sdanielk1977  catchsql {
218c3f9bad2Sdanielk1977    DROP TABLE rlog;
219c3f9bad2Sdanielk1977    DROP TABLE clog;
220c3f9bad2Sdanielk1977    DROP TABLE tbl;
221c3f9bad2Sdanielk1977    DROP TABLE other_tbl;
222c3f9bad2Sdanielk1977  }
223e61b9f4fSdanielk1977}
224c3f9bad2Sdanielk1977
225c3f9bad2Sdanielk1977# 2.
226c3f9bad2Sdanielk1977set ii 0
2278bf8dc92Sdrhforeach tr_program {
2288bf8dc92Sdrh  {UPDATE tbl SET b = old.b;}
2298bf8dc92Sdrh  {INSERT INTO log VALUES(new.c, 2, 3);}
2308bf8dc92Sdrh  {DELETE FROM log WHERE a = 1;}
231c3f9bad2Sdanielk1977  {INSERT INTO tbl VALUES(500, new.b * 10, 700);
232c3f9bad2Sdanielk1977    UPDATE tbl SET c = old.c;
2338bf8dc92Sdrh    DELETE FROM log;}
234c3f9bad2Sdanielk1977  {INSERT INTO log select * from tbl;}
2358bf8dc92Sdrh} {
236c3f9bad2Sdanielk1977  foreach test_varset [ list \
237c3f9bad2Sdanielk1977    {
238c3f9bad2Sdanielk1977      set statement {UPDATE tbl SET c = 10 WHERE a = 1;}
239c3f9bad2Sdanielk1977      set prep      {INSERT INTO tbl VALUES(1, 2, 3);}
240c3f9bad2Sdanielk1977      set newC 10
241c3f9bad2Sdanielk1977      set newB 2
242c3f9bad2Sdanielk1977      set newA 1
243c3f9bad2Sdanielk1977      set oldA 1
244c3f9bad2Sdanielk1977      set oldB 2
245c3f9bad2Sdanielk1977      set oldC 3
246c3f9bad2Sdanielk1977    } \
247c3f9bad2Sdanielk1977    {
248c3f9bad2Sdanielk1977      set statement {DELETE FROM tbl WHERE a = 1;}
249c3f9bad2Sdanielk1977      set prep      {INSERT INTO tbl VALUES(1, 2, 3);}
250c3f9bad2Sdanielk1977      set oldA 1
251c3f9bad2Sdanielk1977      set oldB 2
252c3f9bad2Sdanielk1977      set oldC 3
253c3f9bad2Sdanielk1977    } \
254c3f9bad2Sdanielk1977    {
255c3f9bad2Sdanielk1977      set statement {INSERT INTO tbl VALUES(1, 2, 3);}
256c3f9bad2Sdanielk1977      set newA 1
257c3f9bad2Sdanielk1977      set newB 2
258c3f9bad2Sdanielk1977      set newC 3
259c3f9bad2Sdanielk1977    }
260c3f9bad2Sdanielk1977  ] \
261c3f9bad2Sdanielk1977  {
262c3f9bad2Sdanielk1977    set statement {}
263c3f9bad2Sdanielk1977    set prep {}
264c3f9bad2Sdanielk1977    set newA {''}
265c3f9bad2Sdanielk1977    set newB {''}
266c3f9bad2Sdanielk1977    set newC {''}
267c3f9bad2Sdanielk1977    set oldA {''}
268c3f9bad2Sdanielk1977    set oldB {''}
269c3f9bad2Sdanielk1977    set oldC {''}
270c3f9bad2Sdanielk1977
271c3f9bad2Sdanielk1977    incr ii
272c3f9bad2Sdanielk1977
273c3f9bad2Sdanielk1977    eval $test_varset
274c3f9bad2Sdanielk1977
275c3f9bad2Sdanielk1977    set statement_type [string range $statement 0 5]
276c3f9bad2Sdanielk1977    set tr_program_fixed $tr_program
277c3f9bad2Sdanielk1977    if {$statement_type == "DELETE"} {
278c3f9bad2Sdanielk1977      regsub -all new\.a $tr_program_fixed {''} tr_program_fixed
279c3f9bad2Sdanielk1977      regsub -all new\.b $tr_program_fixed {''} tr_program_fixed
280c3f9bad2Sdanielk1977      regsub -all new\.c $tr_program_fixed {''} tr_program_fixed
281c3f9bad2Sdanielk1977    }
282c3f9bad2Sdanielk1977    if {$statement_type == "INSERT"} {
283c3f9bad2Sdanielk1977      regsub -all old\.a $tr_program_fixed {''} tr_program_fixed
284c3f9bad2Sdanielk1977      regsub -all old\.b $tr_program_fixed {''} tr_program_fixed
285c3f9bad2Sdanielk1977      regsub -all old\.c $tr_program_fixed {''} tr_program_fixed
286c3f9bad2Sdanielk1977    }
287c3f9bad2Sdanielk1977
288c3f9bad2Sdanielk1977
289c3f9bad2Sdanielk1977    set tr_program_cooked $tr_program
290c3f9bad2Sdanielk1977    regsub -all new\.a $tr_program_cooked $newA tr_program_cooked
291c3f9bad2Sdanielk1977    regsub -all new\.b $tr_program_cooked $newB tr_program_cooked
292c3f9bad2Sdanielk1977    regsub -all new\.c $tr_program_cooked $newC tr_program_cooked
293c3f9bad2Sdanielk1977    regsub -all old\.a $tr_program_cooked $oldA tr_program_cooked
294c3f9bad2Sdanielk1977    regsub -all old\.b $tr_program_cooked $oldB tr_program_cooked
295c3f9bad2Sdanielk1977    regsub -all old\.c $tr_program_cooked $oldC tr_program_cooked
296c3f9bad2Sdanielk1977
297c3f9bad2Sdanielk1977    catchsql {
298c3f9bad2Sdanielk1977      DROP TABLE tbl;
299c3f9bad2Sdanielk1977      DROP TABLE log;
300c3f9bad2Sdanielk1977    }
3018bf8dc92Sdrh
302c3f9bad2Sdanielk1977    execsql {
303c3f9bad2Sdanielk1977      CREATE TABLE tbl(a PRIMARY KEY, b, c);
304c3f9bad2Sdanielk1977      CREATE TABLE log(a, b, c);
305c3f9bad2Sdanielk1977    }
306c3f9bad2Sdanielk1977
307c3f9bad2Sdanielk1977    set query {SELECT * FROM tbl; SELECT * FROM log;}
3088bf8dc92Sdrh    set prep "$prep; INSERT INTO log VALUES(1, 2, 3);\
3098bf8dc92Sdrh             INSERT INTO log VALUES(10, 20, 30);"
310c3f9bad2Sdanielk1977
311c3f9bad2Sdanielk1977# Check execution of BEFORE programs:
312c3f9bad2Sdanielk1977
313c3f9bad2Sdanielk1977    set before_data [ execsql "$prep $tr_program_cooked $statement $query" ]
314c3f9bad2Sdanielk1977
315c3f9bad2Sdanielk1977    execsql "DELETE FROM tbl; DELETE FROM log; $prep";
3168bf8dc92Sdrh    execsql "CREATE TRIGGER the_trigger BEFORE [string range $statement 0 6]\
3178bf8dc92Sdrh             ON tbl BEGIN $tr_program_fixed END;"
318c3f9bad2Sdanielk1977
3198bf8dc92Sdrh    do_test trigger2-2.$ii-before "execsql {$statement $query}" $before_data
320c3f9bad2Sdanielk1977
321c3f9bad2Sdanielk1977    execsql "DROP TRIGGER the_trigger;"
322c3f9bad2Sdanielk1977    execsql "DELETE FROM tbl; DELETE FROM log;"
323c3f9bad2Sdanielk1977
324c3f9bad2Sdanielk1977# Check execution of AFTER programs
325c3f9bad2Sdanielk1977    set after_data [ execsql "$prep $statement $tr_program_cooked $query" ]
326c3f9bad2Sdanielk1977
327c3f9bad2Sdanielk1977    execsql "DELETE FROM tbl; DELETE FROM log; $prep";
3288bf8dc92Sdrh    execsql "CREATE TRIGGER the_trigger AFTER [string range $statement 0 6]\
3298bf8dc92Sdrh             ON tbl BEGIN $tr_program_fixed END;"
330c3f9bad2Sdanielk1977
3318bf8dc92Sdrh    do_test trigger2-2.$ii-after "execsql {$statement $query}" $after_data
332c3f9bad2Sdanielk1977    execsql "DROP TRIGGER the_trigger;"
3338bf8dc92Sdrh
33440e016e4Sdrh    integrity_check trigger2-2.$ii-integrity
335c3f9bad2Sdanielk1977  }
336c3f9bad2Sdanielk1977}
337c3f9bad2Sdanielk1977catchsql {
338c3f9bad2Sdanielk1977  DROP TABLE tbl;
339c3f9bad2Sdanielk1977  DROP TABLE log;
340c3f9bad2Sdanielk1977}
341c3f9bad2Sdanielk1977
342c3f9bad2Sdanielk1977# 3.
343c3f9bad2Sdanielk1977
34441a3bd0aSdrh# trigger2-3.1: UPDATE OF triggers
345c3f9bad2Sdanielk1977execsql {
346c3f9bad2Sdanielk1977  CREATE TABLE tbl (a, b, c, d);
347c3f9bad2Sdanielk1977  CREATE TABLE log (a);
348c3f9bad2Sdanielk1977  INSERT INTO log VALUES (0);
349c3f9bad2Sdanielk1977  INSERT INTO tbl VALUES (0, 0, 0, 0);
350c3f9bad2Sdanielk1977  INSERT INTO tbl VALUES (1, 0, 0, 0);
351c3f9bad2Sdanielk1977  CREATE TRIGGER tbl_after_update_cd BEFORE UPDATE OF c, d ON tbl
352c3f9bad2Sdanielk1977    BEGIN
353c3f9bad2Sdanielk1977      UPDATE log SET a = a + 1;
354c3f9bad2Sdanielk1977    END;
355c3f9bad2Sdanielk1977}
35641a3bd0aSdrhdo_test trigger2-3.1 {
357c3f9bad2Sdanielk1977  execsql {
358c3f9bad2Sdanielk1977    UPDATE tbl SET b = 1, c = 10; -- 2
359c3f9bad2Sdanielk1977    UPDATE tbl SET b = 10; -- 0
360c3f9bad2Sdanielk1977    UPDATE tbl SET d = 4 WHERE a = 0; --1
361c3f9bad2Sdanielk1977    UPDATE tbl SET a = 4, b = 10; --0
362c3f9bad2Sdanielk1977    SELECT * FROM log;
363c3f9bad2Sdanielk1977  }
364c3f9bad2Sdanielk1977} {3}
365c3f9bad2Sdanielk1977execsql {
366c3f9bad2Sdanielk1977  DROP TABLE tbl;
367c3f9bad2Sdanielk1977  DROP TABLE log;
368c3f9bad2Sdanielk1977}
369c3f9bad2Sdanielk1977
37041a3bd0aSdrh# trigger2-3.2: WHEN clause
371e61b9f4fSdanielk1977set when_triggers [list {t1 BEFORE INSERT ON tbl WHEN new.a > 20}]
372e61b9f4fSdanielk1977ifcapable subquery {
373e61b9f4fSdanielk1977  lappend when_triggers \
3747bf56610Sdrh      {t2 BEFORE INSERT ON tbl WHEN (SELECT count(*) FROM tbl) = 0}
375e61b9f4fSdanielk1977}
376c3f9bad2Sdanielk1977
377c3f9bad2Sdanielk1977execsql {
378c3f9bad2Sdanielk1977  CREATE TABLE tbl (a, b, c, d);
379c3f9bad2Sdanielk1977  CREATE TABLE log (a);
380c3f9bad2Sdanielk1977  INSERT INTO log VALUES (0);
381c3f9bad2Sdanielk1977}
382c3f9bad2Sdanielk1977
383c3f9bad2Sdanielk1977foreach trig $when_triggers {
384c3f9bad2Sdanielk1977  execsql "CREATE TRIGGER $trig BEGIN UPDATE log set a = a + 1; END;"
385c3f9bad2Sdanielk1977}
386c3f9bad2Sdanielk1977
387e61b9f4fSdanielk1977ifcapable subquery {
388e61b9f4fSdanielk1977  set t232 {1 0 1}
389e61b9f4fSdanielk1977} else {
390e61b9f4fSdanielk1977  set t232 {0 0 1}
391e61b9f4fSdanielk1977}
39241a3bd0aSdrhdo_test trigger2-3.2 {
393c3f9bad2Sdanielk1977  execsql {
394c3f9bad2Sdanielk1977
395e61b9f4fSdanielk1977    INSERT INTO tbl VALUES(0, 0, 0, 0);     -- 1 (ifcapable subquery)
396c3f9bad2Sdanielk1977    SELECT * FROM log;
397c3f9bad2Sdanielk1977    UPDATE log SET a = 0;
398c3f9bad2Sdanielk1977
399c3f9bad2Sdanielk1977    INSERT INTO tbl VALUES(0, 0, 0, 0);     -- 0
400c3f9bad2Sdanielk1977    SELECT * FROM log;
401c3f9bad2Sdanielk1977    UPDATE log SET a = 0;
402c3f9bad2Sdanielk1977
403c3f9bad2Sdanielk1977    INSERT INTO tbl VALUES(200, 0, 0, 0);     -- 1
404c3f9bad2Sdanielk1977    SELECT * FROM log;
405c3f9bad2Sdanielk1977    UPDATE log SET a = 0;
406c3f9bad2Sdanielk1977  }
407e61b9f4fSdanielk1977} $t232
408c3f9bad2Sdanielk1977execsql {
409c3f9bad2Sdanielk1977  DROP TABLE tbl;
410c3f9bad2Sdanielk1977  DROP TABLE log;
411c3f9bad2Sdanielk1977}
41240e016e4Sdrhintegrity_check trigger2-3.3
413c3f9bad2Sdanielk1977
414c3f9bad2Sdanielk1977# Simple cascaded trigger
415c3f9bad2Sdanielk1977execsql {
416c3f9bad2Sdanielk1977  CREATE TABLE tblA(a, b);
417c3f9bad2Sdanielk1977  CREATE TABLE tblB(a, b);
418c3f9bad2Sdanielk1977  CREATE TABLE tblC(a, b);
419c3f9bad2Sdanielk1977
420c3f9bad2Sdanielk1977  CREATE TRIGGER tr1 BEFORE INSERT ON tblA BEGIN
421c3f9bad2Sdanielk1977    INSERT INTO tblB values(new.a, new.b);
422c3f9bad2Sdanielk1977  END;
423c3f9bad2Sdanielk1977
424c3f9bad2Sdanielk1977  CREATE TRIGGER tr2 BEFORE INSERT ON tblB BEGIN
425c3f9bad2Sdanielk1977    INSERT INTO tblC values(new.a, new.b);
426c3f9bad2Sdanielk1977  END;
427c3f9bad2Sdanielk1977}
42841a3bd0aSdrhdo_test trigger2-4.1 {
429c3f9bad2Sdanielk1977  execsql {
430c3f9bad2Sdanielk1977    INSERT INTO tblA values(1, 2);
431c3f9bad2Sdanielk1977    SELECT * FROM tblA;
432c3f9bad2Sdanielk1977    SELECT * FROM tblB;
433c3f9bad2Sdanielk1977    SELECT * FROM tblC;
434c3f9bad2Sdanielk1977  }
435c3f9bad2Sdanielk1977} {1 2 1 2 1 2}
436c3f9bad2Sdanielk1977execsql {
437c3f9bad2Sdanielk1977  DROP TABLE tblA;
438c3f9bad2Sdanielk1977  DROP TABLE tblB;
439c3f9bad2Sdanielk1977  DROP TABLE tblC;
440c3f9bad2Sdanielk1977}
441c3f9bad2Sdanielk1977
442c3f9bad2Sdanielk1977# Simple recursive trigger
443c3f9bad2Sdanielk1977execsql {
444c3f9bad2Sdanielk1977  CREATE TABLE tbl(a, b, c);
445c3f9bad2Sdanielk1977  CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl
446c3f9bad2Sdanielk1977    BEGIN
447c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES (new.a, new.b, new.c);
448c3f9bad2Sdanielk1977    END;
449c3f9bad2Sdanielk1977}
45041a3bd0aSdrhdo_test trigger2-4.2 {
451c3f9bad2Sdanielk1977  execsql {
452c3f9bad2Sdanielk1977    INSERT INTO tbl VALUES (1, 2, 3);
453c3f9bad2Sdanielk1977    select * from tbl;
454c3f9bad2Sdanielk1977  }
455c3f9bad2Sdanielk1977} {1 2 3 1 2 3}
456c3f9bad2Sdanielk1977execsql {
457c3f9bad2Sdanielk1977  DROP TABLE tbl;
458c3f9bad2Sdanielk1977}
459c3f9bad2Sdanielk1977
460c3f9bad2Sdanielk1977# 5.
461c3f9bad2Sdanielk1977execsql {
462c3f9bad2Sdanielk1977  CREATE TABLE tbl(a, b, c);
463c3f9bad2Sdanielk1977  CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl
464c3f9bad2Sdanielk1977    BEGIN
465c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES (1, 2, 3);
466c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES (2, 2, 3);
467c3f9bad2Sdanielk1977      UPDATE tbl set b = 10 WHERE a = 1;
468c3f9bad2Sdanielk1977      DELETE FROM tbl WHERE a = 1;
469c3f9bad2Sdanielk1977      DELETE FROM tbl;
470c3f9bad2Sdanielk1977    END;
471c3f9bad2Sdanielk1977}
47241a3bd0aSdrhdo_test trigger2-5 {
473c3f9bad2Sdanielk1977  execsql {
474c3f9bad2Sdanielk1977    INSERT INTO tbl VALUES(100, 200, 300);
475c3f9bad2Sdanielk1977  }
476c3f9bad2Sdanielk1977  db changes
477c3f9bad2Sdanielk1977} {1}
478c3f9bad2Sdanielk1977execsql {
479c3f9bad2Sdanielk1977  DROP TABLE tbl;
480c3f9bad2Sdanielk1977}
481c3f9bad2Sdanielk1977
4823bdca9c9Sdanielk1977ifcapable conflict {
483c3f9bad2Sdanielk1977  # Handling of ON CONFLICT by INSERT statements inside triggers
484c3f9bad2Sdanielk1977  execsql {
485c3f9bad2Sdanielk1977    CREATE TABLE tbl (a primary key, b, c);
486c3f9bad2Sdanielk1977    CREATE TRIGGER ai_tbl AFTER INSERT ON tbl BEGIN
487c3f9bad2Sdanielk1977      INSERT OR IGNORE INTO tbl values (new.a, 0, 0);
488c3f9bad2Sdanielk1977    END;
489c3f9bad2Sdanielk1977  }
49041a3bd0aSdrh  do_test trigger2-6.1a {
491c3f9bad2Sdanielk1977    execsql {
492c3f9bad2Sdanielk1977      BEGIN;
493c3f9bad2Sdanielk1977      INSERT INTO tbl values (1, 2, 3);
494c3f9bad2Sdanielk1977      SELECT * from tbl;
495c3f9bad2Sdanielk1977    }
496c3f9bad2Sdanielk1977  } {1 2 3}
49741a3bd0aSdrh  do_test trigger2-6.1b {
498c3f9bad2Sdanielk1977    catchsql {
499c3f9bad2Sdanielk1977      INSERT OR ABORT INTO tbl values (2, 2, 3);
500c3f9bad2Sdanielk1977    }
501f9c8ce3cSdrh  } {1 {UNIQUE constraint failed: tbl.a}}
50241a3bd0aSdrh  do_test trigger2-6.1c {
503c3f9bad2Sdanielk1977    execsql {
504c3f9bad2Sdanielk1977      SELECT * from tbl;
505c3f9bad2Sdanielk1977    }
506c3f9bad2Sdanielk1977  } {1 2 3}
50741a3bd0aSdrh  do_test trigger2-6.1d {
508c3f9bad2Sdanielk1977    catchsql {
509c3f9bad2Sdanielk1977      INSERT OR FAIL INTO tbl values (2, 2, 3);
510c3f9bad2Sdanielk1977    }
511f9c8ce3cSdrh  } {1 {UNIQUE constraint failed: tbl.a}}
51241a3bd0aSdrh  do_test trigger2-6.1e {
513c3f9bad2Sdanielk1977    execsql {
514c3f9bad2Sdanielk1977      SELECT * from tbl;
515c3f9bad2Sdanielk1977    }
516c3f9bad2Sdanielk1977  } {1 2 3 2 2 3}
51741a3bd0aSdrh  do_test trigger2-6.1f {
518c3f9bad2Sdanielk1977    execsql {
519c3f9bad2Sdanielk1977      INSERT OR REPLACE INTO tbl values (2, 2, 3);
520c3f9bad2Sdanielk1977      SELECT * from tbl;
521c3f9bad2Sdanielk1977    }
522c3f9bad2Sdanielk1977  } {1 2 3 2 0 0}
52341a3bd0aSdrh  do_test trigger2-6.1g {
524c3f9bad2Sdanielk1977    catchsql {
525c3f9bad2Sdanielk1977      INSERT OR ROLLBACK INTO tbl values (3, 2, 3);
526c3f9bad2Sdanielk1977    }
527f9c8ce3cSdrh  } {1 {UNIQUE constraint failed: tbl.a}}
52841a3bd0aSdrh  do_test trigger2-6.1h {
529c3f9bad2Sdanielk1977    execsql {
530c3f9bad2Sdanielk1977      SELECT * from tbl;
531c3f9bad2Sdanielk1977    }
532c3f9bad2Sdanielk1977  } {}
5334303feedSdrh  execsql {DELETE FROM tbl}
534c3f9bad2Sdanielk1977
535c3f9bad2Sdanielk1977
536c3f9bad2Sdanielk1977  # Handling of ON CONFLICT by UPDATE statements inside triggers
537c3f9bad2Sdanielk1977  execsql {
538c3f9bad2Sdanielk1977    INSERT INTO tbl values (4, 2, 3);
539c3f9bad2Sdanielk1977    INSERT INTO tbl values (6, 3, 4);
540c3f9bad2Sdanielk1977    CREATE TRIGGER au_tbl AFTER UPDATE ON tbl BEGIN
541c3f9bad2Sdanielk1977      UPDATE OR IGNORE tbl SET a = new.a, c = 10;
542c3f9bad2Sdanielk1977    END;
543c3f9bad2Sdanielk1977  }
54441a3bd0aSdrh  do_test trigger2-6.2a {
545c3f9bad2Sdanielk1977    execsql {
546c3f9bad2Sdanielk1977      BEGIN;
547c3f9bad2Sdanielk1977      UPDATE tbl SET a = 1 WHERE a = 4;
548c3f9bad2Sdanielk1977      SELECT * from tbl;
549c3f9bad2Sdanielk1977    }
550c3f9bad2Sdanielk1977  } {1 2 10 6 3 4}
55141a3bd0aSdrh  do_test trigger2-6.2b {
552c3f9bad2Sdanielk1977    catchsql {
553c3f9bad2Sdanielk1977      UPDATE OR ABORT tbl SET a = 4 WHERE a = 1;
554c3f9bad2Sdanielk1977    }
555f9c8ce3cSdrh  } {1 {UNIQUE constraint failed: tbl.a}}
55641a3bd0aSdrh  do_test trigger2-6.2c {
557c3f9bad2Sdanielk1977    execsql {
558c3f9bad2Sdanielk1977      SELECT * from tbl;
559c3f9bad2Sdanielk1977    }
560c3f9bad2Sdanielk1977  } {1 2 10 6 3 4}
56141a3bd0aSdrh  do_test trigger2-6.2d {
562c3f9bad2Sdanielk1977    catchsql {
563c3f9bad2Sdanielk1977      UPDATE OR FAIL tbl SET a = 4 WHERE a = 1;
564c3f9bad2Sdanielk1977    }
565f9c8ce3cSdrh  } {1 {UNIQUE constraint failed: tbl.a}}
56641a3bd0aSdrh  do_test trigger2-6.2e {
567c3f9bad2Sdanielk1977    execsql {
568c3f9bad2Sdanielk1977      SELECT * from tbl;
569c3f9bad2Sdanielk1977    }
570c3f9bad2Sdanielk1977  } {4 2 10 6 3 4}
5714303feedSdrh  do_test trigger2-6.2f.1 {
572c3f9bad2Sdanielk1977    execsql {
573c3f9bad2Sdanielk1977      UPDATE OR REPLACE tbl SET a = 1 WHERE a = 4;
574c3f9bad2Sdanielk1977      SELECT * from tbl;
575c3f9bad2Sdanielk1977    }
576c3f9bad2Sdanielk1977  } {1 3 10}
5774303feedSdrh  do_test trigger2-6.2f.2 {
578c3f9bad2Sdanielk1977    execsql {
579c3f9bad2Sdanielk1977      INSERT INTO tbl VALUES (2, 3, 4);
5804303feedSdrh      SELECT * FROM tbl;
581c3f9bad2Sdanielk1977    }
5824303feedSdrh  } {1 3 10 2 3 4}
58341a3bd0aSdrh  do_test trigger2-6.2g {
584c3f9bad2Sdanielk1977    catchsql {
585c3f9bad2Sdanielk1977      UPDATE OR ROLLBACK tbl SET a = 4 WHERE a = 1;
586c3f9bad2Sdanielk1977    }
587f9c8ce3cSdrh  } {1 {UNIQUE constraint failed: tbl.a}}
58841a3bd0aSdrh  do_test trigger2-6.2h {
589c3f9bad2Sdanielk1977    execsql {
590c3f9bad2Sdanielk1977      SELECT * from tbl;
591c3f9bad2Sdanielk1977    }
592c3f9bad2Sdanielk1977  } {4 2 3 6 3 4}
593c3f9bad2Sdanielk1977  execsql {
594c3f9bad2Sdanielk1977    DROP TABLE tbl;
595c3f9bad2Sdanielk1977  }
5963bdca9c9Sdanielk1977} ; # ifcapable conflict
597c3f9bad2Sdanielk1977
598c3f9bad2Sdanielk1977# 7. Triggers on views
5990fa8ddbdSdanielk1977ifcapable view {
6000fa8ddbdSdanielk1977
60141a3bd0aSdrhdo_test trigger2-7.1 {
602c3f9bad2Sdanielk1977  execsql {
603c3f9bad2Sdanielk1977  CREATE TABLE ab(a, b);
604c3f9bad2Sdanielk1977  CREATE TABLE cd(c, d);
605c3f9bad2Sdanielk1977  INSERT INTO ab VALUES (1, 2);
606c3f9bad2Sdanielk1977  INSERT INTO ab VALUES (0, 0);
607c3f9bad2Sdanielk1977  INSERT INTO cd VALUES (3, 4);
608c3f9bad2Sdanielk1977
609c3f9bad2Sdanielk1977  CREATE TABLE tlog(ii INTEGER PRIMARY KEY,
610c3f9bad2Sdanielk1977      olda, oldb, oldc, oldd, newa, newb, newc, newd);
611c3f9bad2Sdanielk1977
612c3f9bad2Sdanielk1977  CREATE VIEW abcd AS SELECT a, b, c, d FROM ab, cd;
613c3f9bad2Sdanielk1977
614993b173eSdanielk1977  CREATE TRIGGER before_update INSTEAD OF UPDATE ON abcd BEGIN
615c3f9bad2Sdanielk1977    INSERT INTO tlog VALUES(NULL,
616c3f9bad2Sdanielk1977	old.a, old.b, old.c, old.d, new.a, new.b, new.c, new.d);
617c3f9bad2Sdanielk1977  END;
618993b173eSdanielk1977  CREATE TRIGGER after_update INSTEAD OF UPDATE ON abcd BEGIN
619c3f9bad2Sdanielk1977    INSERT INTO tlog VALUES(NULL,
620c3f9bad2Sdanielk1977	old.a, old.b, old.c, old.d, new.a, new.b, new.c, new.d);
621c3f9bad2Sdanielk1977  END;
622c3f9bad2Sdanielk1977
623993b173eSdanielk1977  CREATE TRIGGER before_delete INSTEAD OF DELETE ON abcd BEGIN
624c3f9bad2Sdanielk1977    INSERT INTO tlog VALUES(NULL,
625c3f9bad2Sdanielk1977	old.a, old.b, old.c, old.d, 0, 0, 0, 0);
626c3f9bad2Sdanielk1977  END;
627993b173eSdanielk1977  CREATE TRIGGER after_delete INSTEAD OF DELETE ON abcd BEGIN
628c3f9bad2Sdanielk1977    INSERT INTO tlog VALUES(NULL,
629c3f9bad2Sdanielk1977	old.a, old.b, old.c, old.d, 0, 0, 0, 0);
630c3f9bad2Sdanielk1977  END;
631c3f9bad2Sdanielk1977
632993b173eSdanielk1977  CREATE TRIGGER before_insert INSTEAD OF INSERT ON abcd BEGIN
633c3f9bad2Sdanielk1977    INSERT INTO tlog VALUES(NULL,
634c3f9bad2Sdanielk1977	0, 0, 0, 0, new.a, new.b, new.c, new.d);
635c3f9bad2Sdanielk1977  END;
636993b173eSdanielk1977   CREATE TRIGGER after_insert INSTEAD OF INSERT ON abcd BEGIN
637c3f9bad2Sdanielk1977    INSERT INTO tlog VALUES(NULL,
638c3f9bad2Sdanielk1977	0, 0, 0, 0, new.a, new.b, new.c, new.d);
639c3f9bad2Sdanielk1977   END;
640c3f9bad2Sdanielk1977  }
6418bf8dc92Sdrh} {};
642c3f9bad2Sdanielk1977
64341a3bd0aSdrhdo_test trigger2-7.2 {
644c3f9bad2Sdanielk1977  execsql {
645c3f9bad2Sdanielk1977    UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1;
646c3f9bad2Sdanielk1977    DELETE FROM abcd WHERE a = 1;
647c3f9bad2Sdanielk1977    INSERT INTO abcd VALUES(10, 20, 30, 40);
648c3f9bad2Sdanielk1977    SELECT * FROM tlog;
649c3f9bad2Sdanielk1977  }
650c3f9bad2Sdanielk1977} [ list 1 1 2 3 4 100 25 3 4 \
651c3f9bad2Sdanielk1977         2 1 2 3 4 100 25 3 4 \
652993b173eSdanielk1977	 3 1 2 3 4 0 0 0 0 \
653993b173eSdanielk1977	 4 1 2 3 4 0 0 0 0 \
654993b173eSdanielk1977	 5 0 0 0 0 10 20 30 40 \
655993b173eSdanielk1977	 6 0 0 0 0 10 20 30 40 ]
656c3f9bad2Sdanielk1977
6575cf590c1Sdrhdo_test trigger2-7.3 {
6585cf590c1Sdrh  execsql {
6595cf590c1Sdrh    DELETE FROM tlog;
6605cf590c1Sdrh    INSERT INTO abcd VALUES(10, 20, 30, 40);
6615cf590c1Sdrh    UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1;
6625cf590c1Sdrh    DELETE FROM abcd WHERE a = 1;
6635cf590c1Sdrh    SELECT * FROM tlog;
6645cf590c1Sdrh  }
6655cf590c1Sdrh} [ list \
6665cf590c1Sdrh   1 0 0 0 0 10 20 30 40 \
6675cf590c1Sdrh   2 0 0 0 0 10 20 30 40 \
6685cf590c1Sdrh   3 1 2 3 4 100 25 3 4 \
6695cf590c1Sdrh   4 1 2 3 4 100 25 3 4 \
6705cf590c1Sdrh   5 1 2 3 4 0 0 0 0 \
6715cf590c1Sdrh   6 1 2 3 4 0 0 0 0 \
6725cf590c1Sdrh]
6735cf590c1Sdrhdo_test trigger2-7.4 {
6745cf590c1Sdrh  execsql {
6755cf590c1Sdrh    DELETE FROM tlog;
6765cf590c1Sdrh    DELETE FROM abcd WHERE a = 1;
6775cf590c1Sdrh    INSERT INTO abcd VALUES(10, 20, 30, 40);
6785cf590c1Sdrh    UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1;
6795cf590c1Sdrh    SELECT * FROM tlog;
6805cf590c1Sdrh  }
6815cf590c1Sdrh} [ list \
6825cf590c1Sdrh   1 1 2 3 4 0 0 0 0 \
6835cf590c1Sdrh   2 1 2 3 4 0 0 0 0 \
6845cf590c1Sdrh   3 0 0 0 0 10 20 30 40 \
6855cf590c1Sdrh   4 0 0 0 0 10 20 30 40 \
6865cf590c1Sdrh   5 1 2 3 4 100 25 3 4 \
6875cf590c1Sdrh   6 1 2 3 4 100 25 3 4 \
6885cf590c1Sdrh]
6895cf590c1Sdrh
6905cf590c1Sdrhdo_test trigger2-8.1 {
6915cf590c1Sdrh  execsql {
6925cf590c1Sdrh    CREATE TABLE t1(a,b,c);
6935cf590c1Sdrh    INSERT INTO t1 VALUES(1,2,3);
6945cf590c1Sdrh    CREATE VIEW v1 AS
6955cf590c1Sdrh      SELECT a+b AS x, b+c AS y, a+c AS z FROM t1;
6965cf590c1Sdrh    SELECT * FROM v1;
6975cf590c1Sdrh  }
6985cf590c1Sdrh} {3 5 4}
6995cf590c1Sdrhdo_test trigger2-8.2 {
7005cf590c1Sdrh  execsql {
7015cf590c1Sdrh    CREATE TABLE v1log(a,b,c,d,e,f);
7025cf590c1Sdrh    CREATE TRIGGER r1 INSTEAD OF DELETE ON v1 BEGIN
7035cf590c1Sdrh      INSERT INTO v1log VALUES(OLD.x,NULL,OLD.y,NULL,OLD.z,NULL);
7045cf590c1Sdrh    END;
7055cf590c1Sdrh    DELETE FROM v1 WHERE x=1;
7065cf590c1Sdrh    SELECT * FROM v1log;
7075cf590c1Sdrh  }
7085cf590c1Sdrh} {}
7095cf590c1Sdrhdo_test trigger2-8.3 {
7105cf590c1Sdrh  execsql {
7115cf590c1Sdrh    DELETE FROM v1 WHERE x=3;
7125cf590c1Sdrh    SELECT * FROM v1log;
7135cf590c1Sdrh  }
7145cf590c1Sdrh} {3 {} 5 {} 4 {}}
7155cf590c1Sdrhdo_test trigger2-8.4 {
7165cf590c1Sdrh  execsql {
7175cf590c1Sdrh    INSERT INTO t1 VALUES(4,5,6);
7185cf590c1Sdrh    DELETE FROM v1log;
7195cf590c1Sdrh    DELETE FROM v1 WHERE y=11;
7205cf590c1Sdrh    SELECT * FROM v1log;
7215cf590c1Sdrh  }
7225cf590c1Sdrh} {9 {} 11 {} 10 {}}
7235cf590c1Sdrhdo_test trigger2-8.5 {
7245cf590c1Sdrh  execsql {
7255cf590c1Sdrh    CREATE TRIGGER r2 INSTEAD OF INSERT ON v1 BEGIN
7265cf590c1Sdrh      INSERT INTO v1log VALUES(NULL,NEW.x,NULL,NEW.y,NULL,NEW.z);
7275cf590c1Sdrh    END;
7285cf590c1Sdrh    DELETE FROM v1log;
7295cf590c1Sdrh    INSERT INTO v1 VALUES(1,2,3);
7305cf590c1Sdrh    SELECT * FROM v1log;
7315cf590c1Sdrh  }
7325cf590c1Sdrh} {{} 1 {} 2 {} 3}
7335cf590c1Sdrhdo_test trigger2-8.6 {
7345cf590c1Sdrh  execsql {
7355cf590c1Sdrh    CREATE TRIGGER r3 INSTEAD OF UPDATE ON v1 BEGIN
7365cf590c1Sdrh      INSERT INTO v1log VALUES(OLD.x,NEW.x,OLD.y,NEW.y,OLD.z,NEW.z);
7375cf590c1Sdrh    END;
7385cf590c1Sdrh    DELETE FROM v1log;
7395cf590c1Sdrh    UPDATE v1 SET x=x+100, y=y+200, z=z+300;
7405cf590c1Sdrh    SELECT * FROM v1log;
7415cf590c1Sdrh  }
7425cf590c1Sdrh} {3 103 5 205 4 304 9 109 11 211 10 310}
7435cf590c1Sdrh
744f7300753Sdanielk1977# At one point the following was causing a segfault.
745f7300753Sdanielk1977do_test trigger2-9.1 {
746f7300753Sdanielk1977  execsql {
747f7300753Sdanielk1977    CREATE TABLE t3(a TEXT, b TEXT);
748f7300753Sdanielk1977    CREATE VIEW v3 AS SELECT t3.a FROM t3;
749f7300753Sdanielk1977    CREATE TRIGGER trig1 INSTEAD OF DELETE ON v3 BEGIN
750f7300753Sdanielk1977      SELECT 1;
751f7300753Sdanielk1977    END;
752f7300753Sdanielk1977    DELETE FROM v3 WHERE a = 1;
753f7300753Sdanielk1977  }
754f7300753Sdanielk1977} {}
755f7300753Sdanielk1977
75603836614Sdrhintegrity_check trigger2-9.99
75703836614Sdrh
75803836614Sdrh# 2019-11-02 Problem found by TH3, related to generated column support.
75903836614Sdrhdb close
76003836614Sdrhsqlite3 db :memory:
76103836614Sdrhdo_execsql_test trigger2-10.1 {
76203836614Sdrh  CREATE TABLE t1(a,b,c,d);
76303836614Sdrh  CREATE VIEW v2(a,b,c,d) AS SELECT * FROM t1;
76403836614Sdrh  CREATE TRIGGER v2ins INSTEAD OF INSERT ON v2 BEGIN
76503836614Sdrh    INSERT INTO t1(a,b,c,d) VALUES(new.a, new.b, new.c, new.d);
76603836614Sdrh  END;
76703836614Sdrh  INSERT INTO v2(a,d) VALUES(11,14);
76803836614Sdrh  SELECT * FROM t1;
76903836614Sdrh} {11 {} {} 14}
77003836614Sdrh
7710fa8ddbdSdanielk1977} ;# ifcapable view
7720fa8ddbdSdanielk1977
773*fe599b05Sdan#-------------------------------------------------------------------------
774*fe599b05Sdanreset_db
775*fe599b05Sdando_execsql_test 11.1 {
776*fe599b05Sdan  CREATE TABLE t1(a INT PRIMARY KEY, b, c REAL, d, e);
777*fe599b05Sdan  CREATE TABLE t2(a INT, b, c REAL, d, e, PRIMARY KEY(a,b)) WITHOUT ROWID;
778*fe599b05Sdan  CREATE UNIQUE INDEX t2c ON t2(c);
779*fe599b05Sdan  CREATE UNIQUE INDEX t2d ON t2(d);
780*fe599b05Sdan  CREATE UNIQUE INDEX t2e ON t2(e);
781*fe599b05Sdan}
782*fe599b05Sdan
783*fe599b05Sdando_catchsql_test 11.2 {
784*fe599b05Sdan  CREATE TRIGGER r1 BEFORE INSERT ON t1 BEGIN
785*fe599b05Sdan    INSERT INTO t2(a,b,c,d,e) VALUES(91,NULL,93,94,?1)
786*fe599b05Sdan      ON CONFLICT(b,a) DO NOTHING
787*fe599b05Sdan      ON CONFLICT DO UPDATE SET b=?1;
788*fe599b05Sdan  END;
789*fe599b05Sdan} {1 {trigger cannot use variables}}
790*fe599b05Sdan
7915cf590c1Sdrh
792c3f9bad2Sdanielk1977finish_test
793*fe599b05Sdan
794