File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / triggerA.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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>