From: drh <> Date: Fri, 24 Jul 2026 13:36:44 +0000 (+0000) Subject: Fix to the interaction between indexes-on-expressions, subtypes, and X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=22736272289590383a561ab16e29bcb0b1a116f8;p=thirdparty%2Fsqlite.git Fix to the interaction between indexes-on-expressions, subtypes, and the unary "+" operator. This is a continuation of the prior fix from check-in [d75c08c8416bde3f]. This enhanced fix is prompted by [bugs:/info/2026-07-24T08:42:47Z|Bug 2026-07-24T08:42:47Z]. FossilOrigin-Name: 5398c6a2b6b218461ce1f6437791c62c1ee125fba195660e0d6d1ad97ed6d14c --- diff --git a/manifest b/manifest index a83da3ed37..82569cc893 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\stest_syscall.c,\sassume\sSQLite\salways\scalls\sthe\s4\s(not\s5)\sargument\sform\sof\smremap().\sThis\sfixes\sa\sproblem\swith\sFil-C\sand\smmap2.test. -D 2026-07-24T10:38:27.958 +C Fix\sto\sthe\sinteraction\sbetween\sindexes-on-expressions,\ssubtypes,\sand\nthe\sunary\s"+"\soperator.\s\sThis\sis\sa\scontinuation\sof\sthe\sprior\sfix\sfrom\ncheck-in\s[d75c08c8416bde3f].\s\sThis\senhanced\sfix\sis\sprompted\sby\n[bugs:/info/2026-07-24T08:42:47Z|Bug\s2026-07-24T08:42:47Z]. +D 2026-07-24T13:36:44.121 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -740,7 +740,7 @@ F src/pragma.c 789ef67117b74b5be0a2db6681f7f0c55e6913791b9da309aefd280de2c8a74d F src/prepare.c 8954bb69defe377cd6a926f8c61d8215ea4f1974838d3ec6f22681a2c0a2939f F src/printf.c b480176bd0aaed9d64e804cfa3ca27fc585f65a73e7c7ca2fe9b9016db2cf6d5 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c -F src/resolve.c 54395ee97eb710e695202d4112cf2b1c1c7767a57afcea745df71abb1c917768 +F src/resolve.c 6bfd1a821e88106b2ef811acc9b7d8f3d7a4524cafe08a4189a8be4d79f2a30a F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c d2ad83d49c41c30d213873bac8481c6bf099438c61dcb597de52ddb55a6324fb F src/shell.c.in 0df571dd1eae1a15577361902eb5487a072d3290ea94e1e72e757050b641f870 @@ -1316,7 +1316,7 @@ F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a91 F test/index9.test 2ac891806a4136ef3e91280477e23114e67575207dc331e6797fa0ed9379f997 F test/indexA.test 11d84f6995e6e5b9d8315953fb1b6d29772ee7c7803ee9112715e7e4dd3e4974 F test/indexedby.test 444fb04ce0b21a3daf79f84e6735b49e5a5b3396623b37df5431eb09c8b8f557 -F test/indexexpr1.test e1e6a851d1054fa4fa43b60ad51f350519fabe756e313bc687af430a1efbff6e +F test/indexexpr1.test 5666c888682790e9ea932c134a519b842b2ef0a36b7bd7de51378ffb69f56863 F test/indexexpr2.test 60b364492af311e931615fbece279fc463b281fc1ecfced762b0d33053c82f3f F test/indexexpr3.test 47b91bc7999805c9a34d356f672259bc49295ecc797448511cae554a309b47cd F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 @@ -2217,8 +2217,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P d2d6363f31ecbae353a1e80810f42d9e2f0f8db0fe6294c7deadf0c58669b9d0 -R 28a9b7364f9b60c2ea806c4d63f7b987 -U dan -Z 51a343c0ae8825047216d933eea79aac +P 4d60798b20a560beb945afe7e2998714aa7e5a83a9db078d4431040f0b6e7350 +R bcb7fb7bd55d0c0545755c97da1a6ef8 +U drh +Z c6eb01888af81cac226065cb0f4ef157 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7000c013fc..9e24aedd69 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d60798b20a560beb945afe7e2998714aa7e5a83a9db078d4431040f0b6e7350 +5398c6a2b6b218461ce1f6437791c62c1ee125fba195660e0d6d1ad97ed6d14c diff --git a/src/resolve.c b/src/resolve.c index 223bfceb72..881264a3b8 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -964,11 +964,20 @@ static SQLITE_NOINLINE void resolveSetExprSubtypeArg(ExprList *pList){ nn = pList ? pList->nExpr : 0; for(ii=0; iia[ii].pExpr; - ExprSetProperty(pExpr, EP_SubtArg); - if( pExpr->op==TK_SELECT ){ - assert( ExprUseXSelect(pExpr) ); - assert( pExpr->x.pSelect!=0 ); - resolveSetExprSubtypeArg(pExpr->x.pSelect->pEList); + while( 1 /*exit-by-break*/ ){ + ExprSetProperty(pExpr, EP_SubtArg); + if( pExpr->op==TK_SELECT ){ + assert( ExprUseXSelect(pExpr) ); + assert( pExpr->x.pSelect!=0 ); + resolveSetExprSubtypeArg(pExpr->x.pSelect->pEList); + break; + } + if( pExpr->op==TK_UPLUS ){ + pExpr = pExpr->pLeft; + assert( pExpr!=0 ); + }else{ + break; + } } } } diff --git a/test/indexexpr1.test b/test/indexexpr1.test index 7c5740e7cf..30b181c4c5 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -706,4 +706,30 @@ do_catchsql_test indexexpr1-2310 { CREATE INDEX i2 ON t1( ~(addone(DISTINCT x)) ); } {1 {non-deterministic functions prohibited in index expressions}} +# Bug 2026-07-24T08:42:47Z +# Indexes-on-expression interacting with subtypes and the unary "+" operator +# +do_execsql_test indexexpr1-2500 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INT, j TEXT); + INSERT INTO t1 VALUES(1,'{"x":[1,2]}'); + SELECT json_array(json_extract(j,'$.x')) FROM t1 WHERE a=1; +} {[[1,2]]} +do_execsql_test indexexpr1-2501 { + SELECT json_array(+json_extract(j,'$.x')) FROM t1 WHERE a=1; +} {[[1,2]]} +do_execsql_test indexexpr1-2502 { + SELECT json_array(++json_extract(j,'$.x')) FROM t1 WHERE a=1; +} {[[1,2]]} +do_execsql_test indexexpr1-2503 { + CREATE INDEX ix ON t1(a, json_extract(j,'$.x')); + SELECT json_array(json_extract(j,'$.x')) FROM t1 WHERE a=1; +} {[[1,2]]} +do_execsql_test indexexpr1-2504 { + SELECT json_array(+json_extract(j,'$.x')) FROM t1 WHERE a=1; +} {[[1,2]]} +do_execsql_test indexexpr1-2505 { + SELECT json_array(++json_extract(j,'$.x')) FROM t1 WHERE a=1; +} {[[1,2]]} + finish_test