Avoid preparing a SELECT statement each time an UPDATE or DELETE by docid is
executed against an fts3 table. FossilOrigin-Name: 1afec5758b624e6a066d4e7ef50695095e9d7ff1
This commit is contained in:
commit
ad3b4c078e
@ -492,6 +492,7 @@ static int fts3DisconnectMethod(sqlite3_vtab *pVtab){
|
|||||||
assert( p->pSegments==0 );
|
assert( p->pSegments==0 );
|
||||||
|
|
||||||
/* Free any prepared statements held */
|
/* Free any prepared statements held */
|
||||||
|
sqlite3_finalize(p->pSeekStmt);
|
||||||
for(i=0; i<SizeofArray(p->aStmt); i++){
|
for(i=0; i<SizeofArray(p->aStmt); i++){
|
||||||
sqlite3_finalize(p->aStmt[i]);
|
sqlite3_finalize(p->aStmt[i]);
|
||||||
}
|
}
|
||||||
@ -1680,6 +1681,26 @@ static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){
|
|||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Finalize the statement handle at pCsr->pStmt.
|
||||||
|
**
|
||||||
|
** Or, if that statement handle is one created by fts3CursorSeekStmt(),
|
||||||
|
** and the Fts3Table.pSeekStmt slot is currently NULL, save the statement
|
||||||
|
** pointer there instead of finalizing it.
|
||||||
|
*/
|
||||||
|
static void fts3CursorFinalizeStmt(Fts3Cursor *pCsr){
|
||||||
|
if( pCsr->bSeekStmt ){
|
||||||
|
Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
|
||||||
|
if( p->pSeekStmt==0 ){
|
||||||
|
p->pSeekStmt = pCsr->pStmt;
|
||||||
|
sqlite3_reset(pCsr->pStmt);
|
||||||
|
pCsr->pStmt = 0;
|
||||||
|
}
|
||||||
|
pCsr->bSeekStmt = 0;
|
||||||
|
}
|
||||||
|
sqlite3_finalize(pCsr->pStmt);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Close the cursor. For additional information see the documentation
|
** Close the cursor. For additional information see the documentation
|
||||||
** on the xClose method of the virtual table interface.
|
** on the xClose method of the virtual table interface.
|
||||||
@ -1687,7 +1708,7 @@ static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){
|
|||||||
static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){
|
static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){
|
||||||
Fts3Cursor *pCsr = (Fts3Cursor *)pCursor;
|
Fts3Cursor *pCsr = (Fts3Cursor *)pCursor;
|
||||||
assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
|
assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
|
||||||
sqlite3_finalize(pCsr->pStmt);
|
fts3CursorFinalizeStmt(pCsr);
|
||||||
sqlite3Fts3ExprFree(pCsr->pExpr);
|
sqlite3Fts3ExprFree(pCsr->pExpr);
|
||||||
sqlite3Fts3FreeDeferredTokens(pCsr);
|
sqlite3Fts3FreeDeferredTokens(pCsr);
|
||||||
sqlite3_free(pCsr->aDoclist);
|
sqlite3_free(pCsr->aDoclist);
|
||||||
@ -1705,20 +1726,23 @@ static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){
|
|||||||
**
|
**
|
||||||
** (or the equivalent for a content=xxx table) and set pCsr->pStmt to
|
** (or the equivalent for a content=xxx table) and set pCsr->pStmt to
|
||||||
** it. If an error occurs, return an SQLite error code.
|
** it. If an error occurs, return an SQLite error code.
|
||||||
**
|
|
||||||
** Otherwise, set *ppStmt to point to pCsr->pStmt and return SQLITE_OK.
|
|
||||||
*/
|
*/
|
||||||
static int fts3CursorSeekStmt(Fts3Cursor *pCsr, sqlite3_stmt **ppStmt){
|
static int fts3CursorSeekStmt(Fts3Cursor *pCsr){
|
||||||
int rc = SQLITE_OK;
|
int rc = SQLITE_OK;
|
||||||
if( pCsr->pStmt==0 ){
|
if( pCsr->pStmt==0 ){
|
||||||
Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
|
Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
|
||||||
char *zSql;
|
char *zSql;
|
||||||
zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist);
|
if( p->pSeekStmt ){
|
||||||
if( !zSql ) return SQLITE_NOMEM;
|
pCsr->pStmt = p->pSeekStmt;
|
||||||
rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0);
|
p->pSeekStmt = 0;
|
||||||
sqlite3_free(zSql);
|
}else{
|
||||||
|
zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist);
|
||||||
|
if( !zSql ) return SQLITE_NOMEM;
|
||||||
|
rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0);
|
||||||
|
sqlite3_free(zSql);
|
||||||
|
}
|
||||||
|
if( rc==SQLITE_OK ) pCsr->bSeekStmt = 1;
|
||||||
}
|
}
|
||||||
*ppStmt = pCsr->pStmt;
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1730,9 +1754,7 @@ static int fts3CursorSeekStmt(Fts3Cursor *pCsr, sqlite3_stmt **ppStmt){
|
|||||||
static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){
|
static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){
|
||||||
int rc = SQLITE_OK;
|
int rc = SQLITE_OK;
|
||||||
if( pCsr->isRequireSeek ){
|
if( pCsr->isRequireSeek ){
|
||||||
sqlite3_stmt *pStmt = 0;
|
rc = fts3CursorSeekStmt(pCsr);
|
||||||
|
|
||||||
rc = fts3CursorSeekStmt(pCsr, &pStmt);
|
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId);
|
sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId);
|
||||||
pCsr->isRequireSeek = 0;
|
pCsr->isRequireSeek = 0;
|
||||||
@ -3190,7 +3212,7 @@ static int fts3FilterMethod(
|
|||||||
assert( iIdx==nVal );
|
assert( iIdx==nVal );
|
||||||
|
|
||||||
/* In case the cursor has been used before, clear it now. */
|
/* In case the cursor has been used before, clear it now. */
|
||||||
sqlite3_finalize(pCsr->pStmt);
|
fts3CursorFinalizeStmt(pCsr);
|
||||||
sqlite3_free(pCsr->aDoclist);
|
sqlite3_free(pCsr->aDoclist);
|
||||||
sqlite3Fts3MIBufferFree(pCsr->pMIBuffer);
|
sqlite3Fts3MIBufferFree(pCsr->pMIBuffer);
|
||||||
sqlite3Fts3ExprFree(pCsr->pExpr);
|
sqlite3Fts3ExprFree(pCsr->pExpr);
|
||||||
@ -3258,7 +3280,7 @@ static int fts3FilterMethod(
|
|||||||
rc = SQLITE_NOMEM;
|
rc = SQLITE_NOMEM;
|
||||||
}
|
}
|
||||||
}else if( eSearch==FTS3_DOCID_SEARCH ){
|
}else if( eSearch==FTS3_DOCID_SEARCH ){
|
||||||
rc = fts3CursorSeekStmt(pCsr, &pCsr->pStmt);
|
rc = fts3CursorSeekStmt(pCsr);
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
rc = sqlite3_bind_value(pCsr->pStmt, 1, pCons);
|
rc = sqlite3_bind_value(pCsr->pStmt, 1, pCons);
|
||||||
}
|
}
|
||||||
|
@ -230,6 +230,7 @@ struct Fts3Table {
|
|||||||
** statements is run and reset within a single virtual table API call.
|
** statements is run and reset within a single virtual table API call.
|
||||||
*/
|
*/
|
||||||
sqlite3_stmt *aStmt[40];
|
sqlite3_stmt *aStmt[40];
|
||||||
|
sqlite3_stmt *pSeekStmt; /* Cache for fts3CursorSeekStmt() */
|
||||||
|
|
||||||
char *zReadExprlist;
|
char *zReadExprlist;
|
||||||
char *zWriteExprlist;
|
char *zWriteExprlist;
|
||||||
@ -299,6 +300,7 @@ struct Fts3Cursor {
|
|||||||
i16 eSearch; /* Search strategy (see below) */
|
i16 eSearch; /* Search strategy (see below) */
|
||||||
u8 isEof; /* True if at End Of Results */
|
u8 isEof; /* True if at End Of Results */
|
||||||
u8 isRequireSeek; /* True if must seek pStmt to %_content row */
|
u8 isRequireSeek; /* True if must seek pStmt to %_content row */
|
||||||
|
u8 bSeekStmt; /* True if pStmt is a seek */
|
||||||
sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */
|
sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */
|
||||||
Fts3Expr *pExpr; /* Parsed MATCH query string */
|
Fts3Expr *pExpr; /* Parsed MATCH query string */
|
||||||
int iLangid; /* Language being queried for */
|
int iLangid; /* Language being queried for */
|
||||||
|
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
|||||||
C Typo\sfixes\sin\scomment.\s\sNo\schanges\sto\scode.
|
C Avoid\spreparing\sa\sSELECT\sstatement\seach\stime\san\sUPDATE\sor\sDELETE\sby\sdocid\sis\nexecuted\sagainst\san\sfts3\stable.
|
||||||
D 2017-02-08T18:13:46.938
|
D 2017-02-08T19:12:36.968
|
||||||
F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918
|
F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc 067a6766f800cc8d72845ab61f8de4ffe8f3fc99
|
F Makefile.msc 067a6766f800cc8d72845ab61f8de4ffe8f3fc99
|
||||||
@ -70,9 +70,9 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51
|
|||||||
F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
|
F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
|
||||||
F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314
|
F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314
|
||||||
F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
|
F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
|
||||||
F ext/fts3/fts3.c 5a8cafedffd101e9946f8909ecf8d34aaa383b4d
|
F ext/fts3/fts3.c c4d7eecb12de9749851bcab6e5ca616a5803047a
|
||||||
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
|
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
|
||||||
F ext/fts3/fts3Int.h 89d0bd4595a0de384dac78e94b803de12586e8dd
|
F ext/fts3/fts3Int.h eb2502000148e80913b965db3e59f29251266d0a
|
||||||
F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1
|
F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1
|
||||||
F ext/fts3/fts3_expr.c dfd571a24412779ac01f25c01d888c6ef7b2d0ef
|
F ext/fts3/fts3_expr.c dfd571a24412779ac01f25c01d888c6ef7b2d0ef
|
||||||
F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60
|
F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60
|
||||||
@ -1555,7 +1555,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 77b470b0df73dc5ae5ad2f0170ef7c50558c7c88
|
P c09dd5c0befaf5028abfead8114bd74a30ffe5d4 9962c10a5c6672bd82b2bf640d878fcdac0b815a
|
||||||
R 52473535d67a86108597185ae6d56e08
|
R fbd7643b7e0c4a3c885d2a6aeb5fecfa
|
||||||
U mistachkin
|
U dan
|
||||||
Z 77244f34774b49c249d3e5a9b6027fee
|
Z a7e2195607498eebba62ce2716ddc0de
|
||||||
|
@ -1 +1 @@
|
|||||||
c09dd5c0befaf5028abfead8114bd74a30ffe5d4
|
1afec5758b624e6a066d4e7ef50695095e9d7ff1
|
Loading…
x
Reference in New Issue
Block a user