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

     1  # 2009 August 1
     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  # Tests to make sure #3810 is fixed.
    13  #
    14  # $Id: tkt3810.test,v 1.4 2009/08/06 17:43:31 drh Exp $
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  ifcapable {!trigger} {
    19    finish_test
    20    return
    21  }
    22  
    23  # Create a table using the first database connection.
    24  #
    25  do_test tkt3810-1.1 {
    26    execsql {
    27      CREATE TABLE t1(x);
    28      INSERT INTO t1 VALUES(123);
    29      SELECT * FROM t1;
    30      CREATE TABLE t2(y);
    31      CREATE TABLE t3(z);
    32    }
    33  } 123
    34  
    35  # Create a second connection to the same database.  Make sure the
    36  # schema of the database has been parsed by the second connection.
    37  #
    38  do_test tkt3810-2 {
    39    sqlite3 db2 test.db
    40    execsql {
    41      SELECT * FROM t1;
    42    } db2
    43  } 123
    44  
    45  # DROP the table using the second connection.  The table no longer exists
    46  # but the first connection does not yet know this.  Then try to create a TEMP
    47  # trigger in the first connection that references the table that was dropped.
    48  #
    49  do_test tkt3810-3 {
    50    execsql {DROP TABLE t1} db2
    51    execsql {
    52       CREATE TEMP TRIGGER r1 AFTER INSERT ON t1 BEGIN
    53         INSERT INTO t2 VALUES(new.rowid);
    54       END;
    55    }
    56    catchsql {
    57      SELECT * FROM t3;
    58    }
    59  } {0 {}}
    60  
    61  # Trigger still exists in the sqlite_temp_master table, but now it is
    62  # an orphan.
    63  #
    64  do_test tkt3810-4 {
    65    execsql {SELECT name FROM temp.sqlite_master ORDER BY name}
    66  } {r1}
    67  
    68  # Because it is an orphan, it cannot be dropped.
    69  #
    70  do_test tkt3810-5 {
    71    catchsql {DROP TRIGGER r1}
    72  } {1 {no such trigger: r1}}
    73  
    74  # Create a table t1 then drop the table in order to drop the orphaned
    75  # trigger.
    76  #
    77  do_test tkt3810-6 {
    78    execsql {CREATE TABLE t1(x)} db2
    79    execsql {DROP TABLE t1}
    80    execsql {
    81      SELECT name FROM sqlite_temp_master;
    82    }
    83  } {}
    84  
    85  db2 close
    86  
    87  # 2020-11-06 forum post https://sqlite.org/forum/forumpost/157dc791df
    88  #
    89  reset_db
    90  do_test tkt3810-100 {
    91    db eval {
    92      ATTACH ':memory:' AS aux1;
    93      CREATE TABLE aux1.t1(x);
    94      CREATE TEMP TRIGGER r1 DELETE ON t1 BEGIN SELECT *; END;
    95      CREATE VIEW t1 AS SELECT *;
    96    }
    97    catch {db eval {
    98      CREATE VIRTUAL TABLE t2 USING nosuchmodule;
    99    }}
   100    db eval {CREATE TABLE t3(z);}
   101  } {}
   102  
   103  finish_test