mirror of
https://github.com/sqlite/sqlite.git
synced 2026-10-23 21:49:02 +03:00
Do not use an index expression to evaluate a constant expression, as that
uses unnecessary disk access and might actually give incorrect results if the expression was moved outside of the indexed loop. The error condition arose in check-in [44200596aa943963] for version 3.41.0 and was first reported 3.5 years later by [bugs:/info/2026-10-11T19:26:40Z|Bug 2026-10-11T19:26:40Z]. FossilOrigin-Name: fee60d93e9fb37234d9cad50c65fb6d62dfe21a7fde21a16ce39025290375ad8
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
||||
C Fix\sa\sminor\stypo\sin\sa\scomment.
|
||||
D 2026-10-12T07:54:30.810
|
||||
C Do\snot\suse\san\sindex\sexpression\sto\sevaluate\sa\sconstant\sexpression,\sas\sthat\nuses\sunnecessary\sdisk\saccess\sand\smight\sactually\sgive\sincorrect\sresults\sif\nthe\sexpression\swas\smoved\soutside\sof\sthe\sindexed\sloop.\s\sThe\serror\scondition\narose\sin\scheck-in\s[44200596aa943963]\sfor\sversion\s3.41.0\sand\swas\sfirst\nreported\s3.5\syears\slater\sby\n[bugs:/info/2026-10-11T19:26:40Z|Bug\s2026-10-11T19:26:40Z].
|
||||
D 2026-10-12T10:24:09.887
|
||||
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
@@ -752,7 +752,7 @@ F src/date.c 080641f59097d14fc7341f8bc0458d273b3a62d8381916db8ccbc89c2aae07b3
|
||||
F src/dbpage.c ec8590c5e7a564cef28ca3c6156521316a4d26cb572a34841b0bcb26b67b3f97
|
||||
F src/dbstat.c 34d4e825fbf763640ce3dbc56910ab080495ef4a6efb48b2b1852a43d43763fc
|
||||
F src/delete.c 59eeca3fb88c29329afc41bb803ee568b120d9dd7470b5f38ab55cc38390b451
|
||||
F src/expr.c b90fd483db217989ca862d583e5afe2a0078720fd5bd0279b115f862c463dc05
|
||||
F src/expr.c 439921b2b411ca54176f7f069af93743fe587194f6a17032bbb8fa93cf201b27
|
||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||
F src/fkey.c 26788ae6c785d70f9829c4176e9764447014fc73e6ba31e9f1881720a64ae7f1
|
||||
F src/func.c 54d96eeafcb6ec4cff92028ea0f7bb09e27b375b248d969aeb80a61e560ef302
|
||||
@@ -1378,7 +1378,7 @@ F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a91
|
||||
F test/index9.test 2ac891806a4136ef3e91280477e23114e67575207dc331e6797fa0ed9379f997
|
||||
F test/indexA.test 11d84f6995e6e5b9d8315953fb1b6d29772ee7c7803ee9112715e7e4dd3e4974
|
||||
F test/indexedby.test da454b88cf7d86b8f13cdd41471a7d6a09d3eec391f741aa4a45762226ef87c3
|
||||
F test/indexexpr1.test 5666c888682790e9ea932c134a519b842b2ef0a36b7bd7de51378ffb69f56863
|
||||
F test/indexexpr1.test 1eea1b54fe65857354f0a90a7b8a5a4f759306759d7157043aa1a0fe5884ec07
|
||||
F test/indexexpr2.test 60b364492af311e931615fbece279fc463b281fc1ecfced762b0d33053c82f3f
|
||||
F test/indexexpr3.test 47b91bc7999805c9a34d356f672259bc49295ecc797448511cae554a309b47cd
|
||||
F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811
|
||||
@@ -2283,8 +2283,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
|
||||
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
|
||||
P ba74c33b6a69f8eeca3f8c497f9f74dd6dc92bfe8f4b0dcf0325595a5664c9d9
|
||||
R d705fc521feb88258ca2a0b075f3b359
|
||||
P 6c343ae1fc1a70a6ff837b003d1856a1bd3750083f1573e5ecf7ffdc0f58a588
|
||||
R 30ef643177943621f19969564f286e1f
|
||||
U drh
|
||||
Z 27670f6824bf23b07b409d44dcf1cc9a
|
||||
Z f6e5a4cf0986c91ae171f45cc9aad72d
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
||||
@@ -1 +1 @@
|
||||
6c343ae1fc1a70a6ff837b003d1856a1bd3750083f1573e5ecf7ffdc0f58a588
|
||||
fee60d93e9fb37234d9cad50c65fb6d62dfe21a7fde21a16ce39025290375ad8
|
||||
|
||||
14
src/expr.c
14
src/expr.c
@@ -4902,10 +4902,16 @@ static SQLITE_NOINLINE int sqlite3IndexedExprLookup(
|
||||
|
||||
v = pParse->pVdbe;
|
||||
assert( v!=0 );
|
||||
if( p->bMaybeNullRow ){
|
||||
/* If the index is on a NULL row due to an outer join, then we
|
||||
** cannot extract the value from the index. The value must be
|
||||
** computed using the original expression. */
|
||||
if( p->bMaybeNullRow || sqlite3ExprIsConstant(pParse, pExpr) ){
|
||||
/* The value of pExpr should be computed from the original expression,
|
||||
** not from the index, if either:
|
||||
**
|
||||
** 1. The index might be on a NULL row due to an outer join.
|
||||
**
|
||||
** 2. The expression is a constant. This prevents an attempt to
|
||||
** use an index value outside of the loop that positions the
|
||||
** index. (Bug 2026-10-11T19:26:40Z).
|
||||
*/
|
||||
int addr = sqlite3VdbeCurrentAddr(v);
|
||||
sqlite3VdbeAddOp3(v, OP_IfNullRow, p->iIdxCur, addr+3, target);
|
||||
VdbeCoverage(v);
|
||||
|
||||
@@ -732,4 +732,20 @@ do_execsql_test indexexpr1-2505 {
|
||||
SELECT json_array(++json_extract(j,'$.x')) FROM t1 WHERE a=1;
|
||||
} {[[1,2]]}
|
||||
|
||||
# Bug 2026-10-11T19:26:40Z
|
||||
do_execsql_test indexexpr1-2600 {
|
||||
CREATE TABLE t3(a INT, b TEXT, c INT);
|
||||
INSERT INTO t3 VALUES(0,'xyzzy', 1);
|
||||
CREATE INDEX t3a ON t3(a+1);
|
||||
SELECT * FROM (SELECT 99), t3 WHERE a=0 AND a+1=(SELECT 1);
|
||||
} {99 0 xyzzy 1}
|
||||
do_execsql_test indexexpr1-2610 {
|
||||
DROP INDEX t3a;
|
||||
CREATE INDEX t3ac ON t3(a+c);
|
||||
SELECT * FROM (SELECT 99), t3 WHERE a=0 AND a+c=(SELECT 1);
|
||||
} {99 0 xyzzy 1}
|
||||
do_execsql_test indexexpr1-2620 {
|
||||
SELECT * FROM (SELECT 99), t3 WHERE a=0 AND c=1 AND a+c=(SELECT 1);
|
||||
} {99 0 xyzzy 1}
|
||||
|
||||
finish_test
|
||||
|
||||
Reference in New Issue
Block a user