Annotation of embedaddon/sqlite3/test/laststmtchanges.test, revision 1.1
1.1 ! misho 1: #
! 2: # The author disclaims copyright to this source code. In place of
! 3: # a legal notice, here is a blessing:
! 4: #
! 5: # May you do good and not evil.
! 6: # May you find forgiveness for yourself and forgive others.
! 7: # May you share freely, never taking more than you give.
! 8: #
! 9: #***********************************************************************
! 10: #
! 11: # Tests to make sure that values returned by changes() and total_changes()
! 12: # are updated properly, especially inside triggers
! 13: #
! 14: # Note 1: changes() remains constant within a statement and only updates
! 15: # once the statement is finished (triggers count as part of
! 16: # statement).
! 17: # Note 2: changes() is changed within the context of a trigger much like
! 18: # last_insert_rowid() (see lastinsert.test), but is restored once
! 19: # the trigger exits.
! 20: # Note 3: changes() is not changed by a change to a view (since everything
! 21: # is done within instead of trigger context).
! 22: #
! 23: # $Id: laststmtchanges.test,v 1.7 2008/10/27 13:59:34 danielk1977 Exp $
! 24:
! 25: set testdir [file dirname $argv0]
! 26: source $testdir/tester.tcl
! 27:
! 28: # ----------------------------------------------------------------------------
! 29: # 1.x - basic tests (no triggers)
! 30:
! 31: # changes() set properly after insert
! 32: do_test laststmtchanges-1.1 {
! 33: catchsql {
! 34: create table t0 (x);
! 35: insert into t0 values (1);
! 36: insert into t0 values (1);
! 37: insert into t0 values (2);
! 38: insert into t0 values (2);
! 39: insert into t0 values (1);
! 40: insert into t0 values (1);
! 41: insert into t0 values (1);
! 42: insert into t0 values (2);
! 43: select changes(), total_changes();
! 44: }
! 45: } {0 {1 8}}
! 46:
! 47: # changes() set properly after update
! 48: do_test laststmtchanges-1.2 {
! 49: catchsql {
! 50: update t0 set x=3 where x=1;
! 51: select changes(), total_changes();
! 52: }
! 53: } {0 {5 13}}
! 54:
! 55: # There was some goofy change-counting logic in sqlite3_exec() that
! 56: # appears to have been left over from SQLite version 2. This test
! 57: # makes sure it has been removed.
! 58: #
! 59: do_test laststmtchanges-1.2.1 {
! 60: db cache flush
! 61: sqlite3_exec_printf db {update t0 set x=4 where x=3; select 1;} {}
! 62: execsql {select changes()}
! 63: } {5}
! 64:
! 65: # changes() unchanged within an update statement
! 66: do_test laststmtchanges-1.3 {
! 67: execsql {update t0 set x=3 where x=4}
! 68: catchsql {
! 69: update t0 set x=x+changes() where x=3;
! 70: select count() from t0 where x=8;
! 71: }
! 72: } {0 5}
! 73:
! 74: # changes() set properly after update on table where no rows changed
! 75: do_test laststmtchanges-1.4 {
! 76: catchsql {
! 77: update t0 set x=77 where x=88;
! 78: select changes();
! 79: }
! 80: } {0 0}
! 81:
! 82: # changes() set properly after delete from table
! 83: do_test laststmtchanges-1.5 {
! 84: catchsql {
! 85: delete from t0 where x=2;
! 86: select changes();
! 87: }
! 88: } {0 3}
! 89:
! 90: # All remaining tests involve triggers. Skip them if triggers are not
! 91: # supported in this build.
! 92: #
! 93: ifcapable {!trigger} {
! 94: finish_test
! 95: return
! 96: }
! 97:
! 98:
! 99: # ----------------------------------------------------------------------------
! 100: # 2.x - tests with after insert trigger
! 101:
! 102: # changes() changed properly after insert into table containing after trigger
! 103: do_test laststmtchanges-2.1 {
! 104: set ::tc [db total_changes]
! 105: catchsql {
! 106: create table t1 (k integer primary key);
! 107: create table t2 (k integer primary key, v1, v2);
! 108: create trigger r1 after insert on t1 for each row begin
! 109: insert into t2 values (NULL, changes(), NULL);
! 110: update t0 set x=x;
! 111: update t2 set v2=changes();
! 112: end;
! 113: insert into t1 values (77);
! 114: select changes();
! 115: }
! 116: } {0 1}
! 117:
! 118: # changes() unchanged upon entry into after insert trigger
! 119: do_test laststmtchanges-2.2 {
! 120: catchsql {
! 121: select v1 from t2;
! 122: }
! 123: } {0 3}
! 124:
! 125: # changes() changed properly by update within context of after insert trigger
! 126: do_test laststmtchanges-2.3 {
! 127: catchsql {
! 128: select v2 from t2;
! 129: }
! 130: } {0 5}
! 131:
! 132: # Total changes caused by firing the trigger above:
! 133: #
! 134: # 1 from "insert into t1 values(77)" +
! 135: # 1 from "insert into t2 values (NULL, changes(), NULL);" +
! 136: # 5 from "update t0 set x=x;" +
! 137: # 1 from "update t2 set v2=changes();"
! 138: #
! 139: do_test laststmtchanges-2.4 {
! 140: expr [db total_changes] - $::tc
! 141: } {8}
! 142:
! 143: # ----------------------------------------------------------------------------
! 144: # 3.x - tests with after update trigger
! 145:
! 146: # changes() changed properly after update into table containing after trigger
! 147: do_test laststmtchanges-3.1 {
! 148: catchsql {
! 149: drop trigger r1;
! 150: delete from t2; delete from t2;
! 151: create trigger r1 after update on t1 for each row begin
! 152: insert into t2 values (NULL, changes(), NULL);
! 153: delete from t0 where oid=1 or oid=2;
! 154: update t2 set v2=changes();
! 155: end;
! 156: update t1 set k=k;
! 157: select changes();
! 158: }
! 159: } {0 1}
! 160:
! 161: # changes() unchanged upon entry into after update trigger
! 162: do_test laststmtchanges-3.2 {
! 163: catchsql {
! 164: select v1 from t2;
! 165: }
! 166: } {0 0}
! 167:
! 168: # changes() changed properly by delete within context of after update trigger
! 169: do_test laststmtchanges-3.3 {
! 170: catchsql {
! 171: select v2 from t2;
! 172: }
! 173: } {0 2}
! 174:
! 175: # ----------------------------------------------------------------------------
! 176: # 4.x - tests with before delete trigger
! 177:
! 178: # changes() changed properly on delete from table containing before trigger
! 179: do_test laststmtchanges-4.1 {
! 180: catchsql {
! 181: drop trigger r1;
! 182: delete from t2; delete from t2;
! 183: create trigger r1 before delete on t1 for each row begin
! 184: insert into t2 values (NULL, changes(), NULL);
! 185: insert into t0 values (5);
! 186: update t2 set v2=changes();
! 187: end;
! 188: delete from t1;
! 189: select changes();
! 190: }
! 191: } {0 1}
! 192:
! 193: # changes() unchanged upon entry into before delete trigger
! 194: do_test laststmtchanges-4.2 {
! 195: catchsql {
! 196: select v1 from t2;
! 197: }
! 198: } {0 0}
! 199:
! 200: # changes() changed properly by insert within context of before delete trigger
! 201: do_test laststmtchanges-4.3 {
! 202: catchsql {
! 203: select v2 from t2;
! 204: }
! 205: } {0 1}
! 206:
! 207: # ----------------------------------------------------------------------------
! 208: # 5.x - complex tests with temporary tables and nested instead of triggers
! 209: # These tests cannot run if the library does not have view support enabled.
! 210:
! 211: ifcapable view&&tempdb {
! 212:
! 213: do_test laststmtchanges-5.1 {
! 214: catchsql {
! 215: drop table t0; drop table t1; drop table t2;
! 216: create temp table t0(x);
! 217: create temp table t1 (k integer primary key);
! 218: create temp table t2 (k integer primary key);
! 219: create temp view v1 as select * from t1;
! 220: create temp view v2 as select * from t2;
! 221: create temp table n1 (k integer primary key, n);
! 222: create temp table n2 (k integer primary key, n);
! 223: insert into t0 values (1);
! 224: insert into t0 values (2);
! 225: insert into t0 values (1);
! 226: insert into t0 values (1);
! 227: insert into t0 values (1);
! 228: insert into t0 values (2);
! 229: insert into t0 values (2);
! 230: insert into t0 values (1);
! 231: create temp trigger r1 instead of insert on v1 for each row begin
! 232: insert into n1 values (NULL, changes());
! 233: update t0 set x=x*10 where x=1;
! 234: insert into n1 values (NULL, changes());
! 235: insert into t1 values (NEW.k);
! 236: insert into n1 values (NULL, changes());
! 237: update t0 set x=x*10 where x=0;
! 238: insert into v2 values (100+NEW.k);
! 239: insert into n1 values (NULL, changes());
! 240: end;
! 241: create temp trigger r2 instead of insert on v2 for each row begin
! 242: insert into n2 values (NULL, changes());
! 243: insert into t2 values (1000+NEW.k);
! 244: insert into n2 values (NULL, changes());
! 245: update t0 set x=x*100 where x=0;
! 246: insert into n2 values (NULL, changes());
! 247: delete from t0 where x=2;
! 248: insert into n2 values (NULL, changes());
! 249: end;
! 250: insert into t1 values (77);
! 251: select changes();
! 252: }
! 253: } {0 1}
! 254:
! 255: do_test laststmtchanges-5.2 {
! 256: catchsql {
! 257: delete from t1 where k=88;
! 258: select changes();
! 259: }
! 260: } {0 0}
! 261:
! 262: do_test laststmtchanges-5.3 {
! 263: catchsql {
! 264: insert into v1 values (5);
! 265: select changes();
! 266: }
! 267: } {0 0}
! 268:
! 269: do_test laststmtchanges-5.4 {
! 270: catchsql {
! 271: select n from n1;
! 272: }
! 273: } {0 {0 5 1 0}}
! 274:
! 275: do_test laststmtchanges-5.5 {
! 276: catchsql {
! 277: select n from n2;
! 278: }
! 279: } {0 {0 1 0 3}}
! 280:
! 281: } ;# ifcapable view
! 282:
! 283:
! 284: # ----------------------------------------------------------------------------
! 285: # 6.x - Test "DELETE FROM <table>" in the absence of triggers
! 286: #
! 287: do_test laststmtchanges-6.1 {
! 288: execsql {
! 289: CREATE TABLE t3(a, b, c);
! 290: INSERT INTO t3 VALUES(1, 2, 3);
! 291: INSERT INTO t3 VALUES(4, 5, 6);
! 292: }
! 293: } {}
! 294: do_test laststmtchanges-6.2 {
! 295: execsql {
! 296: BEGIN;
! 297: DELETE FROM t3;
! 298: SELECT changes();
! 299: }
! 300: } {2}
! 301: do_test laststmtchanges-6.3 {
! 302: execsql {
! 303: ROLLBACK;
! 304: BEGIN;
! 305: DELETE FROM t3 WHERE a IS NOT NULL;
! 306: SELECT changes();
! 307: }
! 308: } {2}
! 309: do_test laststmtchanges-6.4 {
! 310: execsql {
! 311: ROLLBACK;
! 312: CREATE INDEX t3_i1 ON t3(a);
! 313: BEGIN;
! 314: DELETE FROM t3;
! 315: SELECT changes();
! 316: }
! 317: } {2}
! 318: do_test laststmtchanges-6.5 {
! 319: execsql { ROLLBACK }
! 320: set nTotalChange [execsql {SELECT total_changes()}]
! 321: expr 0
! 322: } {0}
! 323: do_test laststmtchanges-6.6 {
! 324: execsql {
! 325: SELECT total_changes();
! 326: DELETE FROM t3;
! 327: SELECT total_changes();
! 328: }
! 329: } [list $nTotalChange [expr $nTotalChange+2]]
! 330:
! 331: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>