Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a crash that could occur if the WHERE clause of an UPDATE statement on a view that does not feature a column named "rowid" contains a term such as "rowid=?". |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
8523670d50004f3112b7871f11c8b8b0 |
User & Date: | dan 2014-10-28 16:50:10.527 |
References
2014-10-29
| ||
01:26 | Fix problems with running UPDATE and DELETE against a VIEW and referencing the rowid in the WHERE clause. This is a cherrypick of [95f8ebdbf87326f2] and [8523670d50004f3]. (check-in: cc33e846c8 user: drh tags: branch-3.8.7) | |
Context
2014-10-29
| ||
01:26 | Fix problems with running UPDATE and DELETE against a VIEW and referencing the rowid in the WHERE clause. This is a cherrypick of [95f8ebdbf87326f2] and [8523670d50004f3]. (check-in: cc33e846c8 user: drh tags: branch-3.8.7) | |
2014-10-28
| ||
18:24 | Modify the documentation for sqlite3_changes() to make it more testable. Add tests and minor fixes for the same. (check-in: 41cdd0c422 user: dan tags: trunk) | |
16:50 | Fix a crash that could occur if the WHERE clause of an UPDATE statement on a view that does not feature a column named "rowid" contains a term such as "rowid=?". (check-in: 8523670d50 user: dan tags: trunk) | |
16:19 | Fix a faulty assert() in the DELETE code generator. (check-in: 95f8ebdbf8 user: drh tags: trunk) | |
Changes
Changes to src/update.c.
︙ | ︙ | |||
427 428 429 430 431 432 433 | } sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, iBaseCur, aToOpen, 0, 0); } /* Top of the update loop */ if( okOnePass ){ | | | | 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 | } sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, iBaseCur, aToOpen, 0, 0); } /* Top of the update loop */ if( okOnePass ){ if( aToOpen[iDataCur-iBaseCur] && !isView ){ assert( pPk ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey); VdbeCoverageNeverTaken(v); } labelContinue = labelBreak; sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); VdbeCoverageIf(v, pPk==0); VdbeCoverageIf(v, pPk!=0); |
︙ | ︙ |
Changes to test/trigger9.test.
︙ | ︙ | |||
28 29 30 31 32 33 34 35 36 37 38 39 40 41 | set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable {!trigger} { finish_test return } proc has_rowdata {sql} { expr {[lsearch [execsql "explain $sql"] RowData]>=0} } do_test trigger9-1.1 { execsql { | > | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable {!trigger} { finish_test return } set ::testprefix trigger9 proc has_rowdata {sql} { expr {[lsearch [execsql "explain $sql"] RowData]>=0} } do_test trigger9-1.1 { execsql { |
︙ | ︙ | |||
215 216 217 218 219 220 221 222 223 | END; UPDATE v1 SET b = 'hello'; SELECT * FROM t2; ROLLBACK; } } {2} } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 | END; UPDATE v1 SET b = 'hello'; SELECT * FROM t2; ROLLBACK; } } {2} } reset_db do_execsql_test 4.1 { CREATE TABLE t1(a, b); CREATE TABLE log(x); INSERT INTO t1 VALUES(1, 2); INSERT INTO t1 VALUES(3, 4); CREATE VIEW v1 AS SELECT a, b FROM t1; CREATE TRIGGER tr1 INSTEAD OF DELETE ON v1 BEGIN INSERT INTO log VALUES('delete'); END; CREATE TRIGGER tr2 INSTEAD OF UPDATE ON v1 BEGIN INSERT INTO log VALUES('update'); END; CREATE TRIGGER tr3 INSTEAD OF INSERT ON v1 BEGIN INSERT INTO log VALUES('insert'); END; } do_execsql_test 4.2 { DELETE FROM v1 WHERE rowid=1; } {} do_execsql_test 4.3 { UPDATE v1 SET a=b WHERE rowid=2; } {} finish_test |