From: drh <> Date: Mon, 15 Jun 2026 11:52:31 +0000 (+0000) Subject: Fix a problem that could cause fts5 to return incorrect answers when performing prefi... X-Git-Tag: release~34 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=633e08da828c1708113f2592885bd84a3c98b77e;p=thirdparty%2Fsqlite.git Fix a problem that could cause fts5 to return incorrect answers when performing prefix queries on tokens with synonyms. FossilOrigin-Name: 4f21004f9b5fc9766183a3c4ac44cfeb6cd3e5583fef9176a26fecc2910f8c08 --- diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 8dc01bc0c2..844534a9e0 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -1758,10 +1758,10 @@ static int fts5ParseTokenize( memset(pSyn, 0, (size_t)nByte); pSyn->pTerm = ((char*)pSyn) + sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer); pSyn->nFullTerm = pSyn->nQueryTerm = nToken; + memcpy(pSyn->pTerm, pToken, nToken); if( pCtx->pConfig->bTokendata ){ pSyn->nQueryTerm = (int)strlen(pSyn->pTerm); } - memcpy(pSyn->pTerm, pToken, nToken); pSyn->pSynonym = pPhrase->aTerm[pPhrase->nTerm-1].pSynonym; pPhrase->aTerm[pPhrase->nTerm-1].pSynonym = pSyn; } diff --git a/ext/fts5/test/fts5synonym.test b/ext/fts5/test/fts5synonym.test index 55e2f186a9..0be125abc8 100644 --- a/ext/fts5/test/fts5synonym.test +++ b/ext/fts5/test/fts5synonym.test @@ -418,6 +418,34 @@ do_execsql_test 7.1.2 { INSERT INTO t2(t2) VALUES('integrity-check'); } +#------------------------------------------------------------------------- + +reset_db +fts5_aux_test_functions db + +proc tcl_create {args} { return "tcl_tokenize" } +sqlite3_fts5_create_tokenizer db tcl tcl_create + +proc tcl_tokenize {tflags text} { + foreach {w iStart iEnd} [fts5_tokenize_split $text] { + sqlite3_fts5_token $w $iStart $iEnd + if {$w=="usa"} { + sqlite3_fts5_token -colo "united" $iStart $iEnd + } + } +} + +do_execsql_test 8.0 { + CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize='tcl', tokendata=1); + INSERT INTO t1 VALUES('usa is great'); + INSERT INTO t1 VALUES('canada is cool'); + INSERT INTO t1 VALUES('australia is what matters'); +} + +do_execsql_test 8.1 { + SELECT * FROM t1 WHERE t1 MATCH 'usa*'; +} {{usa is great}} + } ;# foreach_detail_mode finish_test diff --git a/manifest b/manifest index e6cb09f1e4..09b32620aa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\srounding\sbehavior\sin\sthe\sdecimal\sextension\swhen\sall\sleading\sdigits\nare\s9\sand\sthere\sis\snot\sfractional\scomponent. -D 2026-06-15T10:16:23.491 +C Fix\sa\sproblem\sthat\scould\scause\sfts5\sto\sreturn\sincorrect\sanswers\swhen\sperforming\sprefix\squeries\son\stokens\swith\ssynonyms. +D 2026-06-15T11:52:31.943 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -111,7 +111,7 @@ F ext/fts5/fts5Int.h 8d98f8e180fe28d6067e240ed45b9011735d29d5cfb5bac194e1e376baa F ext/fts5/fts5_aux.c 27af933e1a052d9f12d62a45bc60e0b65023997e0cea8f0476ef3cf66e724599 F ext/fts5/fts5_buffer.c dcc3f0352339fe79c9d8abbc1c2009bc3469206467880bf43558447ef4f846fb F ext/fts5/fts5_config.c bfba970fe1e4eed18ee57c8d51458e226db9a960ddf775c5e50e3d76603a667e -F ext/fts5/fts5_expr.c 20e41452e4f83899a3a1bc66d018701186a0bbbc3a1a524f8cae447e0b150f05 +F ext/fts5/fts5_expr.c b906c59e9e842805cc3eea4e131b822e586bb01260e542f67920c61798dcb53d F ext/fts5/fts5_hash.c d5871df92ce3fa210a650cf419ee916b87c29977e86084d06612edf772bff6f5 F ext/fts5/fts5_index.c fac75f47c5b706996b09b0286caeeb206beeb621d24f5a8ca9198e4036e1f972 F ext/fts5/fts5_main.c b0fed47b3b4420ba6810373480a75bc28a9c0b7d16478d19a396436fb3ff17d7 @@ -249,7 +249,7 @@ F ext/fts5/test/fts5securefault.test c34a28c7cd2f31a8b8907563889e1329a97da975c08 F ext/fts5/test/fts5simple.test 302cdb4f8a3350b091f4f1bccd82d05610428657f6f9e81c17703ba48267ec40 F ext/fts5/test/fts5simple2.test d10d963a357b8ec77b99032e4c816459b4dbdb1f6eee25eada7ef3ed245cb2dc F ext/fts5/test/fts5simple3.test 4e03b82e669dc07bf9c9a04c306fa493764bc49c93e539896d87d88bd374fece -F ext/fts5/test/fts5synonym.test becc8cea6cfc958a50b30c572c68cbfdf7455971d0fe988202ce67638d2c6cf6 +F ext/fts5/test/fts5synonym.test e7facc771e5d00f24df64e169d466cb544b584f5cccc9a346eb30235e6dff82c F ext/fts5/test/fts5synonym2.test 58f357b997cf2fedeeb9d0de4db9f880fa96fa2fe27a743bfe7d7b96895bdd87 F ext/fts5/test/fts5tok1.test 1f7817499f5971450d8c4a652114b3d833393c8134e32422d0af27884ffe9cef F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 @@ -2200,9 +2200,9 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 50193066013df50af113576ae0b59af447212472da6d3824ca5aaf7dc9aab3ec -Q +c6a3b18ee9eb4b8dda57fab94aea9c61aed5e1ffe600f0bcf2c90ca752f2512b -R ca695a3d524c33285990f6c66262ace8 +P ae568e059bb179343c31baa3c8bcbe1c64fdcbb28b466af4840963c63d6369f5 +Q +323d87541a63f0b2c64271c78ad6ebd5d04220da59aebfdfbc07caa691af816a +R 4782b4ce8a0733c66e0ef8a801acfe03 U drh -Z 3d0a9e9b0ac536d37f621d950a8d9dbd +Z 72743ecba9a7f2497e748b44562ab1d7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bd04e05a9e..754971d9dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae568e059bb179343c31baa3c8bcbe1c64fdcbb28b466af4840963c63d6369f5 +4f21004f9b5fc9766183a3c4ac44cfeb6cd3e5583fef9176a26fecc2910f8c08