Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | For SQLITE_ENABLE_PREUPDATE_HOOK builds, disable the optimization for a REPLACE command on a WITHOUT ROWID table with no indexes, triggers or foreign key constraints that causes SQLite to clobber any existing row without separately checking for it. This optimization causes SQLite to omit the expected pre-update-hook callbacks. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
6281ef974c0ac7a7133c9e1e04c09fdb |
User & Date: | dan 2019-01-07 15:57:35 |
Context
2019-01-07
| ||
16:52 | Fix another potential buffer overread in fts5. (check-in: d0e943d9 user: dan tags: trunk) | |
15:57 | For SQLITE_ENABLE_PREUPDATE_HOOK builds, disable the optimization for a REPLACE command on a WITHOUT ROWID table with no indexes, triggers or foreign key constraints that causes SQLite to clobber any existing row without separately checking for it. This optimization causes SQLite to omit the expected pre-update-hook callbacks. (check-in: 6281ef97 user: dan tags: trunk) | |
2019-01-06
| ||
02:06 | The page size becomes fixed as soon as page1 from a non-empty database file is read. (check-in: 6064584d user: drh tags: trunk) | |
Changes
Changes to ext/session/sessionwor.test.
︙ | ︙ | |||
26 27 28 29 30 31 32 | catch { db close } catch { db2 close } forcedelete test.db test.db2 sqlite3 db test.db sqlite3 db2 test.db2 } | | | | > > | > | | | | | | | | | | | | | | > > > > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | catch { db close } catch { db2 close } forcedelete test.db test.db2 sqlite3 db test.db sqlite3 db2 test.db2 } foreach {tn wo} { 1 "" 2 "WITHOUT ROWID" } { reset_db do_execsql_test 1.$tn.0 "CREATE TABLE t1(a PRIMARY KEY, b) $wo ;" do_iterator_test 1.$tn.1 t1 { INSERT INTO t1 VALUES('one', 'two'); } { {INSERT t1 0 X. {} {t one t two}} } do_iterator_test 1.$tn.2 t1 { UPDATE t1 SET b='three' } { {UPDATE t1 0 X. {t one t two} {{} {} t three}} } do_iterator_test 1.$tn.3 t1 { REPLACE INTO t1 VALUES('one', 'four'); } { {UPDATE t1 0 X. {t one t three} {{} {} t four}} } do_iterator_test 1.$tn.4 t1 { DELETE FROM t1; } { {DELETE t1 0 X. {t one t four} {}} } } foreach {tn wo} { 1 "" 2 "WITHOUT ROWID" } { reset_db do_execsql_test 2.$tn.0 "CREATE TABLE t1(a INTEGER PRIMARY KEY, b) $wo ;" do_iterator_test 1.1 t1 { INSERT INTO t1 VALUES(1, 'two'); } { {INSERT t1 0 X. {} {i 1 t two}} } do_iterator_test 2.$tn.2 t1 { UPDATE t1 SET b='three' } { {UPDATE t1 0 X. {i 1 t two} {{} {} t three}} } do_iterator_test 2.$tn.3 t1 { REPLACE INTO t1 VALUES(1, 'four'); } { {UPDATE t1 0 X. {i 1 t three} {{} {} t four}} } do_iterator_test 2.$tn.4 t1 { DELETE FROM t1; } { {DELETE t1 0 X. {i 1 t four} {}} } } finish_test |
Changes to src/insert.c.
︙ | ︙ | |||
1708 1709 1710 1711 1712 1713 1714 | /* Collision detection may be omitted if all of the following are true: ** (1) The conflict resolution algorithm is REPLACE ** (2) The table is a WITHOUT ROWID table ** (3) There are no secondary indexes on the table ** (4) No delete triggers need to be fired if there is a conflict ** (5) No FK constraint counters need to be updated if a conflict occurs. | | > > > > > | 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 | /* Collision detection may be omitted if all of the following are true: ** (1) The conflict resolution algorithm is REPLACE ** (2) The table is a WITHOUT ROWID table ** (3) There are no secondary indexes on the table ** (4) No delete triggers need to be fired if there is a conflict ** (5) No FK constraint counters need to be updated if a conflict occurs. ** ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row ** must be explicitly deleted in order to ensure any pre-update hook ** is invoked. */ #ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ && onError==OE_Replace /* Condition 1 */ && ( 0==(db->flags&SQLITE_RecTriggers) || /* Condition 4 */ 0==sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0)) && ( 0==(db->flags&SQLITE_ForeignKeys) || /* Condition 5 */ (0==pTab->pFKey && 0==sqlite3FkReferences(pTab))) ){ sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; } #endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ /* Check to see if the new index entry will be unique */ sqlite3VdbeVerifyAbortable(v, onError); sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, regIdx, pIdx->nKeyCol); VdbeCoverage(v); /* Generate code to handle collisions */ |
︙ | ︙ |