Annotation of embedaddon/sqlite3/test/lastinsert.test, revision 1.1
1.1 ! misho 1: # The author disclaims copyright to this source code. In place of
! 2: # a legal notice, here is a blessing:
! 3: #
! 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.
! 7: #
! 8: #***********************************************************************
! 9: #
! 10: # Tests to make sure that value returned by last_insert_rowid() (LIRID)
! 11: # is updated properly, especially inside triggers
! 12: #
! 13: # Note 1: insert into table is now the only statement which changes LIRID
! 14: # Note 2: upon entry into before or instead of triggers,
! 15: # LIRID is unchanged (rather than -1)
! 16: # Note 3: LIRID is changed within the context of a trigger,
! 17: # but is restored once the trigger exits
! 18: # Note 4: LIRID is not changed by an insert into a view (since everything
! 19: # is done within instead of trigger context)
! 20: #
! 21:
! 22: set testdir [file dirname $argv0]
! 23: source $testdir/tester.tcl
! 24:
! 25: # ----------------------------------------------------------------------------
! 26: # 1.x - basic tests (no triggers)
! 27:
! 28: # LIRID changed properly after an insert into a table
! 29: do_test lastinsert-1.1 {
! 30: catchsql {
! 31: create table t1 (k integer primary key);
! 32: insert into t1 values (1);
! 33: insert into t1 values (NULL);
! 34: insert into t1 values (NULL);
! 35: select last_insert_rowid();
! 36: }
! 37: } {0 3}
! 38:
! 39: # LIRID unchanged after an update on a table
! 40: do_test lastinsert-1.2 {
! 41: catchsql {
! 42: update t1 set k=4 where k=2;
! 43: select last_insert_rowid();
! 44: }
! 45: } {0 3}
! 46:
! 47: # LIRID unchanged after a delete from a table
! 48: do_test lastinsert-1.3 {
! 49: catchsql {
! 50: delete from t1 where k=4;
! 51: select last_insert_rowid();
! 52: }
! 53: } {0 3}
! 54:
! 55: # LIRID unchanged after create table/view statements
! 56: do_test lastinsert-1.4.1 {
! 57: catchsql {
! 58: create table t2 (k integer primary key, val1, val2, val3);
! 59: select last_insert_rowid();
! 60: }
! 61: } {0 3}
! 62: ifcapable view {
! 63: do_test lastinsert-1.4.2 {
! 64: catchsql {
! 65: create view v as select * from t1;
! 66: select last_insert_rowid();
! 67: }
! 68: } {0 3}
! 69: } ;# ifcapable view
! 70:
! 71: # All remaining tests involve triggers. Skip them if triggers are not
! 72: # supported in this build.
! 73: #
! 74: ifcapable {!trigger} {
! 75: finish_test
! 76: return
! 77: }
! 78:
! 79: # ----------------------------------------------------------------------------
! 80: # 2.x - tests with after insert trigger
! 81:
! 82: # LIRID changed properly after an insert into table containing an after trigger
! 83: do_test lastinsert-2.1 {
! 84: catchsql {
! 85: delete from t2;
! 86: create trigger r1 after insert on t1 for each row begin
! 87: insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
! 88: update t2 set k=k+10, val2=100+last_insert_rowid();
! 89: update t2 set val3=1000+last_insert_rowid();
! 90: end;
! 91: insert into t1 values (13);
! 92: select last_insert_rowid();
! 93: }
! 94: } {0 13}
! 95:
! 96: # LIRID equals NEW.k upon entry into after insert trigger
! 97: do_test lastinsert-2.2 {
! 98: catchsql {
! 99: select val1 from t2;
! 100: }
! 101: } {0 13}
! 102:
! 103: # LIRID changed properly by insert within context of after insert trigger
! 104: do_test lastinsert-2.3 {
! 105: catchsql {
! 106: select val2 from t2;
! 107: }
! 108: } {0 126}
! 109:
! 110: # LIRID unchanged by update within context of after insert trigger
! 111: do_test lastinsert-2.4 {
! 112: catchsql {
! 113: select val3 from t2;
! 114: }
! 115: } {0 1026}
! 116:
! 117: # ----------------------------------------------------------------------------
! 118: # 3.x - tests with after update trigger
! 119:
! 120: # LIRID not changed after an update onto a table containing an after trigger
! 121: do_test lastinsert-3.1 {
! 122: catchsql {
! 123: delete from t2;
! 124: drop trigger r1;
! 125: create trigger r1 after update on t1 for each row begin
! 126: insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
! 127: update t2 set k=k+10, val2=100+last_insert_rowid();
! 128: update t2 set val3=1000+last_insert_rowid();
! 129: end;
! 130: update t1 set k=14 where k=3;
! 131: select last_insert_rowid();
! 132: }
! 133: } {0 13}
! 134:
! 135: # LIRID unchanged upon entry into after update trigger
! 136: do_test lastinsert-3.2 {
! 137: catchsql {
! 138: select val1 from t2;
! 139: }
! 140: } {0 13}
! 141:
! 142: # LIRID changed properly by insert within context of after update trigger
! 143: do_test lastinsert-3.3 {
! 144: catchsql {
! 145: select val2 from t2;
! 146: }
! 147: } {0 128}
! 148:
! 149: # LIRID unchanged by update within context of after update trigger
! 150: do_test lastinsert-3.4 {
! 151: catchsql {
! 152: select val3 from t2;
! 153: }
! 154: } {0 1028}
! 155:
! 156: # ----------------------------------------------------------------------------
! 157: # 4.x - tests with instead of insert trigger
! 158: # These may not be run if either views or triggers were disabled at
! 159: # compile-time
! 160:
! 161: ifcapable {view && trigger} {
! 162: # LIRID not changed after an insert into view containing an instead of trigger
! 163: do_test lastinsert-4.1 {
! 164: catchsql {
! 165: delete from t2;
! 166: drop trigger r1;
! 167: create trigger r1 instead of insert on v for each row begin
! 168: insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
! 169: update t2 set k=k+10, val2=100+last_insert_rowid();
! 170: update t2 set val3=1000+last_insert_rowid();
! 171: end;
! 172: insert into v values (15);
! 173: select last_insert_rowid();
! 174: }
! 175: } {0 13}
! 176:
! 177: # LIRID unchanged upon entry into instead of trigger
! 178: do_test lastinsert-4.2 {
! 179: catchsql {
! 180: select val1 from t2;
! 181: }
! 182: } {0 13}
! 183:
! 184: # LIRID changed properly by insert within context of instead of trigger
! 185: do_test lastinsert-4.3 {
! 186: catchsql {
! 187: select val2 from t2;
! 188: }
! 189: } {0 130}
! 190:
! 191: # LIRID unchanged by update within context of instead of trigger
! 192: do_test lastinsert-4.4 {
! 193: catchsql {
! 194: select val3 from t2;
! 195: }
! 196: } {0 1030}
! 197: } ;# ifcapable (view && trigger)
! 198:
! 199: # ----------------------------------------------------------------------------
! 200: # 5.x - tests with before delete trigger
! 201:
! 202: # LIRID not changed after a delete on a table containing a before trigger
! 203: do_test lastinsert-5.1 {
! 204: catchsql {
! 205: drop trigger r1; -- This was not created if views are disabled.
! 206: }
! 207: catchsql {
! 208: delete from t2;
! 209: create trigger r1 before delete on t1 for each row begin
! 210: insert into t2 values (77, last_insert_rowid(), NULL, NULL);
! 211: update t2 set k=k+10, val2=100+last_insert_rowid();
! 212: update t2 set val3=1000+last_insert_rowid();
! 213: end;
! 214: delete from t1 where k=1;
! 215: select last_insert_rowid();
! 216: }
! 217: } {0 13}
! 218:
! 219: # LIRID unchanged upon entry into delete trigger
! 220: do_test lastinsert-5.2 {
! 221: catchsql {
! 222: select val1 from t2;
! 223: }
! 224: } {0 13}
! 225:
! 226: # LIRID changed properly by insert within context of delete trigger
! 227: do_test lastinsert-5.3 {
! 228: catchsql {
! 229: select val2 from t2;
! 230: }
! 231: } {0 177}
! 232:
! 233: # LIRID unchanged by update within context of delete trigger
! 234: do_test lastinsert-5.4 {
! 235: catchsql {
! 236: select val3 from t2;
! 237: }
! 238: } {0 1077}
! 239:
! 240: # ----------------------------------------------------------------------------
! 241: # 6.x - tests with instead of update trigger
! 242: # These tests may not run if either views or triggers are disabled.
! 243:
! 244: ifcapable {view && trigger} {
! 245: # LIRID not changed after an update on a view containing an instead of trigger
! 246: do_test lastinsert-6.1 {
! 247: catchsql {
! 248: delete from t2;
! 249: drop trigger r1;
! 250: create trigger r1 instead of update on v for each row begin
! 251: insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL);
! 252: update t2 set k=k+10, val2=100+last_insert_rowid();
! 253: update t2 set val3=1000+last_insert_rowid();
! 254: end;
! 255: update v set k=16 where k=14;
! 256: select last_insert_rowid();
! 257: }
! 258: } {0 13}
! 259:
! 260: # LIRID unchanged upon entry into instead of trigger
! 261: do_test lastinsert-6.2 {
! 262: catchsql {
! 263: select val1 from t2;
! 264: }
! 265: } {0 13}
! 266:
! 267: # LIRID changed properly by insert within context of instead of trigger
! 268: do_test lastinsert-6.3 {
! 269: catchsql {
! 270: select val2 from t2;
! 271: }
! 272: } {0 132}
! 273:
! 274: # LIRID unchanged by update within context of instead of trigger
! 275: do_test lastinsert-6.4 {
! 276: catchsql {
! 277: select val3 from t2;
! 278: }
! 279: } {0 1032}
! 280: } ;# ifcapable (view && trigger)
! 281:
! 282: # ----------------------------------------------------------------------------
! 283: # 7.x - complex tests with temporary tables and nested instead of triggers
! 284: # These do not run if views or triggers are disabled.
! 285:
! 286: ifcapable {trigger && view && tempdb} {
! 287: do_test lastinsert-7.1 {
! 288: catchsql {
! 289: drop table t1; drop table t2; drop trigger r1;
! 290: create temp table t1 (k integer primary key);
! 291: create temp table t2 (k integer primary key);
! 292: create temp view v1 as select * from t1;
! 293: create temp view v2 as select * from t2;
! 294: create temp table rid (k integer primary key, rin, rout);
! 295: insert into rid values (1, NULL, NULL);
! 296: insert into rid values (2, NULL, NULL);
! 297: create temp trigger r1 instead of insert on v1 for each row begin
! 298: update rid set rin=last_insert_rowid() where k=1;
! 299: insert into t1 values (100+NEW.k);
! 300: insert into v2 values (100+last_insert_rowid());
! 301: update rid set rout=last_insert_rowid() where k=1;
! 302: end;
! 303: create temp trigger r2 instead of insert on v2 for each row begin
! 304: update rid set rin=last_insert_rowid() where k=2;
! 305: insert into t2 values (1000+NEW.k);
! 306: update rid set rout=last_insert_rowid() where k=2;
! 307: end;
! 308: insert into t1 values (77);
! 309: select last_insert_rowid();
! 310: }
! 311: } {0 77}
! 312:
! 313: do_test lastinsert-7.2 {
! 314: catchsql {
! 315: insert into v1 values (5);
! 316: select last_insert_rowid();
! 317: }
! 318: } {0 77}
! 319:
! 320: do_test lastinsert-7.3 {
! 321: catchsql {
! 322: select rin from rid where k=1;
! 323: }
! 324: } {0 77}
! 325:
! 326: do_test lastinsert-7.4 {
! 327: catchsql {
! 328: select rout from rid where k=1;
! 329: }
! 330: } {0 105}
! 331:
! 332: do_test lastinsert-7.5 {
! 333: catchsql {
! 334: select rin from rid where k=2;
! 335: }
! 336: } {0 105}
! 337:
! 338: do_test lastinsert-7.6 {
! 339: catchsql {
! 340: select rout from rid where k=2;
! 341: }
! 342: } {0 1205}
! 343:
! 344: do_test lastinsert-8.1 {
! 345: db close
! 346: sqlite3 db test.db
! 347: execsql {
! 348: CREATE TABLE t2(x INTEGER PRIMARY KEY, y);
! 349: CREATE TABLE t3(a, b);
! 350: CREATE TRIGGER after_t2 AFTER INSERT ON t2 BEGIN
! 351: INSERT INTO t3 VALUES(new.x, new.y);
! 352: END;
! 353: INSERT INTO t2 VALUES(5000000000, 1);
! 354: SELECT last_insert_rowid();
! 355: }
! 356: } 5000000000
! 357:
! 358: do_test lastinsert-9.1 {
! 359: db eval {INSERT INTO t2 VALUES(123456789012345,0)}
! 360: db last_insert_rowid
! 361: } {123456789012345}
! 362:
! 363:
! 364: } ;# ifcapable (view && trigger)
! 365:
! 366: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>