Annotation of embedaddon/sqlite3/test/trigger9.test, revision 1.1

1.1     ! misho       1: # 2008 January 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: # This file implements regression tests for SQLite library. Specifically,
        !            12: # it tests some compiler optimizations for SQL statements featuring
        !            13: # triggers:
        !            14: #
        !            15: #
        !            16: #
        !            17: 
        !            18: # trigger9-1.* -   Test that if there are no references to OLD.* cols, or a
        !            19: #                  reference to only OLD.rowid, the data is not loaded.
        !            20: #
        !            21: # trigger9-2.* -   Test that for NEW.* records populated by UPDATE 
        !            22: #                  statements, unused fields are populated with NULL values. 
        !            23: #
        !            24: # trigger9-3.* -   Test that the temporary tables used for OLD.* references
        !            25: #                  in "INSTEAD OF" triggers have NULL values in unused 
        !            26: #                  fields.
        !            27: #
        !            28: 
        !            29: set testdir [file dirname $argv0]
        !            30: source $testdir/tester.tcl
        !            31: ifcapable {!trigger} {
        !            32:   finish_test
        !            33:   return
        !            34: }
        !            35: 
        !            36: proc has_rowdata {sql} {
        !            37:   expr {[lsearch [execsql "explain $sql"] RowData]>=0}
        !            38: }
        !            39: 
        !            40: do_test trigger9-1.1 {
        !            41:   execsql {
        !            42:     PRAGMA page_size = 1024;
        !            43:     CREATE TABLE t1(x, y, z);
        !            44:     INSERT INTO t1 VALUES('1', randstr(10000,10000), '2');
        !            45:     INSERT INTO t1 VALUES('2', randstr(10000,10000), '4');
        !            46:     INSERT INTO t1 VALUES('3', randstr(10000,10000), '6');
        !            47:     CREATE TABLE t2(x);
        !            48:   }
        !            49: } {}
        !            50: 
        !            51: do_test trigger9-1.2.1 {
        !            52:   execsql {
        !            53:     BEGIN;
        !            54:       CREATE TRIGGER trig1 BEFORE DELETE ON t1 BEGIN
        !            55:         INSERT INTO t2 VALUES(old.rowid);
        !            56:       END;
        !            57:       DELETE FROM t1;
        !            58:       SELECT * FROM t2;
        !            59:   }
        !            60: } {1 2 3}
        !            61: do_test trigger9-1.2.3 {
        !            62:   has_rowdata {DELETE FROM t1}
        !            63: } 0
        !            64: do_test trigger9-1.2.4 { execsql { ROLLBACK } } {}
        !            65: 
        !            66: do_test trigger9-1.3.1 {
        !            67:   execsql {
        !            68:     BEGIN;
        !            69:       CREATE TRIGGER trig1 BEFORE DELETE ON t1 BEGIN
        !            70:         INSERT INTO t2 VALUES(old.x);
        !            71:       END;
        !            72:       DELETE FROM t1;
        !            73:       SELECT * FROM t2;
        !            74:   }
        !            75: } {1 2 3}
        !            76: do_test trigger9-1.3.2 {
        !            77:   has_rowdata {DELETE FROM t1}
        !            78: } 0
        !            79: do_test trigger9-1.3.3 { execsql { ROLLBACK } } {}
        !            80: 
        !            81: do_test trigger9-1.4.1 {
        !            82:   execsql {
        !            83:     BEGIN;
        !            84:       CREATE TRIGGER trig1 BEFORE DELETE ON t1 WHEN old.x='1' BEGIN
        !            85:         INSERT INTO t2 VALUES(old.rowid);
        !            86:       END;
        !            87:       DELETE FROM t1;
        !            88:       SELECT * FROM t2;
        !            89:   }
        !            90: } {1}
        !            91: do_test trigger9-1.4.2 {
        !            92:   has_rowdata {DELETE FROM t1}
        !            93: } 0
        !            94: do_test trigger9-1.4.3 { execsql { ROLLBACK } } {}
        !            95: 
        !            96: do_test trigger9-1.5.1 {
        !            97:   execsql {
        !            98:     BEGIN;
        !            99:       CREATE TRIGGER trig1 BEFORE UPDATE ON t1 BEGIN
        !           100:         INSERT INTO t2 VALUES(old.rowid);
        !           101:       END;
        !           102:       UPDATE t1 SET y = '';
        !           103:       SELECT * FROM t2;
        !           104:   }
        !           105: } {1 2 3}
        !           106: do_test trigger9-1.5.2 {
        !           107:   has_rowdata {UPDATE t1 SET y = ''}
        !           108: } 0
        !           109: do_test trigger9-1.5.3 { execsql { ROLLBACK } } {}
        !           110: 
        !           111: do_test trigger9-1.6.1 {
        !           112:   execsql {
        !           113:     BEGIN;
        !           114:       CREATE TRIGGER trig1 BEFORE UPDATE ON t1 BEGIN
        !           115:         INSERT INTO t2 VALUES(old.x);
        !           116:       END;
        !           117:       UPDATE t1 SET y = '';
        !           118:       SELECT * FROM t2;
        !           119:   }
        !           120: } {1 2 3}
        !           121: do_test trigger9-1.6.2 {
        !           122:   has_rowdata {UPDATE t1 SET y = ''}
        !           123: } 0
        !           124: do_test trigger9-1.6.3 { execsql { ROLLBACK } } {}
        !           125: 
        !           126: do_test trigger9-1.7.1 {
        !           127:   execsql {
        !           128:     BEGIN;
        !           129:       CREATE TRIGGER trig1 BEFORE UPDATE ON t1 WHEN old.x>='2' BEGIN
        !           130:         INSERT INTO t2 VALUES(old.x);
        !           131:       END;
        !           132:       UPDATE t1 SET y = '';
        !           133:       SELECT * FROM t2;
        !           134:   }
        !           135: } {2 3}
        !           136: do_test trigger9-1.7.2 {
        !           137:   has_rowdata {UPDATE t1 SET y = ''}
        !           138: } 0
        !           139: do_test trigger9-1.7.3 { execsql { ROLLBACK } } {}
        !           140: 
        !           141: do_test trigger9-3.1 {
        !           142:   execsql {
        !           143:     CREATE TABLE t3(a, b);
        !           144:     INSERT INTO t3 VALUES(1, 'one');
        !           145:     INSERT INTO t3 VALUES(2, 'two');
        !           146:     INSERT INTO t3 VALUES(3, 'three');
        !           147:   }
        !           148: } {}
        !           149: do_test trigger9-3.2 {
        !           150:   execsql {
        !           151:     BEGIN;
        !           152:       CREATE VIEW v1 AS SELECT * FROM t3;
        !           153:       CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
        !           154:         INSERT INTO t2 VALUES(old.a);
        !           155:       END;
        !           156:       UPDATE v1 SET b = 'hello';
        !           157:       SELECT * FROM t2;
        !           158:     ROLLBACK;
        !           159:   }
        !           160: } {1 2 3}
        !           161: do_test trigger9-3.3 {
        !           162:   # In this test the 'c' column of the view is not required by
        !           163:   # the INSTEAD OF trigger, but the expression is reused internally as
        !           164:   # part of the view's WHERE clause. Check that this does not cause
        !           165:   # a problem.
        !           166:   #
        !           167:   execsql {
        !           168:     BEGIN;
        !           169:       CREATE VIEW v1 AS SELECT a, b AS c FROM t3 WHERE c > 'one';
        !           170:       CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
        !           171:         INSERT INTO t2 VALUES(old.a);
        !           172:       END;
        !           173:       UPDATE v1 SET c = 'hello';
        !           174:       SELECT * FROM t2;
        !           175:     ROLLBACK;
        !           176:   }
        !           177: } {2 3}
        !           178: do_test trigger9-3.4 {
        !           179:   execsql {
        !           180:     BEGIN;
        !           181:       INSERT INTO t3 VALUES(3, 'three');
        !           182:       INSERT INTO t3 VALUES(3, 'four');
        !           183:       CREATE VIEW v1 AS SELECT DISTINCT a, b FROM t3;
        !           184:       CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
        !           185:         INSERT INTO t2 VALUES(old.a);
        !           186:       END;
        !           187:       UPDATE v1 SET b = 'hello';
        !           188:       SELECT * FROM t2;
        !           189:     ROLLBACK;
        !           190:   }
        !           191: } {1 2 3 3}
        !           192: 
        !           193: ifcapable compound {
        !           194:   do_test trigger9-3.5 {
        !           195:     execsql {
        !           196:       BEGIN;
        !           197:         INSERT INTO t3 VALUES(1, 'uno');
        !           198:         CREATE VIEW v1 AS SELECT a, b FROM t3 EXCEPT SELECT 1, 'one';
        !           199:         CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
        !           200:           INSERT INTO t2 VALUES(old.a);
        !           201:         END;
        !           202:         UPDATE v1 SET b = 'hello';
        !           203:         SELECT * FROM t2;
        !           204:       ROLLBACK;
        !           205:     }
        !           206:   } {1 2 3}
        !           207:   do_test trigger9-3.6 {
        !           208:     execsql {
        !           209:       BEGIN;
        !           210:         INSERT INTO t3 VALUES(1, 'zero');
        !           211:         CREATE VIEW v1 AS 
        !           212:           SELECT sum(a) AS a, max(b) AS b FROM t3 GROUP BY t3.a HAVING b>'two';
        !           213:         CREATE TRIGGER trig1 INSTEAD OF UPDATE ON v1 BEGIN
        !           214:           INSERT INTO t2 VALUES(old.a);
        !           215:         END;
        !           216:         UPDATE v1 SET b = 'hello';
        !           217:         SELECT * FROM t2;
        !           218:       ROLLBACK;
        !           219:     }
        !           220:   } {2}
        !           221: }
        !           222: 
        !           223: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>