]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
More tests for the new code on this branch.
authordan <Dan Kennedy>
Tue, 13 Aug 2024 21:15:43 +0000 (21:15 +0000)
committerdan <Dan Kennedy>
Tue, 13 Aug 2024 21:15:43 +0000 (21:15 +0000)
FossilOrigin-Name: 00792e807f1dde750e6ac9f9b0095cf60b9fa6ff7cf4b14440600a21de2ee61a

ext/fts5/fts5_main.c
ext/fts5/test/fts5blob.test
ext/fts5/test/fts5faultI.test [new file with mode: 0644]
ext/fts5/test/fts5locale.test
ext/fts5/test/fts5misc.test
manifest
manifest.uuid

index a70dad4b204e4c2404bc337a4a02c1618912eb98..80fe73a2fa908053ac7580a7a034d56c2a35cac6 100644 (file)
@@ -1992,12 +1992,11 @@ static int fts5UpdateMethod(
         }
       }
 
+      assert( eType1==SQLITE_INTEGER || eType1==SQLITE_NULL );
       if( eType0!=SQLITE_INTEGER ){
         /* An INSERT statement. If the conflict-mode is REPLACE, first remove
         ** the current entry (if any). */
-        if( eType1!=SQLITE_INTEGER && eType1!=SQLITE_NULL ){
-          rc = SQLITE_MISMATCH;
-        }else if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){
+        if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){
           i64 iNew = sqlite3_value_int64(apVal[1]);  /* Rowid to delete */
           rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0, 0);
           bUpdateOrDelete = 1;
