1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Take out the OP_JumpOnce opcode. Revert compound SELECT to use OP_IfNot,

which is the correct behavior.  Mark trigger registers as initially
invalid.

FossilOrigin-Name: 6a9fb47d5060fe641915f5f99cc9265409a4583b
This commit is contained in:
drh
2011-12-09 17:27:51 +00:00
parent f4d31bcb05
commit ec86c724ac
4 changed files with 12 additions and 28 deletions

View File

@@ -1,5 +1,5 @@
C Previous\scheck-in\sbroke\sauto-increment.\s\sThis\scheck-in\sappears\sto\sfix\sit. 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-09T16:59:19.303 D 2011-12-09T17:27:51.519
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -180,7 +180,7 @@ F src/printf.c 03104cbff6959ff45df69dc9060ba6212f60a869
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
F src/resolve.c 365ab1c870e38596d6869e76fb544fe6e4ffc809 F src/resolve.c 365ab1c870e38596d6869e76fb544fe6e4ffc809
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
F src/select.c d1895ff59f2051ad55e9075bf093fd28bcd36a89 F src/select.c fd3046fb39a1de8dce269e9b5ecbf58fe7e7e480
F src/shell.c 29812a900a780eb0f835c4bc65e216272689def8 F src/shell.c 29812a900a780eb0f835c4bc65e216272689def8
F src/sqlite.h.in 57081d8e6b53ce29541d7437c93bce6087ac53b5 F src/sqlite.h.in 57081d8e6b53ce29541d7437c93bce6087ac53b5
F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477 F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477
@@ -239,7 +239,7 @@ F src/update.c d3076782c887c10e882996550345da9c4c9f9dea
F src/utf.c 890c67dcfcc7a74623c95baac7535aadfe265e84 F src/utf.c 890c67dcfcc7a74623c95baac7535aadfe265e84
F src/util.c 01238e2b0f24a14779181dbf991fe02620a80e31 F src/util.c 01238e2b0f24a14779181dbf991fe02620a80e31
F src/vacuum.c 0c0ba2242355c6048d65e2b333abe0f7c06348fa F src/vacuum.c 0c0ba2242355c6048d65e2b333abe0f7c06348fa
F src/vdbe.c 9fc8110b1f2c5285e53948ac59ab4d0e75f18d28 F src/vdbe.c 029add0c5197a61db588824a58570547330b9d8f
F src/vdbe.h 18f581cac1f4339ec3299f3e0cc6e11aec654cdb F src/vdbe.h 18f581cac1f4339ec3299f3e0cc6e11aec654cdb
F src/vdbeInt.h 23a9506c9ab31e7823d7257d1828d2d7843443a0 F src/vdbeInt.h 23a9506c9ab31e7823d7257d1828d2d7843443a0
F src/vdbeapi.c 86189ebba2c49791d75eaa12929f3ce6527596bd F src/vdbeapi.c 86189ebba2c49791d75eaa12929f3ce6527596bd
@@ -978,7 +978,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
P 521d72bdf67b4b1972331307345a18c231a6e1d6 P 28ffd39c7162c8f7139711545122cffa257911dd
R 28ec5920c638a4a7052dc1caf48390ef R 121bb37be8c24842afbf4add96953aee
U drh U drh
Z 3eb2c2f097e358392b3aefdceca7c178 Z 11be617eddaa1f2d6fdfc985cd0a65fa

View File

@@ -1 +1 @@
28ffd39c7162c8f7139711545122cffa257911dd 6a9fb47d5060fe641915f5f99cc9265409a4583b

View File

@@ -1947,12 +1947,13 @@ static int generateOutputSubroutine(
*/ */
if( regPrev ){ if( regPrev ){
int j1, j2; 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, j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iMem, regPrev+1, pIn->nMem,
(char*)pKeyInfo, p4type); (char*)pKeyInfo, p4type);
sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2); sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2);
sqlite3VdbeJumpHere(v, j1); sqlite3VdbeJumpHere(v, j1);
sqlite3ExprCodeCopy(pParse, pIn->iMem, regPrev+1, pIn->nMem); sqlite3ExprCodeCopy(pParse, pIn->iMem, regPrev+1, pIn->nMem);
sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev);
} }
if( pParse->db->mallocFailed ) return 0; if( pParse->db->mallocFailed ) return 0;

View File

@@ -2052,22 +2052,6 @@ case OP_Once: { /* jump */
break; 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 * * /* Opcode: If P1 P2 P3 * *
** **
** Jump to P2 if the value in register P1 is true. The value ** 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; pProgram = pOp->p4.pProgram;
pRt = &aMem[pOp->p3]; pRt = &aMem[pOp->p3];
/*assert( memIsValid(pRt) );*/
assert( pProgram->nOp>0 ); assert( pProgram->nOp>0 );
/* If the p5 flag is clear, then recursive invocation of triggers is /* 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]; pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem];
for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){ for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){
pMem->flags = MEM_Null; pMem->flags = MEM_Invalid;
pMem->db = db; pMem->db = db;
} }
}else{ }else{
@@ -5278,7 +5261,7 @@ case OP_MemMax: { /* in2 */
}else{ }else{
pIn1 = &aMem[pOp->p1]; pIn1 = &aMem[pOp->p1];
} }
/*assert( memIsValid(pIn1) ); FIXME */ assert( memIsValid(pIn1) );
sqlite3VdbeMemIntegerify(pIn1); sqlite3VdbeMemIntegerify(pIn1);
pIn2 = &aMem[pOp->p2]; pIn2 = &aMem[pOp->p2];
sqlite3VdbeMemIntegerify(pIn2); sqlite3VdbeMemIntegerify(pIn2);