Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem in the xBestIndex method of the closure extension causing it to allocate non-contiguous argvIndex values in some cases (an "xBestIndex malfunction" error). |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
0c67150749cb3d067e14b2dcac9c3489 |
User & Date: | dan 2018-05-02 08:12:22 |
Context
2018-05-02
| ||
15:00 | Prevent VACUUM from running any commands in sqlite_master.sql other than CREATE statements. That is all that should be there anyhow. This fixes a problem discovered by OSSFuzz. Test cases in TH3. (check-in: ab0d99d0 user: drh tags: trunk) | |
08:12 | Fix a problem in the xBestIndex method of the closure extension causing it to allocate non-contiguous argvIndex values in some cases (an "xBestIndex malfunction" error). (check-in: 0c671507 user: dan tags: trunk) | |
03:01 | Add sqlite3_win32_set_directory8() and sqlite3_win32_set_directory16() functions. (check-in: 22089ea2 user: mistachkin tags: trunk) | |
Changes
Changes to ext/misc/closure.c.
︙ | ︙ | |||
822 823 824 825 826 827 828 | static int closureBestIndex( sqlite3_vtab *pTab, /* The virtual table */ sqlite3_index_info *pIdxInfo /* Information about the query */ ){ int iPlan = 0; int i; int idx = 1; | < < < < < | 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 | static int closureBestIndex( sqlite3_vtab *pTab, /* The virtual table */ sqlite3_index_info *pIdxInfo /* Information about the query */ ){ int iPlan = 0; int i; int idx = 1; const struct sqlite3_index_constraint *pConstraint; closure_vtab *pVtab = (closure_vtab*)pTab; double rCost = 10000000.0; pConstraint = pIdxInfo->aConstraint; for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ if( pConstraint->usable==0 ) continue; if( (iPlan & 1)==0 && pConstraint->iColumn==CLOSURE_COL_ROOT && pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ iPlan |= 1; pIdxInfo->aConstraintUsage[i].argvIndex = 1; |
︙ | ︙ | |||
888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 | || (pVtab->zIdColumn==0 && (iPlan & 0x00f000)==0) || (pVtab->zParentColumn==0 && (iPlan & 0x0f0000)==0) ){ /* All of tablename, idcolumn, and parentcolumn must be specified ** in either the CREATE VIRTUAL TABLE or in the WHERE clause constraints ** or else the result is an empty set. */ iPlan = 0; } pIdxInfo->idxNum = iPlan; if( pIdxInfo->nOrderBy==1 && pIdxInfo->aOrderBy[0].iColumn==CLOSURE_COL_ID && pIdxInfo->aOrderBy[0].desc==0 ){ pIdxInfo->orderByConsumed = 1; } | > > > > > > > > > > > > < | 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 | || (pVtab->zIdColumn==0 && (iPlan & 0x00f000)==0) || (pVtab->zParentColumn==0 && (iPlan & 0x0f0000)==0) ){ /* All of tablename, idcolumn, and parentcolumn must be specified ** in either the CREATE VIRTUAL TABLE or in the WHERE clause constraints ** or else the result is an empty set. */ iPlan = 0; } if( (iPlan&1)==0 ){ /* If there is no usable "root=?" term, then set the index-type to 0. ** Also clear any argvIndex variables already set. This is necessary ** to prevent the core from throwing an "xBestIndex malfunction error" ** error (because the argvIndex values are not contiguously assigned ** starting from 1). */ rCost *= 1e30; for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ pIdxInfo->aConstraintUsage[i].argvIndex = 0; } iPlan = 0; } pIdxInfo->idxNum = iPlan; if( pIdxInfo->nOrderBy==1 && pIdxInfo->aOrderBy[0].iColumn==CLOSURE_COL_ID && pIdxInfo->aOrderBy[0].desc==0 ){ pIdxInfo->orderByConsumed = 1; } pIdxInfo->estimatedCost = rCost; return SQLITE_OK; } /* ** A virtual table module that implements the "transitive_closure". |
︙ | ︙ |
Changes to test/closure01.test.
︙ | ︙ | |||
268 269 270 271 272 273 274 275 276 | WHERE root=1 AND depth=3 AND tablename='t1' AND idcolumn='x' AND parentcolumn='y' ORDER BY id; } {8 9 10 11 12 13 14 15} finish_test | > > > > > > > > > > > > > > > > > > > | 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 | WHERE root=1 AND depth=3 AND tablename='t1' AND idcolumn='x' AND parentcolumn='y' ORDER BY id; } {8 9 10 11 12 13 14 15} #------------------------------------------------------------------------- # At one point the following join query was causing a malfunction in # xBestIndex. # do_execsql_test 6.0 { CREATE TABLE t4 ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, parent_id INTEGER ); CREATE VIRTUAL TABLE vt4 USING transitive_closure ( idcolumn=id, parentcolumn=parent_id, tablename=t4 ); } do_execsql_test 6.1 { SELECT * FROM t4, vt4 WHERE t4.id = vt4.root AND vt4.id=4 AND vt4.depth=2; } finish_test |