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:
14
manifest
14
manifest
@@ -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
|
||||||
|
@@ -1 +1 @@
|
|||||||
28ffd39c7162c8f7139711545122cffa257911dd
|
6a9fb47d5060fe641915f5f99cc9265409a4583b
|
@@ -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;
|
||||||
|
|
||||||
|
21
src/vdbe.c
21
src/vdbe.c
@@ -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);
|
||||||
|
Reference in New Issue
Block a user