| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 # 2009 December 29 | 
|  | 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 # Verify that when columns named "rowid", "oid", and "_rowid_" appear | 
|  | 13 # in a table as ordinary columns (not as the INTEGER PRIMARY KEY) then | 
|  | 14 # the use of these columns in triggers will refer to the column and not | 
|  | 15 # to the actual ROWID.  Ticket [34d2ae1c6d08b5271ba5e5592936d4a1d913ffe3] | 
|  | 16 # | 
|  | 17 | 
|  | 18 set testdir [file dirname $argv0] | 
|  | 19 source $testdir/tester.tcl | 
|  | 20 ifcapable {!trigger} { | 
|  | 21   finish_test | 
|  | 22   return | 
|  | 23 } | 
|  | 24 | 
|  | 25 # Triggers on tables where the table has ordinary columns named | 
|  | 26 # rowid, oid, and _rowid_. | 
|  | 27 # | 
|  | 28 do_test triggerD-1.1 { | 
|  | 29   db eval { | 
|  | 30     CREATE TABLE t1(rowid, oid, _rowid_, x); | 
|  | 31     CREATE TABLE log(a,b,c,d,e); | 
|  | 32     CREATE TRIGGER r1 BEFORE INSERT ON t1 BEGIN | 
|  | 33       INSERT INTO log VALUES('r1', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 34     END; | 
|  | 35     CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN | 
|  | 36       INSERT INTO log VALUES('r2', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 37     END; | 
|  | 38     CREATE TRIGGER r3 BEFORE UPDATE ON t1 BEGIN | 
|  | 39       INSERT INTO log VALUES('r3.old', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 40       INSERT INTO log VALUES('r3.new', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 41     END; | 
|  | 42     CREATE TRIGGER r4 AFTER UPDATE ON t1 BEGIN | 
|  | 43       INSERT INTO log VALUES('r4.old', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 44       INSERT INTO log VALUES('r4.new', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 45     END; | 
|  | 46     CREATE TRIGGER r5 BEFORE DELETE ON t1 BEGIN | 
|  | 47       INSERT INTO log VALUES('r5', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 48     END; | 
|  | 49     CREATE TRIGGER r6 AFTER DELETE ON t1 BEGIN | 
|  | 50       INSERT INTO log VALUES('r6', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 51     END; | 
|  | 52   } | 
|  | 53 } {} | 
|  | 54 do_test triggerD-1.2 { | 
|  | 55   db eval { | 
|  | 56     INSERT INTO t1 VALUES(100,200,300,400); | 
|  | 57     SELECT * FROM log | 
|  | 58   } | 
|  | 59 } {r1 100 200 300 400 r2 100 200 300 400} | 
|  | 60 do_test triggerD-1.3 { | 
|  | 61   db eval { | 
|  | 62     DELETE FROM log; | 
|  | 63     UPDATE t1 SET rowid=rowid+1; | 
|  | 64     SELECT * FROM log | 
|  | 65   } | 
|  | 66 } {r3.old 100 200 300 400 r3.new 101 200 300 400 r4.old 100 200 300 400 r4.new 1
     01 200 300 400} | 
|  | 67 do_test triggerD-1.4 { | 
|  | 68   db eval { | 
|  | 69     DELETE FROM log; | 
|  | 70     DELETE FROM t1; | 
|  | 71     SELECT * FROM log | 
|  | 72   } | 
|  | 73 } {r5 101 200 300 400 r6 101 200 300 400} | 
|  | 74 | 
|  | 75 # Triggers on tables where the table does not have ordinary columns named | 
|  | 76 # rowid, oid, and _rowid_. | 
|  | 77 # | 
|  | 78 do_test triggerD-2.1 { | 
|  | 79   db eval { | 
|  | 80     DROP TABLE t1; | 
|  | 81     CREATE TABLE t1(w,x,y,z); | 
|  | 82     CREATE TRIGGER r1 BEFORE INSERT ON t1 BEGIN | 
|  | 83       INSERT INTO log VALUES('r1', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 84     END; | 
|  | 85     CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN | 
|  | 86       INSERT INTO log VALUES('r2', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 87     END; | 
|  | 88     CREATE TRIGGER r3 BEFORE UPDATE ON t1 BEGIN | 
|  | 89       INSERT INTO log VALUES('r3.old', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 90       INSERT INTO log VALUES('r3.new', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 91     END; | 
|  | 92     CREATE TRIGGER r4 AFTER UPDATE ON t1 BEGIN | 
|  | 93       INSERT INTO log VALUES('r4.old', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 94       INSERT INTO log VALUES('r4.new', new.rowid, new.oid, new._rowid_, new.x); | 
|  | 95     END; | 
|  | 96     CREATE TRIGGER r5 BEFORE DELETE ON t1 BEGIN | 
|  | 97       INSERT INTO log VALUES('r5', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 98     END; | 
|  | 99     CREATE TRIGGER r6 AFTER DELETE ON t1 BEGIN | 
|  | 100       INSERT INTO log VALUES('r6', old.rowid, old.oid, old._rowid_, old.x); | 
|  | 101     END; | 
|  | 102   } | 
|  | 103 } {} | 
|  | 104 do_test triggerD-2.2 { | 
|  | 105   db eval { | 
|  | 106     DELETE FROM log; | 
|  | 107     INSERT INTO t1 VALUES(100,200,300,400); | 
|  | 108     SELECT * FROM log; | 
|  | 109   } | 
|  | 110 } {r1 -1 -1 -1 200 r2 1 1 1 200} | 
|  | 111 do_test triggerD-2.3 { | 
|  | 112   db eval { | 
|  | 113     DELETE FROM log; | 
|  | 114     UPDATE t1 SET x=x+1; | 
|  | 115     SELECT * FROM log | 
|  | 116   } | 
|  | 117 } {r3.old 1 1 1 200 r3.new 1 1 1 201 r4.old 1 1 1 200 r4.new 1 1 1 201} | 
|  | 118 do_test triggerD-2.4 { | 
|  | 119   db eval { | 
|  | 120     DELETE FROM log; | 
|  | 121     DELETE FROM t1; | 
|  | 122     SELECT * FROM log | 
|  | 123   } | 
|  | 124 } {r5 1 1 1 201 r6 1 1 1 201} | 
|  | 125 | 
|  | 126 | 
|  | 127 ########################################################################### | 
|  | 128 # | 
|  | 129 # Ticket [985771e1161200ae5eac3162686ea6711c035d08]: | 
|  | 130 # | 
|  | 131 # When both a main database table and a TEMP table have the same name, | 
|  | 132 # and a main database trigge is created on the main table, the trigger | 
|  | 133 # is incorrectly bound to the TEMP table. For example: | 
|  | 134 # | 
|  | 135 #   CREATE TABLE t1(x); | 
|  | 136 #   CREATE TEMP TABLE t1(x); | 
|  | 137 #   CREATE TABLE t2(z); | 
|  | 138 #   CREATE TRIGGER main.r1 AFTER INSERT ON t1 BEGIN | 
|  | 139 #     INSERT INTO t2 VALUES(10000 + new.x); | 
|  | 140 #   END; | 
|  | 141 #   INSERT INTO main.t1 VALUES(3); | 
|  | 142 #   INSERT INTO temp.t1 VALUES(4); | 
|  | 143 #   SELECT * FROM t2; | 
|  | 144 # | 
|  | 145 # The r1 trigger fires when the value 4 is inserted into the temp.t1 | 
|  | 146 # table, rather than when value 3 is inserted into main.t1. | 
|  | 147 # | 
|  | 148 do_test triggerD-3.1 { | 
|  | 149   db eval { | 
|  | 150     CREATE TABLE t300(x); | 
|  | 151     CREATE TEMP TABLE t300(x); | 
|  | 152     CREATE TABLE t301(y); | 
|  | 153     CREATE TRIGGER main.r300 AFTER INSERT ON t300 BEGIN | 
|  | 154       INSERT INTO t301 VALUES(10000 + new.x); | 
|  | 155     END; | 
|  | 156     INSERT INTO main.t300 VALUES(3); | 
|  | 157     INSERT INTO temp.t300 VALUES(4); | 
|  | 158     SELECT * FROM t301; | 
|  | 159   } | 
|  | 160 } {10003} | 
|  | 161 do_test triggerD-3.2 { | 
|  | 162   db eval { | 
|  | 163     DELETE FROM t301; | 
|  | 164     CREATE TRIGGER temp.r301 AFTER INSERT ON t300 BEGIN | 
|  | 165       INSERT INTO t301 VALUES(20000 + new.x); | 
|  | 166     END; | 
|  | 167     INSERT INTO main.t300 VALUES(3); | 
|  | 168     INSERT INTO temp.t300 VALUES(4); | 
|  | 169     SELECT * FROM t301; | 
|  | 170   } | 
|  | 171 } {10003 20004} | 
|  | 172 | 
|  | 173 | 
|  | 174 finish_test | 
| OLD | NEW | 
|---|