Annotation of embedaddon/sqlite3/test/triggerA.test, revision 1.1.1.1

1.1       misho       1: # 2008 February 12
                      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 issues relating to firing an INSTEAD OF trigger on a VIEW
                     13: # when one tries to UPDATE or DELETE from the view.  Does the WHERE
                     14: # clause of the UPDATE or DELETE statement get passed down correctly 
                     15: # into the query that manifests the view?
                     16: #
                     17: # Ticket #2938
                     18: #
                     19: 
                     20: set testdir [file dirname $argv0]
                     21: source $testdir/tester.tcl
                     22: ifcapable !trigger||!compound {
                     23:   finish_test
                     24:   return
                     25: }
                     26: 
                     27: # Create two table containing some sample data
                     28: #
                     29: do_test triggerA-1.1 {
                     30:   db eval {
                     31:     CREATE TABLE t1(x INTEGER PRIMARY KEY, y TEXT UNIQUE);
                     32:     CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER UNIQUE, c TEXT);
                     33:   }
                     34:   set i 1
                     35:   foreach word {one two three four five six seven eight nine ten} {
                     36:     set j [expr {$i*100 + [string length $word]}]
                     37:     db eval {
                     38:        INSERT INTO t1 VALUES($i,$word);
                     39:        INSERT INTO t2 VALUES(20-$i,$j,$word);
                     40:     }
                     41:     incr i
                     42:   }
                     43:   db eval {
                     44:     SELECT count(*) FROM t1 UNION ALL SELECT count(*) FROM t2;
                     45:   }
                     46: } {10 10}
                     47: 
                     48: # Create views of various forms against one or both of the two tables.
                     49: #
                     50: do_test triggerA-1.2 {
                     51:   db eval {
                     52:      CREATE VIEW v1 AS SELECT y, x FROM t1;
                     53:      SELECT * FROM v1 ORDER BY 1;
                     54:   }
                     55: } {eight 8 five 5 four 4 nine 9 one 1 seven 7 six 6 ten 10 three 3 two 2}
                     56: do_test triggerA-1.3 {
                     57:   db eval {
                     58:      CREATE VIEW v2 AS SELECT x, y FROM t1 WHERE y GLOB '*e*';
                     59:      SELECT * FROM v2 ORDER BY 1;
                     60:   }
                     61: } {1 one 3 three 5 five 7 seven 8 eight 9 nine 10 ten}
                     62: do_test triggerA-1.4 {
                     63:   db eval {
                     64:      CREATE VIEW v3 AS
                     65:        SELECT CAST(x AS TEXT) AS c1 FROM t1 UNION SELECT y FROM t1;
                     66:      SELECT * FROM v3 ORDER BY c1;
                     67:   }
                     68: } {1 10 2 3 4 5 6 7 8 9 eight five four nine one seven six ten three two}
                     69: do_test triggerA-1.5 {
                     70:   db eval {
                     71:      CREATE VIEW v4 AS
                     72:         SELECT CAST(x AS TEXT) AS c1 FROM t1
                     73:         UNION SELECT y FROM t1 WHERE x BETWEEN 3 and 5;
                     74:      SELECT * FROM v4 ORDER BY 1;
                     75:   }
                     76: } {1 10 2 3 4 5 6 7 8 9 five four three}
                     77: do_test triggerA-1.6 {
                     78:   db eval {
                     79:      CREATE VIEW v5 AS SELECT x, b FROM t1, t2 WHERE y=c;
                     80:      SELECT * FROM v5 ORDER BY x DESC;
                     81:   }
                     82: } {10 1003 9 904 8 805 7 705 6 603 5 504 4 404 3 305 2 203 1 103}
                     83: 
                     84: # Create INSTEAD OF triggers on the views.  Run UPDATE and DELETE statements
                     85: # using those triggers.  Verify correct operation.
                     86: #
                     87: do_test triggerA-2.1 {
                     88:   db eval {
                     89:      CREATE TABLE result2(a,b);
                     90:      CREATE TRIGGER r1d INSTEAD OF DELETE ON v1 BEGIN
                     91:        INSERT INTO result2(a,b) VALUES(old.y, old.x);
                     92:      END;
                     93:      DELETE FROM v1 WHERE x=5;
                     94:      SELECT * FROM result2;
                     95:   }
                     96: } {five 5}
                     97: do_test triggerA-2.2 {
                     98:   db eval {
                     99:      CREATE TABLE result4(a,b,c,d);
                    100:      CREATE TRIGGER r1u INSTEAD OF UPDATE ON v1 BEGIN
                    101:        INSERT INTO result4(a,b,c,d) VALUES(old.y, old.x, new.y, new.x);
                    102:      END;
                    103:      UPDATE v1 SET y=y||'-extra' WHERE x BETWEEN 3 AND 5;
                    104:      SELECT * FROM result4 ORDER BY a;
                    105:   }
                    106: } {five 5 five-extra 5 four 4 four-extra 4 three 3 three-extra 3}
                    107: 
                    108: 
                    109: do_test triggerA-2.3 {
                    110:   db eval {
                    111:      DELETE FROM result2;
                    112:      CREATE TRIGGER r2d INSTEAD OF DELETE ON v2 BEGIN
                    113:        INSERT INTO result2(a,b) VALUES(old.y, old.x);
                    114:      END;
                    115:      DELETE FROM v2 WHERE x=5;
                    116:      SELECT * FROM result2;
                    117:   }
                    118: } {five 5}
                    119: do_test triggerA-2.4 {
                    120:   db eval {
                    121:      DELETE FROM result4;
                    122:      CREATE TRIGGER r2u INSTEAD OF UPDATE ON v2 BEGIN
                    123:        INSERT INTO result4(a,b,c,d) VALUES(old.y, old.x, new.y, new.x);
                    124:      END;
                    125:      UPDATE v2 SET y=y||'-extra' WHERE x BETWEEN 3 AND 5;
                    126:      SELECT * FROM result4 ORDER BY a;
                    127:   }
                    128: } {five 5 five-extra 5 three 3 three-extra 3}
                    129: 
                    130: 
                    131: do_test triggerA-2.5 {
                    132:   db eval {
                    133:      CREATE TABLE result1(a);
                    134:      CREATE TRIGGER r3d INSTEAD OF DELETE ON v3 BEGIN
                    135:        INSERT INTO result1(a) VALUES(old.c1);
                    136:      END;
                    137:      DELETE FROM v3 WHERE c1 BETWEEN '8' AND 'eight';
                    138:      SELECT * FROM result1 ORDER BY a;
                    139:   }
                    140: } {8 9 eight}
                    141: do_test triggerA-2.6 {
                    142:   db eval {
                    143:      DELETE FROM result2;
                    144:      CREATE TRIGGER r3u INSTEAD OF UPDATE ON v3 BEGIN
                    145:        INSERT INTO result2(a,b) VALUES(old.c1, new.c1);
                    146:      END;
                    147:      UPDATE v3 SET c1 = c1 || '-extra' WHERE c1 BETWEEN '8' and 'eight';
                    148:      SELECT * FROM result2 ORDER BY a;
                    149:   }
                    150: } {8 8-extra 9 9-extra eight eight-extra}
                    151: 
                    152: 
                    153: do_test triggerA-2.7 {
                    154:   db eval {
                    155:      DELETE FROM result1;
                    156:      CREATE TRIGGER r4d INSTEAD OF DELETE ON v4 BEGIN
                    157:        INSERT INTO result1(a) VALUES(old.c1);
                    158:      END;
                    159:      DELETE FROM v4 WHERE c1 BETWEEN '8' AND 'eight';
                    160:      SELECT * FROM result1 ORDER BY a;
                    161:   }
                    162: } {8 9}
                    163: do_test triggerA-2.8 {
                    164:   db eval {
                    165:      DELETE FROM result2;
                    166:      CREATE TRIGGER r4u INSTEAD OF UPDATE ON v4 BEGIN
                    167:        INSERT INTO result2(a,b) VALUES(old.c1, new.c1);
                    168:      END;
                    169:      UPDATE v4 SET c1 = c1 || '-extra' WHERE c1 BETWEEN '8' and 'eight';
                    170:      SELECT * FROM result2 ORDER BY a;
                    171:   }
                    172: } {8 8-extra 9 9-extra}
                    173: 
                    174: 
                    175: do_test triggerA-2.9 {
                    176:   db eval {
                    177:      DELETE FROM result2;
                    178:      CREATE TRIGGER r5d INSTEAD OF DELETE ON v5 BEGIN
                    179:        INSERT INTO result2(a,b) VALUES(old.x, old.b);
                    180:      END;
                    181:      DELETE FROM v5 WHERE x=5;
                    182:      SELECT * FROM result2;
                    183:   }
                    184: } {5 504}
                    185: do_test triggerA-2.10 {
                    186:   db eval {
                    187:      DELETE FROM result4;
                    188:      CREATE TRIGGER r5u INSTEAD OF UPDATE ON v5 BEGIN
                    189:        INSERT INTO result4(a,b,c,d) VALUES(old.x, old.b, new.x, new.b);
                    190:      END;
                    191:      UPDATE v5 SET b = b+9900000 WHERE x BETWEEN 3 AND 5;
                    192:      SELECT * FROM result4 ORDER BY a;
                    193:   }
                    194: } {3 305 3 9900305 4 404 4 9900404 5 504 5 9900504}
                    195: 
                    196: # Only run the reamining tests if memory debugging is turned on.
                    197: #
                    198: ifcapable !memdebug {
                    199:    puts "Skipping triggerA malloc tests: not compiled with -DSQLITE_MEMDEBUG..."
                    200:    finish_test
                    201:    return
                    202: }
                    203: source $testdir/malloc_common.tcl
                    204: 
                    205: # Save a copy of the current database configuration.
                    206: #
                    207: db close
                    208: forcedelete test.db-triggerA
                    209: copy_file test.db test.db-triggerA
                    210: sqlite3 db test.db
                    211: 
                    212: # Run malloc tests on the INSTEAD OF trigger firing.
                    213: #
                    214: do_malloc_test triggerA-3 -tclprep {
                    215:   db close
                    216:   forcedelete test.db test.db-journal
                    217:   forcecopy test.db-triggerA test.db
                    218:   sqlite3 db test.db
                    219:   sqlite3_extended_result_codes db 1  
                    220:   db eval {SELECT * FROM v5; -- warm up the cache}
                    221: } -sqlbody {
                    222:    DELETE FROM v5 WHERE x=5;
                    223:    UPDATE v5 SET b=b+9900000 WHERE x BETWEEN 3 AND 5;
                    224: }
                    225: 
                    226: # Clean up the saved database copy.
                    227: #
                    228: forcedelete test.db-triggerA
                    229: 
                    230: finish_test

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