Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem in fts3/4 that was causing it to discard data cached in-memory if an 'optimize' command is run when there is no data on disk. The usual way this would happen is if the very first transaction that writes to the fts3/4 table also includes an 'optimize' command. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
79338b991bf01e81d336790ca87a0fa7 |
User & Date: | dan 2016-03-09 18:17:42.821 |
Context
2016-03-09
| ||
20:54 | Add an incremental optimize capability to fts5. Make the 'merge' command independent of the 'automerge' settings. (check-in: 556671444c user: dan tags: trunk) | |
18:17 | Fix a problem in fts3/4 that was causing it to discard data cached in-memory if an 'optimize' command is run when there is no data on disk. The usual way this would happen is if the very first transaction that writes to the fts3/4 table also includes an 'optimize' command. (check-in: 79338b991b user: dan tags: trunk) | |
15:34 | Slight simplification to the query optimizer logic associated with IN (SELECT). (check-in: 2c55c3c295 user: drh tags: trunk) | |
Changes
Changes to ext/fts3/fts3_write.c.
︙ | ︙ | |||
3191 3192 3193 3194 3195 3196 3197 | } if( iLevel==FTS3_SEGCURSOR_ALL ){ /* This call is to merge all segments in the database to a single ** segment. The level of the new segment is equal to the numerically ** greatest segment level currently present in the database for this ** index. The idx of the new segment is always 0. */ | | | 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 | } if( iLevel==FTS3_SEGCURSOR_ALL ){ /* This call is to merge all segments in the database to a single ** segment. The level of the new segment is equal to the numerically ** greatest segment level currently present in the database for this ** index. The idx of the new segment is always 0. */ if( csr.nSegment==1 && 0==fts3SegReaderIsPending(csr.apSegment[0]) ){ rc = SQLITE_DONE; goto finished; } iNewLevel = iMaxLevel; bIgnoreEmpty = 1; }else{ |
︙ | ︙ |
Changes to test/fts4opt.test.
︙ | ︙ | |||
161 162 163 164 165 166 167 168 169 | } {33 1 1057 1 2081 1 3105 1} do_execsql_test 2.7 { INSERT INTO t2(t2) VALUES('integrity-check') } do_execsql_test 2.8 { INSERT INTO t2(words) SELECT words FROM t1; SELECT level, count(*) FROM t2_segdir GROUP BY level; } {0 2 1024 2 2048 2 3072 2} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 212 213 | } {33 1 1057 1 2081 1 3105 1} do_execsql_test 2.7 { INSERT INTO t2(t2) VALUES('integrity-check') } do_execsql_test 2.8 { INSERT INTO t2(words) SELECT words FROM t1; SELECT level, count(*) FROM t2_segdir GROUP BY level; } {0 2 1024 2 2048 2 3072 2} #------------------------------------------------------------------------- # Check that 'optimize' works when there is data in the in-memory hash # table, but no segments at all on disk. # do_execsql_test 3.1 { CREATE VIRTUAL TABLE fts USING fts4 (t); INSERT INTO fts (fts) VALUES ('optimize'); } do_execsql_test 3.2 { INSERT INTO fts(fts) VALUES('integrity-check'); SELECT count(*) FROM fts_segdir; } {0} do_execsql_test 3.3 { BEGIN; INSERT INTO fts (rowid, t) VALUES (2, 'test'); INSERT INTO fts (fts) VALUES ('optimize'); COMMIT; SELECT level, idx FROM fts_segdir; } {0 0} do_execsql_test 3.4 { INSERT INTO fts(fts) VALUES('integrity-check'); SELECT rowid FROM fts WHERE fts MATCH 'test'; } {2} do_execsql_test 3.5 { INSERT INTO fts (fts) VALUES ('optimize'); INSERT INTO fts(fts) VALUES('integrity-check'); } do_test 3.6 { set c1 [db total_changes] execsql { INSERT INTO fts (fts) VALUES ('optimize') } expr {[db total_changes] - $c1} } {1} do_test 3.7 { execsql { INSERT INTO fts (rowid, t) VALUES (3, 'xyz') } set c1 [db total_changes] execsql { INSERT INTO fts (fts) VALUES ('optimize') } expr {([db total_changes] - $c1) > 1} } {1} do_test 3.8 { set c1 [db total_changes] execsql { INSERT INTO fts (fts) VALUES ('optimize') } expr {[db total_changes] - $c1} } {1} finish_test |