persistentstorage/sqlite3api/TEST/TclScript/trigger4.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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 # This file tests the triggers of views.
       
    11 #
       
    12 
       
    13 set testdir [file dirname $argv0]
       
    14 source $testdir/tester.tcl
       
    15 
       
    16 # If either views or triggers are disabled in this build, omit this file.
       
    17 ifcapable {!trigger || !view} {
       
    18   finish_test
       
    19   return
       
    20 }
       
    21 
       
    22 do_test trigger4-1.1 {
       
    23   execsql {
       
    24     create table test1(id integer primary key,a);
       
    25     create table test2(id integer,b);
       
    26     create view test as
       
    27       select test1.id as id,a as a,b as b
       
    28       from test1 join test2 on test2.id =  test1.id;
       
    29     create trigger I_test instead of insert on test
       
    30       begin
       
    31         insert into test1 (id,a) values (NEW.id,NEW.a);
       
    32         insert into test2 (id,b) values (NEW.id,NEW.b);
       
    33       end;
       
    34     insert into test values(1,2,3);
       
    35     select * from test1;
       
    36   }
       
    37 } {1 2}
       
    38 do_test trigger4-1.2 {
       
    39   execsql {
       
    40     select * from test2;
       
    41   }
       
    42 } {1 3}
       
    43 do_test trigger4-1.3 {
       
    44   db close
       
    45   sqlite3 db test.db
       
    46   execsql {
       
    47     insert into test values(4,5,6);
       
    48     select * from test1;
       
    49   }
       
    50 } {1 2 4 5}
       
    51 do_test trigger4-1.4 {
       
    52   execsql {
       
    53     select * from test2;
       
    54   }
       
    55 } {1 3 4 6}
       
    56 
       
    57 do_test trigger4-2.1 {
       
    58   execsql {
       
    59     create trigger U_test instead of update on test
       
    60       begin
       
    61         update test1 set a=NEW.a where id=NEW.id;
       
    62         update test2 set b=NEW.b where id=NEW.id;
       
    63       end;
       
    64     update test set a=22 where id=1;
       
    65     select * from test1;
       
    66   }
       
    67 } {1 22 4 5}
       
    68 do_test trigger4-2.2 {
       
    69   execsql {
       
    70     select * from test2;
       
    71   }
       
    72 } {1 3 4 6}
       
    73 do_test trigger4-2.3 {
       
    74   db close
       
    75   sqlite3 db test.db
       
    76   execsql {
       
    77     update test set b=66 where id=4;
       
    78     select * from test1;
       
    79   }
       
    80 } {1 22 4 5}
       
    81 do_test trigger4-2.4 {
       
    82   execsql {
       
    83     select * from test2;
       
    84   }
       
    85 } {1 3 4 66}
       
    86 
       
    87 do_test trigger4-3.1 {
       
    88   catchsql {
       
    89     drop table test2;
       
    90     insert into test values(7,8,9);
       
    91   }
       
    92 } {1 {no such table: main.test2}}
       
    93 do_test trigger4-3.2 {
       
    94   db close
       
    95   sqlite3 db test.db
       
    96   catchsql {
       
    97     insert into test values(7,8,9);
       
    98   }
       
    99 } {1 {no such table: main.test2}}
       
   100 do_test trigger4-3.3 {
       
   101   catchsql {
       
   102     update test set a=222 where id=1;
       
   103   }
       
   104 } {1 {no such table: main.test2}}
       
   105 do_test trigger4-3.4 {
       
   106   execsql {
       
   107     select * from test1;
       
   108   }
       
   109 } {1 22 4 5}
       
   110 do_test trigger4-3.5 {
       
   111   execsql {
       
   112     create table test2(id,b);
       
   113     insert into test values(7,8,9);
       
   114     select * from test1;
       
   115   }
       
   116 } {1 22 4 5 7 8}
       
   117 do_test trigger4-3.6 {
       
   118   execsql {
       
   119     select * from test2;
       
   120   }
       
   121 } {7 9}
       
   122 do_test trigger4-3.7 {
       
   123   db close
       
   124   sqlite3 db test.db
       
   125   execsql {
       
   126     update test set b=99 where id=7;
       
   127     select * from test2;
       
   128   }
       
   129 } {7 99}
       
   130 
       
   131 do_test trigger4-4.1 {
       
   132     db close
       
   133     file delete -force trigtest.db
       
   134     file delete -force trigtest.db-journal
       
   135     sqlite3 db trigtest.db
       
   136     catchsql {drop table tbl; drop view vw}
       
   137     execsql {
       
   138 	create table tbl(a integer primary key, b integer);
       
   139 	create view vw as select * from tbl;
       
   140 	create trigger t_del_tbl instead of delete on vw for each row begin
       
   141 	  delete from tbl where a = old.a;
       
   142 	end;
       
   143 	create trigger t_upd_tbl instead of update on vw for each row begin
       
   144 	  update tbl set a=new.a, b=new.b where a = old.a;
       
   145 	end;
       
   146 	create trigger t_ins_tbl instead of insert on vw for each row begin
       
   147 	  insert into tbl values (new.a,new.b);
       
   148 	end;
       
   149 	insert into tbl values(101,1001);
       
   150 	insert into tbl values(102,1002);
       
   151 	insert into tbl select a+2, b+2 from tbl;
       
   152 	insert into tbl select a+4, b+4 from tbl;
       
   153 	insert into tbl select a+8, b+8 from tbl;
       
   154 	insert into tbl select a+16, b+16 from tbl;
       
   155 	insert into tbl select a+32, b+32 from tbl;
       
   156 	insert into tbl select a+64, b+64 from tbl;
       
   157 	select count(*) from vw;
       
   158     }
       
   159 } {128}
       
   160 do_test trigger4-4.2 {
       
   161     execsql {select a, b from vw where a<103 or a>226 order by a}
       
   162 } {101 1001 102 1002 227 1127 228 1128}
       
   163 
       
   164 #test delete from view
       
   165 do_test trigger4-5.1 {
       
   166     catchsql {delete from vw where a>101 and a<2000}
       
   167 } {0 {}}
       
   168 do_test trigger4-5.2 {
       
   169     execsql {select * from vw}
       
   170 } {101 1001}
       
   171 
       
   172 #test insert into view
       
   173 do_test trigger4-6.1 {
       
   174     catchsql {
       
   175 	insert into vw values(102,1002);
       
   176 	insert into vw select a+2, b+2 from vw;
       
   177 	insert into vw select a+4, b+4 from vw;
       
   178 	insert into vw select a+8, b+8 from vw;
       
   179 	insert into vw select a+16, b+16 from vw;
       
   180 	insert into vw select a+32, b+32 from vw;
       
   181 	insert into vw select a+64, b+64 from vw;
       
   182     }
       
   183 } {0 {}}
       
   184 do_test trigger4-6.2 {
       
   185     execsql {select count(*) from vw}
       
   186 } {128}
       
   187 
       
   188 #test update of view
       
   189 do_test trigger4-7.1 {
       
   190     catchsql {update vw set b=b+1000 where a>101 and a<2000}
       
   191 } {0 {}}
       
   192 do_test trigger4-7.2 {
       
   193     execsql {select a, b from vw where a<=102 or a>=227 order by a}
       
   194 } {101 1001 102 2002 227 2127 228 2128}
       
   195 
       
   196 integrity_check trigger4-99.9
       
   197 db close
       
   198 file delete -force trigtest.db trigtest.db-journal
       
   199 
       
   200 finish_test