Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix some problems similar to #2832, but caused by triggers instead of an OR REPLACE clause. (CVS 4615) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
ee98ae17187296f7b0181c3d4d2b942d |
User & Date: | danielk1977 2007-12-12 16:06:23.000 |
Context
2007-12-12
| ||
17:19 | Remove a couple of lines in delete.c that weren't doing anything. (CVS 4616) (check-in: 86332c79ae user: danielk1977 tags: trunk) | |
16:06 | Fix some problems similar to #2832, but caused by triggers instead of an OR REPLACE clause. (CVS 4615) (check-in: ee98ae1718 user: danielk1977 tags: trunk) | |
14:46 | Test file containing minimal example of bug #2832. (CVS 4614) (check-in: ed2e61a9fa user: danielk1977 tags: trunk) | |
Changes
Changes to src/delete.c.
︙ | ︙ | |||
8 9 10 11 12 13 14 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** in order to generate code for DELETE FROM statements. ** | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** in order to generate code for DELETE FROM statements. ** ** $Id: delete.c,v 1.132 2007/12/12 16:06:23 danielk1977 Exp $ */ #include "sqliteInt.h" /* ** Look up every table that is named in pSrc. If any table is not found, ** add an error message to pParse->zErrMsg and return NULL. If all tables ** are found, return a pointer to the last table. |
︙ | ︙ | |||
279 280 281 282 283 284 285 | if( triggers_exist ){ int mem1 = pParse->nMem++; addr = sqlite3VdbeAddOp(v, OP_FifoRead, 0, end); sqlite3VdbeAddOp(v, OP_MemStore, mem1, 0); if( !isView ){ sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); } | | | 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 | if( triggers_exist ){ int mem1 = pParse->nMem++; addr = sqlite3VdbeAddOp(v, OP_FifoRead, 0, end); sqlite3VdbeAddOp(v, OP_MemStore, mem1, 0); if( !isView ){ sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); } sqlite3VdbeAddOp(v, OP_NotExists, iCur, addr); sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); sqlite3VdbeAddOp(v, OP_RowData, iCur, 0); sqlite3VdbeAddOp(v, OP_Insert, oldIdx, 0); if( !isView ){ sqlite3VdbeAddOp(v, OP_Close, iCur, 0); } |
︙ | ︙ |
Changes to src/update.c.
︙ | ︙ | |||
8 9 10 11 12 13 14 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle UPDATE statements. ** | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle UPDATE statements. ** ** $Id: update.c,v 1.144 2007/12/12 16:06:23 danielk1977 Exp $ */ #include "sqliteInt.h" #ifndef SQLITE_OMIT_VIRTUALTABLE /* Forward declaration */ static void updateVirtualTable( Parse *pParse, /* The parsing context */ |
︙ | ︙ | |||
336 337 338 339 340 341 342 | if( !isView ){ /* Open a cursor and make it point to the record that is ** being updated. */ sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); } | | | 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 | if( !isView ){ /* Open a cursor and make it point to the record that is ** being updated. */ sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); } sqlite3VdbeAddOp(v, OP_NotExists, iCur, addr); /* Generate the OLD table */ sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); sqlite3VdbeAddOp(v, OP_RowData, iCur, 0); sqlite3VdbeAddOp(v, OP_Insert, oldIdx, 0); |
︙ | ︙ |
Changes to test/tkt2832.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2007 Dec 12 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # # This file is to test that ticket #2832 has been fixed. # | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | # 2007 Dec 12 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # # This file is to test that ticket #2832 has been fixed. # # $Id: tkt2832.test,v 1.2 2007/12/12 16:06:23 danielk1977 Exp $ # set testdir [file dirname $argv0] source $testdir/tester.tcl do_test tkt2832-1.1 { execsql { CREATE TABLE t1(a PRIMARY KEY); INSERT INTO t1 VALUES(2); INSERT INTO t1 VALUES(1); INSERT INTO t1 VALUES(3); } } {} do_test tkt2832-1.2 { execsql { UPDATE OR REPLACE t1 SET a = 1; SELECT * FROM t1; } } {1} do_test tkt2832-2.1 { execsql { CREATE TABLE t2(a, b); CREATE TRIGGER t2_t AFTER UPDATE ON t2 BEGIN DELETE FROM t2 WHERE a = new.a + 1; END; INSERT INTO t2 VALUES(1, 2); INSERT INTO t2 VALUES(2, 3); } } {} do_test tkt2832-2.2 { execsql { UPDATE t2 SET b = 5 } } {} do_test tkt2832-3.1 { execsql { CREATE TABLE t3(a, b); CREATE TRIGGER t3_t AFTER DELETE ON t3 BEGIN DELETE FROM t3 WHERE a = old.a + 1; END; INSERT INTO t3 VALUES(1, 2); INSERT INTO t3 VALUES(2, 3); } } {} do_test tkt2832-3.2 { explain { DELETE FROM t3 WHERE 1 } execsql { DELETE FROM t3 WHERE 1 } } {} finish_test |