]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Take out the OP_JumpOnce opcode. Revert compound SELECT to use OP_IfNot,
authordrh <drh@noemail.net>
Fri, 9 Dec 2011 17:27:51 +0000 (17:27 +0000)
committerdrh <drh@noemail.net>
Fri, 9 Dec 2011 17:27:51 +0000 (17:27 +0000)
which is the correct behavior.  Mark trigger registers as initially
invalid.

FossilOrigin-Name: 6a9fb47d5060fe641915f5f99cc9265409a4583b

manifest
manifest.uuid
src/select.c
src/vdbe.c

index 2814c2eb42e2917f212fa2dbc1b4e7ed4bd6e417..4cca45f7b73fc1411d96efd9b4ec0c83c5d2b6c8 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Previous\scheck-in\sbroke\sauto-increment.\s\sThis\scheck-in\sappears\sto\sfix\sit.
-D 2011-12-09T16:59:19.303
+C Take\sout\sthe\sOP_JumpOnce\sopcode.\s\sRevert\scompound\sSELECT\sto\suse\sOP_IfNot,\nwhich\sis\sthe\scorrect\sbehavior.\s\sMark\strigger\sregisters\sas\sinitially\ninvalid.
+D 2011-12-09T17:27:51.519
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -180,7 +180,7 @@ F src/printf.c 03104cbff6959ff45df69dc9060ba6212f60a869
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
 F src/resolve.c 365ab1c870e38596d6869e76fb544fe6e4ffc809
 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
-F src/select.c d1895ff59f2051ad55e9075bf093fd28bcd36a89
+F src/select.c fd3046fb39a1de8dce269e9b5ecbf58fe7e7e480
 F src/shell.c 29812a900a780eb0f835c4bc65e216272689def8
 F src/sqlite.h.in 57081d8e6b53ce29541d7437c93bce6087ac53b5
 F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477
@@ -239,7 +239,7 @@ F src/update.c d3076782c887c10e882996550345da9c4c9f9dea
 F src/utf.c 890c67dcfcc7a74623c95baac7535aadfe265e84
 F src/util.c 01238e2b0f24a14779181dbf991fe02620a80e31
 F src/vacuum.c 0c0ba2242355c6048d65e2b333abe0f7c06348fa
-F src/vdbe.c 9fc8110b1f2c5285e53948ac59ab4d0e75f18d28
+F src/vdbe.c 029add0c5197a61db588824a58570547330b9d8f
 F src/vdbe.h 18f581cac1f4339ec3299f3e0cc6e11aec654cdb
 F src/vdbeInt.h 23a9506c9ab31e7823d7257d1828d2d7843443a0
 F src/vdbeapi.c 86189ebba2c49791d75eaa12929f3ce6527596bd
@@ -978,7 +978,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P 521d72bdf67b4b1972331307345a18c231a6e1d6
-R 28ec5920c638a4a7052dc1caf48390ef
+P 28ffd39c7162c8f7139711545122cffa257911dd
+R 121bb37be8c24842afbf4add96953aee
 U drh
-Z 3eb2c2f097e358392b3aefdceca7c178
+Z 11be617eddaa1f2d6fdfc985cd0a65fa
index 9695c697d75f8b0977c1e9e71fc1c42417379b5a..c01915d14d36158407e67a049d600ada47be1d5b 100644 (file)
@@ -1 +1 @@
-28ffd39c7162c8f7139711545122cffa257911dd
\ No newline at end of file
+6a9fb47d5060fe641915f5f99cc9265409a4583b
\ No newline at end of file
index 870db3f850b4a32b5f236fdc0a3aaaa4ead9e886..793b849b793778daf71c57908e6be9bcf499fe1e 100644 (file)
@@ -1947,12 +1947,13 @@ static int generateOutputSubroutine(
   */
   if( regPrev ){
     int j1, j2;
-    j1 = sqlite3VdbeAddOp1(v, OP_JumpOnce, pParse->nOnce++);
+    j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev);
     j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iMem, regPrev+1, pIn->nMem,
                               (char*)pKeyInfo, p4type);
     sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2);
     sqlite3VdbeJumpHere(v, j1);
     sqlite3ExprCodeCopy(pParse, pIn->iMem, regPrev+1, pIn->nMem);
+    sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev);
   }
   if( pParse->db->mallocFailed ) return 0;
 
index 7f763cfe690123dc5d2d0187e4ffb8ed437af496..64ae54e3dbd20fb29feb5f0f204532606de4f758 100644 (file)
@@ -2052,22 +2052,6 @@ case OP_Once: {             /* jump */
   break;
 }
 
-/* Opcode: JumpOnce P1 P2 * * *
-**
-** Check if OP_Once flag P1 is clear. If so, set the flag and
-** jump to instruction P2. Otherwise fall through.
-**
-** See also: Once
-*/
-case OP_JumpOnce: {         /* jump */
-  assert( pOp->p1<p->nOnceFlag );
-  if( !p->aOnceFlag[pOp->p1] ){
-    pc = pOp->p2-1;
-    p->aOnceFlag[pOp->p1] = 1;
-  }
-  break;
-}
-
 /* Opcode: If P1 P2 P3 * *
 **
 ** Jump to P2 if the value in register P1 is true.  The value
@@ -5101,7 +5085,6 @@ case OP_Program: {        /* jump */
 
   pProgram = pOp->p4.pProgram;
   pRt = &aMem[pOp->p3];
-  /*assert( memIsValid(pRt) );*/
   assert( pProgram->nOp>0 );
   
   /* If the p5 flag is clear, then recursive invocation of triggers is 
@@ -5166,7 +5149,7 @@ case OP_Program: {        /* jump */
 
     pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem];
     for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){
-      pMem->flags = MEM_Null;
+      pMem->flags = MEM_Invalid;
       pMem->db = db;
     }
   }else{
@@ -5278,7 +5261,7 @@ case OP_MemMax: {        /* in2 */
   }else{
     pIn1 = &aMem[pOp->p1];
   }
-  /*assert( memIsValid(pIn1) );  FIXME */
+  assert( memIsValid(pIn1) );
   sqlite3VdbeMemIntegerify(pIn1);
   pIn2 = &aMem[pOp->p2];
   sqlite3VdbeMemIntegerify(pIn2);