]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve the error message issued when an FTS query exceeds the maximum allowable...
authordan <dan@noemail.net>
Mon, 29 Apr 2013 18:07:37 +0000 (18:07 +0000)
committerdan <dan@noemail.net>
Mon, 29 Apr 2013 18:07:37 +0000 (18:07 +0000)
FossilOrigin-Name: f480b1fe6012f36c59cd0525efdc6df74143ccd0

ext/fts3/fts3.c
ext/fts3/fts3Int.h
ext/fts3/fts3_expr.c
manifest
manifest.uuid

index 0c7e07740db61cc9c28c01e82546bbfa17bffca0..34d1e2acbda9b5b3dbd696f83479bd23c318edd1 100644 (file)
@@ -2975,14 +2975,12 @@ static int fts3FilterMethod(
     pCsr->iLangid = 0;
     if( nVal==2 ) pCsr->iLangid = sqlite3_value_int(apVal[1]);
 
+    assert( p->base.zErrMsg==0 );
     rc = sqlite3Fts3ExprParse(p->pTokenizer, pCsr->iLangid,
-        p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr
+        p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr, 
+        &p->base.zErrMsg
     );
     if( rc!=SQLITE_OK ){
-      if( rc==SQLITE_ERROR ){
-        static const char *zErr = "malformed MATCH expression: [%s]";
-        p->base.zErrMsg = sqlite3_mprintf(zErr, zQuery);
-      }
       return rc;
     }
 
index a11c18a3b7a226b88ce11d648892068dc2d15a01..1fbb9c75873db0f60fb6f7ef60df1711cc9fe07a 100644 (file)
@@ -524,7 +524,7 @@ void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *);
 
 /* fts3_expr.c */
 int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int,
-  char **, int, int, int, const char *, int, Fts3Expr **
+  char **, int, int, int, const char *, int, Fts3Expr **, char **
 );
 void sqlite3Fts3ExprFree(Fts3Expr *);
 #ifdef SQLITE_TEST
index 2cb0f94bcbc56ce50f3db3d61f31d051e62779f8..3ea3f23c96b11e129ed6f01b8fe06cb259487075 100644 (file)
@@ -756,7 +756,7 @@ static int fts3ExprCheckDepth(Fts3Expr *p, int nMaxDepth){
   int rc = SQLITE_OK;
   if( p ){
     if( nMaxDepth<0 ){ 
-      rc = SQLITE_ERROR;
+      rc = SQLITE_TOOBIG;
     }else{
       rc = fts3ExprCheckDepth(p->pLeft, nMaxDepth-1);
       if( rc==SQLITE_OK ){
@@ -841,7 +841,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){
         }
         if( p ){
           sqlite3Fts3ExprFree(p);
-          rc = SQLITE_ERROR;
+          rc = SQLITE_TOOBIG;
           break;
         }
 
@@ -996,7 +996,8 @@ int sqlite3Fts3ExprParse(
   int nCol,                           /* Number of entries in azCol[] */
   int iDefaultCol,                    /* Default column to query */
   const char *z, int n,               /* Text of MATCH query */
-  Fts3Expr **ppExpr                   /* OUT: Parsed query structure */
+  Fts3Expr **ppExpr,                  /* OUT: Parsed query structure */
+  char **pzErr                        /* OUT: Error message (sqlite3_malloc) */
 ){
   static const int MAX_EXPR_DEPTH = 12;
   int rc = fts3ExprParseUnbalanced(
@@ -1011,9 +1012,18 @@ int sqlite3Fts3ExprParse(
       rc = fts3ExprCheckDepth(*ppExpr, MAX_EXPR_DEPTH);
     }
   }
+
   if( rc!=SQLITE_OK ){
     sqlite3Fts3ExprFree(*ppExpr);
     *ppExpr = 0;
+    if( rc==SQLITE_TOOBIG ){
+      *pzErr = sqlite3_mprintf(
+          "FTS expression tree is too large (maximum depth %d)", MAX_EXPR_DEPTH
+      );
+      rc = SQLITE_ERROR;
+    }else if( rc==SQLITE_ERROR ){
+      *pzErr = sqlite3_mprintf("malformed MATCH expression: [%s]", z);
+    }
   }
 
   return rc;
@@ -1216,10 +1226,12 @@ static void fts3ExprTest(
   }
 
   if( sqlite3_user_data(context) ){
+    char *zDummy = 0;
     rc = sqlite3Fts3ExprParse(
-        pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr
+        pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr, &zDummy
     );
     assert( rc==SQLITE_OK || pExpr==0 );
+    sqlite3_free(zDummy);
   }else{
     rc = fts3ExprParseUnbalanced(
         pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr
index 7a2fc313d4cd5aac942732746cc581a7339792d8..f3fe09157bfb4f1326e36070a05af8b1c3952dc0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\soff-by-one\sin\sthe\scode\sfor\slimiting\sthe\sdepth\sof\sFTS\sexpression\strees.
-D 2013-04-29T17:12:06.416
+C Improve\sthe\serror\smessage\sissued\swhen\san\sFTS\squery\sexceeds\sthe\smaximum\sallowable\stree\sdepth.
+D 2013-04-29T18:07:37.241
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in ce81671efd6223d19d4c8c6b88ac2c4134427111
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -55,11 +55,11 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51
 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
 F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314
 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
-F ext/fts3/fts3.c 784aadfb4c2a217c3eb1feaecac924989f29728f
+F ext/fts3/fts3.c 5c3d44d16701cc4bc81ebf0bb9d5bff136d42de0
 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
-F ext/fts3/fts3Int.h 352c8a83ee4c6a14ced1759a39dd890ab947cbe0
+F ext/fts3/fts3Int.h 23ea0a2bb7258d2539376ed60220cce28ba25765
 F ext/fts3/fts3_aux.c b02632f6dd0e375ce97870206d914ea6d8df5ccd
-F ext/fts3/fts3_expr.c 2449c3f31b87c3376b66999cdd10d23be0b0bd42
+F ext/fts3/fts3_expr.c 44b4a3c4983ddbf1958c4a40468efb4ff2e0549a
 F ext/fts3/fts3_hash.c 8dd2d06b66c72c628c2732555a32bc0943114914
 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
 F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5
@@ -1060,7 +1060,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 52417eac3ecaec2dbbde170334358f5ddbd32501
-R 9ce2a78bcb94198e11ae7a2e16b98558
+P 72ac73189c3577740a77d2ea2fc7118391c0703f
+R 845f7187fab8dee39261b18defdba512
 U dan
-Z 54156ad010a8fff228c493eff10ae743
+Z 0f3ad9cc69769334523e8cc24ad50e47
index 39bbe3f113e1b5ba519ff136188c48a7d1c13c52..eb0b27c97e52df51b7f501de3ca4d49b230ef685 100644 (file)
@@ -1 +1 @@
-72ac73189c3577740a77d2ea2fc7118391c0703f
\ No newline at end of file
+f480b1fe6012f36c59cd0525efdc6df74143ccd0
\ No newline at end of file