1*1da57d55SToomas Soome# 2c5c4113dSnw141292# The author disclaims copyright to this source code. In place of 3c5c4113dSnw141292# a legal notice, here is a blessing: 4c5c4113dSnw141292# 5c5c4113dSnw141292# May you do good and not evil. 6c5c4113dSnw141292# May you find forgiveness for yourself and forgive others. 7c5c4113dSnw141292# May you share freely, never taking more than you give. 8c5c4113dSnw141292# 9c5c4113dSnw141292#*********************************************************************** 10c5c4113dSnw141292# 11c5c4113dSnw141292# Tests to make sure that value returned by last_insert_rowid() (LIRID) 12c5c4113dSnw141292# is updated properly, especially inside triggers 13c5c4113dSnw141292# 14c5c4113dSnw141292# Note 1: insert into table is now the only statement which changes LIRID 15c5c4113dSnw141292# Note 2: upon entry into before or instead of triggers, 16c5c4113dSnw141292# LIRID is unchanged (rather than -1) 17c5c4113dSnw141292# Note 3: LIRID is changed within the context of a trigger, 18c5c4113dSnw141292# but is restored once the trigger exits 19c5c4113dSnw141292# Note 4: LIRID is not changed by an insert into a view (since everything 20c5c4113dSnw141292# is done within instead of trigger context) 21c5c4113dSnw141292# 22c5c4113dSnw141292 23c5c4113dSnw141292set testdir [file dirname $argv0] 24c5c4113dSnw141292source $testdir/tester.tcl 25c5c4113dSnw141292 26c5c4113dSnw141292# ---------------------------------------------------------------------------- 27c5c4113dSnw141292# 1.x - basic tests (no triggers) 28c5c4113dSnw141292 29c5c4113dSnw141292# LIRID changed properly after an insert into a table 30c5c4113dSnw141292do_test lastinsert-1.1 { 31c5c4113dSnw141292 catchsql { 32c5c4113dSnw141292 create table t1 (k integer primary key); 33c5c4113dSnw141292 insert into t1 values (1); 34c5c4113dSnw141292 insert into t1 values (NULL); 35c5c4113dSnw141292 insert into t1 values (NULL); 36c5c4113dSnw141292 select last_insert_rowid(); 37c5c4113dSnw141292 } 38c5c4113dSnw141292} {0 3} 39c5c4113dSnw141292 40c5c4113dSnw141292# LIRID unchanged after an update on a table 41c5c4113dSnw141292do_test lastinsert-1.2 { 42c5c4113dSnw141292 catchsql { 43c5c4113dSnw141292 update t1 set k=4 where k=2; 44c5c4113dSnw141292 select last_insert_rowid(); 45c5c4113dSnw141292 } 46c5c4113dSnw141292} {0 3} 47c5c4113dSnw141292 48c5c4113dSnw141292# LIRID unchanged after a delete from a table 49c5c4113dSnw141292do_test lastinsert-1.3 { 50c5c4113dSnw141292 catchsql { 51c5c4113dSnw141292 delete from t1 where k=4; 52c5c4113dSnw141292 select last_insert_rowid(); 53c5c4113dSnw141292 } 54c5c4113dSnw141292} {0 3} 55c5c4113dSnw141292 56c5c4113dSnw141292# LIRID unchanged after create table/view statements 57c5c4113dSnw141292do_test lastinsert-1.4 { 58c5c4113dSnw141292 catchsql { 59c5c4113dSnw141292 create table t2 (k integer primary key, val1, val2, val3); 60c5c4113dSnw141292 create view v as select * from t1; 61c5c4113dSnw141292 select last_insert_rowid(); 62c5c4113dSnw141292 } 63c5c4113dSnw141292} {0 3} 64c5c4113dSnw141292 65c5c4113dSnw141292# ---------------------------------------------------------------------------- 66c5c4113dSnw141292# 2.x - tests with after insert trigger 67c5c4113dSnw141292 68c5c4113dSnw141292# LIRID changed properly after an insert into table containing an after trigger 69c5c4113dSnw141292do_test lastinsert-2.1 { 70c5c4113dSnw141292 catchsql { 71c5c4113dSnw141292 delete from t2; 72c5c4113dSnw141292 create trigger r1 after insert on t1 for each row begin 73c5c4113dSnw141292 insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL); 74c5c4113dSnw141292 update t2 set k=k+10, val2=100+last_insert_rowid(); 75c5c4113dSnw141292 update t2 set val3=1000+last_insert_rowid(); 76c5c4113dSnw141292 end; 77c5c4113dSnw141292 insert into t1 values (13); 78c5c4113dSnw141292 select last_insert_rowid(); 79c5c4113dSnw141292 } 80c5c4113dSnw141292} {0 13} 81c5c4113dSnw141292 82c5c4113dSnw141292# LIRID equals NEW.k upon entry into after insert trigger 83c5c4113dSnw141292do_test lastinsert-2.2 { 84c5c4113dSnw141292 catchsql { 85c5c4113dSnw141292 select val1 from t2; 86c5c4113dSnw141292 } 87c5c4113dSnw141292} {0 13} 88c5c4113dSnw141292 89c5c4113dSnw141292# LIRID changed properly by insert within context of after insert trigger 90c5c4113dSnw141292do_test lastinsert-2.3 { 91c5c4113dSnw141292 catchsql { 92c5c4113dSnw141292 select val2 from t2; 93c5c4113dSnw141292 } 94c5c4113dSnw141292} {0 126} 95c5c4113dSnw141292 96c5c4113dSnw141292# LIRID unchanged by update within context of after insert trigger 97c5c4113dSnw141292do_test lastinsert-2.4 { 98c5c4113dSnw141292 catchsql { 99c5c4113dSnw141292 select val3 from t2; 100c5c4113dSnw141292 } 101c5c4113dSnw141292} {0 1026} 102c5c4113dSnw141292 103c5c4113dSnw141292# ---------------------------------------------------------------------------- 104c5c4113dSnw141292# 3.x - tests with after update trigger 105c5c4113dSnw141292 106c5c4113dSnw141292# LIRID not changed after an update onto a table containing an after trigger 107c5c4113dSnw141292do_test lastinsert-3.1 { 108c5c4113dSnw141292 catchsql { 109c5c4113dSnw141292 delete from t2; 110c5c4113dSnw141292 drop trigger r1; 111c5c4113dSnw141292 create trigger r1 after update on t1 for each row begin 112c5c4113dSnw141292 insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL); 113c5c4113dSnw141292 update t2 set k=k+10, val2=100+last_insert_rowid(); 114c5c4113dSnw141292 update t2 set val3=1000+last_insert_rowid(); 115c5c4113dSnw141292 end; 116c5c4113dSnw141292 update t1 set k=14 where k=3; 117c5c4113dSnw141292 select last_insert_rowid(); 118c5c4113dSnw141292 } 119c5c4113dSnw141292} {0 13} 120c5c4113dSnw141292 121c5c4113dSnw141292# LIRID unchanged upon entry into after update trigger 122c5c4113dSnw141292do_test lastinsert-3.2 { 123c5c4113dSnw141292 catchsql { 124c5c4113dSnw141292 select val1 from t2; 125c5c4113dSnw141292 } 126c5c4113dSnw141292} {0 13} 127c5c4113dSnw141292 128c5c4113dSnw141292# LIRID changed properly by insert within context of after update trigger 129c5c4113dSnw141292do_test lastinsert-3.3 { 130c5c4113dSnw141292 catchsql { 131c5c4113dSnw141292 select val2 from t2; 132c5c4113dSnw141292 } 133c5c4113dSnw141292} {0 128} 134c5c4113dSnw141292 135c5c4113dSnw141292# LIRID unchanged by update within context of after update trigger 136c5c4113dSnw141292do_test lastinsert-3.4 { 137c5c4113dSnw141292 catchsql { 138c5c4113dSnw141292 select val3 from t2; 139c5c4113dSnw141292 } 140c5c4113dSnw141292} {0 1028} 141c5c4113dSnw141292 142c5c4113dSnw141292# ---------------------------------------------------------------------------- 143c5c4113dSnw141292# 4.x - tests with instead of insert trigger 144c5c4113dSnw141292 145c5c4113dSnw141292# LIRID not changed after an insert into view containing an instead of trigger 146c5c4113dSnw141292do_test lastinsert-4.1 { 147c5c4113dSnw141292 catchsql { 148c5c4113dSnw141292 delete from t2; 149c5c4113dSnw141292 drop trigger r1; 150c5c4113dSnw141292 create trigger r1 instead of insert on v for each row begin 151c5c4113dSnw141292 insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL); 152c5c4113dSnw141292 update t2 set k=k+10, val2=100+last_insert_rowid(); 153c5c4113dSnw141292 update t2 set val3=1000+last_insert_rowid(); 154c5c4113dSnw141292 end; 155c5c4113dSnw141292 insert into v values (15); 156c5c4113dSnw141292 select last_insert_rowid(); 157c5c4113dSnw141292 } 158c5c4113dSnw141292} {0 13} 159c5c4113dSnw141292 160c5c4113dSnw141292# LIRID unchanged upon entry into instead of trigger 161c5c4113dSnw141292do_test lastinsert-4.2 { 162c5c4113dSnw141292 catchsql { 163c5c4113dSnw141292 select val1 from t2; 164c5c4113dSnw141292 } 165c5c4113dSnw141292} {0 13} 166c5c4113dSnw141292 167c5c4113dSnw141292# LIRID changed properly by insert within context of instead of trigger 168c5c4113dSnw141292do_test lastinsert-4.3 { 169c5c4113dSnw141292 catchsql { 170c5c4113dSnw141292 select val2 from t2; 171c5c4113dSnw141292 } 172c5c4113dSnw141292} {0 130} 173c5c4113dSnw141292 174c5c4113dSnw141292# LIRID unchanged by update within context of instead of trigger 175c5c4113dSnw141292do_test lastinsert-4.4 { 176c5c4113dSnw141292 catchsql { 177c5c4113dSnw141292 select val3 from t2; 178c5c4113dSnw141292 } 179c5c4113dSnw141292} {0 1030} 180c5c4113dSnw141292 181c5c4113dSnw141292# ---------------------------------------------------------------------------- 182c5c4113dSnw141292# 5.x - tests with before delete trigger 183c5c4113dSnw141292 184c5c4113dSnw141292# LIRID not changed after a delete on a table containing a before trigger 185c5c4113dSnw141292do_test lastinsert-5.1 { 186c5c4113dSnw141292 catchsql { 187c5c4113dSnw141292 delete from t2; 188c5c4113dSnw141292 drop trigger r1; 189c5c4113dSnw141292 create trigger r1 before delete on t1 for each row begin 190c5c4113dSnw141292 insert into t2 values (77, last_insert_rowid(), NULL, NULL); 191c5c4113dSnw141292 update t2 set k=k+10, val2=100+last_insert_rowid(); 192c5c4113dSnw141292 update t2 set val3=1000+last_insert_rowid(); 193c5c4113dSnw141292 end; 194c5c4113dSnw141292 delete from t1 where k=1; 195c5c4113dSnw141292 select last_insert_rowid(); 196c5c4113dSnw141292 } 197c5c4113dSnw141292} {0 13} 198c5c4113dSnw141292 199c5c4113dSnw141292# LIRID unchanged upon entry into delete trigger 200c5c4113dSnw141292do_test lastinsert-5.2 { 201c5c4113dSnw141292 catchsql { 202c5c4113dSnw141292 select val1 from t2; 203c5c4113dSnw141292 } 204c5c4113dSnw141292} {0 13} 205c5c4113dSnw141292 206c5c4113dSnw141292# LIRID changed properly by insert within context of delete trigger 207c5c4113dSnw141292do_test lastinsert-5.3 { 208c5c4113dSnw141292 catchsql { 209c5c4113dSnw141292 select val2 from t2; 210c5c4113dSnw141292 } 211c5c4113dSnw141292} {0 177} 212c5c4113dSnw141292 213c5c4113dSnw141292# LIRID unchanged by update within context of delete trigger 214c5c4113dSnw141292do_test lastinsert-5.4 { 215c5c4113dSnw141292 catchsql { 216c5c4113dSnw141292 select val3 from t2; 217c5c4113dSnw141292 } 218c5c4113dSnw141292} {0 1077} 219c5c4113dSnw141292 220c5c4113dSnw141292# ---------------------------------------------------------------------------- 221c5c4113dSnw141292# 6.x - tests with instead of update trigger 222c5c4113dSnw141292 223c5c4113dSnw141292# LIRID not changed after an update on a view containing an instead of trigger 224c5c4113dSnw141292do_test lastinsert-6.1 { 225c5c4113dSnw141292 catchsql { 226c5c4113dSnw141292 delete from t2; 227c5c4113dSnw141292 drop trigger r1; 228c5c4113dSnw141292 create trigger r1 instead of update on v for each row begin 229c5c4113dSnw141292 insert into t2 values (NEW.k*2, last_insert_rowid(), NULL, NULL); 230c5c4113dSnw141292 update t2 set k=k+10, val2=100+last_insert_rowid(); 231c5c4113dSnw141292 update t2 set val3=1000+last_insert_rowid(); 232c5c4113dSnw141292 end; 233c5c4113dSnw141292 update v set k=16 where k=14; 234c5c4113dSnw141292 select last_insert_rowid(); 235c5c4113dSnw141292 } 236c5c4113dSnw141292} {0 13} 237c5c4113dSnw141292 238c5c4113dSnw141292# LIRID unchanged upon entry into instead of trigger 239c5c4113dSnw141292do_test lastinsert-6.2 { 240c5c4113dSnw141292 catchsql { 241c5c4113dSnw141292 select val1 from t2; 242c5c4113dSnw141292 } 243c5c4113dSnw141292} {0 13} 244c5c4113dSnw141292 245c5c4113dSnw141292# LIRID changed properly by insert within context of instead of trigger 246c5c4113dSnw141292do_test lastinsert-6.3 { 247c5c4113dSnw141292 catchsql { 248c5c4113dSnw141292 select val2 from t2; 249c5c4113dSnw141292 } 250c5c4113dSnw141292} {0 132} 251c5c4113dSnw141292 252c5c4113dSnw141292# LIRID unchanged by update within context of instead of trigger 253c5c4113dSnw141292do_test lastinsert-6.4 { 254c5c4113dSnw141292 catchsql { 255c5c4113dSnw141292 select val3 from t2; 256c5c4113dSnw141292 } 257c5c4113dSnw141292} {0 1032} 258c5c4113dSnw141292 259c5c4113dSnw141292# ---------------------------------------------------------------------------- 260c5c4113dSnw141292# 7.x - complex tests with temporary tables and nested instead of triggers 261c5c4113dSnw141292 262c5c4113dSnw141292do_test lastinsert-7.1 { 263c5c4113dSnw141292 catchsql { 264c5c4113dSnw141292 drop table t1; drop table t2; drop trigger r1; 265c5c4113dSnw141292 create temp table t1 (k integer primary key); 266c5c4113dSnw141292 create temp table t2 (k integer primary key); 267c5c4113dSnw141292 create temp view v1 as select * from t1; 268c5c4113dSnw141292 create temp view v2 as select * from t2; 269c5c4113dSnw141292 create temp table rid (k integer primary key, rin, rout); 270c5c4113dSnw141292 insert into rid values (1, NULL, NULL); 271c5c4113dSnw141292 insert into rid values (2, NULL, NULL); 272c5c4113dSnw141292 create temp trigger r1 instead of insert on v1 for each row begin 273c5c4113dSnw141292 update rid set rin=last_insert_rowid() where k=1; 274c5c4113dSnw141292 insert into t1 values (100+NEW.k); 275c5c4113dSnw141292 insert into v2 values (100+last_insert_rowid()); 276c5c4113dSnw141292 update rid set rout=last_insert_rowid() where k=1; 277c5c4113dSnw141292 end; 278c5c4113dSnw141292 create temp trigger r2 instead of insert on v2 for each row begin 279c5c4113dSnw141292 update rid set rin=last_insert_rowid() where k=2; 280c5c4113dSnw141292 insert into t2 values (1000+NEW.k); 281c5c4113dSnw141292 update rid set rout=last_insert_rowid() where k=2; 282c5c4113dSnw141292 end; 283c5c4113dSnw141292 insert into t1 values (77); 284c5c4113dSnw141292 select last_insert_rowid(); 285c5c4113dSnw141292 } 286c5c4113dSnw141292} {0 77} 287c5c4113dSnw141292 288c5c4113dSnw141292do_test lastinsert-7.2 { 289c5c4113dSnw141292 catchsql { 290c5c4113dSnw141292 insert into v1 values (5); 291c5c4113dSnw141292 select last_insert_rowid(); 292c5c4113dSnw141292 } 293c5c4113dSnw141292} {0 77} 294c5c4113dSnw141292 295c5c4113dSnw141292do_test lastinsert-7.3 { 296c5c4113dSnw141292 catchsql { 297c5c4113dSnw141292 select rin from rid where k=1; 298c5c4113dSnw141292 } 299c5c4113dSnw141292} {0 77} 300c5c4113dSnw141292 301c5c4113dSnw141292do_test lastinsert-7.4 { 302c5c4113dSnw141292 catchsql { 303c5c4113dSnw141292 select rout from rid where k=1; 304c5c4113dSnw141292 } 305c5c4113dSnw141292} {0 105} 306c5c4113dSnw141292 307c5c4113dSnw141292do_test lastinsert-7.5 { 308c5c4113dSnw141292 catchsql { 309c5c4113dSnw141292 select rin from rid where k=2; 310c5c4113dSnw141292 } 311c5c4113dSnw141292} {0 105} 312c5c4113dSnw141292 313c5c4113dSnw141292do_test lastinsert-7.6 { 314c5c4113dSnw141292 catchsql { 315c5c4113dSnw141292 select rout from rid where k=2; 316c5c4113dSnw141292 } 317c5c4113dSnw141292} {0 1205} 318c5c4113dSnw141292 319c5c4113dSnw141292finish_test 320c5c4113dSnw141292 321