]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
If OP_Rewind has P2 of zero, that is an assertion that the table is never code-generator-20230111
authordrh <>
Wed, 11 Jan 2023 17:50:24 +0000 (17:50 +0000)
committerdrh <>
Wed, 11 Jan 2023 17:50:24 +0000 (17:50 +0000)
empty.  This fixes a false-positive in the out-of-subroutine jump detection
logic added in version 3.39.0, and which was causing the assertion on the
previous check-in.

FossilOrigin-Name: 33fd9997ebb88f0d78522c036e75aef08015d31d28b1cbee08ae7c4cd5ecc6aa

manifest
manifest.uuid
src/vdbe.c
src/window.c

index cc8bbc6bd35e091249f6a68697c2a00f00ebb596..9d7e6bcea45513bdd2ab37148a6ebaa40027f2fc 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\san\sassert()\sto\sthe\sbyte-code\sengine\sthat\sgoes\soff\sif\sthe\sOP_Halt\sopcode\nis\sinvoked\swith\sSQLITE_INTERNAL.\s\sThis\scauses\sthe\sRIGHT\sJOIN\serror\n"Opcode\sjumps\sto\s...\swhich\sis\soutside\sthe\ssubroutine\s..."\sto\sfail\simmediately,\ncausing\sit\sto\scome\smore\sreadily\sto\stester's\sattention.\s\sThere\sis\sat\sleast\none\stestcase\sin\stest/fuzzdata8.db\sthat\sasserts\sdue\sto\sthis\schange.
-D 2023-01-11T16:44:57.242
+C If\sOP_Rewind\shas\sP2\sof\szero,\sthat\sis\san\sassertion\sthat\sthe\stable\sis\snever\nempty.\s\sThis\sfixes\sa\sfalse-positive\sin\sthe\sout-of-subroutine\sjump\sdetection\nlogic\sadded\sin\sversion\s3.39.0,\sand\swhich\swas\scausing\sthe\sassertion\son\sthe\nprevious\scheck-in.
+D 2023-01-11T17:50:24.382
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -717,7 +717,7 @@ F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
 F src/util.c 0e5cf9062a796f0f1b6b3228b121b2344932c05425f7c8b5a7cb245812473bbd
 F src/vacuum.c 84ce7f01f8a7a08748e107a441db83bcec13970190ddcb0c9ff522adbc1c23fd
-F src/vdbe.c 813c7895fc5516696b7acd5852df470c9ae7f91f46c4dcd7e0bd4e97f8c145b3
+F src/vdbe.c 238635c1c40d42d9ded72994b81d4127f99d6d09e9279bdd37f6f34f4025adee
 F src/vdbe.h 73b904a6b3bb27f308c6cc287a5751ebc7f1f89456be0ed068a12b92844c6e8c
 F src/vdbeInt.h fc15815b7bdafbb27e7f027faba2b0112e87d382c0d72241672528806ebc0db5
 F src/vdbeapi.c 4ee67890913c1d2469c68e3ad2e7ddeab57ac5924a64bbfd0906a8ea0d542c7f
@@ -736,7 +736,7 @@ F src/where.c d0d8e3cb2c11e77ba0f8f9ed8eada9d84dbd377167cdcf387b8eeb824c35a3ad
 F src/whereInt.h e25203e5bfee149f5f1225ae0166cfb4f1e65490c998a024249e98bb0647377c
 F src/wherecode.c 76bca3379219880d2527493b71a3be49e696f75396d3481e4de5d4ceec7886b2
 F src/whereexpr.c 7c5671a04b00c876bec5e99fd4e6f688065feb4773160fbf76fd7900d2901777
-F src/window.c 14836767adb26573b50f528eb37f8b1336f2c430ab38de7cead1e5c546bb4d8c
+F src/window.c 9ea4dc243420e029586c8e1ed5929fad2eae438279341ae9defc66e8f905aabc
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
 F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2a510a9
