⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trigger1.test

📁 sqlite-3.4.1,嵌入式数据库.是一个功能强大的开源数据库,给学习和研发以及小型公司的发展带来了全所未有的好处.
💻 TEST
📖 第 1 页 / 共 2 页
字号:
# The author disclaims copyright to this source code.  In place of# a legal notice, here is a blessing:##    May you do good and not evil.#    May you find forgiveness for yourself and forgive others.#    May you share freely, never taking more than you give.##***********************************************************************## This file tests creating and dropping triggers, and interaction thereof# with the database COMMIT/ROLLBACK logic.## 1. CREATE and DROP TRIGGER tests# trig-1.1: Error if table does not exist# trig-1.2: Error if trigger already exists# trig-1.3: Created triggers are deleted if the transaction is rolled back# trig-1.4: DROP TRIGGER removes trigger# trig-1.5: Dropped triggers are restored if the transaction is rolled back# trig-1.6: Error if dropped trigger doesn't exist# trig-1.7: Dropping the table automatically drops all triggers# trig-1.8: A trigger created on a TEMP table is not inserted into sqlite_master# trig-1.9: Ensure that we cannot create a trigger on sqlite_master# trig-1.10:# trig-1.11:# trig-1.12: Ensure that INSTEAD OF triggers cannot be created on tables# trig-1.13: Ensure that AFTER triggers cannot be created on views# trig-1.14: Ensure that BEFORE triggers cannot be created on views#set testdir [file dirname $argv0]source $testdir/tester.tclifcapable {!trigger} {  finish_test  return}do_test trigger1-1.1.1 {   catchsql {     CREATE TRIGGER trig UPDATE ON no_such_table BEGIN       SELECT * from sqlite_master;     END;   } } {1 {no such table: main.no_such_table}}ifcapable tempdb {  do_test trigger1-1.1.2 {     catchsql {       CREATE TEMP TRIGGER trig UPDATE ON no_such_table BEGIN         SELECT * from sqlite_master;       END;     }   } {1 {no such table: no_such_table}}}execsql {    CREATE TABLE t1(a);}do_test trigger1-1.1.3 {  catchsql {     CREATE TRIGGER trig UPDATE ON t1 FOR EACH STATEMENT BEGIN        SELECT * FROM sqlite_master;     END;  }} {1 {near "STATEMENT": syntax error}}execsql {	CREATE TRIGGER tr1 INSERT ON t1 BEGIN	  INSERT INTO t1 values(1); 	END;}do_test trigger1-1.2.0 {    catchsql {	CREATE TRIGGER IF NOT EXISTS tr1 DELETE ON t1 BEGIN	    SELECT * FROM sqlite_master; 	END     }} {0 {}}do_test trigger1-1.2.1 {    catchsql {	CREATE TRIGGER tr1 DELETE ON t1 BEGIN	    SELECT * FROM sqlite_master; 	END     }} {1 {trigger tr1 already exists}}do_test trigger1-1.2.2 {    catchsql {	CREATE TRIGGER "tr1" DELETE ON t1 BEGIN	    SELECT * FROM sqlite_master; 	END     }} {1 {trigger "tr1" already exists}}do_test trigger1-1.2.3 {    catchsql {	CREATE TRIGGER [tr1] DELETE ON t1 BEGIN	    SELECT * FROM sqlite_master; 	END     }} {1 {trigger [tr1] already exists}}do_test trigger1-1.3 {    catchsql {	BEGIN;	CREATE TRIGGER tr2 INSERT ON t1 BEGIN	    SELECT * from sqlite_master; END;        ROLLBACK;	CREATE TRIGGER tr2 INSERT ON t1 BEGIN	    SELECT * from sqlite_master; END;    }} {0 {}}do_test trigger1-1.4 {    catchsql {	DROP TRIGGER IF EXISTS tr1;	CREATE TRIGGER tr1 DELETE ON t1 BEGIN	    SELECT * FROM sqlite_master;	END    }} {0 {}}do_test trigger1-1.5 {    execsql {	BEGIN;	DROP TRIGGER tr2;	ROLLBACK;	DROP TRIGGER tr2;    }} {}do_test trigger1-1.6.1 {    catchsql {	DROP TRIGGER IF EXISTS biggles;    }} {0 {}}do_test trigger1-1.6.2 {    catchsql {	DROP TRIGGER biggles;    }} {1 {no such trigger: biggles}}do_test trigger1-1.7 {    catchsql {	DROP TABLE t1;	DROP TRIGGER tr1;    }} {1 {no such trigger: tr1}}ifcapable tempdb {  execsql {    CREATE TEMP TABLE temp_table(a);  }  do_test trigger1-1.8 {    execsql {  	CREATE TRIGGER temp_trig UPDATE ON temp_table BEGIN  	    SELECT * from sqlite_master;  	END;  	SELECT count(*) FROM sqlite_master WHERE name = 'temp_trig';    }   } {0}}do_test trigger1-1.9 {  catchsql {    CREATE TRIGGER tr1 AFTER UPDATE ON sqlite_master BEGIN       SELECT * FROM sqlite_master;    END;  }} {1 {cannot create trigger on system table}}# Check to make sure that a DELETE statement within the body of# a trigger does not mess up the DELETE that caused the trigger to# run in the first place.#do_test trigger1-1.10 {  execsql {    create table t1(a,b);    insert into t1 values(1,'a');    insert into t1 values(2,'b');    insert into t1 values(3,'c');    insert into t1 values(4,'d');    create trigger r1 after delete on t1 for each row begin      delete from t1 WHERE a=old.a+2;    end;    delete from t1 where a=1 OR a=3;    select * from t1;    drop table t1;  }} {2 b 4 d}do_test trigger1-1.11 {  execsql {    create table t1(a,b);    insert into t1 values(1,'a');    insert into t1 values(2,'b');    insert into t1 values(3,'c');    insert into t1 values(4,'d');    create trigger r1 after update on t1 for each row begin      delete from t1 WHERE a=old.a+2;    end;    update t1 set b='x-' || b where a=1 OR a=3;    select * from t1;    drop table t1;  }} {1 x-a 2 b 4 d}# Ensure that we cannot create INSTEAD OF triggers on tablesdo_test trigger1-1.12 {  catchsql {    create table t1(a,b);    create trigger t1t instead of update on t1 for each row begin      delete from t1 WHERE a=old.a+2;    end;  }} {1 {cannot create INSTEAD OF trigger on table: main.t1}}ifcapable view {# Ensure that we cannot create BEFORE triggers on viewsdo_test trigger1-1.13 {  catchsql {    create view v1 as select * from t1;    create trigger v1t before update on v1 for each row begin      delete from t1 WHERE a=old.a+2;    end;  }} {1 {cannot create BEFORE trigger on view: main.v1}}# Ensure that we cannot create AFTER triggers on viewsdo_test trigger1-1.14 {  catchsql {    drop view v1;    create view v1 as select * from t1;    create trigger v1t AFTER update on v1 for each row begin      delete from t1 WHERE a=old.a+2;    end;  }} {1 {cannot create AFTER trigger on view: main.v1}}} ;# ifcapable view# Check for memory leaks in the trigger parser#do_test trigger1-2.1 {  catchsql {    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN      SELECT * FROM;  -- Syntax error    END;  }} {1 {near ";": syntax error}}do_test trigger1-2.2 {  catchsql {    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN      SELECT * FROM t1;      SELECT * FROM;  -- Syntax error    END;  }} {1 {near ";": syntax error}}# Create a trigger that refers to a table that might not exist.#ifcapable tempdb {  do_test trigger1-3.1 {    execsql {      CREATE TEMP TABLE t2(x,y);    }    catchsql {      CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN        INSERT INTO t2 VALUES(NEW.a,NEW.b);      END;    }  } {0 {}}  do_test trigger-3.2 {    catchsql {      INSERT INTO t1 VALUES(1,2);      SELECT * FROM t2;    }  } {1 {no such table: main.t2}}  do_test trigger-3.3 {    db close    set rc [catch {sqlite3 db test.db} err]    if {$rc} {lappend rc $err}    set rc  } {0}  do_test trigger-3.4 {    catchsql {      INSERT INTO t1 VALUES(1,2);      SELECT * FROM t2;    }  } {1 {no such table: main.t2}}  do_test trigger-3.5 {    catchsql {      CREATE TEMP TABLE t2(x,y);      INSERT INTO t1 VALUES(1,2);      SELECT * FROM t2;    }  } {1 {no such table: main.t2}}  do_test trigger-3.6 {    catchsql {      DROP TRIGGER r1;      CREATE TEMP TRIGGER r1 AFTER INSERT ON t1 BEGIN        INSERT INTO t2 VALUES(NEW.a,NEW.b);      END;      INSERT INTO t1 VALUES(1,2);      SELECT * FROM t2;    }  } {0 {1 2}}  do_test trigger-3.7 {    execsql {      DROP TABLE t2;      CREATE TABLE t2(x,y);      SELECT * FROM t2;    }  } {}  # There are two versions of trigger-3.8 and trigger-3.9. One that uses  # compound SELECT statements, and another that does not.  ifcapable compound {  do_test trigger1-3.8 {    execsql {      INSERT INTO t1 VALUES(3,4);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -