os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/laststmtchanges.test
Update contrib.
1 # The author disclaims copyright to this source code. In place of
2 # a legal notice, here is a blessing:
4 # May you do good and not evil.
5 # May you find forgiveness for yourself and forgive others.
6 # May you share freely, never taking more than you give.
8 #***********************************************************************
10 # Tests to make sure that values returned by changes() and total_changes()
11 # are updated properly, especially inside triggers
13 # Note 1: changes() remains constant within a statement and only updates
14 # once the statement is finished (triggers count as part of
16 # Note 2: changes() is changed within the context of a trigger much like
17 # last_insert_rowid() (see lastinsert.test), but is restored once
19 # Note 3: changes() is not changed by a change to a view (since everything
20 # is done within instead of trigger context).
23 set testdir [file dirname $argv0]
24 source $testdir/tester.tcl
26 # ----------------------------------------------------------------------------
27 # 1.x - basic tests (no triggers)
29 # changes() set properly after insert
30 do_test laststmtchanges-1.1 {
33 insert into t0 values (1);
34 insert into t0 values (1);
35 insert into t0 values (2);
36 insert into t0 values (2);
37 insert into t0 values (1);
38 insert into t0 values (1);
39 insert into t0 values (1);
40 insert into t0 values (2);
41 select changes(), total_changes();
45 # changes() set properly after update
46 do_test laststmtchanges-1.2 {
48 update t0 set x=3 where x=1;
49 select changes(), total_changes();
53 # There was some goofy change-counting logic in sqlite3_exec() that
54 # appears to have been left over from SQLite version 2. This test
55 # makes sure it has been removed.
57 do_test laststmtchanges-1.2.1 {
59 sqlite3_exec_printf db {update t0 set x=4 where x=3; select 1;} {}
60 execsql {select changes()}
63 # changes() unchanged within an update statement
64 do_test laststmtchanges-1.3 {
65 execsql {update t0 set x=3 where x=4}
67 update t0 set x=x+changes() where x=3;
68 select count() from t0 where x=8;
72 # changes() set properly after update on table where no rows changed
73 do_test laststmtchanges-1.4 {
75 update t0 set x=77 where x=88;
80 # changes() set properly after delete from table
81 do_test laststmtchanges-1.5 {
83 delete from t0 where x=2;
88 # All remaining tests involve triggers. Skip them if triggers are not
89 # supported in this build.
91 ifcapable {!trigger} {
97 # ----------------------------------------------------------------------------
98 # 2.x - tests with after insert trigger
100 # changes() changed properly after insert into table containing after trigger
101 do_test laststmtchanges-2.1 {
102 set ::tc [db total_changes]
104 create table t1 (k integer primary key);
105 create table t2 (k integer primary key, v1, v2);
106 create trigger r1 after insert on t1 for each row begin
107 insert into t2 values (NULL, changes(), NULL);
109 update t2 set v2=changes();
111 insert into t1 values (77);
116 # changes() unchanged upon entry into after insert trigger
117 do_test laststmtchanges-2.2 {
123 # changes() changed properly by update within context of after insert trigger
124 do_test laststmtchanges-2.3 {
130 # Total changes caused by firing the trigger above:
132 # 1 from "insert into t1 values(77)" +
133 # 1 from "insert into t2 values (NULL, changes(), NULL);" +
134 # 5 from "update t0 set x=x;" +
135 # 1 from "update t2 set v2=changes();"
137 do_test laststmtchanges-2.4 {
138 expr [db total_changes] - $::tc
141 # ----------------------------------------------------------------------------
142 # 3.x - tests with after update trigger
144 # changes() changed properly after update into table containing after trigger
145 do_test laststmtchanges-3.1 {
148 delete from t2; delete from t2;
149 create trigger r1 after update on t1 for each row begin
150 insert into t2 values (NULL, changes(), NULL);
151 delete from t0 where oid=1 or oid=2;
152 update t2 set v2=changes();
159 # changes() unchanged upon entry into after update trigger
160 do_test laststmtchanges-3.2 {
166 # changes() changed properly by delete within context of after update trigger
167 do_test laststmtchanges-3.3 {
173 # ----------------------------------------------------------------------------
174 # 4.x - tests with before delete trigger
176 # changes() changed properly on delete from table containing before trigger
177 do_test laststmtchanges-4.1 {
180 delete from t2; delete from t2;
181 create trigger r1 before delete on t1 for each row begin
182 insert into t2 values (NULL, changes(), NULL);
183 insert into t0 values (5);
184 update t2 set v2=changes();
191 # changes() unchanged upon entry into before delete trigger
192 do_test laststmtchanges-4.2 {
198 # changes() changed properly by insert within context of before delete trigger
199 do_test laststmtchanges-4.3 {
205 # ----------------------------------------------------------------------------
206 # 5.x - complex tests with temporary tables and nested instead of triggers
207 # These tests cannot run if the library does not have view support enabled.
209 ifcapable view&&tempdb {
211 do_test laststmtchanges-5.1 {
213 drop table t0; drop table t1; drop table t2;
214 create temp table t0(x);
215 create temp table t1 (k integer primary key);
216 create temp table t2 (k integer primary key);
217 create temp view v1 as select * from t1;
218 create temp view v2 as select * from t2;
219 create temp table n1 (k integer primary key, n);
220 create temp table n2 (k integer primary key, n);
221 insert into t0 values (1);
222 insert into t0 values (2);
223 insert into t0 values (1);
224 insert into t0 values (1);
225 insert into t0 values (1);
226 insert into t0 values (2);
227 insert into t0 values (2);
228 insert into t0 values (1);
229 create temp trigger r1 instead of insert on v1 for each row begin
230 insert into n1 values (NULL, changes());
231 update t0 set x=x*10 where x=1;
232 insert into n1 values (NULL, changes());
233 insert into t1 values (NEW.k);
234 insert into n1 values (NULL, changes());
235 update t0 set x=x*10 where x=0;
236 insert into v2 values (100+NEW.k);
237 insert into n1 values (NULL, changes());
239 create temp trigger r2 instead of insert on v2 for each row begin
240 insert into n2 values (NULL, changes());
241 insert into t2 values (1000+NEW.k);
242 insert into n2 values (NULL, changes());
243 update t0 set x=x*100 where x=0;
244 insert into n2 values (NULL, changes());
245 delete from t0 where x=2;
246 insert into n2 values (NULL, changes());
248 insert into t1 values (77);
253 do_test laststmtchanges-5.2 {
255 delete from t1 where k=88;
260 do_test laststmtchanges-5.3 {
262 insert into v1 values (5);
267 do_test laststmtchanges-5.4 {
273 do_test laststmtchanges-5.5 {