@@ -2068,11 +2068,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 6db42780a9e530bcc94490cc6080536309666dc13523272d1799d6661137e908
-R 7452496a34578ebcb2192d17749a2338
-T *branch * code-generator-20220111
-T *sym-code-generator-20220111 *
-T -sym-trunk *
+P b8f994414285264f4f7c472dfad646a061fc3580b754eac0f20080c24ecc256d
+R 33119e24f97d5be4ac5b9daaf803acf6
 U drh
-Z 8538b98284c40a3c08b07910b6f7dc3d
+Z 9446ccaebb4d9a169bf71f4d9d4b2e34
 # Remove this line to create a well-formed Fossil manifest.
index 7c003a69b5244432170752b05494a99ee4f0817f..24f2824819fb3d9a2ade8371f3a20457e81f092a 100644 (file)
@@ -1 +1 @@
-b8f994414285264f4f7c472dfad646a061fc3580b754eac0f20080c24ecc256d
\ No newline at end of file
+33fd9997ebb88f0d78522c036e75aef08015d31d28b1cbee08ae7c4cd5ecc6aa
\ No newline at end of file
index 9eb0cb8deeb498c5c733492283431904adbc93ad..92dc1e1edf7eff686c564ae9c5646fb5a00a0ce7 100644 (file)
@@ -6126,6 +6126,9 @@ case OP_Sort: {        /* jump */
 ** If the table or index is not empty, fall through to the following 
 ** instruction.
 **
+** If P2 is zero, that is an assertion that the P1 table is never
+** empty and hence the jump will never be taken.
+**
 ** This opcode leaves the cursor configured to move in forward order,
 ** from the beginning toward the end.  In other words, the cursor is
 ** configured to use Next, not Prev.
@@ -6137,6 +6140,8 @@ case OP_Rewind: {        /* jump, ncycle */
 
   assert( pOp->p1>=0 && pOp->p1<p->nCursor );
   assert( pOp->p5==0 );
+  assert( pOp->p2>=0 && pOp->p2<p->nOp );
+
   pC = p->apCsr[pOp->p1];
   assert( pC!=0 );
   assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) );
@@ -6156,9 +6161,10 @@ case OP_Rewind: {        /* jump, ncycle */
   }
   if( rc ) goto abort_due_to_error;
   pC->nullRow = (u8)res;
-  assert( pOp->p2>0 && pOp->p2<p->nOp );
-  VdbeBranchTaken(res!=0,2);
-  if( res ) goto jump_to_p2;
+  if( pOp->p2>0 ){
+    VdbeBranchTaken(res!=0,2);
+    if( res ) goto jump_to_p2;
+  }
   break;
 }
 
index 1ed3e49214934262cc620b732a039368374fc0ad..8dd35ee30b1f2e2469ea69ba119eb68cca7dc906 100644 (file)
@@ -2944,8 +2944,7 @@ void sqlite3WindowCodeStep(
     VdbeCoverageNeverNullIf(v, op==OP_Ge); /* NeverNull because bound <expr> */
     VdbeCoverageNeverNullIf(v, op==OP_Le); /*   values previously checked */
     windowAggFinal(&s, 0);
-    sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1);
-    VdbeCoverageNeverTaken(v);
+    sqlite3VdbeAddOp1(v, OP_Rewind, s.current.csr);
     windowReturnOneRow(&s);
     sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr);
     sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd);
@@ -2957,13 +2956,10 @@ void sqlite3WindowCodeStep(
   }
 
   if( pMWin->eStart!=TK_UNBOUNDED ){
-    sqlite3VdbeAddOp2(v, OP_Rewind, s.start.csr, 1);
-    VdbeCoverageNeverTaken(v);
+    sqlite3VdbeAddOp1(v, OP_Rewind, s.start.csr);
   }
-  sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1);
-  VdbeCoverageNeverTaken(v);
-  sqlite3VdbeAddOp2(v, OP_Rewind, s.end.csr, 1);
-  VdbeCoverageNeverTaken(v);
+  sqlite3VdbeAddOp1(v, OP_Rewind, s.current.csr);
+  sqlite3VdbeAddOp1(v, OP_Rewind, s.end.csr);
   if( regPeer && pOrderBy ){
     sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, pOrderBy->nExpr-1);
     sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.start.reg, pOrderBy->nExpr-1);