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>