Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Ensure that the xSavepoint() virtual table method is correctly invoked if there are already open savepoints (or statement transactions) the first time a virtual table is written within a transaction. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
77948b5eceab92a77c39d0864ac15ad4 |
User & Date: | dan 2015-09-29 16:41:23.689 |
References
2016-08-02
| ||
11:29 | Fix a problem introduced by [77948b5eceab92a7] causing duplicate calls to be made to the xSavepoint() method of virtual tables under some circumstances. (check-in: e64a4173d2 user: dan tags: trunk) | |
Context
2015-09-29
| ||
16:47 | Add the sqlite3_index_info.idxFlags field, allowing xBestIndex() implementations to specify to SQLite that a strategy may visit at most one row. Add support for this to fts3/4. Omit the statement journal from virtual table UPDATE and DELETE operations that are guaranteed not to affect more than one row. (check-in: a1d08fd3d0 user: dan tags: trunk) | |
16:41 | Ensure that the xSavepoint() virtual table method is correctly invoked if there are already open savepoints (or statement transactions) the first time a virtual table is written within a transaction. (check-in: 77948b5ece user: dan tags: trunk) | |
12:19 | Fix an off-by-one error in test function fts5_decode(). (check-in: 3a9f076250 user: dan tags: trunk) | |
Changes
Changes to src/vtab.c.
︙ | ︙ | |||
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 | /* Invoke the xBegin method. If successful, add the vtab to the ** sqlite3.aVTrans[] array. */ rc = growVTrans(db); if( rc==SQLITE_OK ){ rc = pModule->xBegin(pVTab->pVtab); if( rc==SQLITE_OK ){ addToVTrans(db, pVTab); } } } return rc; } /* | > > | 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 | /* Invoke the xBegin method. If successful, add the vtab to the ** sqlite3.aVTrans[] array. */ rc = growVTrans(db); if( rc==SQLITE_OK ){ rc = pModule->xBegin(pVTab->pVtab); if( rc==SQLITE_OK ){ int iSvpt = db->nStatement + db->nSavepoint; addToVTrans(db, pVTab); if( iSvpt ) rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, iSvpt-1); } } } return rc; } /* |
︙ | ︙ |
Changes to test/fts3conf.test.
︙ | ︙ | |||
173 174 175 176 177 178 179 180 181 | SELECT docid FROM t3; } {3 4 5} do_execsql_test 3.8 { UPDATE OR REPLACE t3 SET docid = 5, content='three four' WHERE docid = 4; SELECT quote(matchinfo(t3, 'na')) FROM t3 WHERE t3 MATCH 'one' } {X'0200000002000000'} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | SELECT docid FROM t3; } {3 4 5} do_execsql_test 3.8 { UPDATE OR REPLACE t3 SET docid = 5, content='three four' WHERE docid = 4; SELECT quote(matchinfo(t3, 'na')) FROM t3 WHERE t3 MATCH 'one' } {X'0200000002000000'} #------------------------------------------------------------------------- # Test that the xSavepoint is invoked correctly if the first write # operation within a transaction is to a virtual table. # do_catchsql_test 4.1.1 { CREATE VIRTUAL TABLE t0 USING fts4; BEGIN; INSERT INTO t0(rowid, content) SELECT 1, 'abc' UNION ALL SELECT 2, 'def' UNION ALL SELECT 1, 'ghi'; } {1 {constraint failed}} do_execsql_test 4.1.2 { COMMIT; } do_execsql_test 4.1.3 { SELECT * FROM t0 WHERE t0 MATCH 'abc'; INSERT INTO t0(t0) VALUES('integrity-check'); } {} do_execsql_test 4.2.1 { CREATE VIRTUAL TABLE t01 USING fts4; BEGIN; SAVEPOINT abc; INSERT INTO t01 VALUES('a b c'); ROLLBACK TO abc; COMMIT; } do_execsql_test 4.2.2 { SELECT * FROM t01 WHERE t01 MATCH 'b'; INSERT INTO t01(t01) VALUES('integrity-check'); } {} finish_test |