From: dan Date: Thu, 31 Jul 2014 17:47:04 +0000 (+0000) Subject: Try to reuse sorter statements in fts5. Does not work due to circular references... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Fsave_sorter_stmt;p=thirdparty%2Fsqlite.git Try to reuse sorter statements in fts5. Does not work due to circular references on VTable object. FossilOrigin-Name: bc14e64bdffb165fc5468339a7eaa5f6707537bf --- diff --git a/ext/fts5/fts5.c b/ext/fts5/fts5.c index 9849b87b3e..5fa6bb90ee 100644 --- a/ext/fts5/fts5.c +++ b/ext/fts5/fts5.c @@ -74,6 +74,7 @@ struct Fts5MatchPhrase { ** byte of the position list for the corresponding phrase. */ struct Fts5Sorter { + int eStmt; sqlite3_stmt *pStmt; i64 iRowid; /* Current rowid */ const u8 *aPoslist; /* Position lists for current row */ @@ -376,9 +377,19 @@ static int fts5CloseMethod(sqlite3_vtab_cursor *pCursor){ sqlite3Fts5StorageStmtRelease(pTab->pStorage, eStmt, pCsr->pStmt); } if( pCsr->pSorter ){ - Fts5Sorter *pSorter = pCsr->pSorter; - sqlite3_finalize(pSorter->pStmt); - sqlite3_free(pSorter); + Fts5Sorter *p = pCsr->pSorter; + + /* TODO: It would be better here to use sqlite3Fts5StorageStmtRelease() + ** so that the statement may be reused by subsequent queries. But that + ** is not possible as SQLite reference counts the virtual table objects. + ** And since pStmt reads from this very virtual table, saving it here + ** creates a circular reference. + ** + ** We wouldn't worry so much if SQLite had a built-in statement cache. + */ + /* sqlite3Fts5StorageStmtRelease(pTab->pStorage, p->eStmt, p->pStmt); */ + sqlite3_finalize(p->pStmt); + sqlite3_free(p); } if( pCsr->idxNum!=FTS5_PLAN_SOURCE ){ @@ -481,6 +492,7 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bAsc){ Fts5Sorter *pSorter; int nPhrase; int nByte; + int eStmt; int rc = SQLITE_OK; char *zSql; @@ -491,16 +503,11 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bAsc){ memset(pSorter, 0, nByte); pSorter->nIdx = nPhrase; - zSql = sqlite3_mprintf("SELECT rowid, %s FROM %Q.%Q ORDER BY +%s %s", - pConfig->zName, pConfig->zDb, pConfig->zName, FTS5_RANK_NAME, - bAsc ? "ASC" : "DESC" - ); - if( zSql==0 ){ - rc = SQLITE_NOMEM; - }else{ - rc = sqlite3_prepare_v2(pConfig->db, zSql, -1, &pSorter->pStmt, 0); - sqlite3_free(zSql); - } + assert( FTS5_STMT_SORTER_ASC==1+FTS5_STMT_SORTER_DESC ); + assert( bAsc==0 || bAsc==1 ); + + pSorter->eStmt = FTS5_STMT_SORTER_DESC+bAsc; + rc = sqlite3Fts5StorageStmt(pTab->pStorage, pSorter->eStmt, &pSorter->pStmt); pCsr->pSorter = pSorter; if( rc==SQLITE_OK ){ diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index bfbc8d7aca..2ac653e0bd 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -282,9 +282,11 @@ int sqlite3Fts5IndexSetAverages(Fts5Index *p, const u8*, int); ** code to access the data stored in the %_content and %_docsize tables. */ -#define FTS5_STMT_SCAN_ASC 0 /* SELECT rowid, * FROM ... ORDER BY 1 ASC */ -#define FTS5_STMT_SCAN_DESC 1 /* SELECT rowid, * FROM ... ORDER BY 1 DESC */ -#define FTS5_STMT_LOOKUP 2 /* SELECT rowid, * FROM ... WHERE rowid=? */ +#define FTS5_STMT_SCAN_ASC 0 /* SELECT rowid, * FROM ... ORDER BY 1 ASC */ +#define FTS5_STMT_SCAN_DESC 1 /* SELECT rowid, * FROM ... ORDER BY 1 DESC */ +#define FTS5_STMT_LOOKUP 2 /* SELECT rowid, * FROM ... WHERE rowid=? */ +#define FTS5_STMT_SORTER_DESC 3 /* SELECT ... ORDER BY rank ASC */ +#define FTS5_STMT_SORTER_ASC 4 /* SELECT ... ORDER BY rank ASC */ typedef struct Fts5Storage Fts5Storage; diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 22cb427e05..37aa62f055 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -19,7 +19,7 @@ struct Fts5Storage { Fts5Index *pIndex; i64 nTotalRow; /* Total number of rows in FTS table */ i64 *aTotalSize; /* Total sizes of each column */ - sqlite3_stmt *aStmt[9]; + sqlite3_stmt *aStmt[11]; }; @@ -32,15 +32,20 @@ struct Fts5Storage { #if FTS5_STMT_LOOKUP!=2 # error "FTS5_STMT_LOOKUP mismatch" #endif +#if FTS5_STMT_SORTER_DESC!=3 +# error "FTS5_STMT_SORTER_DESC mismatch" +#endif +#if FTS5_STMT_SORTER_ASC!=4 +# error "FTS5_STMT_SORTER_ASC mismatch" +#endif -#define FTS5_STMT_INSERT_CONTENT 3 -#define FTS5_STMT_REPLACE_CONTENT 4 - -#define FTS5_STMT_DELETE_CONTENT 5 -#define FTS5_STMT_REPLACE_DOCSIZE 6 -#define FTS5_STMT_DELETE_DOCSIZE 7 +#define FTS5_STMT_INSERT_CONTENT 5 +#define FTS5_STMT_REPLACE_CONTENT 6 -#define FTS5_STMT_LOOKUP_DOCSIZE 8 +#define FTS5_STMT_DELETE_CONTENT 7 +#define FTS5_STMT_REPLACE_DOCSIZE 8 +#define FTS5_STMT_DELETE_DOCSIZE 9 +#define FTS5_STMT_LOOKUP_DOCSIZE 10 /* ** Prepare the two insert statements - Fts5Storage.pInsertContent and @@ -62,6 +67,10 @@ static int fts5StorageGetStmt( "SELECT * FROM %Q.'%q_content' ORDER BY id DESC", /* SCAN_DESC */ "SELECT * FROM %Q.'%q_content' WHERE rowid=?", /* LOOKUP */ + /* SORTER_DESC and SORTER_ASC: */ + "SELECT rowid, \"%s\" FROM %Q.%Q ORDER BY +" FTS5_RANK_NAME " DESC", + "SELECT rowid, \"%s\" FROM %Q.%Q ORDER BY +" FTS5_RANK_NAME " ASC", + "INSERT INTO %Q.'%q_content' VALUES(%s)", /* INSERT_CONTENT */ "REPLACE INTO %Q.'%q_content' VALUES(%s)", /* REPLACE_CONTENT */ "DELETE FROM %Q.'%q_content' WHERE id=?", /* DELETE_CONTENT */ @@ -88,6 +97,10 @@ static int fts5StorageGetStmt( zSql = sqlite3_mprintf(azStmt[eStmt],pConfig->zDb,pConfig->zName,zBind); sqlite3_free(zBind); } + }else if( eStmt==FTS5_STMT_SORTER_ASC || eStmt==FTS5_STMT_SORTER_DESC ){ + zSql = sqlite3_mprintf(azStmt[eStmt], + pConfig->zName, pConfig->zDb, pConfig->zName + ); }else{ zSql = sqlite3_mprintf(azStmt[eStmt], pConfig->zDb, pConfig->zName); } @@ -631,6 +644,8 @@ int sqlite3Fts5StorageStmt(Fts5Storage *p, int eStmt, sqlite3_stmt **pp){ assert( eStmt==FTS5_STMT_SCAN_ASC || eStmt==FTS5_STMT_SCAN_DESC || eStmt==FTS5_STMT_LOOKUP + || eStmt==FTS5_STMT_SORTER_DESC + || eStmt==FTS5_STMT_SORTER_ASC ); rc = fts5StorageGetStmt(p, eStmt, pp); if( rc==SQLITE_OK ){ @@ -653,6 +668,8 @@ void sqlite3Fts5StorageStmtRelease( assert( eStmt==FTS5_STMT_SCAN_ASC || eStmt==FTS5_STMT_SCAN_DESC || eStmt==FTS5_STMT_LOOKUP + || eStmt==FTS5_STMT_SORTER_DESC + || eStmt==FTS5_STMT_SORTER_ASC ); if( p->aStmt[eStmt]==0 ){ sqlite3_reset(pStmt); diff --git a/manifest b/manifest index 7b3e89ea0b..c64f5d97a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfurther\stests\sfor\sthe\sextension\sAPIs\swith\s"ORDER\sBY\srank"\squeries. -D 2014-07-31T11:57:59.052 +C Try\sto\sreuse\ssorter\sstatements\sin\sfts5.\sDoes\snot\swork\sdue\sto\scircular\sreferences\son\sVTable\sobject. +D 2014-07-31T17:47:04.870 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -103,15 +103,15 @@ F ext/fts3/tool/fts3view.c 6cfc5b67a5f0e09c0d698f9fd012c784bfaa9197 F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl dc6f268eb526710e2c6e496c372471d773d0c368 -F ext/fts5/fts5.c b54b776771d1e965bac02bffcf875a0bfc3660db +F ext/fts5/fts5.c 85b0d66a927ce160ca226b121cd5ae24affa5b85 F ext/fts5/fts5.h 8ace10d5b249a3baa983c79e7a1306d2a79cfd6a -F ext/fts5/fts5Int.h 9a195c1706876c538902f007149b39e982e9da53 +F ext/fts5/fts5Int.h 2adf0ca39d9764cb2114725f5a1c8c7a0fdcd698 F ext/fts5/fts5_aux.c 366057c7186bc3615deb5ecc0ff61de50b6d2dbc F ext/fts5/fts5_buffer.c 248c61ac9fec001602efc72a45704f3b8d367c00 F ext/fts5/fts5_config.c f4ebf143e141b8c77355e3b15aba81b7be51d710 F ext/fts5/fts5_expr.c e764d75c58a3accda795f1da1b45960ac87dc77a F ext/fts5/fts5_index.c 68d2d41b5c6d2f8838c3d6ebdc8b242718b8e997 -F ext/fts5/fts5_storage.c 2866e7e1de9dc851756c3a9c76b6e1d75e0facb7 +F ext/fts5/fts5_storage.c 7036cf22baa00780860fc35cc2573d36cdc03f7b F ext/fts5/fts5parse.y 777da8e5819f75c217982c79c29d014c293acac9 F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43 F ext/icu/icu.c d415ccf984defeb9df2c0e1afcfaa2f6dc05eacb @@ -1198,7 +1198,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f1b4e1a98d49ecaba962beba16f8224175e4ba59 -R bf2807e3a776f0c27fe888a62861bcb4 +P 37a417d27e4ebafd4783f62728d7467316b75b17 +R 534b5c94a0bdd15a21f4d009040d2019 +T *branch * save_sorter_stmt +T *sym-save_sorter_stmt * +T -sym-fts5 * U dan -Z 17018f27d9e25b34230168ffaec13df5 +Z b48f3961f977602946001c5dfc0bf2c0 diff --git a/manifest.uuid b/manifest.uuid index c5f4f69e5e..7875f3ab38 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -37a417d27e4ebafd4783f62728d7467316b75b17 \ No newline at end of file +bc14e64bdffb165fc5468339a7eaa5f6707537bf \ No newline at end of file