]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Cherrypick three fixes from trunk.
authordrh <>
Thu, 30 Mar 2023 11:28:38 +0000 (11:28 +0000)
committerdrh <>
Thu, 30 Mar 2023 11:28:38 +0000 (11:28 +0000)
FossilOrigin-Name: 5583ea82c6e4555081a7b9ee3c397663abbcdd626e2d1e964aeb31e6d4d4bc4c

manifest
manifest.uuid
src/expr.c
src/vdbeapi.c
src/wherecode.c
test/aggfault.test [new file with mode: 0644]
test/scanstatus2.test
test/seekscan1.test

index 1902df6965cf0399ff892c5bb4c9bb6a5ab257ca..81ddd9519fd59a25a4a89cfc008a7b5c4cd11e0e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sPRAGMA\sintegrity_check\sso\sthat\sit\scan\sdetect\sthat\sa\sNOT\sNULL\scolumn\ncontains\sa\sNaN\svalue\sand\sreport\sthat\sas\san\serror.
-D 2023-03-29T11:40:56.785
+C Cherrypick\sthree\sfixes\sfrom\strunk.
+D 2023-03-30T11:28:38.380
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -571,7 +571,7 @@ F src/date.c f21815ca7172ce073db3163ac54c8d9f2841077165c1a6123b4d1c376a0c7ec7
 F src/dbpage.c d47549716549311f79dc39fe5c8fb19390a6eb2c960f8e37c89a9c4de0c1052e
 F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
 F src/delete.c a9c6d3f51c0a31e9b831e0a0580a98d702904b42d216fee530940e40dec34873
-F src/expr.c 4d42cbf2d03dacc6d62410f07d84c2e6677cea2e4a74bdf95efc13b81f4ee02a
+F src/expr.c 7661f8a701a9805a2a858cb46f9b9bc00218b02f2018cc3f7bfe1d393f2a9c4c
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
 F src/func.c d187be57a886ddf4e6b7ef584a494361899be3df5eee6d4a747b68ff4aff4122
@@ -694,7 +694,7 @@ F src/vacuum.c 84ce7f01f8a7a08748e107a441db83bcec13970190ddcb0c9ff522adbc1c23fd
 F src/vdbe.c 7415af77b86d79e51298b7be58c2e419263bc148c6ea8db9cd12e8c26197de09
 F src/vdbe.h 73b904a6b3bb27f308c6cc287a5751ebc7f1f89456be0ed068a12b92844c6e8c
 F src/vdbeInt.h a4147a4ddf613cb1bcb555ace9e9e74a9c099d65facd88155f191b1fb4d74cfb
-F src/vdbeapi.c 40c47b1528d308a322203de21d2e0d711753257ed9771771b6129214b1d65932
+F src/vdbeapi.c 998d240b3afd78df3581d545240330ca4cc09ecd10d0af730fe364f1c7eb253d
 F src/vdbeaux.c 3f9e3b6585e7434aa11300169dd66ddf0fc963a0c6f7940bdc058335dadeb353
 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
 F src/vdbemem.c cbd2305d6444dc0aa3ab0dbe8f45ca5166da6f5a9bb6402be9739b6443a83fd0
@@ -708,13 +708,14 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
 F src/where.c 9286604a250b5748cda8c5ac8c21d880a34c6d5839b5f2456a74f223eb6d4f48
 F src/whereInt.h e25203e5bfee149f5f1225ae0166cfb4f1e65490c998a024249e98bb0647377c
-F src/wherecode.c b82d0d33315e1526904b95155e55e61149c4462147668e1cc4567c812735eff1
+F src/wherecode.c cfb770843e99a4a977c37103e055c2cd8b15d6d694370d1e1b3f5ea59a3b963d
 F src/whereexpr.c 16d1eefd95f69843b45aba6d04fe2b63fc4f51584dff85ae380f5c20718f3c75
 F src/window.c 76a27cff9ea2ded0c2c3527187029259440fabcc4cc4c07b11d942c78494a614
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
 F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2a510a9
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
+F test/aggfault.test 0643b110cfec4e7f188087ae481f5538905096281694e4ba910beb1ec226d5fe
 F test/aggnested.test 7269d07ac879fce161cb26c8fabe65cba5715742fac8a1fccac570dcdaf28f00
 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
