]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix to the interaction between indexes-on-expressions, subtypes, and
authordrh <>
Fri, 24 Jul 2026 13:36:44 +0000 (13:36 +0000)
committerdrh <>
Fri, 24 Jul 2026 13:36:44 +0000 (13:36 +0000)
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

manifest
manifest.uuid
src/resolve.c
test/indexexpr1.test

index a83da3ed37096a840dca9740b78fb03e5473644f..82569cc89302a0d73baf4adb4ea185754fde1035 100644 (file)
--- 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.
index 7000c013fc79949e1fecf0d69f7a0e6a55c7d69b..9e24aedd69ad1fb1e9c47e4de905a65cdd1d9ff0 100644 (file)
@@ -1 +1 @@
-4d60798b20a560beb945afe7e2998714aa7e5a83a9db078d4431040f0b6e7350
+5398c6a2b6b218461ce1f6437791c62c1ee125fba195660e0d6d1ad97ed6d14c
index 223bfceb72ab8ade71aa4d5236a621591dbb7582..881264a3b8cc90c41d97283da5670a4fc1479875 100644 (file)
@@ -964,11 +964,20 @@ static SQLITE_NOINLINE void resolveSetExprSubtypeArg(ExprList *pList){
   nn = pList ? pList->nExpr : 0;
   for(ii=0; ii<nn; ii++){
     Expr *pExpr = pList->a[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;
+      }
     }
   }
 }
index 7c5740e7cf65995d0b044309048e6123bd187443..30b181c4c5d901f3c78df69982cb5a8ad054e3a9 100644 (file)
@@ -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