Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | In btree.c, save the positions of other cursors open on the same table when writing via an incremental blob handle. Otherwise, they may be left holding an out-of-date xFetch page reference. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | experimental-mmap |
Files: | files | file ages | folders |
SHA1: |
3f09fba18f7e61e21381ffea13c31b96 |
User & Date: | dan 2013-04-03 11:17:39.067 |
Context
2013-04-03
| ||
11:38 | When moving a page to make way for the root page of a new table or index in an auto-vacuum database, save the positions of any cursors that may be holding xFetch references to the page being moved. (check-in: 9d9b1da54a user: dan tags: experimental-mmap) | |
11:17 | In btree.c, save the positions of other cursors open on the same table when writing via an incremental blob handle. Otherwise, they may be left holding an out-of-date xFetch page reference. (check-in: 3f09fba18f user: dan tags: experimental-mmap) | |
10:50 | Initialize the mmap_limit of temporary files to the configured mmap_limit. (check-in: 24bab7596b user: drh tags: experimental-mmap) | |
Changes
Changes to src/btree.c.
︙ | ︙ | |||
8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 | if( rc!=SQLITE_OK ){ return rc; } assert( pCsr->eState!=CURSOR_REQUIRESEEK ); if( pCsr->eState!=CURSOR_VALID ){ return SQLITE_ABORT; } /* Check some assumptions: ** (a) the cursor is open for writing, ** (b) there is a read/write transaction open, ** (c) the connection holds a write-lock on the table (if required), ** (d) there are no conflicting read-locks, and ** (e) the cursor points at a valid row of an intKey table. | > > > > > > > > > | 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 | if( rc!=SQLITE_OK ){ return rc; } assert( pCsr->eState!=CURSOR_REQUIRESEEK ); if( pCsr->eState!=CURSOR_VALID ){ return SQLITE_ABORT; } /* Save the positions of all other cursors open on this table. This is ** required in case any of them are holding references to an xFetch ** version of the b-tree page modified by the accessPayload call below. */ rc = saveAllCursors(pCsr->pBt, pCsr->pgnoRoot, pCsr); if( rc!=SQLITE_OK ){ return SQLITE_OK; } /* Check some assumptions: ** (a) the cursor is open for writing, ** (b) there is a read/write transaction open, ** (c) the connection holds a write-lock on the table (if required), ** (d) there are no conflicting read-locks, and ** (e) the cursor points at a valid row of an intKey table. |
︙ | ︙ |
Changes to test/mmap1.test.
︙ | ︙ | |||
153 154 155 156 157 158 159 160 | db eval {SELECT * FROM t2 ORDER BY a, b} { if {$nRow==4} { db eval { DELETE FROM t1 } } incr nRow } set nRow } {8} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 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 | db eval {SELECT * FROM t2 ORDER BY a, b} { if {$nRow==4} { db eval { DELETE FROM t1 } } incr nRow } set nRow } {8} #------------------------------------------------------------------------- # Ensure that existing cursors using xFetch() pages see changes made # to rows using the incrblob API. # reset_db set aaa [string repeat a 400] set bbb [string repeat b 400] set ccc [string repeat c 400] set ddd [string repeat d 400] set eee [string repeat e 400] do_execsql_test 4.1 { PRAGMA page_size = 1024; CREATE TABLE t1(x); INSERT INTO t1 VALUES($aaa); INSERT INTO t1 VALUES($bbb); INSERT INTO t1 VALUES($ccc); INSERT INTO t1 VALUES($ddd); SELECT * FROM t1; BEGIN; } [list $aaa $bbb $ccc $ddd] do_test 4.2 { set ::STMT [sqlite3_prepare db "SELECT * FROM t1 ORDER BY rowid" -1 dummy] sqlite3_step $::STMT sqlite3_column_text $::STMT 0 } $aaa do_test 4.3 { foreach r {2 3 4} { set fd [db incrblob t1 x $r] puts -nonewline $fd $eee close $fd } set res [list] while {"SQLITE_ROW" == [sqlite3_step $::STMT]} { lappend res [sqlite3_column_text $::STMT 0] } set res } [list $eee $eee $eee] do_test 4.4 { sqlite3_finalize $::STMT } SQLITE_OK do_execsql_test 4.5 { COMMIT } finish_test |