@@ -1435,7 +1436,7 @@ F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7
 F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa
 F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2
 F test/scanstatus.test 74391c2c0926994bf0962db6c04c9ff5b95d15a41d2e076fe011b73f92815e70
-F test/scanstatus2.test ca6c258425977e5935f0ff3a8670d9b5d813dd5b83cf0bbe39acfc0fd2b5a0b1
+F test/scanstatus2.test 86d60940518f97de69bc5abe8e313d8c5d1e7e841de67c36a10df3d6f09099be
 F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431
 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5
 F test/schema3.test 8ed4ae66e082cdd8b1b1f22d8549e1e7a0db4527a8e6ee8b6193053ee1e5c9ce
@@ -1445,7 +1446,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce
 F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e
 F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384
 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5
-F test/seekscan1.test d79c97de5bb1dd1fd466687f3014add514fddf8248c57baf51d749c7dfd573d8
+F test/seekscan1.test 31af16e3bb3203d153aea320939c5da97ec44705c2710d153c06a01397d45b09
 F test/select1.test 692e84cfa29c405854c69e8a4027183d64c22952866a123fabbce741a379e889
 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
 F test/select3.test 8d04b66df7475275a65f7e4a786d6a724c30bd9929f8ae5bd59c8d3d6e75e6cd
@@ -2045,9 +2046,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 36fd948e34c5f1bb1c49957ea349ac521c97a7298f4f9d61a683e03d20818651
-Q +7638d9755dc90fd353b874d03ed418fa8aaee4440290ff69b1b552eae84e5baa
-R 1c960a3a449ce114851d81381525a943
+P fbc27e18aac7e403c5888c031a57748eebcd31f47c639281c2febe3a64fc529b
+Q +1fa78fafa1340de458546526b03cf8b3e9c823913c4225d7c747ad182df5c0fc
+Q +804435a2731bd3c26278c47098854b9ee7727a686587f6208e793738fbfc0555
+Q +c9c4f287652933eb6262a3419efe7e7288f55d3db7e2ac032eeae025f665d306
+R bbb8e8c9e81ac8419477a569f7dbde0c
 U drh
-Z 39e87cd8c8bd9ad7cff84ba80cfe8d76
+Z 761901dddc4ad02e8ffe55112903e925
 # Remove this line to create a well-formed Fossil manifest.
index c064948783fc0f55bf6907161c88a2f3a09dbfe9..b2cb12b0320dab5ab5ab132c371c7fa2d825b4cd 100644 (file)
@@ -1 +1 @@
-fbc27e18aac7e403c5888c031a57748eebcd31f47c639281c2febe3a64fc529b
\ No newline at end of file
+5583ea82c6e4555081a7b9ee3c397663abbcdd626e2d1e964aeb31e6d4d4bc4c
\ No newline at end of file
index 124c5450578707b8518b336cfca746b46ce7d916..a95c66680035baf4ff08ab3dfe1fc38b988d70d2 100644 (file)
@@ -6462,6 +6462,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
       tmp.iTable = pIEpr->iIdxCur;
       tmp.iColumn = pIEpr->iIdxCol;
       findOrCreateAggInfoColumn(pParse, pAggInfo, &tmp);
+      if( pParse->nErr ) return WRC_Abort;
       pAggInfo->aCol[tmp.iAgg].pCExpr = pExpr;
       pExpr->pAggInfo = pAggInfo;
       pExpr->iAgg = tmp.iAgg;
