xref: /illumos-gate/usr/src/lib/libsqlite/test/lastinsert.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# Tests to make sure that value returned by last_insert_rowid() (LIRID)
12c5c4113dSnw141292# is updated properly, especially inside triggers
13c5c4113dSnw141292#
14c5c4113dSnw141292# Note 1: insert into table is now the only statement which changes LIRID
15c5c4113dSnw141292# Note 2: upon entry into before or instead of triggers,
16c5c4113dSnw141292#           LIRID is unchanged (rather than -1)
17c5c4113dSnw141292# Note 3: LIRID is changed within the context of a trigger,
18c5c4113dSnw141292#           but is restored once the trigger exits
19c5c4113dSnw141292# Note 4: LIRID is not changed by an insert into a view (since everything
20c5c4113dSnw141292#           is done within instead of trigger context)
21c5c4113dSnw141292#
22c5c4113dSnw141292
23c5c4113dSnw141292set testdir [file dirname $argv0]
24c5c4113dSnw141292source $testdir/tester.tcl
25c5c4113dSnw141292
26c5c4113dSnw141292# ----------------------------------------------------------------------------
27c5c4113dSnw141292# 1.x - basic tests (no triggers)
28c5c4113dSnw141292
29c5c4113dSnw141292# LIRID changed properly after an insert into a table
30c5c4113dSnw141292do_test lastinsert-1.1 {
31c5c4113dSnw141292    catchsql {
32c5c4113dSnw141292        create table t1 (k integer primary key);
33c5c4113dSnw141292        insert into t1 values (1);
34c5c4113dSnw141292        insert into t1 values (NULL);
35c5c4113dSnw141292        insert into t1 values (NULL);
36c5c4113dSnw141292        select last_insert_rowid();
37c5c4113dSnw141292    }
38c5c4113dSnw141292} {0 3}
39c5c4113dSnw141292
40c5c4113dSnw141292# LIRID unchanged after an update on a table
41c5c4113dSnw141292do_test lastinsert-1.2 {
42c5c4113dSnw141292    catchsql {
43c5c4113dSnw141292        update t1 set k=4 where k=2;
44c5c4113dSnw141292        select last_insert_rowid();
45c5c4113dSnw141292    }
46c5c4113dSnw141292} {0 3}
47c5c4113dSnw141292
48c5c4113dSnw141292# LIRID unchanged after a delete from a table
49c5c4113dSnw141292do_test lastinsert-1.3 {
50c5c4113dSnw141292    catchsql {
51c5c4113dSnw141292        delete from t1 where k=4;
52c5c4113dSnw141292        select last_insert_rowid();
53c5c4113dSnw141292    }
54c5c4113dSnw141292} {0 3}
55c5c4113dSnw141292
56c5c4113dSnw141292# LIRID unchanged after create table/view statements
57c5c4113dSnw141292do_test lastinsert-1.4 {
58c5c4113dSnw141292    catchsql {
59c5c4113dSnw141292        create table t2 (k integer primary key, val1, val2, val3);
60c5c4113dSnw141292        create view v as select * from t1;
61c5c4113dSnw141292        select last_insert_rowid();
62c5c4113dSnw141292    }
63c5c4113dSnw141292} {0 3}
64c5c4113dSnw141292
65c5c4113dSnw141292# ----------------------------------------------------------------------------
66c5c4113dSnw141292# 2.x - tests with after insert trigger
67c5c4113dSnw141292
68c5c4113dSnw141292# LIRID changed properly after an insert into table containing an after trigger
69c5c4113dSnw141292do_test lastinsert-2.1 {
70c5c4113dSnw141292    catchsql {
71c5c4113dSnw141292        delete from t2;
72c5c4113dSnw141292        create trigger r1 after insert on t1 for each row begin
73c5c4113dSnw141292            insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
74c5c4113dSnw141292            update t2 set k=k+10, val2=100+last_insert_rowid();
75c5c4113dSnw141292            update t2 set val3=1000+last_insert_rowid();
76c5c4113dSnw141292        end;
77c5c4113dSnw141292        insert into t1 values (13);
78c5c4113dSnw141292        select last_insert_rowid();
79c5c4113dSnw141292    }
80c5c4113dSnw141292} {0 13}
81c5c4113dSnw141292
82c5c4113dSnw141292# LIRID equals NEW.k upon entry into after insert trigger
83c5c4113dSnw141292do_test lastinsert-2.2 {
84c5c4113dSnw141292    catchsql {
85c5c4113dSnw141292        select val1 from t2;
86c5c4113dSnw141292    }
87c5c4113dSnw141292} {0 13}
88c5c4113dSnw141292
89c5c4113dSnw141292# LIRID changed properly by insert within context of after insert trigger
90c5c4113dSnw141292do_test lastinsert-2.3 {
91c5c4113dSnw141292    catchsql {
92c5c4113dSnw141292        select val2 from t2;
93c5c4113dSnw141292    }
94c5c4113dSnw141292} {0 126}
95c5c4113dSnw141292
96c5c4113dSnw141292# LIRID unchanged by update within context of after insert trigger
97c5c4113dSnw141292do_test lastinsert-2.4 {
98c5c4113dSnw141292    catchsql {
99c5c4113dSnw141292        select val3 from t2;
100c5c4113dSnw141292    }
101c5c4113dSnw141292} {0 1026}
102c5c4113dSnw141292
103c5c4113dSnw141292# ----------------------------------------------------------------------------
104c5c4113dSnw141292# 3.x - tests with after update trigger
105c5c4113dSnw141292
106c5c4113dSnw141292# LIRID not changed after an update onto a table containing an after trigger
107c5c4113dSnw141292do_test lastinsert-3.1 {
108c5c4113dSnw141292    catchsql {
109c5c4113dSnw141292        delete from t2;
110c5c4113dSnw141292        drop trigger r1;
111c5c4113dSnw141292        create trigger r1 after update on t1 for each row begin
112c5c4113dSnw141292            insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
113c5c4113dSnw141292            update t2 set k=k+10, val2=100+last_insert_rowid();
114c5c4113dSnw141292            update t2 set val3=1000+last_insert_rowid();
115c5c4113dSnw141292        end;
116c5c4113dSnw141292        update t1 set k=14 where k=3;
117c5c4113dSnw141292        select last_insert_rowid();
118c5c4113dSnw141292    }
119c5c4113dSnw141292} {0 13}
120c5c4113dSnw141292
121c5c4113dSnw141292# LIRID unchanged upon entry into after update trigger
122c5c4113dSnw141292do_test lastinsert-3.2 {
123c5c4113dSnw141292    catchsql {
124c5c4113dSnw141292        select val1 from t2;
125c5c4113dSnw141292    }
126c5c4113dSnw141292} {0 13}
127c5c4113dSnw141292
128c5c4113dSnw141292# LIRID changed properly by insert within context of after update trigger
129c5c4113dSnw141292do_test lastinsert-3.3 {
130c5c4113dSnw141292    catchsql {
131c5c4113dSnw141292        select val2 from t2;
132c5c4113dSnw141292    }
133c5c4113dSnw141292} {0 128}
134c5c4113dSnw141292
135c5c4113dSnw141292# LIRID unchanged by update within context of after update trigger
136c5c4113dSnw141292do_test lastinsert-3.4 {
137c5c4113dSnw141292    catchsql {
138c5c4113dSnw141292        select val3 from t2;
139c5c4113dSnw141292    }
140c5c4113dSnw141292} {0 1028}
141c5c4113dSnw141292
142c5c4113dSnw141292# ----------------------------------------------------------------------------
143c5c4113dSnw141292# 4.x - tests with instead of insert trigger
144c5c4113dSnw141292
145c5c4113dSnw141292# LIRID not changed after an insert into view containing an instead of trigger
146c5c4113dSnw141292do_test lastinsert-4.1 {
147c5c4113dSnw141292    catchsql {
148c5c4113dSnw141292        delete from t2;
149c5c4113dSnw141292        drop trigger r1;
150c5c4113dSnw141292        create trigger r1 instead of insert on v for each row begin
151c5c4113dSnw141292            insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
152c5c4113dSnw141292            update t2 set k=k+10, val2=100+last_insert_rowid();
153c5c4113dSnw141292            update t2 set val3=1000+last_insert_rowid();
154c5c4113dSnw141292        end;
155c5c4113dSnw141292        insert into v values (15);
156c5c4113dSnw141292        select last_insert_rowid();
157c5c4113dSnw141292    }
158c5c4113dSnw141292} {0 13}
159c5c4113dSnw141292
160c5c4113dSnw141292# LIRID unchanged upon entry into instead of trigger
161c5c4113dSnw141292do_test lastinsert-4.2 {
162c5c4113dSnw141292    catchsql {
163c5c4113dSnw141292        select val1 from t2;
164c5c4113dSnw141292    }
165c5c4113dSnw141292} {0 13}
166c5c4113dSnw141292
167c5c4113dSnw141292# LIRID changed properly by insert within context of instead of trigger
168c5c4113dSnw141292do_test lastinsert-4.3 {
169c5c4113dSnw141292    catchsql {
170c5c4113dSnw141292        select val2 from t2;
171c5c4113dSnw141292    }
172c5c4113dSnw141292} {0 130}
173c5c4113dSnw141292
174c5c4113dSnw141292# LIRID unchanged by update within context of instead of trigger
175c5c4113dSnw141292do_test lastinsert-4.4 {
176c5c4113dSnw141292    catchsql {
177c5c4113dSnw141292        select val3 from t2;
178c5c4113dSnw141292    }
179c5c4113dSnw141292} {0 1030}
180c5c4113dSnw141292
181c5c4113dSnw141292# ----------------------------------------------------------------------------
182c5c4113dSnw141292# 5.x - tests with before delete trigger
183c5c4113dSnw141292
184c5c4113dSnw141292# LIRID not changed after a delete on a table containing a before trigger
185c5c4113dSnw141292do_test lastinsert-5.1 {
186c5c4113dSnw141292    catchsql {
187c5c4113dSnw141292        delete from t2;
188c5c4113dSnw141292        drop trigger r1;
189c5c4113dSnw141292        create trigger r1 before delete on t1 for each row begin
190c5c4113dSnw141292            insert into t2 values (77, last_insert_rowid(), NULL, NULL);
191c5c4113dSnw141292            update t2 set k=k+10, val2=100+last_insert_rowid();
192c5c4113dSnw141292            update t2 set val3=1000+last_insert_rowid();
193c5c4113dSnw141292        end;
194c5c4113dSnw141292        delete from t1 where k=1;
195c5c4113dSnw141292        select last_insert_rowid();
196c5c4113dSnw141292    }
197c5c4113dSnw141292} {0 13}
198c5c4113dSnw141292
199c5c4113dSnw141292# LIRID unchanged upon entry into delete trigger
200c5c4113dSnw141292do_test lastinsert-5.2 {
201c5c4113dSnw141292    catchsql {
202c5c4113dSnw141292        select val1 from t2;
203c5c4113dSnw141292    }
204c5c4113dSnw141292} {0 13}
205c5c4113dSnw141292
206c5c4113dSnw141292# LIRID changed properly by insert within context of delete trigger
207c5c4113dSnw141292do_test lastinsert-5.3 {
208c5c4113dSnw141292    catchsql {
209c5c4113dSnw141292        select val2 from t2;
210c5c4113dSnw141292    }
211c5c4113dSnw141292} {0 177}
212c5c4113dSnw141292
213c5c4113dSnw141292# LIRID unchanged by update within context of delete trigger
214c5c4113dSnw141292do_test lastinsert-5.4 {
215c5c4113dSnw141292    catchsql {
216c5c4113dSnw141292        select val3 from t2;
217c5c4113dSnw141292    }
218c5c4113dSnw141292} {0 1077}
219c5c4113dSnw141292
220c5c4113dSnw141292# ----------------------------------------------------------------------------
221c5c4113dSnw141292# 6.x - tests with instead of update trigger
222c5c4113dSnw141292
223c5c4113dSnw141292# LIRID not changed after an update on a view containing an instead of trigger
224c5c4113dSnw141292do_test lastinsert-6.1 {
225c5c4113dSnw141292    catchsql {
226c5c4113dSnw141292        delete from t2;
227c5c4113dSnw141292        drop trigger r1;
228c5c4113dSnw141292        create trigger r1 instead of update on v for each row begin
229c5c4113dSnw141292            insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
230c5c4113dSnw141292            update t2 set k=k+10, val2=100+last_insert_rowid();
231c5c4113dSnw141292            update t2 set val3=1000+last_insert_rowid();
232c5c4113dSnw141292        end;
233c5c4113dSnw141292        update v set k=16 where k=14;
234c5c4113dSnw141292        select last_insert_rowid();
235c5c4113dSnw141292    }
236c5c4113dSnw141292} {0 13}
237c5c4113dSnw141292
238c5c4113dSnw141292# LIRID unchanged upon entry into instead of trigger
239c5c4113dSnw141292do_test lastinsert-6.2 {
240c5c4113dSnw141292    catchsql {
241c5c4113dSnw141292        select val1 from t2;
242c5c4113dSnw141292    }
243c5c4113dSnw141292} {0 13}
244c5c4113dSnw141292
245c5c4113dSnw141292# LIRID changed properly by insert within context of instead of trigger
246c5c4113dSnw141292do_test lastinsert-6.3 {
247c5c4113dSnw141292    catchsql {
248c5c4113dSnw141292        select val2 from t2;
249c5c4113dSnw141292    }
250c5c4113dSnw141292} {0 132}
251c5c4113dSnw141292
252c5c4113dSnw141292# LIRID unchanged by update within context of instead of trigger
253c5c4113dSnw141292do_test lastinsert-6.4 {
254c5c4113dSnw141292    catchsql {
255c5c4113dSnw141292        select val3 from t2;
256c5c4113dSnw141292    }
257c5c4113dSnw141292} {0 1032}
258c5c4113dSnw141292
259c5c4113dSnw141292# ----------------------------------------------------------------------------
260c5c4113dSnw141292# 7.x - complex tests with temporary tables and nested instead of triggers
261c5c4113dSnw141292
262c5c4113dSnw141292do_test lastinsert-7.1 {
263c5c4113dSnw141292    catchsql {
264c5c4113dSnw141292        drop table t1; drop table t2; drop trigger r1;
265c5c4113dSnw141292        create temp table t1 (k integer primary key);
266c5c4113dSnw141292        create temp table t2 (k integer primary key);
267c5c4113dSnw141292        create temp view v1 as select * from t1;
268c5c4113dSnw141292        create temp view v2 as select * from t2;
269c5c4113dSnw141292        create temp table rid (k integer primary key, rin, rout);
270c5c4113dSnw141292        insert into rid values (1, NULL, NULL);
271c5c4113dSnw141292        insert into rid values (2, NULL, NULL);
272c5c4113dSnw141292        create temp trigger r1 instead of insert on v1 for each row begin
273c5c4113dSnw141292            update rid set rin=last_insert_rowid() where k=1;
274c5c4113dSnw141292            insert into t1 values (100+NEW.k);
275c5c4113dSnw141292            insert into v2 values (100+last_insert_rowid());
276c5c4113dSnw141292            update rid set rout=last_insert_rowid() where k=1;
277c5c4113dSnw141292        end;
278c5c4113dSnw141292        create temp trigger r2 instead of insert on v2 for each row begin
279c5c4113dSnw141292            update rid set rin=last_insert_rowid() where k=2;
280c5c4113dSnw141292            insert into t2 values (1000+NEW.k);
281c5c4113dSnw141292            update rid set rout=last_insert_rowid() where k=2;
282c5c4113dSnw141292        end;
283c5c4113dSnw141292        insert into t1 values (77);
284c5c4113dSnw141292        select last_insert_rowid();
285c5c4113dSnw141292    }
286c5c4113dSnw141292} {0 77}
287c5c4113dSnw141292
288c5c4113dSnw141292do_test lastinsert-7.2 {
289c5c4113dSnw141292    catchsql {
290c5c4113dSnw141292        insert into v1 values (5);
291c5c4113dSnw141292        select last_insert_rowid();
292c5c4113dSnw141292    }
293c5c4113dSnw141292} {0 77}
294c5c4113dSnw141292
295c5c4113dSnw141292do_test lastinsert-7.3 {
296c5c4113dSnw141292    catchsql {
297c5c4113dSnw141292        select rin from rid where k=1;
298c5c4113dSnw141292    }
299c5c4113dSnw141292} {0 77}
300c5c4113dSnw141292
301c5c4113dSnw141292do_test lastinsert-7.4 {
302c5c4113dSnw141292    catchsql {
303c5c4113dSnw141292        select rout from rid where k=1;
304c5c4113dSnw141292    }
305c5c4113dSnw141292} {0 105}
306c5c4113dSnw141292
307c5c4113dSnw141292do_test lastinsert-7.5 {
308c5c4113dSnw141292    catchsql {
309c5c4113dSnw141292        select rin from rid where k=2;
310c5c4113dSnw141292    }
311c5c4113dSnw141292} {0 105}
312c5c4113dSnw141292
313c5c4113dSnw141292do_test lastinsert-7.6 {
314c5c4113dSnw141292    catchsql {
315c5c4113dSnw141292        select rout from rid where k=2;
316c5c4113dSnw141292    }
317c5c4113dSnw141292} {0 1205}
318c5c4113dSnw141292
319c5c4113dSnw141292finish_test
320c5c4113dSnw141292
321