]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve test coverage of fts3.c.
authordan <dan@noemail.net>
Tue, 4 Oct 2011 19:41:50 +0000 (19:41 +0000)
committerdan <dan@noemail.net>
Tue, 4 Oct 2011 19:41:50 +0000 (19:41 +0000)
FossilOrigin-Name: 0f439944ab49a5691615bc170fdcf652055573df

ext/fts3/fts3.c
manifest
manifest.uuid
test/fts3ao.test
test/fts3fault2.test
test/fts3malloc.test
test/fts3matchinfo.test
test/fts3prefix.test
test/fts3sort.test

index c6b356f51fd2835fe59bb83437f7ed1523d9e6ae..624221f979af80641ec49a638d14b513d2dac0d6 100644 (file)
@@ -1151,7 +1151,7 @@ static int fts3InitVtab(
 
             case 4:               /* ORDER */
               if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) 
-               && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 3)) 
+               && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) 
               ){
                 *pzErr = sqlite3_mprintf("unrecognized order: %s", zVal);
                 rc = SQLITE_ERROR;
@@ -1159,7 +1159,8 @@ static int fts3InitVtab(
               bDescIdx = (zVal[0]=='d' || zVal[0]=='D');
               break;
 
-            case 5:               /* CONTENT */
+            default:              /* CONTENT */
+              assert( iOpt==5 );
               sqlite3_free(zUncompress);
               zContent = zVal;
               zVal = 0;
@@ -1928,7 +1929,7 @@ static int fts3PoslistPhraseMerge(
   char **pp1,                     /* IN/OUT: Left input list */
   char **pp2                      /* IN/OUT: Right input list */
 ){
-  char *p = (pp ? *pp : 0);
+  char *p = *pp;
   char *p1 = *pp1;
   char *p2 = *pp2;
   int iCol1 = 0;
@@ -1954,7 +1955,7 @@ static int fts3PoslistPhraseMerge(
       sqlite3_int64 iPos1 = 0;
       sqlite3_int64 iPos2 = 0;
 
-      if( pp && iCol1 ){
+      if( iCol1 ){
         *p++ = POS_COLUMN;
         p += sqlite3Fts3PutVarint(p, iCol1);
       }
@@ -1969,13 +1970,6 @@ static int fts3PoslistPhraseMerge(
          || (isExact==0 && iPos2>iPos1 && iPos2<=iPos1+nToken) 
         ){
           sqlite3_int64 iSave;
-          if( !pp ){
-            fts3PoslistCopy(0, &p2);
-            fts3PoslistCopy(0, &p1);
-            *pp1 = p1;
-            *pp2 = p2;
-            return 1;
-          }
           iSave = isSaveLeft ? iPos1 : iPos2;
           fts3PutDeltaVarint(&p, &iPrev, iSave+2); iPrev -= 2;
           pSave = 0;
@@ -2027,7 +2021,7 @@ static int fts3PoslistPhraseMerge(
   fts3PoslistCopy(0, &p1);
   *pp1 = p1;
   *pp2 = p2;
-  if( !pp || *pp==p ){
+  if( *pp==p ){
     return 0;
   }
   *p++ = 0x00;
@@ -3216,10 +3210,14 @@ static int fts3RenameMethod(
   sqlite3 *db = p->db;            /* Database connection */
   int rc;                         /* Return Code */
 
+  /* As it happens, the pending terms table is always empty here. This is
+  ** because an "ALTER TABLE RENAME TABLE" statement inside a transaction 
+  ** always opens a savepoint transaction. And the xSavepoint() method 
+  ** flushes the pending terms table. But leave the (no-op) call to
+  ** PendingTermsFlush() in in case that changes.
+  */
+  assert( p->nPendingData==0 );
   rc = sqlite3Fts3PendingTermsFlush(p);
-  if( rc!=SQLITE_OK ){
-    return rc;
-  }
 
   if( p->zContentTbl==0 ){
     fts3DbExec(&rc, db,
@@ -3586,21 +3584,20 @@ static int fts3EvalPhraseLoad(
 */
 static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
   int iToken;                     /* Used to iterate through phrase tokens */
-  int rc = SQLITE_OK;             /* Return code */
   char *aPoslist = 0;             /* Position list for deferred tokens */
   int nPoslist = 0;               /* Number of bytes in aPoslist */
   int iPrev = -1;                 /* Token number of previous deferred token */
 
   assert( pPhrase->doclist.bFreeList==0 );
 
-  for(iToken=0; rc==SQLITE_OK && iToken<pPhrase->nToken; iToken++){
+  for(iToken=0; iToken<pPhrase->nToken; iToken++){
     Fts3PhraseToken *pToken = &pPhrase->aToken[iToken];
     Fts3DeferredToken *pDeferred = pToken->pDeferred;
 
     if( pDeferred ){
       char *pList;
       int nList;
-      rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList);
+      int rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList);
       if( rc!=SQLITE_OK ) return rc;
 
       if( pList==0 ){
@@ -3930,7 +3927,7 @@ static void fts3EvalTokenCosts(
   Fts3Expr ***ppOr,               /* Write new OR root to *(*ppOr)++ */
   int *pRc                        /* IN/OUT: Error code */
 ){
-  if( *pRc==SQLITE_OK && pExpr ){
+  if( *pRc==SQLITE_OK ){
     if( pExpr->eType==FTSQUERY_PHRASE ){
       Fts3Phrase *pPhrase = pExpr->pPhrase;
       int i;
@@ -3944,6 +3941,11 @@ static void fts3EvalTokenCosts(
         *pRc = sqlite3Fts3MsrOvfl(pCsr, pTC->pToken->pSegcsr, &pTC->nOvfl);
       }
     }else if( pExpr->eType!=FTSQUERY_NOT ){
+      assert( pExpr->eType==FTSQUERY_OR
+           || pExpr->eType==FTSQUERY_AND
+           || pExpr->eType==FTSQUERY_NEAR
+      );
+      assert( pExpr->pLeft && pExpr->pRight );
       if( pExpr->eType==FTSQUERY_OR ){
         pRoot = pExpr->pLeft;
         **ppOr = pRoot;
index 98818959087bbc5d18dd1c0912fc6dc58c616ca0..e1d1bbee86ad0571621f7db6cfb0da6604ec7a20 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stests\sto\scheck\sthat\smodifying\sthe\sschema\sof\san\sFTS\scontent\stable\sdoes\snot\scause\sa\scrash\sin\sthe\sFTS\smodule.\sAlso\sdisable\sthe\sdeferred\stoken\soptimization\sfor\scontent=xxx\sFTS\stables.
-D 2011-10-04T16:37:35.422
+C Improve\stest\scoverage\sof\sfts3.c.
+D 2011-10-04T19:41:50.550
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in a162fe39e249b8ed4a65ee947c30152786cfe897
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -62,7 +62,7 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0
 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
 F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9
 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
-F ext/fts3/fts3.c df149056426597b32b2b8488eefbc755258f55d7
+F ext/fts3/fts3.c 6d6f3d331ed785d2e68608443eff66448ea95354
 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
 F ext/fts3/fts3Int.h 06f442ce096e6254432a6b16a56b6fe7b24bd372
 F ext/fts3/fts3_aux.c 0ebfa7b86cf8ff6a0861605fcc63b83ec1b70691
@@ -457,7 +457,7 @@ F test/fts3ak.test bd14deafe9d1586e8e9bf032411026ac4f8c925d
 F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f
 F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8
 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18
-F test/fts3ao.test 60a15590d3c8578e943e4a149524b16b9bc1be92
+F test/fts3ao.test e7b80272efcced57d1d087a9da5c690dd7c21fd9
 F test/fts3atoken.test 402ef2f7c2fb4b3d4fa0587df6441c1447e799b3
 F test/fts3auto.test c1a30b37002b7c764a96937fbc71065b73d69494
 F test/fts3aux1.test 0b02743955d56fc0d4d66236a26177bd1b726de0
@@ -475,16 +475,16 @@ F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851
 F test/fts3expr.test 5e745b2b6348499d9ef8d59015de3182072c564c
 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a
 F test/fts3fault.test f83e556465bb69dc8bc676339eca408dce4ca246
-F test/fts3fault2.test dc96203af6ba31ce20163fc35460e1556e8edf4d
-F test/fts3malloc.test 9c8cc3f885bb4dfc66d0460c52f68f45e4710d1b
-F test/fts3matchinfo.test 08a82d18cc08abb28aec41d412b4c2ef25ba6a5f
+F test/fts3fault2.test 253f9b336043ab7d0393d1b97a9f4ed21190331a
+F test/fts3malloc.test b86ea33db9e8c58c0c2f8027a9fcadaf6a1568be
+F test/fts3matchinfo.test 6507fe1c342e542300d65ea637d4110eccf894e6
 F test/fts3near.test 2e318ee434d32babd27c167142e2b94ddbab4844
-F test/fts3prefix.test 36246609111ec1683f7ea5ed27666ce2cefb5676
+F test/fts3prefix.test b36d4f00b128a51e7b386cc013a874246d9d7dc1
 F test/fts3query.test ef79d31fdb355d094baec1c1b24b60439a1fb8a2
 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0
 F test/fts3shared.test 8bb266521d7c5495c0ae522bb4d376ad5387d4a2
 F test/fts3snippet.test 8e956051221a34c7daeb504f023cb54d5fa5a8b2
-F test/fts3sort.test 9a5176c9317bb545ec5f144d62e6fedb4da6c66e
+F test/fts3sort.test 95be0b19d7e41c44b29014f13ea8bddd495fd659
 F test/fts4aa.test 6e7f90420b837b2c685f3bcbe84c868492d40a68
 F test/fts4content.test 5c226c7c666e250c175bcbdfbdd4be3f275c73ba
 F test/func.test 6c5ce11e3a0021ca3c0649234e2d4454c89110ca
@@ -966,7 +966,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
 F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2
-P 1d27ea741f61c624e18bdc6a3b1c2d8574a64ddc
-R da82d432e1ef8526b881f10f91640d66
+P be86c7061b68f403730bf63ea1f7dc0d9ceb0a3b
+R 5a9454f18e2824c0a4b3f3725eccae4e
 U dan
-Z d642325dd5adee7274f24ac6f8449504
+Z e08086009c7ea460be359636e4d09cb8
index 18907d6d6bcf44f9d8915e4025875e3f8fefba9b..2e94e1ac7cd1a05c77ba2ebeef267c2df5812391 100644 (file)
@@ -1 +1 @@
-be86c7061b68f403730bf63ea1f7dc0d9ceb0a3b
\ No newline at end of file
+0f439944ab49a5691615bc170fdcf652055573df
\ No newline at end of file
index 0b6fcd3d19c394db9b5d327187af3ee32ecd72c4..786667a7f35e7f089ff71e0f2da2e6e21c5b0a8f 100644 (file)
@@ -200,6 +200,9 @@ do_test fts3ao-4.7 {
     SELECT * FROM t5;
   }
 } {{the quick brown fox} {jumped over the} {lazy dog}}
+do_execsql_test fts3ao-4.8 {
+  SELECT snippet(t5, '[', ']') FROM t5 WHERE t5 MATCH 'the'
+} {{[the] quick brown fox} {jumped over [the]}}
 
 # Test that it is possible to rename an FTS4 table. Renaming an FTS4 table
 # involves renaming the extra %_docsize and %_stat tables.
index fb877737f4ef88b20fb995c0c5a9d74d410fee29..c24c52fe95937a9c122d29cc9dfd86f5a29f8022 100644 (file)
@@ -82,4 +82,27 @@ do_faultsim_test 2.1 -prep {
   faultsim_test_result {0 {a * 1 1 a 0 1 1 b * 1 1 b 0 1 1 c * 1 1 c 0 1 1 x * 1 1 x 1 1 1 y * 1 1 y 1 1 1 z * 1 1 z 1 1 1}}
 }
 
+do_faultsim_test 3.0 -faults oom* -prep {
+  faultsim_delete_and_reopen
+  db eval { CREATE TABLE 'xx yy'(a, b); }
+} -body {
+  execsql {
+    CREATE VIRTUAL TABLE tt USING fts4(content="xx yy");
+  }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+do_faultsim_test 3.1 -faults oom* -prep {
+  faultsim_delete_and_reopen
+  db func zip zip
+  db func unzip unzip
+} -body {
+  execsql {
+    CREATE VIRTUAL TABLE tt USING fts4(compress=zip, uncompress=unzip);
+  }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
 finish_test
index 932ea098d0b2fd38f364b0f46dd47c918db73c52..7eeee7fe0d7fa96b312ca9075dba86a098bd1933 100644 (file)
@@ -294,6 +294,7 @@ do_write_test fts3_malloc-5.1 ft_content {
 do_test fts3_malloc-5.2 {
   execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
 } {}
+
 do_write_test fts3_malloc-5.3 ft_content {
   INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
 }
index 40366b6aefe2534269d1c943dcb6f795c4a9dc93..0e8885804f46e190a925b6d8fbafaf5bdeeabd89 100644 (file)
@@ -19,6 +19,7 @@ source $testdir/tester.tcl
 ifcapable !fts3 { finish_test ; return }
 
 set testprefix fts3matchinfo
+set sqlite_fts3_enable_parentheses 0
 
 proc mit {blob} {
   set scan(littleEndian) i*
@@ -57,6 +58,9 @@ do_catchsql_test 2.0 {
 do_catchsql_test 2.1 {
   CREATE VIRTUAL TABLE x2 USING fts4(mtchinfo=fts3);
 } {1 {unrecognized parameter: mtchinfo=fts3}}
+do_catchsql_test 2.2 {
+  CREATE VIRTUAL TABLE x2 USING fts4(matchinfo=fts5);
+} {1 {unrecognized matchinfo: fts5}}
 
 # Check that with fts3, the "=" character is permitted in column definitions.
 #
@@ -224,6 +228,18 @@ do_matchinfo_test 4.1.3 t4 {t4 MATCH 'a b'}     { s {{2 0} {0 2}} }
 do_matchinfo_test 4.1.4 t4 {t4 MATCH '"a b" c'} { s {{2 0} {0 2}} }
 do_matchinfo_test 4.1.5 t4 {t4 MATCH 'a "b c"'} { s {{2 0} {0 2}} }
 do_matchinfo_test 4.1.6 t4 {t4 MATCH 'd d'}     { s {{1 0} {0 1}} }
+do_matchinfo_test 4.1.7 t4 {t4 MATCH 'f OR abcd'} {
+  x { 
+    {0 1 1  1 1 1  0 0 0  0 0 0} 
+    {1 1 1  0 1 1  0 0 0  0 0 0}
+  }
+}
+do_matchinfo_test 4.1.8 t4 {t4 MATCH 'f -abcd'} {
+  x { 
+    {0 1 1  1 1 1}
+    {1 1 1  0 1 1}
+  }
+}
 
 do_execsql_test 4.2.0 {
   CREATE VIRTUAL TABLE t5 USING fts4;
index f5e31f320889077d6bf69ccf0f08c026f1272eff..e7c197da9ddb9cd3e03ab8108e04c3b50db31173 100644 (file)
@@ -200,4 +200,14 @@ do_execsql_test 4.6 {
   SELECT * FROM t3 WHERE t3 MATCH 'one*'
 } {{one two three}}
 
+#-------------------------------------------------------------------------
+# Syntax tests.
+#
+do_catchsql_test 5.1 {
+  CREATE VIRTUAL TABLE t4 USING fts4(prefix="abc");
+} {1 {error parsing prefix parameter: abc}}
+do_catchsql_test 5.2 {
+  CREATE VIRTUAL TABLE t4 USING fts4(prefix="");
+} {0 {}}
+
 finish_test
index ccdc203442775dbe8d872e1e41d59986b72edd78..be7560432b5ed4c684e339b9ed5a8744f5f1be56 100644 (file)
@@ -138,6 +138,8 @@ foreach {tn param res} {
   3 "order=dec"             {1 {unrecognized order: dec}}
   4 "order=xxx, order=asc"  {1 {unrecognized order: xxx}}
   5 "order=desc, order=asc" {0 {}}
+  6 "order=xxxx, order=asc" {1 {unrecognized order: xxxx}}
+  7 "order=desk"            {1 {unrecognized order: desk}}
 } {
   execsql { DROP TABLE IF EXISTS t1 }
   do_catchsql_test 2.1.$tn "
@@ -157,6 +159,9 @@ do_execsql_test 2.2 {
 do_execsql_test 2.3 {
   SELECT docid FROM t2 WHERE t2 MATCH 'aa';
 } {3 1}
+do_execsql_test 2.4 {
+  SELECT docid FROM t2 WHERE t2 MATCH 'aa' ORDER BY content;
+} {1 3}
 
 #-------------------------------------------------------------------------
 # Test that ticket [56be976859] has been fixed.