index 476b6a2adfb6f9035296dde3f1f0fe61e0563511..42f3bb0b40dd779cde2e4d8f3e925c4841701df4 100644 (file)
@@ -2138,15 +2138,24 @@ int sqlite3_stmt_scanstatus_v2(
   void *pOut                      /* OUT: Write the answer here */
 ){
   Vdbe *p = (Vdbe*)pStmt;
+  VdbeOp *aOp = p->aOp;
+  int nOp = p->nOp;
   ScanStatus *pScan;
   int idx;
 
+  if( p->pFrame ){
+    VdbeFrame *pFrame;
+    for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
+    aOp = pFrame->aOp;
+    nOp = pFrame->nOp;
+  }
+
   if( iScan<0 ){
     int ii;
     if( iScanStatusOp==SQLITE_SCANSTAT_NCYCLE ){
       i64 res = 0;
-      for(ii=0; ii<p->nOp; ii++){
-        res += p->aOp[ii].nCycle;
+      for(ii=0; ii<nOp; ii++){
+        res += aOp[ii].nCycle;
       }
       *(i64*)pOut = res;
       return 0;
@@ -2172,7 +2181,7 @@ int sqlite3_stmt_scanstatus_v2(
   switch( iScanStatusOp ){
     case SQLITE_SCANSTAT_NLOOP: {
       if( pScan->addrLoop>0 ){
-        *(sqlite3_int64*)pOut = p->aOp[pScan->addrLoop].nExec;
+        *(sqlite3_int64*)pOut = aOp[pScan->addrLoop].nExec;
       }else{
         *(sqlite3_int64*)pOut = -1;
       }
@@ -2180,7 +2189,7 @@ int sqlite3_stmt_scanstatus_v2(
     }
     case SQLITE_SCANSTAT_NVISIT: {
       if( pScan->addrVisit>0 ){
-        *(sqlite3_int64*)pOut = p->aOp[pScan->addrVisit].nExec;
+        *(sqlite3_int64*)pOut = aOp[pScan->addrVisit].nExec;
       }else{
         *(sqlite3_int64*)pOut = -1;
       }
@@ -2202,7 +2211,7 @@ int sqlite3_stmt_scanstatus_v2(
     }
     case SQLITE_SCANSTAT_EXPLAIN: {
       if( pScan->addrExplain ){
-        *(const char**)pOut = p->aOp[ pScan->addrExplain ].p4.z;
+        *(const char**)pOut = aOp[ pScan->addrExplain ].p4.z;
       }else{
         *(const char**)pOut = 0;
       }
@@ -2210,7 +2219,7 @@ int sqlite3_stmt_scanstatus_v2(
     }
     case SQLITE_SCANSTAT_SELECTID: {
       if( pScan->addrExplain ){
-        *(int*)pOut = p->aOp[ pScan->addrExplain ].p1;
+        *(int*)pOut = aOp[ pScan->addrExplain ].p1;
       }else{
         *(int*)pOut = -1;
       }
@@ -2218,7 +2227,7 @@ int sqlite3_stmt_scanstatus_v2(
     }
     case SQLITE_SCANSTAT_PARENTID: {
       if( pScan->addrExplain ){
-        *(int*)pOut = p->aOp[ pScan->addrExplain ].p2;
+        *(int*)pOut = aOp[ pScan->addrExplain ].p2;
       }else{
         *(int*)pOut = -1;
       }
@@ -2236,18 +2245,18 @@ int sqlite3_stmt_scanstatus_v2(
           if( iIns==0 ) break;
           if( iIns>0 ){
             while( iIns<=iEnd ){
-              res += p->aOp[iIns].nCycle;
+              res += aOp[iIns].nCycle;
               iIns++;
             }
           }else{
             int iOp;
-            for(iOp=0; iOp<p->nOp; iOp++){
-              Op *pOp = &p->aOp[iOp];
+            for(iOp=0; iOp<nOp; iOp++){
+              Op *pOp = &aOp[iOp];
               if( pOp->p1!=iEnd ) continue;
               if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_NCYCLE)==0 ){
                 continue;
               }
-              res += p->aOp[iOp].nCycle;
+              res += aOp[iOp].nCycle;
             }
           }
         }
index 860acb44cf55a4fa655e8df1449602d7a3b76cfb..42006da82fc44325fa93e3b09b4ea7ce0179c744 100644 (file)
@@ -1925,7 +1925,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
         ** guess. */
         addrSeekScan = sqlite3VdbeAddOp1(v, OP_SeekScan, 
                                          (pIdx->aiRowLogEst[0]+9)/10);
-        if( pRangeStart ){
+        if( pRangeStart || pRangeEnd ){
           sqlite3VdbeChangeP5(v, 1);
           sqlite3VdbeChangeP2(v, addrSeekScan, sqlite3VdbeCurrentAddr(v)+1);
           addrSeekScan = 0;
@@ -1966,16 +1966,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
     assert( pLevel->p2==0 );
     if( pRangeEnd ){
       Expr *pRight = pRangeEnd->pExpr->pRight;
-      if( addrSeekScan ){
-        /* For a seek-scan that has a range on the lowest term of the index,
-        ** we have to make the top of the loop be code that sets the end
-        ** condition of the range.  Otherwise, the OP_SeekScan might jump
-        ** over that initialization, leaving the range-end value set to the
-        ** range-start value, resulting in a wrong answer.
-        ** See ticket 5981a8c041a3c2f3 (2021-11-02).
-        */
-        pLevel->p2 = sqlite3VdbeCurrentAddr(v);
-      }
+      assert( addrSeekScan==0 );
       codeExprOrVector(pParse, pRight, regBase+nEq, nTop);
       whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd);
       if( (pRangeEnd->wtFlags & TERM_VNULL)==0
diff --git a/test/aggfault.test b/test/aggfault.test
new file mode 100644 (file)
index 0000000..3b9d957
--- /dev/null
@@ -0,0 +1,43 @@
+# 2023 March 30
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix aggfault
+
+
+do_execsql_test 1 {
+  CREATE TABLE t1(x);
+  CREATE TABLE t1x ON t1(x, x=0);
+}
+faultsim_save_and_close
+
+do_faultsim_test 2 -faults oom* -prep {
+  faultsim_restore_and_reopen
+  execsql { SELECT * FROM sqlite_schema }
+} -body {
+  execsql {
+    SELECT * FROM t1 AS a1 WHERE (
+      SELECT count(x AND 0=a1.x) FROM t1 GROUP BY abs(1)
+    ) AND x=(
+      SELECT * FROM t1 AS a1 
+      WHERE (SELECT count(x IS 1 AND a1.x=0) 
+      FROM t1 
+      GROUP BY abs(1)) AND x=0
+    );
+  }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+
+finish_test
index 497cbe67d82b7bf3d64a1e884bfecca015728aec..110b2af41860842ce2e9fc9eb68c5a89e84c5b77 100644 (file)
@@ -232,6 +232,34 @@ QUERY (nCycle=nnn)
 --SEARCH v1 USING AUTOMATIC COVERING INDEX (x1=?) (nCycle=nnn)
 }
 
+#-------------------------------------------------------------------------
+reset_db
+
+ifcapable trace { 
+  do_execsql_test 5.0 {
+    CREATE TABLE t1(x, y);
+    CREATE TRIGGER tr1 AFTER DELETE ON t1 BEGIN
+      SELECT 1;
+    END;
+    INSERT INTO t1 VALUES(1, 2);
+  }
+  
+  proc trace {stmt sql} {
+    array set A [sqlite3_stmt_scanstatus -flags complex [format %x $stmt] 0]
+    lappend ::trace_explain $A(zExplain)
+  }
+  db trace_v2 trace 
+  
+  set ::trace_explain [list]
+  do_execsql_test 5.1 {
+    DELETE FROM t1 WHERE x=1;
+  }
+  
+  do_test 5.2 {
+    set ::trace_explain
+  } {{SCAN t1} {SCAN t1} {SCAN t1}}
+}
+
 finish_test
 
 
index e68d71449d97647dcd689094280fb6f93da5f98a..0e53c1916688e6328429c9191695ae371e9ebb16 100644 (file)
@@ -24,6 +24,7 @@ do_execsql_test 1.0 {
   ANALYZE;
 }
 
+
 do_execsql_test 1.1 {
   SELECT a,b,c FROM t1 
   WHERE b IN (234, 345) AND c BETWEEN 6 AND 6.5 AND a='abc' 
@@ -59,5 +60,9 @@ do_execsql_test 1.4 {
   abc 345 7
 }
 
+do_execsql_test 1.5 {
+  SELECT a,b,c FROM t1 WHERE b IN (235, 345) AND c<=3 AND a='abc' ORDER BY a, b;
+}
+
 
 finish_test