@@ -2726,7 +2725,7 @@ static int fts5ApiColumnLocale(
         if( pConfig->eContent==FTS5_CONTENT_EXTERNAL ){
           const int SZHDR = sizeof(FTS5_LOCALE_HEADER)-1;
           if( nBlob<SZHDR || memcmp(FTS5_LOCALE_HEADER, pBlob, SZHDR) ){
-            rc = SQLITE_MISMATCH;
+            rc = SQLITE_ERROR;
           }
           pBlob += 4;
           nBlob -= 4;
@@ -2734,9 +2733,9 @@ static int fts5ApiColumnLocale(
         if( rc==SQLITE_OK ){
           int nLocale = 0;
           for(nLocale=0; nLocale<nBlob && pBlob[nLocale]!=0x00; nLocale++);
-          if( nLocale==nBlob ){
-            rc = FTS5_CORRUPT;
-          }else if( nLocale!=0 ){
+          if( nLocale==nBlob || nLocale==0 ){
+            rc = SQLITE_ERROR;
+          }else{
             /* A locale/text pair */
             *pzLocale = (const char*)pBlob;
             *pnLocale = nLocale;
@@ -2992,7 +2991,7 @@ static void fts5ExtractValueFromColumn(
 
     if( pConfig->eContent==FTS5_CONTENT_EXTERNAL ){
       if( nBlob<SZHDR || memcmp(pBlob, FTS5_LOCALE_HEADER, SZHDR) ){
-        sqlite3_result_error_code(pCtx, SQLITE_MISMATCH);
+        sqlite3_result_error_code(pCtx, SQLITE_ERROR);
         return;
       }else{
         pBlob += 4;
@@ -3001,7 +3000,9 @@ static void fts5ExtractValueFromColumn(
     }
 
     for(ii=0; ii<nBlob && pBlob[ii]; ii++);
-    if( ii<nBlob ){
+    if( ii==0 || ii==nBlob ){
+      sqlite3_result_error_code(pCtx, SQLITE_ERROR);
+    }else{
       const char *pText = (const char*)&pBlob[ii+1];
       sqlite3_result_text(pCtx, pText, nBlob-ii-1, SQLITE_TRANSIENT);
     }
index 985fe2888c0a011deefd9312ce4a5febee309f1e..4233719fbc1c74bb49cf47a4a4b1aff8448128f3 100644 (file)
@@ -144,6 +144,23 @@ do_catchsql_test 3.4 {
     VALUES(113, 'hello world', 'yesno', fts5_locale('en_AU', 'abc'));
 } {1 {fts5_locale() requires locale=1}}
 
+
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 4.0 {
+  CREATE VIRTUAL TABLE x1 USING fts5(x);
+}
+
+foreach {tn sql} {
+  1 { INSERT INTO x1(rowid, x) VALUES(4.5, 'abcd') }
+  2 { INSERT INTO x1(rowid, x) VALUES('xyz', 'abcd') }
+  3 { INSERT INTO x1(rowid, x) VALUES(X'001122', 'abcd') }
+} {
+  do_catchsql_test 4.1.$tn $sql {1 {datatype mismatch}}
+}
+
+
 finish_test
 
 
diff --git a/ext/fts5/test/fts5faultI.test b/ext/fts5/test/fts5faultI.test
new file mode 100644 (file)
index 0000000..0d5ef4a
--- /dev/null
@@ -0,0 +1,67 @@
+# 2010 June 15
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+source [file join [file dirname [info script]] fts5_common.tcl]
+source $testdir/malloc_common.tcl
+set testprefix fts5faultI
+
+# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
+ifcapable !fts5 {
+  finish_test
+  return
+}
+
+set ::testprefix fts5faultH
+
+do_execsql_test 1.0 {
+  PRAGMA encoding = utf16;
+  CREATE VIRTUAL TABLE t1 USING fts5(x, locale=1);
+  INSERT INTO t1 VALUES('origintext unicode61 ascii porter trigram');
+}
+
+faultsim_save_and_close
+faultsim_restore_and_reopen
+
+do_faultsim_test 1 -faults oom* -prep { 
+} -body {
+  execsql {
+    SELECT rowid FROM t1(fts5_locale('en_US', 'origintext'));
+  }
+} -test {
+  faultsim_test_result {0 1}
+}
+
+do_faultsim_test 2 -faults oom* -prep { 
+  faultsim_restore_and_reopen
+  execsql {
+    SELECT * FROM t1('ascii');
+  }
+} -body {
+  execsql {
+    UPDATE t1 SET rowid=rowid+1;
+  }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+fts5_aux_test_functions db
+do_faultsim_test 3 -faults oom* -prep { 
+} -body {
+  execsql {
+    SELECT fts5_columnlocale(t1, 0) FROM t1('unicode*');
+  }
+} -test {
+  faultsim_test_result {0 {{}}}
+}
+
+finish_test
+
index a8ea31e221d1fffbcb63e34e87590cd09517c997..a07f4ccfa86bf92e80be7934f2ed943f807ef22a 100644 (file)
@@ -88,9 +88,12 @@ do_execsql_test 2.1 {
   CREATE VIRTUAL TABLE ttt USING fts5vocab('b1', instance);
 }
 
-do_catchsql_test 2.2 {
+do_catchsql_test 2.2.1 {
   CREATE VIRTUAL TABLE b3 USING fts5(x, y, locale=2);
 } {1 {malformed locale=... directive}}
+do_catchsql_test 2.2.2 {
+  CREATE VIRTUAL TABLE b3 USING fts5(x, y, locale=111);
+} {1 {malformed locale=... directive}}
 
 do_catchsql_test 2.3 {
   INSERT INTO b1(b1, rank) VALUES('locale', 0);
@@ -418,7 +421,6 @@ do_execsql_test 8.1 {
 # Test that position-lists (used by xInst, xPhraseFirst etc.) work with
 # locales and modes other than detail=full.
 #
-
 foreach {tn detail} {
   1 detail=full
   2 detail=none
@@ -444,5 +446,80 @@ foreach {tn detail} {
   } {{it is an ancient [mariner]}}
 }
 
+#-------------------------------------------------------------------------
+# Check some corrupt fts5_locale() blob formats are detected.
+#
+foreach_detail_mode $::testprefix {
+
+  reset_db
+  sqlite3_fts5_create_tokenizer -v2 db tcl tcl_create
+  fts5_aux_test_functions db
+  do_execsql_test 10.1 {
+    CREATE TABLE x1(ii INTEGER PRIMARY KEY, x);
+    CREATE VIRTUAL TABLE ft USING fts5(x, 
+        content=x1, content_rowid=ii, locale=1, detail=%DETAIL%, columnsize=0
+    );
+  }
+  
+  foreach {tn v} {
+    1   X'001122'
+    2   X'0011223344'
+    3   X'00E0B2EB68656c6c6f'
+    4   X'00E0B2EB0068656c6c6f'
+  } {
+    do_execsql_test 10.2.$tn.0 { INSERT INTO ft(ft) VALUES('delete-all') }
+    do_execsql_test 10.2.$tn.1 { DELETE FROM x1; }
+    do_execsql_test 10.2.$tn.2 " INSERT INTO x1 VALUES(NULL, $v) "
+  
+    do_catchsql_test 10.2.$tn.3 {
+      INSERT INTO ft(ft) VALUES('rebuild');
+    } {1 {SQL logic error}}
+  
+    do_catchsql_test 10.2.$tn.4 "
+      SELECT * FROM ft( test_setsubtype($v, 76) );
+    " {1 {SQL logic error}}
+  
+    do_execsql_test 10.2.$tn.5 {
+      INSERT INTO ft(rowid, x) VALUES(1, 'hello world');
+    }
+  
+    if {"%DETAIL%"!="full"} {
+      do_catchsql_test 10.2.$tn.6 {
+        SELECT fts5_test_poslist(ft) FROM ft('world');
+      } {1 SQLITE_ERROR}
+  
+      do_catchsql_test 10.2.$tn.7 {
+        SELECT fts5_test_columnsize(ft) FROM ft('world');
+      } {1 SQLITE_ERROR}
+
+      do_catchsql_test 10.2.$tn.7 {
+        SELECT fts5_test_columnlocale(ft) FROM ft('world');
+      } {1 SQLITE_ERROR}
+    }
+
+    do_catchsql_test 10.2.$tn.8 {
+      SELECT * FROM ft('hello')
+    } {1 {SQL logic error}}
+  }
+
+}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+sqlite3_fts5_create_tokenizer -v2 db tcl tcl_create
+fts5_aux_test_functions db
+do_execsql_test 11.0 {
+  CREATE VIRTUAL TABLE x1 USING fts5(abc, locale=1);
+  INSERT INTO x1(rowid, abc) VALUES(123, fts5_locale('en_US', 'one two three'));
+}
+
+do_catchsql_test 11.1 {
+  SELECT fts5_columnlocale(x1, -1) FROM x1('two');
+} {1 SQLITE_RANGE}
+do_catchsql_test 11.2 {
+  SELECT fts5_columnlocale(x1, 1) FROM x1('two');
+} {1 SQLITE_RANGE}
+
 finish_test
 
index e4903d067a6d4255be2086812dc397c05b0013b0..a9806ff8bc62132d87c496d3b1dc2bfe290ff7e8 100644 (file)
@@ -59,6 +59,11 @@ do_catchsql_test 1.3.3 {
     WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads'));
 } {1 {no such cursor: 1}}
 
+fts5_aux_test_functions db
+do_catchsql_test 1.3.4 {
+  SELECT fts5_columntext(t1) FROM t1('*reads');
+} {1 {no such cursor: 1}}
+
 #-------------------------------------------------------------------------
 reset_db
 do_execsql_test 2.0 {
index 8e8fa479e790a10e55102392b82d58dfbaca43f9..318eb8554f7d729ccb4f6851c3fbfbda98c1b1ca 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stests\sand\sfix\sminor\sissues\swith\sthe\scode\son\sthis\sbranch.
-D 2024-08-13T15:04:00.350
+C More\stests\sfor\sthe\snew\scode\son\sthis\sbranch.
+D 2024-08-13T21:15:43.313
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -100,7 +100,7 @@ F ext/fts5/fts5_config.c 187f7ffa5eddd6539ffa592de85e95b18be951728491390121bb215
 F ext/fts5/fts5_expr.c 3a24c6ab5b7545312a5ec03085ae705ede820a08f9a63f1d72829ed4a35da6f6
 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1
 F ext/fts5/fts5_index.c eb9a0dda3bc6ef969a6be8d2746af56856e67251810ddba08622b45be8477abe
-F ext/fts5/fts5_main.c 42860180de19a159dd821e83450916ddfae92a6aeb8cd357c8c93ef10d3dec0e
+F ext/fts5/fts5_main.c f8eae223ce93aad7c503a76872267e0e6d288b54ccb4d9bfe894c4ed365f8d3c
 F ext/fts5/fts5_storage.c 5bf88213ff5911625c142ac332ddba10dcd0869e757f91f2a3d27f27ba595992
 F ext/fts5/fts5_tcl.c 50c7e16753fde0c4d80d8abd00a4ed2b0e998d5d3899a484510d01923c5da43b
 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
@@ -132,7 +132,7 @@ F ext/fts5/test/fts5auxdata.test 372549088ff792655f73e62b9dfaf4863ce74f5e604c06c
 F ext/fts5/test/fts5bigid.test 2860854c2561a57594192b00c33a29f91cb85e25f3d6c03b5c2b8f62708f39dd
 F ext/fts5/test/fts5bigpl.test 8f09858aab866c33593560e6480b2b6975ae7ff29ca32ad7b77e2da61402f8ef
 F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36
-F ext/fts5/test/fts5blob.test 2f84ef3591dd3eb0efa686a3615e9ed5c5005462c663c7c72c350692b99f91f5
+F ext/fts5/test/fts5blob.test caa33369e93e99ff494cd1103506ae34c5afbc0bcc369ed5e58e135144e33689
 F ext/fts5/test/fts5cat.test daba0b80659460b0cb60bd1f40b402478a761fe7ea414c3c94c2be25568cc33a
 F ext/fts5/test/fts5circref.test f880dfd0d99f6fb73b88ccacb0927d18e833672fd906cc47d6b4e529419eaa62
 F ext/fts5/test/fts5colset.test 544f4998cdbfe06a3123887fc0221612e8aa8192cdaff152872f1aadb10e6897
@@ -177,6 +177,7 @@ F ext/fts5/test/fts5faultE.test 844586ce71dab4be85bb86880e87b624d089f851654cd22e
 F ext/fts5/test/fts5faultF.test 4abef99f86e99d9f0c6460dd68c586a766b6b9f1f660ada55bf2e8266bd1bbc1
 F ext/fts5/test/fts5faultG.test 0544411ffcb3e19b42866f757a8a5e0fb8fef3a62c06f61d14deebc571bb7ea9
 F ext/fts5/test/fts5faultH.test 2b2b5b8cb1b3fd7679f488c06e22af44107fbc6137eaf45b3e771dc7b149312d
+F ext/fts5/test/fts5faultI.test bfaf9b94888ef604bd8034a3edd1bbdeb626c07337376b9b66d6171b28ee7931
 F ext/fts5/test/fts5first.test bfd685b96905bf541d99d8644e0a7219d1d833455a08ab64e344071a613b6ba9
 F ext/fts5/test/fts5full.test 97d263c1072f4a560929cca31e70f65d2ae232610e17e6affcf7e979df59547b
 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e
@@ -186,11 +187,11 @@ F ext/fts5/test/fts5interrupt.test 20d04204d3e341b104c0c24a41596b6393a3a81eba104
 F ext/fts5/test/fts5lastrowid.test f36298a1fb9f988bde060a274a7ce638faa9c38a31400f8d2d27ea9373e0c4a1
 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad
 F ext/fts5/test/fts5limits.test 8ab67cf5d311c124b6ceb0062d0297767176df4572d955fce79fa43004dff01c
-F ext/fts5/test/fts5locale.test 1f08fb39af3c0cb49ce48ec1212308db4b0105a38ff1a6864c8ef73abffb5431
+F ext/fts5/test/fts5locale.test f58ac6ab539d3813556646f7d4b1e19f7e3b1a56ca4439349eb8099d6a821ff6
 F ext/fts5/test/fts5matchinfo.test 877520582feb86bbfd95ab780099bcba4526f18ac75ee34979144cf86ba3a5a3
 F ext/fts5/test/fts5merge.test 2654df0bcdb2d117c2d38b6aeb0168061be01c643f9e9194b36c43a2970e8082
 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2
-F ext/fts5/test/fts5misc.test b88aa28ff20238b394495b0795cddca1a62b98fa09b99e462a8abc572d04ee88
+F ext/fts5/test/fts5misc.test 946abba0b45298e3d9d7a98e19eb4ac5384e8f2848ce1888c7ab3f62645efd2f
 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581
 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45
 F ext/fts5/test/fts5near.test 33d60867581066e5db7016deb5d651628125d7ff4e0233a88175aa5b65874c74
@@ -2207,8 +2208,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 1a7a9bd3f6a2b9347720f7f0386399e7f14b428500acf07d7c55b9dde1ec233a
-R 3ca8b15875339dd4f641808ef826812c
+P def5243a7b4f1d50427ba607d31332db2d6ac34b181b0cbd2ed4911064f5637a
+R 4b120525083c8e765eb88ddcda2d97e2
 U dan
-Z 64c2a3f3ef9fc7e9fed1ba5b27ea297b
+Z aad3d9cc9413a3fb75b2e684b7b3f795
 # Remove this line to create a well-formed Fossil manifest.
index 80e74cf5f3cf6e4b99cc004ee149780e049d6e41..154fd54b3fe672c1f2cae835c86c4fdeb7e5cc5f 100644 (file)
@@ -1 +1 @@
-def5243a7b4f1d50427ba607d31332db2d6ac34b181b0cbd2ed4911064f5637a
+00792e807f1dde750e6ac9f9b0095cf60b9fa6ff7cf4b14440600a21de2ee61a