diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index d82a15a012..456f7c6acc 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -940,6 +940,13 @@ static int fts5ExprNearTest( if( i==pNear->nPhrase && (i==1 || fts5ExprNearIsMatch(pRc, pNear)) ){ return 1; } + + /* Not a match. Clear the position lists of all phrases, as some may + ** have been populated before the loop above exited early, and others + ** may still contain data left over from a previous row. */ + for(i=0; inPhrase; i++){ + pNear->apPhrase[i]->poslist.n = 0; + } return 0; } } diff --git a/ext/fts5/test/fts5near.test b/ext/fts5/test/fts5near.test index 82b92fde0c..c25604d028 100644 --- a/ext/fts5/test/fts5near.test +++ b/ext/fts5/test/fts5near.test @@ -80,4 +80,32 @@ do_execsql_test 2.1 { SELECT count(*) FROM t WHERE t MATCH 'NEAR(aaa aaa, 4)'; } {1} +#------------------------------------------------------------------------- +# Check that if a NEAR group does not match a row that is matched by +# another branch of an OR, the auxiliary functions do not see stale or +# partially populated position lists for the phrases of the NEAR group. +# +reset_db +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a, b); + INSERT INTO t1(rowid, a, b) VALUES (1, 'one', 'h e d c'); + INSERT INTO t1(rowid, a, b) VALUES (2, 'r h c', 'p q s t u'); +} + +do_execsql_test 3.1 { + SELECT rowid, highlight(t1, 1, '[', ']') FROM t1('b : NEAR(h c, 2) OR r'); +} {1 {[h] e d [c]} 2 {p q s t u}} + +do_execsql_test 3.2 { + UPDATE t1 SET b = 'x' WHERE rowid = 2; + SELECT rowid, snippet(t1, 1, '[', ']', '..', 3) + FROM t1('b : NEAR(h c, 2) OR r'); +} {1 {[h] e d..} 2 x} + +do_execsql_test 3.3 { + CREATE VIRTUAL TABLE t2 USING fts5(a); + INSERT INTO t2(a) VALUES ('r h d c'); + SELECT highlight(t2, 0, '[', ']') FROM t2('NEAR(h "c d") OR r'); +} {{[r] h d c}} + finish_test diff --git a/manifest b/manifest index e320f81863..d8bf79fb24 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssome\scases\swhere\sthe\slist\sof\smatches\smade\savailable\sto\sauxilary\sfts5\sfunctions\swas\snot\scorrect.\sReport\s[bugs:/info/2026-10-23T02:22:13Z\s|\s2026-10-23T02:22:13Z]. -D 2026-10-24T19:30:11.421 +C Fix\san\sfts5\sproblem\scausing\sauxiliary\sfunctions\sto\ssee\san\sincorrect\slist\sof\smatches\sin\ssome\scases\swhen\sthe\squery\scontains\sa\sNEAR\sexpression.\sReport\s[bugs:/info/2026-10-22T16:41:04Z\s|\s2026-10-22T16:41:04Z]. +D 2026-10-24T19:50:13.835 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -112,7 +112,7 @@ F ext/fts5/fts5Int.h 8d98f8e180fe28d6067e240ed45b9011735d29d5cfb5bac194e1e376baa F ext/fts5/fts5_aux.c 022066fe72bc15357cd3c3e620b6c566d7e030df859bae65bfc4649591b69d35 F ext/fts5/fts5_buffer.c dcc3f0352339fe79c9d8abbc1c2009bc3469206467880bf43558447ef4f846fb F ext/fts5/fts5_config.c d5df08345abc813a0b58be6b2e08ad9b3ba9be355c3ca3ae36226ffea760876f -F ext/fts5/fts5_expr.c 514f5f56fd6a7294d4cea7a2e077ccd5865c8ced2ad1d7fb7a77e6b309620100 +F ext/fts5/fts5_expr.c 77e1a5e4aa11209d38f488afeb7ee8a96b92c782154d67dedd5ec3c8a36f45aa F ext/fts5/fts5_hash.c 341a08ad0153b397b819ef3d7a7959c1dc3c84a6988a431d93dece8bd62ae10e F ext/fts5/fts5_index.c e8feafa4e8abc03536a7ac08f198f662eb5c247e9dcaf150b8b7193fa759928b F ext/fts5/fts5_main.c 4b588e2b8218021f3985d930f9dbf4eea4155c6e9cfa997fc9bc25ee8b11e448 @@ -218,7 +218,7 @@ F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd731 F ext/fts5/test/fts5misc.test 23e7f56dc89f26624073f4e07ec15d484a2196ff7c5da20f8fd9f5ef282a7749 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 -F ext/fts5/test/fts5near.test b173a56a3c45ac9fdd1626db2ddf923c42632489a4ccedfe68a806c1a0734286 +F ext/fts5/test/fts5near.test b370d30b899ebf2ff355ddd7716d3005d5ed648bd6efaab10645b57f7087c8dc F ext/fts5/test/fts5onepass.test b56d4109e841c2bc83555c162515748780ea6e0c455c54cf4afd4bd940d14b84 F ext/fts5/test/fts5optimize.test 264b9101721c17d06d1d174feb743fda3ddc89fad41dee980fef821428258e47 F ext/fts5/test/fts5optimize2.test 795d4ae5f66a7239cf8d5aef4c2ea96aeb8bcd907bd9be0cfe22064fc71a44ed @@ -2301,8 +2301,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 0ce909f57ad48cd1387785c7931a355954f4162396f19d364c5015095d91ef2f -R 04bd5a0bab71e5572705ab87661d8a57 +P 16ba33e6dffaf830f40cb13c1357dea33abf6de233e22e15f2caed42ee8ffe7f +R 35e20b48298ccf2e4111190b65e6b478 U dan -Z 3db0f228af9a0f4fcb8848224bbefe0e +Z f1a13dc8f7c5e03ba63aaa4eaf866104 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e513d79b7f..50a4924927 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16ba33e6dffaf830f40cb13c1357dea33abf6de233e22e15f2caed42ee8ffe7f +fcddc5ab9ab46852de1500430e16e04739341266651703a868138d666ca45cd6