Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Modify the OR-clause handling so that it can safely deal with OR-clause with 17 or more terms. Fix for ticket [10fb063b1179be53ea0b53bb]. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
a67b5312f63909737c052fe58ab5772d |
User & Date: | drh 2014-04-10 02:24:48.549 |
Context
2014-04-13
| ||
19:15 | Make sure column cache elements are cleared correctly when jumping over code for key generation in a partial index. Fix for ticket [2ea3e9fe6379fc3f6]. (check-in: 3122b83640 user: drh tags: trunk) | |
2014-04-10
| ||
02:24 | Modify the OR-clause handling so that it can safely deal with OR-clause with 17 or more terms. Fix for ticket [10fb063b1179be53ea0b53bb]. (check-in: a67b5312f6 user: drh tags: trunk) | |
2014-04-04
| ||
18:49 | Performance improvements when reading large blobs, especially if SQLITE_DIRECT_OVERFLOW_READ is defined. (check-in: 2312eb6a9e user: drh tags: trunk) | |
Changes
Changes to src/rowset.c.
︙ | ︙ | |||
108 109 110 111 112 113 114 | struct RowSetChunk *pChunk; /* List of all chunk allocations */ sqlite3 *db; /* The database connection */ struct RowSetEntry *pEntry; /* List of entries using pRight */ struct RowSetEntry *pLast; /* Last entry on the pEntry list */ struct RowSetEntry *pFresh; /* Source of new entry objects */ struct RowSetEntry *pForest; /* List of binary trees of entries */ u16 nFresh; /* Number of objects on pFresh */ | | | | 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | struct RowSetChunk *pChunk; /* List of all chunk allocations */ sqlite3 *db; /* The database connection */ struct RowSetEntry *pEntry; /* List of entries using pRight */ struct RowSetEntry *pLast; /* Last entry on the pEntry list */ struct RowSetEntry *pFresh; /* Source of new entry objects */ struct RowSetEntry *pForest; /* List of binary trees of entries */ u16 nFresh; /* Number of objects on pFresh */ u16 rsFlags; /* Various flags */ int iBatch; /* Current insert batch */ }; /* ** Allowed values for RowSet.rsFlags */ #define ROWSET_SORTED 0x01 /* True if RowSet.pEntry is sorted */ #define ROWSET_NEXT 0x02 /* True if sqlite3RowSetNext() has been called */ |
︙ | ︙ | |||
443 444 445 446 447 448 449 | ** Check to see if element iRowid was inserted into the rowset as ** part of any insert batch prior to iBatch. Return 1 or 0. ** ** If this is the first test of a new batch and if there exist entires ** on pRowSet->pEntry, then sort those entires into the forest at ** pRowSet->pForest so that they can be tested. */ | | | 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 | ** Check to see if element iRowid was inserted into the rowset as ** part of any insert batch prior to iBatch. Return 1 or 0. ** ** If this is the first test of a new batch and if there exist entires ** on pRowSet->pEntry, then sort those entires into the forest at ** pRowSet->pForest so that they can be tested. */ int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 iRowid){ struct RowSetEntry *p, *pTree; /* This routine is never called after sqlite3RowSetNext() */ assert( pRowSet!=0 && (pRowSet->rsFlags & ROWSET_NEXT)==0 ); /* Sort entries into the forest on the first test of a new batch */ |
︙ | ︙ |
Changes to src/sqliteInt.h.
︙ | ︙ | |||
3015 3016 3017 3018 3019 3020 3021 | void sqlite3BitvecDestroy(Bitvec*); u32 sqlite3BitvecSize(Bitvec*); int sqlite3BitvecBuiltinTest(int,int*); RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int); void sqlite3RowSetClear(RowSet*); void sqlite3RowSetInsert(RowSet*, i64); | | | 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 | void sqlite3BitvecDestroy(Bitvec*); u32 sqlite3BitvecSize(Bitvec*); int sqlite3BitvecBuiltinTest(int,int*); RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int); void sqlite3RowSetClear(RowSet*); void sqlite3RowSetInsert(RowSet*, i64); int sqlite3RowSetTest(RowSet*, int iBatch, i64); int sqlite3RowSetNext(RowSet*, i64*); void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int); #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) int sqlite3ViewGetColumnNames(Parse*,Table*); #else |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
5223 5224 5225 5226 5227 5228 5229 | sqlite3VdbeMemSetRowSet(pIn1); if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem; } assert( pOp->p4type==P4_INT32 ); assert( iSet==-1 || iSet>=0 ); if( iSet ){ | | < < | 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 | sqlite3VdbeMemSetRowSet(pIn1); if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem; } assert( pOp->p4type==P4_INT32 ); assert( iSet==-1 || iSet>=0 ); if( iSet ){ exists = sqlite3RowSetTest(pIn1->u.pRowSet, iSet, pIn3->u.i); VdbeBranchTaken(exists!=0,2); if( exists ){ pc = pOp->p2 - 1; break; } } if( iSet>=0 ){ |
︙ | ︙ |
Changes to test/whereD.test.
︙ | ︙ | |||
213 214 215 216 217 218 219 220 221 222 | } {3 4 3 4} do_execsql_test 4.7 { SELECT * FROM t44 LEFT JOIN t46 ON a=c WHERE d=4 OR d IS NULL ORDER BY a; } {3 4 3 4} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 | } {3 4 3 4} do_execsql_test 4.7 { SELECT * FROM t44 LEFT JOIN t46 ON a=c WHERE d=4 OR d IS NULL ORDER BY a; } {3 4 3 4} # Verify fix of a bug reported on the mailing list by Peter Reid # do_execsql_test 5.1 { DROP TABLE IF EXISTS t; CREATE TABLE t(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17); CREATE INDEX tc0 ON t(c0); CREATE INDEX tc1 ON t(c1); CREATE INDEX tc2 ON t(c2); CREATE INDEX tc3 ON t(c3); CREATE INDEX tc4 ON t(c4); CREATE INDEX tc5 ON t(c5); CREATE INDEX tc6 ON t(c6); CREATE INDEX tc7 ON t(c7); CREATE INDEX tc8 ON t(c8); CREATE INDEX tc9 ON t(c9); CREATE INDEX tc10 ON t(c10); CREATE INDEX tc11 ON t(c11); CREATE INDEX tc12 ON t(c12); CREATE INDEX tc13 ON t(c13); CREATE INDEX tc14 ON t(c14); CREATE INDEX tc15 ON t(c15); CREATE INDEX tc16 ON t(c16); CREATE INDEX tc17 ON t(c17); INSERT INTO t(c0, c16) VALUES (1,1); SELECT * FROM t WHERE c0=1 or c1=1 or c2=1 or c3=1 or c4=1 or c5=1 or c6=1 or c7=1 or c8=1 or c9=1 or c10=1 or c11=1 or c12=1 or c13=1 or c14=1 or c15=1 or c16=1 or c17=1; } {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1 {}} do_execsql_test 5.2 { DELETE FROM t; INSERT INTO t(c0,c17) VALUES(1,1); SELECT * FROM t WHERE c0=1 or c1=1 or c2=1 or c3=1 or c4=1 or c5=1 or c6=1 or c7=1 or c8=1 or c9=1 or c10=1 or c11=1 or c12=1 or c13=1 or c14=1 or c15=1 or c16=1 or c17=1; } {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1} do_execsql_test 5.3 { DELETE FROM t; INSERT INTO t(c0,c15) VALUES(1,1); SELECT * FROM t WHERE c0=1 or c1=1 or c2=1 or c3=1 or c4=1 or c5=1 or c6=1 or c7=1 or c8=1 or c9=1 or c10=1 or c11=1 or c12=1 or c13=1 or c14=1 or c15=1 or c16=1 or c17=1; } {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1 {} {}} finish_test |