]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enable the optimization on this branch for indexes on expressions only.
authordan <Dan Kennedy>
Wed, 22 Apr 2026 17:50:50 +0000 (17:50 +0000)
committerdan <Dan Kennedy>
Wed, 22 Apr 2026 17:50:50 +0000 (17:50 +0000)
FossilOrigin-Name: 3576b6930436b3149c5033476f70518e9b4adeaeec2538a68b7dc599eb854c47

manifest
manifest.uuid
src/delete.c
test/expridx2.test

index 0ca2ab9b2f74d08f3b9c6895d4c12cf033299349..52f73ab06b0245bf879ab013fd2df19f1824e39c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sP3/P5\sconfusion\sin\sthe\scomment\sabove\sOP_IdxDelete.
-D 2026-04-22T17:31:19.738
+C Enable\sthe\soptimization\son\sthis\sbranch\sfor\sindexes\son\sexpressions\sonly.
+D 2026-04-22T17:50:50.730
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -685,7 +685,7 @@ F src/complete.c f216b970ce99c5a657556cf1f17e7ddd494515d3beb63df426bf59ff43bd3d9
 F src/date.c 61e92f1f7e2e88e1cd91e91dc69eb2b2854e7877254470f9fabd776bfac922b8
 F src/dbpage.c c9ea81c11727f27e02874611e92773e68e2a90a875ef2404b084564c235fd91f
 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
-F src/delete.c dbde329841d214a85b1fa9f4c7ce9f53e4fc3066d2f5d491b3364cd43ec3bc14
+F src/delete.c 59eeca3fb88c29329afc41bb803ee568b120d9dd7470b5f38ab55cc38390b451
 F src/expr.c 68400681c5f6e41231d2c85abf6bb432aeeb2e36c4abdf90eb7b78551a5ce0f3
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 931f74cec1dc8038a0217ef340c91ce147dd1bbed08dc40c47ee0ec6edfffb08
@@ -1108,7 +1108,7 @@ F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75f
 F test/exprfault.test da33606d799718e2f8e34efd0e5858884a1ad87f608774c552a7f5517cc27181
 F test/exprfault2.test c49e84273898969af5dbc4fe6a3f4335f14639799f343590336c9ddf84425965
 F test/expridx1.test b464520126e1d781a7800f8540621c82e8bbc526f089ff8b0b57ffc51feea6b7
-F test/expridx2.test 374fc3a1864e25f724c04a8c2eeec8c7fb14b7306c8de32b63cd6ebf7f7ce64f
+F test/expridx2.test 8890d483da880ce86bc5f2f6cd93c27af8a3b99871ed039fe385ee99dbeb9455
 F test/extension01.test 5de412c66276105901c370770175003381fdcb0c4da7054fa43cf4a31e0bfa3a
 F test/external_reader.test 6fdec43eeca23eb32faad1e95a4d1abc402bc8b3db70df12d6fc08a637f4a2b5
 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79
@@ -2203,8 +2203,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 7a01caf0d0864a462eb81b7643dcf89048f4ae56a29d762f0cfc38066218504f
-R f6ba1f248dd30549b7f4f352031f00e3
+P 0fb6ca8e22f355838a02223dd24b34c0669a6cc0b7ac80931c721db72cf5c1c8
+R 7af78ac5b7fa26cb04f29a37faac6c06
 U dan
-Z 3bf4f946ff4dbebc9016cd341c7b13d2
+Z d4134b8fef7b68b28ed810606a3d8b86
 # Remove this line to create a well-formed Fossil manifest.
index da9b5e746f9ee0d93c16460f5454b88603bf93f6..a0a6d0a1397168c23967be5350ef45c8b4016f51 100644 (file)
@@ -1 +1 @@
-0fb6ca8e22f355838a02223dd24b34c0669a6cc0b7ac80931c721db72cf5c1c8
+3576b6930436b3149c5033476f70518e9b4adeaeec2538a68b7dc599eb854c47
index e450c2ad6468702e5b89348e20ff1b693a9400cd..0b0b461afcf7ba3ecc9ab4e8371f3d8e9ccaf6a3 100644 (file)
@@ -915,6 +915,7 @@ void sqlite3GenerateRowIndexDelete(
   v = pParse->pVdbe;
   pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
   for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
+    int p3 = 0;
     assert( iIdxCur+i!=iDataCur || pPk==pIdx );
     if( aRegIdx!=0 && aRegIdx[i]==0 ) continue;
     if( pIdx==pPk ) continue;
@@ -922,7 +923,10 @@ void sqlite3GenerateRowIndexDelete(
     VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName));
     r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1,
         &iPartIdxLabel, pPrior, r1);
-    sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, aRegIdx ? aRegIdx[i] : 0);
+    if( pIdx->bHasExpr && aRegIdx ){
+      p3 = aRegIdx[i];
+    }
+    sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, p3);
     sqlite3VdbeChangeP4(v, -1, (const char*)pIdx, P4_INDEX);
     sqlite3VdbeChangeP5(v, pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn);
     sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel);
index 9cde0478a9dd03f2c02fadb97a0678eed47f04a6..55b234390ceaa4218965fd8853d9e2d3fdcd3ae9 100644 (file)
@@ -27,6 +27,13 @@ do_execsql_test 1.0 {
   CREATE INDEX t1a ON t1( (b->>'a') );
   CREATE INDEX t1b ON t1( (b->>'b') );
   CREATE INDEX t1c ON t1( (b->>'c') );
+
+  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
+  CREATE INDEX t2b ON t2( b );
+  INSERT INTO t2 VALUES(1, 1, 1);
+  INSERT INTO t2 VALUES(2, 2, 2);
+  INSERT INTO t2 VALUES(3, 3, 3);
+  INSERT INTO t2 VALUES(4, 4, 4);
 } {wal}
 
 proc nWrite {sql} {
@@ -56,5 +63,17 @@ do_test 1.3 {
 
 integrity_check 1.4
 
+do_test 1.5 {
+  nWrite { UPDATE t2 SET b = b+1, c=c+1 }
+} {2}
+
+do_test 1.6 {
+  nWrite { UPDATE t2 SET b = b, c=c+1 }
+} {2}
+
+do_test 1.7 {
+  nWrite { UPDATE t2 SET c=c+1 }
+} {1}
+
 finish_test