os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/trigger4.test
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     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