]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Try to reuse sorter statements in fts5. Does not work due to circular references... save_sorter_stmt
authordan <dan@noemail.net>
Thu, 31 Jul 2014 17:47:04 +0000 (17:47 +0000)
committerdan <dan@noemail.net>
Thu, 31 Jul 2014 17:47:04 +0000 (17:47 +0000)
FossilOrigin-Name: bc14e64bdffb165fc5468339a7eaa5f6707537bf

ext/fts5/fts5.c
ext/fts5/fts5Int.h
ext/fts5/fts5_storage.c
manifest
manifest.uuid

index 9849b87b3e16b9c75e35db0531e73cde26389aee..5fa6bb90ee4cd096f9456ad9488574e66d60cbd1 100644 (file)
@@ -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 ){
index bfbc8d7aca2537edbe9523e8c52059f34801b8a3..2ac653e0bda85f7d169fa17348eb02979c5ce298 100644 (file)
@@ -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;
 
index 22cb427e0551758c2cf7ec7f25a10fa95a6824dc..37aa62f05579658b81a81748cc579e2162e0d55e 100644 (file)
@@ -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);
index 7b3e89ea0b683774ff2213fb08b7d0ad71bbb087..c64f5d97a63822e474e40ca30a4984fcc8f200ca 100644 (file)
--- 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
index c5f4f69e5e76647e8354d43cae13a3deb34de54c..7875f3ab380deddbf5149082e2fab8920d32a8f8 100644 (file)
@@ -1 +1 @@
-37a417d27e4ebafd4783f62728d7467316b75b17
\ No newline at end of file
+bc14e64bdffb165fc5468339a7eaa5f6707537bf
\ No newline at end of file