gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/e_droptrigger.test (about)

     1  # 2010 November 29
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  #
    12  # This file implements tests to verify that the "testable statements" in 
    13  # the lang_droptrigger.html document are correct.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  set ::testprefix e_droptrigger
    19  
    20  ifcapable !trigger { finish_test ; return }
    21  
    22  proc do_droptrigger_tests {nm args} {
    23    uplevel do_select_tests [list e_createtable-$nm] $args
    24  }
    25  
    26  proc list_all_triggers {{db db}} {
    27    set res [list]
    28    $db eval { PRAGMA database_list } {
    29      if {$name == "temp"} {
    30        set tbl sqlite_temp_master
    31      } else {
    32        set tbl "$name.sqlite_master"
    33      }
    34      lappend res {*}[
    35        db eval "SELECT '$name.' || name FROM $tbl WHERE type = 'trigger'"
    36      ]
    37    }
    38    set res
    39  }
    40  
    41  
    42  proc droptrigger_reopen_db {{event INSERT}} {
    43    db close
    44    forcedelete test.db test.db2
    45    sqlite3 db test.db
    46  
    47    set ::triggers_fired [list]
    48    proc r {x} { lappend ::triggers_fired $x }
    49    db func r r
    50  
    51    db eval "
    52      ATTACH 'test.db2' AS aux;
    53  
    54      CREATE TEMP TABLE t1(a, b);
    55      INSERT INTO t1 VALUES('a', 'b');
    56      CREATE TRIGGER tr1 AFTER $event ON t1 BEGIN SELECT r('temp.tr1') ; END;
    57  
    58      CREATE TABLE t2(a, b);
    59      INSERT INTO t2 VALUES('a', 'b');
    60      CREATE TRIGGER tr1 BEFORE $event ON t2 BEGIN SELECT r('main.tr1') ; END;
    61      CREATE TRIGGER tr2 AFTER  $event ON t2 BEGIN SELECT r('main.tr2') ; END;
    62  
    63      CREATE TABLE aux.t3(a, b);
    64      INSERT INTO t3 VALUES('a', 'b');
    65      CREATE TRIGGER aux.tr1 BEFORE $event ON t3 BEGIN SELECT r('aux.tr1') ; END;
    66      CREATE TRIGGER aux.tr2 AFTER  $event ON t3 BEGIN SELECT r('aux.tr2') ; END;
    67      CREATE TRIGGER aux.tr3 AFTER  $event ON t3 BEGIN SELECT r('aux.tr3') ; END;
    68    "
    69  }
    70  
    71  
    72  # -- syntax diagram drop-trigger-stmt
    73  #
    74  do_droptrigger_tests 1.1 -repair {
    75    droptrigger_reopen_db
    76  } -tclquery {
    77    list_all_triggers 
    78  } {
    79    1   "DROP TRIGGER main.tr1"            
    80        {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
    81    2   "DROP TRIGGER IF EXISTS main.tr1"  
    82        {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
    83    3   "DROP TRIGGER tr1"                 
    84        {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
    85    4   "DROP TRIGGER IF EXISTS tr1"       
    86        {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
    87  
    88    5   "DROP TRIGGER aux.tr1"             
    89        {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
    90    6   "DROP TRIGGER IF EXISTS aux.tr1"   
    91        {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
    92  
    93    7   "DROP TRIGGER IF EXISTS aux.xxx"   
    94        {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
    95    8   "DROP TRIGGER IF EXISTS aux.xxx"   
    96        {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
    97  }
    98  
    99  # EVIDENCE-OF: R-61172-15671 The DROP TRIGGER statement removes a
   100  # trigger created by the CREATE TRIGGER statement.
   101  #
   102  foreach {tn tbl droptrigger before after} {
   103    1   t1  "DROP TRIGGER tr1" {temp.tr1}                {}
   104    2   t2  "DROP TRIGGER tr1" {main.tr1 main.tr2}       {main.tr1 main.tr2}
   105    3   t3  "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
   106  
   107    4   t1  "DROP TRIGGER tr2" {temp.tr1}                {temp.tr1}
   108    5   t2  "DROP TRIGGER tr2" {main.tr1 main.tr2}       {main.tr1}
   109    6   t3  "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
   110  
   111    7   t1  "DROP TRIGGER tr3" {temp.tr1}                {temp.tr1}
   112    8   t2  "DROP TRIGGER tr3" {main.tr1 main.tr2}       {main.tr1 main.tr2}
   113    9   t3  "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
   114  } {
   115  
   116    do_test 2.$tn.1 {
   117      droptrigger_reopen_db
   118      execsql " INSERT INTO $tbl VALUES('1', '2') "
   119      set ::triggers_fired
   120    } $before
   121  
   122    do_test 2.$tn.2 {
   123      droptrigger_reopen_db
   124      execsql $droptrigger
   125      execsql " INSERT INTO $tbl VALUES('1', '2') "
   126      set ::triggers_fired
   127    } $after
   128  }
   129  
   130  # EVIDENCE-OF: R-04950-25529 Once removed, the trigger definition is no
   131  # longer present in the sqlite_schema (or sqlite_temp_schema) table and
   132  # is not fired by any subsequent INSERT, UPDATE or DELETE statements.
   133  #
   134  #   Test cases e_droptrigger-1.* test the first part of this statement
   135  #   (that dropped triggers do not appear in the schema table), and tests
   136  #   droptrigger-2.* test that dropped triggers are not fired by INSERT
   137  #   statements. The following tests verify that they are not fired by
   138  #   UPDATE or DELETE statements.
   139  #
   140  foreach {tn tbl droptrigger before after} {
   141    1   t1  "DROP TRIGGER tr1" {temp.tr1}                {}
   142    2   t2  "DROP TRIGGER tr1" {main.tr1 main.tr2}       {main.tr1 main.tr2}
   143    3   t3  "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
   144  
   145    4   t1  "DROP TRIGGER tr2" {temp.tr1}                {temp.tr1}
   146    5   t2  "DROP TRIGGER tr2" {main.tr1 main.tr2}       {main.tr1}
   147    6   t3  "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
   148  
   149    7   t1  "DROP TRIGGER tr3" {temp.tr1}                {temp.tr1}
   150    8   t2  "DROP TRIGGER tr3" {main.tr1 main.tr2}       {main.tr1 main.tr2}
   151    9   t3  "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
   152  } {
   153  
   154    do_test 3.1.$tn.1 {
   155      droptrigger_reopen_db UPDATE
   156      execsql "UPDATE $tbl SET a = 'abc'"
   157      set ::triggers_fired
   158    } $before
   159  
   160    do_test 3.1.$tn.2 {
   161      droptrigger_reopen_db UPDATE
   162      execsql $droptrigger
   163      execsql "UPDATE $tbl SET a = 'abc'"
   164      set ::triggers_fired
   165    } $after
   166  }
   167  foreach {tn tbl droptrigger before after} {
   168    1   t1  "DROP TRIGGER tr1" {temp.tr1}                {}
   169    2   t2  "DROP TRIGGER tr1" {main.tr1 main.tr2}       {main.tr1 main.tr2}
   170    3   t3  "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
   171  
   172    4   t1  "DROP TRIGGER tr2" {temp.tr1}                {temp.tr1}
   173    5   t2  "DROP TRIGGER tr2" {main.tr1 main.tr2}       {main.tr1}
   174    6   t3  "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
   175  
   176    7   t1  "DROP TRIGGER tr3" {temp.tr1}                {temp.tr1}
   177    8   t2  "DROP TRIGGER tr3" {main.tr1 main.tr2}       {main.tr1 main.tr2}
   178    9   t3  "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
   179  } {
   180  
   181    do_test 3.2.$tn.1 {
   182      droptrigger_reopen_db DELETE
   183      execsql "DELETE FROM $tbl"
   184      set ::triggers_fired
   185    } $before
   186  
   187    do_test 3.2.$tn.2 {
   188      droptrigger_reopen_db DELETE
   189      execsql $droptrigger
   190      execsql "DELETE FROM $tbl"
   191      set ::triggers_fired
   192    } $after
   193  }
   194  
   195  # EVIDENCE-OF: R-37808-62273 Note that triggers are automatically
   196  # dropped when the associated table is dropped.
   197  #
   198  do_test 4.1 {
   199    droptrigger_reopen_db
   200    list_all_triggers
   201  } {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
   202  do_test 4.2 {
   203    droptrigger_reopen_db
   204    execsql "DROP TABLE t1"
   205    list_all_triggers
   206  } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
   207  do_test 4.3 {
   208    droptrigger_reopen_db
   209    execsql "DROP TABLE t1"
   210    list_all_triggers
   211  } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
   212  do_test 4.4 {
   213    droptrigger_reopen_db
   214    execsql "DROP TABLE t1"
   215    list_all_triggers
   216  } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
   217  
   218  finish_test