Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Merge latest trunk changes with experimental branch. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | experimental |
Files: | files | file ages | folders |
SHA1: |
e56be74eabc03d1a524d96aa4e87102d |
User & Date: | dan 2011-07-01 18:43:13.469 |
Context
2011-07-02
| ||
06:44 | Fix a broken assert() in where.c. (Closed-Leaf check-in: 090b29177f user: dan tags: experimental) | |
2011-07-01
| ||
18:43 | Merge latest trunk changes with experimental branch. (check-in: e56be74eab user: dan tags: experimental) | |
18:26 | Improve use of indexes to optimize DISTINCT queries. (check-in: 6c202ea024 user: dan tags: experimental) | |
14:22 | Test case for ticket [d6ddba6706353915ceed] (check-in: 953e169e8a user: drh tags: trunk) | |
Changes
Changes to src/trigger.c.
︙ | ︙ | |||
113 114 115 116 117 118 119 120 121 122 123 124 125 | }else{ /* Figure out the db that the the trigger will be created in */ iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); if( iDb<0 ){ goto trigger_cleanup; } } /* If the trigger name was unqualified, and the table is a temp table, ** then set iDb to 1 to create the trigger in the temporary database. ** If sqlite3SrcListLookup() returns 0, indicating the table does not ** exist, the error is caught by the block below. */ | > > > > > > > > > > > > > > > > < < < | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | }else{ /* Figure out the db that the the trigger will be created in */ iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); if( iDb<0 ){ goto trigger_cleanup; } } if( !pTableName || db->mallocFailed ){ goto trigger_cleanup; } /* A long-standing parser bug is that this syntax was allowed: ** ** CREATE TRIGGER attached.demo AFTER INSERT ON attached.tab .... ** ^^^^^^^^ ** ** To maintain backwards compatibility, ignore the database ** name on pTableName if we are reparsing our of SQLITE_MASTER. */ if( db->init.busy && iDb!=1 ){ sqlite3DbFree(db, pTableName->a[0].zDatabase); pTableName->a[0].zDatabase = 0; } /* If the trigger name was unqualified, and the table is a temp table, ** then set iDb to 1 to create the trigger in the temporary database. ** If sqlite3SrcListLookup() returns 0, indicating the table does not ** exist, the error is caught by the block below. */ pTab = sqlite3SrcListLookup(pParse, pTableName); if( db->init.busy==0 && pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){ iDb = 1; } /* Ensure the table name matches database name and that the table exists */ |
︙ | ︙ |
Changes to test/triggerD.test.
︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #*********************************************************************** # # Verify that when columns named "rowid", "oid", and "_rowid_" appear # in a table as ordinary columns (not as the INTEGER PRIMARY KEY) then # the use of these columns in triggers will refer to the column and not # to the actual ROWID. Ticket [34d2ae1c6d08b5271ba5e5592936d4a1d913ffe3] # set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable {!trigger} { finish_test return } | > > > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #*********************************************************************** # # Verify that when columns named "rowid", "oid", and "_rowid_" appear # in a table as ordinary columns (not as the INTEGER PRIMARY KEY) then # the use of these columns in triggers will refer to the column and not # to the actual ROWID. Ticket [34d2ae1c6d08b5271ba5e5592936d4a1d913ffe3] # # Also, verify that triggers created like this: # # CREATE TRIGGER attached.trig AFTER INSERT ON attached.tab ... # # can be reparsed as a main database. Ticket [d6ddba6706353915ceedc56b4e3] # set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable {!trigger} { finish_test return } |
︙ | ︙ | |||
166 167 168 169 170 171 172 173 174 | END; INSERT INTO main.t300 VALUES(3); INSERT INTO temp.t300 VALUES(4); SELECT * FROM t301; } } {10003 20004} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | END; INSERT INTO main.t300 VALUES(3); INSERT INTO temp.t300 VALUES(4); SELECT * FROM t301; } } {10003 20004} ############################################################################# # # Ticket [d6ddba6706353915ceedc56b4e3e72ecb4d77ba4] # # The following syntax really should not be allowed: # # CREATE TRIGGER xyz.trig BEFORE UPDATE ON xyz.tab BEGIN ... # # But a long-standing bug does allow it. And the "xyz.tab" slips into # the sqlite_master table. We cannot fix the bug simply by disallowing # "xyz.tab" since that could break legacy applications. We have to # fix the system so that the "xyz." on "xyz.tab" is ignored. # Verify that this is the case. # do_test triggerD-4.1 { db close file delete -force test.db test2.db sqlite3 db test.db db eval { CREATE TABLE t1(x); ATTACH 'test2.db' AS db2; CREATE TABLE db2.t2(y); CREATE TABLE db2.log(z); CREATE TRIGGER db2.trig AFTER INSERT ON db2.t2 BEGIN INSERT INTO log(z) VALUES(new.y); END; INSERT INTO t2 VALUES(123); SELECT * FROM log; } } {123} do_test triggerD-4.2 { sqlite3 db2 test2.db db2 eval { INSERT INTO t2 VALUES(234); SELECT * FROM log; } } {123 234} db2 close finish_test |