github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/e_totalchanges.test (about) 1 # 2011 May 06 2 # 3 # The author disclaims copyright to this source code. In place of 4 # a legal notice, here is a blessing: 5 # 6 # May you do good and not evil. 7 # May you find forgiveness for yourself and forgive others. 8 # May you share freely, never taking more than you give. 9 # 10 #*********************************************************************** 11 # 12 13 set testdir [file dirname $argv0] 14 source $testdir/tester.tcl 15 set testprefix e_totalchanges 16 17 # Like [do_execsql_test], except it appends the value returned by 18 # [db total_changes] to the result of executing the SQL script. 19 # 20 proc do_tc_test {tn sql res} { 21 uplevel [list \ 22 do_test $tn "concat \[execsql {$sql}\] \[db total_changes\]" $res 23 ] 24 } 25 26 do_execsql_test 1.0 { 27 CREATE TABLE t1(a, b); 28 CREATE INDEX t1_b ON t1(b); 29 CREATE TABLE t2(x, y, PRIMARY KEY(x, y)) WITHOUT ROWID; 30 CREATE INDEX t2_y ON t2(y); 31 } 32 33 34 #-------------------------------------------------------------------------- 35 # EVIDENCE-OF: R-65438-26258 This function returns the total number of 36 # rows inserted, modified or deleted by all INSERT, UPDATE or DELETE 37 # statements completed since the database connection was opened, 38 # including those executed as part of trigger programs. 39 # 40 # 1.1.*: different types of I/U/D statements, 41 # 1.2.*: trigger programs. 42 # 43 do_tc_test 1.1.1 { 44 INSERT INTO t1 VALUES(1, 2); 45 INSERT INTO t1 VALUES(3, 4); 46 UPDATE t1 SET a = a+1; 47 DELETE FROM t1; 48 } {6} 49 do_tc_test 1.1.2 { 50 DELETE FROM t1 51 } {6} 52 53 do_tc_test 1.1.3 { 54 WITH data(a,b) AS ( 55 SELECT 0, 0 UNION ALL SELECT a+1, b+1 FROM data WHERE a<99 56 ) 57 INSERT INTO t1 SELECT * FROM data; 58 } {106} 59 60 do_tc_test 1.1.4 { 61 INSERT INTO t2 SELECT * FROM t1 WHERE a<50; 62 UPDATE t2 SET y=y+1; 63 } {206} 64 65 do_tc_test 1.1.5 { 66 DELETE FROM t2 WHERE y<=25 67 } {231} 68 69 do_execsql_test 1.2.1 { 70 DELETE FROM t1; 71 DELETE FROM t2; 72 } 73 sqlite3 db test.db ; # To reset total_changes 74 do_tc_test 1.2.2 { 75 CREATE TABLE log(detail); 76 CREATE TRIGGER t1_after_insert AFTER INSERT ON t1 BEGIN 77 INSERT INTO log VALUES('inserted into t1'); 78 END; 79 80 CREATE TRIGGER t1_before_delete BEFORE DELETE ON t1 BEGIN 81 INSERT INTO log VALUES('deleting from t1'); 82 INSERT INTO log VALUES('here we go!'); 83 END; 84 85 CREATE TRIGGER t1_after_update AFTER UPDATE ON t1 BEGIN 86 INSERT INTO log VALUES('update'); 87 DELETE FROM log; 88 END; 89 90 INSERT INTO t1 VALUES('a', 'b'); -- 1 + 1 91 UPDATE t1 SET b='c'; -- 1 + 1 + 2 92 DELETE FROM t1; -- 1 + 1 + 1 93 } {9} 94 95 #-------------------------------------------------------------------------- 96 # EVIDENCE-OF: R-61766-15253 Executing any other type of SQL statement 97 # does not affect the value returned by sqlite3_total_changes(). 98 do_tc_test 2.1 { 99 INSERT INTO t1 VALUES(1, 2), (3, 4); 100 INSERT INTO t2 VALUES(1, 2), (3, 4); 101 } {15} 102 do_tc_test 2.2 { 103 SELECT count(*) FROM t1; 104 } {2 15} 105 do_tc_test 2.3 { 106 CREATE TABLE t4(a, b); 107 ALTER TABLE t4 ADD COLUMN c; 108 CREATE INDEX i4 ON t4(c); 109 ALTER TABLE t4 RENAME TO t5; 110 ANALYZE; 111 BEGIN; 112 DROP TABLE t2; 113 ROLLBACK; 114 VACUUM; 115 } {15} 116 117 118 #-------------------------------------------------------------------------- 119 # EVIDENCE-OF: R-36043-10590 Changes made as part of foreign key 120 # actions are included in the count, but those made as part of REPLACE 121 # constraint resolution are not. 122 # 123 # 3.1.*: foreign key actions 124 # 3.2.*: REPLACE constraints. 125 # 126 sqlite3 db test.db ; # To reset total_changes 127 do_tc_test 3.1.1 { 128 CREATE TABLE p1(c PRIMARY KEY, d); 129 CREATE TABLE c1(a, b, FOREIGN KEY(a) REFERENCES p1 ON DELETE SET NULL); 130 CREATE TABLE c2(a, b, FOREIGN KEY(a) REFERENCES p1 ON DELETE CASCADE); 131 CREATE TABLE c3(a, b, FOREIGN KEY(a) REFERENCES p1 ON DELETE SET DEFAULT); 132 133 INSERT INTO p1 VALUES(1, 'one'); 134 INSERT INTO p1 VALUES(2, 'two'); 135 INSERT INTO p1 VALUES(3, 'three'); 136 INSERT INTO p1 VALUES(4, 'four'); 137 138 INSERT INTO c1 VALUES(1, 'i'); 139 INSERT INTO c2 VALUES(2, 'ii'); 140 INSERT INTO c3 VALUES(3, 'iii'); 141 PRAGMA foreign_keys = ON; 142 } {7} 143 144 do_tc_test 3.1.2 { DELETE FROM p1 WHERE c=1; } {9} 145 do_tc_test 3.1.3 { DELETE FROM p1 WHERE c=2; } {11} 146 do_tc_test 3.1.4 { DELETE FROM p1 WHERE c=3; } {13} 147 do_tc_test 3.1.5 { DELETE FROM p1 WHERE c=4; } {14} ; # only 1 this time. 148 149 sqlite3 db test.db ; # To reset total_changes 150 do_tc_test 3.1.6 { 151 DROP TABLE c1; 152 DROP TABLE c2; 153 DROP TABLE c3; 154 CREATE TABLE c1(a, b, FOREIGN KEY(a) REFERENCES p1 ON UPDATE SET NULL); 155 CREATE TABLE c2(a, b, FOREIGN KEY(a) REFERENCES p1 ON UPDATE CASCADE); 156 CREATE TABLE c3(a, b, FOREIGN KEY(a) REFERENCES p1 ON UPDATE SET DEFAULT); 157 158 INSERT INTO p1 VALUES(1, 'one'); 159 INSERT INTO p1 VALUES(2, 'two'); 160 INSERT INTO p1 VALUES(3, 'three'); 161 INSERT INTO p1 VALUES(4, 'four'); 162 163 INSERT INTO c1 VALUES(1, 'i'); 164 INSERT INTO c2 VALUES(2, 'ii'); 165 INSERT INTO c3 VALUES(3, 'iii'); 166 PRAGMA foreign_keys = ON; 167 } {7} 168 169 do_tc_test 3.1.7 { UPDATE p1 SET c=c+4 WHERE c=1; } {9} 170 do_tc_test 3.1.8 { UPDATE p1 SET c=c+4 WHERE c=2; } {11} 171 do_tc_test 3.1.9 { UPDATE p1 SET c=c+4 WHERE c=3; } {13} 172 do_tc_test 3.1.10 { UPDATE p1 SET c=c+4 WHERE c=4; } {14} ; # only 1 this time. 173 174 sqlite3 db test.db ; # To reset total_changes 175 do_tc_test 3.2.1 { 176 CREATE TABLE t3(a UNIQUE, b UNIQUE); 177 INSERT INTO t3 VALUES('one', 'one'); 178 INSERT INTO t3 VALUES('two', 'two'); 179 INSERT OR REPLACE INTO t3 VALUES('one', 'two'); 180 } {3} 181 182 do_tc_test 3.2.2 { 183 INSERT INTO t3 VALUES('three', 'one'); 184 UPDATE OR REPLACE t3 SET b='two' WHERE b='one'; 185 SELECT * FROM t3; 186 } {three two 5} 187 188 #-------------------------------------------------------------------------- 189 # EVIDENCE-OF: R-54872-08741 Changes to a view that are intercepted by 190 # INSTEAD OF triggers are not counted. 191 # 192 sqlite3 db test.db ; # To reset total_changes 193 do_tc_test 4.1 { 194 CREATE TABLE t6(x); 195 CREATE VIEW v1 AS SELECT * FROM t6; 196 CREATE TRIGGER v1_tr1 INSTEAD OF INSERT ON v1 BEGIN 197 SELECT 'no-op'; 198 END; 199 200 INSERT INTO v1 VALUES('a'); 201 INSERT INTO v1 VALUES('b'); 202 } {0} 203 do_tc_test 4.2 { 204 CREATE TRIGGER v1_tr2 INSTEAD OF INSERT ON v1 BEGIN 205 INSERT INTO t6 VALUES(new.x); 206 END; 207 208 INSERT INTO v1 VALUES('c'); 209 INSERT INTO v1 VALUES('d'); 210 } {2} 211 212 213 finish_test