xref: /onnv-gate/usr/src/lib/libsqlite/test/laststmtchanges.test (revision 4520:7dbeadedd7fe)
1*4520Snw141292
2*4520Snw141292#pragma ident	"%Z%%M%	%I%	%E% SMI"
3*4520Snw141292
4*4520Snw141292# The author disclaims copyright to this source code.  In place of
5*4520Snw141292# a legal notice, here is a blessing:
6*4520Snw141292#
7*4520Snw141292#    May you do good and not evil.
8*4520Snw141292#    May you find forgiveness for yourself and forgive others.
9*4520Snw141292#    May you share freely, never taking more than you give.
10*4520Snw141292#
11*4520Snw141292#***********************************************************************
12*4520Snw141292#
13*4520Snw141292# Tests to make sure that value returned by last_statement_change_count()
14*4520Snw141292# (LSCC) is updated properly, especially inside triggers
15*4520Snw141292#
16*4520Snw141292# Note 1: LSCC remains constant within a statement and only updates once
17*4520Snw141292#           the statement is finished (triggers count as part of statement)
18*4520Snw141292# Note 2: LSCC is changed within the context of a trigger
19*4520Snw141292#           much like last_insert_rowid() (see lastinsert.test),
20*4520Snw141292#           but is restored once the trigger exits
21*4520Snw141292# Note 3: LSCC is not changed by a change to a view (since everything
22*4520Snw141292#           is done within instead of trigger context)
23*4520Snw141292#
24*4520Snw141292
25*4520Snw141292set testdir [file dirname $argv0]
26*4520Snw141292source $testdir/tester.tcl
27*4520Snw141292
28*4520Snw141292# ----------------------------------------------------------------------------
29*4520Snw141292# 1.x - basic tests (no triggers)
30*4520Snw141292
31*4520Snw141292# LSCC set properly after insert
32*4520Snw141292do_test laststmtchanges-1.1 {
33*4520Snw141292    catchsql {
34*4520Snw141292        create table t0 (x);
35*4520Snw141292        insert into t0 values (1);
36*4520Snw141292        insert into t0 values (1);
37*4520Snw141292        insert into t0 values (2);
38*4520Snw141292        insert into t0 values (2);
39*4520Snw141292        insert into t0 values (1);
40*4520Snw141292        insert into t0 values (1);
41*4520Snw141292        insert into t0 values (1);
42*4520Snw141292        insert into t0 values (2);
43*4520Snw141292        select last_statement_change_count();
44*4520Snw141292    }
45*4520Snw141292} {0 1}
46*4520Snw141292
47*4520Snw141292# LSCC set properly after update
48*4520Snw141292do_test laststmtchanges-1.2 {
49*4520Snw141292    catchsql {
50*4520Snw141292        update t0 set x=3 where x=1;
51*4520Snw141292        select last_statement_change_count();
52*4520Snw141292    }
53*4520Snw141292} {0 5}
54*4520Snw141292
55*4520Snw141292# LSCC unchanged within an update statement
56*4520Snw141292do_test laststmtchanges-1.3 {
57*4520Snw141292    catchsql {
58*4520Snw141292        update t0 set x=x+last_statement_change_count() where x=3;
59*4520Snw141292        select count() from t0 where x=8;
60*4520Snw141292    }
61*4520Snw141292} {0 5}
62*4520Snw141292
63*4520Snw141292# LSCC set properly after update on table where no rows changed
64*4520Snw141292do_test laststmtchanges-1.4 {
65*4520Snw141292    catchsql {
66*4520Snw141292        update t0 set x=77 where x=88;
67*4520Snw141292        select last_statement_change_count();
68*4520Snw141292    }
69*4520Snw141292} {0 0}
70*4520Snw141292
71*4520Snw141292# LSCC set properly after delete from table
72*4520Snw141292do_test laststmtchanges-1.5 {
73*4520Snw141292    catchsql {
74*4520Snw141292        delete from t0 where x=2;
75*4520Snw141292        select last_statement_change_count();
76*4520Snw141292    }
77*4520Snw141292} {0 3}
78*4520Snw141292
79*4520Snw141292# ----------------------------------------------------------------------------
80*4520Snw141292# 2.x - tests with after insert trigger
81*4520Snw141292
82*4520Snw141292# LSCC changed properly after insert into table containing after trigger
83*4520Snw141292do_test laststmtchanges-2.1 {
84*4520Snw141292    catchsql {
85*4520Snw141292        create table t1 (k integer primary key);
86*4520Snw141292        create table t2 (k integer primary key, v1, v2);
87*4520Snw141292        create trigger r1 after insert on t1 for each row begin
88*4520Snw141292            insert into t2 values (NULL, last_statement_change_count(), NULL);
89*4520Snw141292            update t0 set x=x;
90*4520Snw141292            update t2 set v2=last_statement_change_count();
91*4520Snw141292        end;
92*4520Snw141292        insert into t1 values (77);
93*4520Snw141292        select last_statement_change_count();
94*4520Snw141292    }
95*4520Snw141292} {0 1}
96*4520Snw141292
97*4520Snw141292# LSCC unchanged upon entry into after insert trigger
98*4520Snw141292do_test laststmtchanges-2.2 {
99*4520Snw141292    catchsql {
100*4520Snw141292        select v1 from t2;
101*4520Snw141292    }
102*4520Snw141292} {0 3}
103*4520Snw141292
104*4520Snw141292# LSCC changed properly by update within context of after insert trigger
105*4520Snw141292do_test laststmtchanges-2.3 {
106*4520Snw141292    catchsql {
107*4520Snw141292        select v2 from t2;
108*4520Snw141292    }
109*4520Snw141292} {0 5}
110*4520Snw141292
111*4520Snw141292# ----------------------------------------------------------------------------
112*4520Snw141292# 3.x - tests with after update trigger
113*4520Snw141292
114*4520Snw141292# LSCC changed properly after update into table containing after trigger
115*4520Snw141292do_test laststmtchanges-3.1 {
116*4520Snw141292    catchsql {
117*4520Snw141292        drop trigger r1;
118*4520Snw141292        delete from t2; delete from t2;
119*4520Snw141292        create trigger r1 after update on t1 for each row begin
120*4520Snw141292            insert into t2 values (NULL, last_statement_change_count(), NULL);
121*4520Snw141292            delete from t0 where oid=1 or oid=2;
122*4520Snw141292            update t2 set v2=last_statement_change_count();
123*4520Snw141292        end;
124*4520Snw141292        update t1 set k=k;
125*4520Snw141292        select last_statement_change_count();
126*4520Snw141292    }
127*4520Snw141292} {0 1}
128*4520Snw141292
129*4520Snw141292# LSCC unchanged upon entry into after update trigger
130*4520Snw141292do_test laststmtchanges-3.2 {
131*4520Snw141292    catchsql {
132*4520Snw141292        select v1 from t2;
133*4520Snw141292    }
134*4520Snw141292} {0 0}
135*4520Snw141292
136*4520Snw141292# LSCC changed properly by delete within context of after update trigger
137*4520Snw141292do_test laststmtchanges-3.3 {
138*4520Snw141292    catchsql {
139*4520Snw141292        select v2 from t2;
140*4520Snw141292    }
141*4520Snw141292} {0 2}
142*4520Snw141292
143*4520Snw141292# ----------------------------------------------------------------------------
144*4520Snw141292# 4.x - tests with before delete trigger
145*4520Snw141292
146*4520Snw141292# LSCC changed properly on delete from table containing before trigger
147*4520Snw141292do_test laststmtchanges-4.1 {
148*4520Snw141292    catchsql {
149*4520Snw141292        drop trigger r1;
150*4520Snw141292        delete from t2; delete from t2;
151*4520Snw141292        create trigger r1 before delete on t1 for each row begin
152*4520Snw141292            insert into t2 values (NULL, last_statement_change_count(), NULL);
153*4520Snw141292            insert into t0 values (5);
154*4520Snw141292            update t2 set v2=last_statement_change_count();
155*4520Snw141292        end;
156*4520Snw141292        delete from t1;
157*4520Snw141292        select last_statement_change_count();
158*4520Snw141292    }
159*4520Snw141292} {0 1}
160*4520Snw141292
161*4520Snw141292# LSCC unchanged upon entry into before delete trigger
162*4520Snw141292do_test laststmtchanges-4.2 {
163*4520Snw141292    catchsql {
164*4520Snw141292        select v1 from t2;
165*4520Snw141292    }
166*4520Snw141292} {0 0}
167*4520Snw141292
168*4520Snw141292# LSCC changed properly by insert within context of before delete trigger
169*4520Snw141292do_test laststmtchanges-4.3 {
170*4520Snw141292    catchsql {
171*4520Snw141292        select v2 from t2;
172*4520Snw141292    }
173*4520Snw141292} {0 1}
174*4520Snw141292
175*4520Snw141292# ----------------------------------------------------------------------------
176*4520Snw141292# 5.x - complex tests with temporary tables and nested instead of triggers
177*4520Snw141292
178*4520Snw141292do_test laststmtchanges-5.1 {
179*4520Snw141292    catchsql {
180*4520Snw141292        drop table t0; drop table t1; drop table t2;
181*4520Snw141292        create temp table t0(x);
182*4520Snw141292        create temp table t1 (k integer primary key);
183*4520Snw141292        create temp table t2 (k integer primary key);
184*4520Snw141292        create temp view v1 as select * from t1;
185*4520Snw141292        create temp view v2 as select * from t2;
186*4520Snw141292        create temp table n1 (k integer primary key, n);
187*4520Snw141292        create temp table n2 (k integer primary key, n);
188*4520Snw141292        insert into t0 values (1);
189*4520Snw141292        insert into t0 values (2);
190*4520Snw141292        insert into t0 values (1);
191*4520Snw141292        insert into t0 values (1);
192*4520Snw141292        insert into t0 values (1);
193*4520Snw141292        insert into t0 values (2);
194*4520Snw141292        insert into t0 values (2);
195*4520Snw141292        insert into t0 values (1);
196*4520Snw141292        create temp trigger r1 instead of insert on v1 for each row begin
197*4520Snw141292            insert into n1 values (NULL, last_statement_change_count());
198*4520Snw141292            update t0 set x=x*10 where x=1;
199*4520Snw141292            insert into n1 values (NULL, last_statement_change_count());
200*4520Snw141292            insert into t1 values (NEW.k);
201*4520Snw141292            insert into n1 values (NULL, last_statement_change_count());
202*4520Snw141292            update t0 set x=x*10 where x=0;
203*4520Snw141292            insert into v2 values (100+NEW.k);
204*4520Snw141292            insert into n1 values (NULL, last_statement_change_count());
205*4520Snw141292        end;
206*4520Snw141292        create temp trigger r2 instead of insert on v2 for each row begin
207*4520Snw141292            insert into n2 values (NULL, last_statement_change_count());
208*4520Snw141292            insert into t2 values (1000+NEW.k);
209*4520Snw141292            insert into n2 values (NULL, last_statement_change_count());
210*4520Snw141292            update t0 set x=x*100 where x=0;
211*4520Snw141292            insert into n2 values (NULL, last_statement_change_count());
212*4520Snw141292            delete from t0 where x=2;
213*4520Snw141292            insert into n2 values (NULL, last_statement_change_count());
214*4520Snw141292        end;
215*4520Snw141292        insert into t1 values (77);
216*4520Snw141292        select last_statement_change_count();
217*4520Snw141292    }
218*4520Snw141292} {0 1}
219*4520Snw141292
220*4520Snw141292do_test laststmtchanges-5.2 {
221*4520Snw141292    catchsql {
222*4520Snw141292        delete from t1 where k=88;
223*4520Snw141292        select last_statement_change_count();
224*4520Snw141292    }
225*4520Snw141292} {0 0}
226*4520Snw141292
227*4520Snw141292do_test laststmtchanges-5.3 {
228*4520Snw141292    catchsql {
229*4520Snw141292        insert into v1 values (5);
230*4520Snw141292        select last_statement_change_count();
231*4520Snw141292    }
232*4520Snw141292} {0 0}
233*4520Snw141292
234*4520Snw141292do_test laststmtchanges-5.4 {
235*4520Snw141292    catchsql {
236*4520Snw141292        select n from n1;
237*4520Snw141292    }
238*4520Snw141292} {0 {0 5 1 0}}
239*4520Snw141292
240*4520Snw141292do_test laststmtchanges-5.5 {
241*4520Snw141292    catchsql {
242*4520Snw141292        select n from n2;
243*4520Snw141292    }
244*4520Snw141292} {0 {0 1 0 3}}
245*4520Snw141292
246*4520Snw141292finish_test
247*4520Snw141292
248