mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Merge all recent trunk fixes and enhancements into the sessions branch.
FossilOrigin-Name: e65e65f9bc9b4bf5c9dd6e3a77a0d5f03c40e006
This commit is contained in:
312
src/vdbe.c
312
src/vdbe.c
@@ -524,6 +524,21 @@ static int checkSavepointCount(sqlite3 *db){
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Return the register of pOp->p2 after first preparing it to be
|
||||
** overwritten with an integer value.
|
||||
*/
|
||||
static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){
|
||||
Mem *pOut;
|
||||
assert( pOp->p2>0 );
|
||||
assert( pOp->p2<=(p->nMem-p->nCursor) );
|
||||
pOut = &p->aMem[pOp->p2];
|
||||
memAboutToChange(p, pOut);
|
||||
if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut);
|
||||
pOut->flags = MEM_Int;
|
||||
return pOut;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Execute as much of a VDBE program as we can.
|
||||
@@ -532,9 +547,8 @@ static int checkSavepointCount(sqlite3 *db){
|
||||
int sqlite3VdbeExec(
|
||||
Vdbe *p /* The VDBE */
|
||||
){
|
||||
int pc=0; /* The program counter */
|
||||
Op *aOp = p->aOp; /* Copy of p->aOp */
|
||||
Op *pOp; /* Current operation */
|
||||
Op *pOp = aOp; /* Current operation */
|
||||
int rc = SQLITE_OK; /* Value to return */
|
||||
sqlite3 *db = p->db; /* The database */
|
||||
u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */
|
||||
@@ -610,23 +624,22 @@ int sqlite3VdbeExec(
|
||||
}
|
||||
sqlite3EndBenignMalloc();
|
||||
#endif
|
||||
for(pc=p->pc; rc==SQLITE_OK; pc++){
|
||||
assert( pc>=0 && pc<p->nOp );
|
||||
for(pOp=&aOp[p->pc]; rc==SQLITE_OK; pOp++){
|
||||
assert( pOp>=aOp && pOp<&aOp[p->nOp]);
|
||||
if( db->mallocFailed ) goto no_mem;
|
||||
#ifdef VDBE_PROFILE
|
||||
start = sqlite3Hwtime();
|
||||
#endif
|
||||
nVmStep++;
|
||||
pOp = &aOp[pc];
|
||||
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
|
||||
if( p->anExec ) p->anExec[pc]++;
|
||||
if( p->anExec ) p->anExec[(int)(pOp-aOp)]++;
|
||||
#endif
|
||||
|
||||
/* Only allow tracing if SQLITE_DEBUG is defined.
|
||||
*/
|
||||
#ifdef SQLITE_DEBUG
|
||||
if( db->flags & SQLITE_VdbeTrace ){
|
||||
sqlite3VdbePrintOp(stdout, pc, pOp);
|
||||
sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -643,23 +656,9 @@ int sqlite3VdbeExec(
|
||||
}
|
||||
#endif
|
||||
|
||||
/* On any opcode with the "out2-prerelease" tag, free any
|
||||
** external allocations out of mem[p2] and set mem[p2] to be
|
||||
** an undefined integer. Opcodes will either fill in the integer
|
||||
** value or convert mem[p2] to a different type.
|
||||
*/
|
||||
assert( pOp->opflags==sqlite3OpcodeProperty[pOp->opcode] );
|
||||
if( pOp->opflags & OPFLG_OUT2_PRERELEASE ){
|
||||
assert( pOp->p2>0 );
|
||||
assert( pOp->p2<=(p->nMem-p->nCursor) );
|
||||
pOut = &aMem[pOp->p2];
|
||||
memAboutToChange(p, pOut);
|
||||
if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut);
|
||||
pOut->flags = MEM_Int;
|
||||
}
|
||||
|
||||
/* Sanity checking on other operands */
|
||||
#ifdef SQLITE_DEBUG
|
||||
assert( pOp->opflags==sqlite3OpcodeProperty[pOp->opcode] );
|
||||
if( (pOp->opflags & OPFLG_IN1)!=0 ){
|
||||
assert( pOp->p1>0 );
|
||||
assert( pOp->p1<=(p->nMem-p->nCursor) );
|
||||
@@ -715,7 +714,7 @@ int sqlite3VdbeExec(
|
||||
**
|
||||
** Other keywords in the comment that follows each case are used to
|
||||
** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[].
|
||||
** Keywords include: in1, in2, in3, out2_prerelease, out2, out3. See
|
||||
** Keywords include: in1, in2, in3, out2, out3. See
|
||||
** the mkopcodeh.awk script for additional information.
|
||||
**
|
||||
** Documentation about VDBE opcodes is generated by scanning this file
|
||||
@@ -743,7 +742,8 @@ int sqlite3VdbeExec(
|
||||
** to the current line should be indented for EXPLAIN output.
|
||||
*/
|
||||
case OP_Goto: { /* jump */
|
||||
pc = pOp->p2 - 1;
|
||||
jump_to_p2_and_check_for_interrupt:
|
||||
pOp = &aOp[pOp->p2 - 1];
|
||||
|
||||
/* Opcodes that are used as the bottom of a loop (OP_Next, OP_Prev,
|
||||
** OP_VNext, OP_RowSetNext, or OP_SorterNext) all jump here upon
|
||||
@@ -788,9 +788,13 @@ case OP_Gosub: { /* jump */
|
||||
assert( VdbeMemDynamic(pIn1)==0 );
|
||||
memAboutToChange(p, pIn1);
|
||||
pIn1->flags = MEM_Int;
|
||||
pIn1->u.i = pc;
|
||||
pIn1->u.i = (int)(pOp-aOp);
|
||||
REGISTER_TRACE(pOp->p1, pIn1);
|
||||
pc = pOp->p2 - 1;
|
||||
|
||||
/* Most jump operations do a goto to this spot in order to update
|
||||
** the pOp pointer. */
|
||||
jump_to_p2:
|
||||
pOp = &aOp[pOp->p2 - 1];
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -802,7 +806,7 @@ case OP_Gosub: { /* jump */
|
||||
case OP_Return: { /* in1 */
|
||||
pIn1 = &aMem[pOp->p1];
|
||||
assert( pIn1->flags==MEM_Int );
|
||||
pc = (int)pIn1->u.i;
|
||||
pOp = &aOp[pIn1->u.i];
|
||||
pIn1->flags = MEM_Undefined;
|
||||
break;
|
||||
}
|
||||
@@ -826,7 +830,7 @@ case OP_InitCoroutine: { /* jump */
|
||||
assert( !VdbeMemDynamic(pOut) );
|
||||
pOut->u.i = pOp->p3 - 1;
|
||||
pOut->flags = MEM_Int;
|
||||
if( pOp->p2 ) pc = pOp->p2 - 1;
|
||||
if( pOp->p2 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -846,7 +850,7 @@ case OP_EndCoroutine: { /* in1 */
|
||||
pCaller = &aOp[pIn1->u.i];
|
||||
assert( pCaller->opcode==OP_Yield );
|
||||
assert( pCaller->p2>=0 && pCaller->p2<p->nOp );
|
||||
pc = pCaller->p2 - 1;
|
||||
pOp = &aOp[pCaller->p2 - 1];
|
||||
pIn1->flags = MEM_Undefined;
|
||||
break;
|
||||
}
|
||||
@@ -870,9 +874,9 @@ case OP_Yield: { /* in1, jump */
|
||||
assert( VdbeMemDynamic(pIn1)==0 );
|
||||
pIn1->flags = MEM_Int;
|
||||
pcDest = (int)pIn1->u.i;
|
||||
pIn1->u.i = pc;
|
||||
pIn1->u.i = (int)(pOp - aOp);
|
||||
REGISTER_TRACE(pOp->p1, pIn1);
|
||||
pc = pcDest;
|
||||
pOp = &aOp[pcDest];
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -923,30 +927,34 @@ case OP_HaltIfNull: { /* in3 */
|
||||
case OP_Halt: {
|
||||
const char *zType;
|
||||
const char *zLogFmt;
|
||||
VdbeFrame *pFrame;
|
||||
int pcx;
|
||||
|
||||
pcx = (int)(pOp - aOp);
|
||||
if( pOp->p1==SQLITE_OK && p->pFrame ){
|
||||
/* Halt the sub-program. Return control to the parent frame. */
|
||||
VdbeFrame *pFrame = p->pFrame;
|
||||
pFrame = p->pFrame;
|
||||
p->pFrame = pFrame->pParent;
|
||||
p->nFrame--;
|
||||
sqlite3VdbeSetChanges(db, p->nChange);
|
||||
pc = sqlite3VdbeFrameRestore(pFrame);
|
||||
pcx = sqlite3VdbeFrameRestore(pFrame);
|
||||
lastRowid = db->lastRowid;
|
||||
if( pOp->p2==OE_Ignore ){
|
||||
/* Instruction pc is the OP_Program that invoked the sub-program
|
||||
/* Instruction pcx is the OP_Program that invoked the sub-program
|
||||
** currently being halted. If the p2 instruction of this OP_Halt
|
||||
** instruction is set to OE_Ignore, then the sub-program is throwing
|
||||
** an IGNORE exception. In this case jump to the address specified
|
||||
** as the p2 of the calling OP_Program. */
|
||||
pc = p->aOp[pc].p2-1;
|
||||
pcx = p->aOp[pcx].p2-1;
|
||||
}
|
||||
aOp = p->aOp;
|
||||
aMem = p->aMem;
|
||||
pOp = &aOp[pcx];
|
||||
break;
|
||||
}
|
||||
p->rc = pOp->p1;
|
||||
p->errorAction = (u8)pOp->p2;
|
||||
p->pc = pc;
|
||||
p->pc = pcx;
|
||||
if( p->rc ){
|
||||
if( pOp->p5 ){
|
||||
static const char * const azType[] = { "NOT NULL", "UNIQUE", "CHECK",
|
||||
@@ -970,7 +978,7 @@ case OP_Halt: {
|
||||
}else{
|
||||
sqlite3SetString(&p->zErrMsg, db, "%s constraint failed", zType);
|
||||
}
|
||||
sqlite3_log(pOp->p1, zLogFmt, pc, p->zSql, p->zErrMsg);
|
||||
sqlite3_log(pOp->p1, zLogFmt, pcx, p->zSql, p->zErrMsg);
|
||||
}
|
||||
rc = sqlite3VdbeHalt(p);
|
||||
assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR );
|
||||
@@ -981,6 +989,7 @@ case OP_Halt: {
|
||||
assert( rc==SQLITE_OK || db->nDeferredCons>0 || db->nDeferredImmCons>0 );
|
||||
rc = p->rc ? SQLITE_ERROR : SQLITE_DONE;
|
||||
}
|
||||
pOp = &aOp[pcx];
|
||||
goto vdbe_return;
|
||||
}
|
||||
|
||||
@@ -989,7 +998,8 @@ case OP_Halt: {
|
||||
**
|
||||
** The 32-bit integer value P1 is written into register P2.
|
||||
*/
|
||||
case OP_Integer: { /* out2-prerelease */
|
||||
case OP_Integer: { /* out2 */
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->u.i = pOp->p1;
|
||||
break;
|
||||
}
|
||||
@@ -1000,7 +1010,8 @@ case OP_Integer: { /* out2-prerelease */
|
||||
** P4 is a pointer to a 64-bit integer value.
|
||||
** Write that value into register P2.
|
||||
*/
|
||||
case OP_Int64: { /* out2-prerelease */
|
||||
case OP_Int64: { /* out2 */
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
assert( pOp->p4.pI64!=0 );
|
||||
pOut->u.i = *pOp->p4.pI64;
|
||||
break;
|
||||
@@ -1013,7 +1024,8 @@ case OP_Int64: { /* out2-prerelease */
|
||||
** P4 is a pointer to a 64-bit floating point value.
|
||||
** Write that value into register P2.
|
||||
*/
|
||||
case OP_Real: { /* same as TK_FLOAT, out2-prerelease */
|
||||
case OP_Real: { /* same as TK_FLOAT, out2 */
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->flags = MEM_Real;
|
||||
assert( !sqlite3IsNaN(*pOp->p4.pReal) );
|
||||
pOut->u.r = *pOp->p4.pReal;
|
||||
@@ -1029,8 +1041,9 @@ case OP_Real: { /* same as TK_FLOAT, out2-prerelease */
|
||||
** this transformation, the length of string P4 is computed and stored
|
||||
** as the P1 parameter.
|
||||
*/
|
||||
case OP_String8: { /* same as TK_STRING, out2-prerelease */
|
||||
case OP_String8: { /* same as TK_STRING, out2 */
|
||||
assert( pOp->p4.z!=0 );
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOp->opcode = OP_String;
|
||||
pOp->p1 = sqlite3Strlen30(pOp->p4.z);
|
||||
|
||||
@@ -1067,8 +1080,9 @@ case OP_String8: { /* same as TK_STRING, out2-prerelease */
|
||||
** the same sequence of bytes, it is merely interpreted as a BLOB instead
|
||||
** of a string, as if it had been CAST.
|
||||
*/
|
||||
case OP_String: { /* out2-prerelease */
|
||||
case OP_String: { /* out2 */
|
||||
assert( pOp->p4.z!=0 );
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->flags = MEM_Str|MEM_Static|MEM_Term;
|
||||
pOut->z = pOp->p4.z;
|
||||
pOut->n = pOp->p1;
|
||||
@@ -1096,9 +1110,10 @@ case OP_String: { /* out2-prerelease */
|
||||
** NULL values will not compare equal even if SQLITE_NULLEQ is set on
|
||||
** OP_Ne or OP_Eq.
|
||||
*/
|
||||
case OP_Null: { /* out2-prerelease */
|
||||
case OP_Null: { /* out2 */
|
||||
int cnt;
|
||||
u16 nullFlag;
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
cnt = pOp->p3-pOp->p2;
|
||||
assert( pOp->p3<=(p->nMem-p->nCursor) );
|
||||
pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null;
|
||||
@@ -1133,8 +1148,9 @@ case OP_SoftNull: {
|
||||
** P4 points to a blob of data P1 bytes long. Store this
|
||||
** blob in register P2.
|
||||
*/
|
||||
case OP_Blob: { /* out2-prerelease */
|
||||
case OP_Blob: { /* out2 */
|
||||
assert( pOp->p1 <= SQLITE_MAX_LENGTH );
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0);
|
||||
pOut->enc = encoding;
|
||||
UPDATE_MAX_BLOBSIZE(pOut);
|
||||
@@ -1149,7 +1165,7 @@ case OP_Blob: { /* out2-prerelease */
|
||||
** If the parameter is named, then its name appears in P4.
|
||||
** The P4 value is used by sqlite3_bind_parameter_name().
|
||||
*/
|
||||
case OP_Variable: { /* out2-prerelease */
|
||||
case OP_Variable: { /* out2 */
|
||||
Mem *pVar; /* Value being transferred */
|
||||
|
||||
assert( pOp->p1>0 && pOp->p1<=p->nVar );
|
||||
@@ -1158,6 +1174,7 @@ case OP_Variable: { /* out2-prerelease */
|
||||
if( sqlite3VdbeMemTooBig(pVar) ){
|
||||
goto too_big;
|
||||
}
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static);
|
||||
UPDATE_MAX_BLOBSIZE(pOut);
|
||||
break;
|
||||
@@ -1334,7 +1351,7 @@ case OP_ResultRow: {
|
||||
|
||||
/* Return SQLITE_ROW
|
||||
*/
|
||||
p->pc = pc + 1;
|
||||
p->pc = (int)(pOp - aOp) + 1;
|
||||
rc = SQLITE_ROW;
|
||||
goto vdbe_return;
|
||||
}
|
||||
@@ -1580,7 +1597,7 @@ case OP_Function: {
|
||||
|
||||
assert( pOp->p4type==P4_FUNCDEF );
|
||||
ctx.pFunc = pOp->p4.pFunc;
|
||||
ctx.iOp = pc;
|
||||
ctx.iOp = (int)(pOp - aOp);
|
||||
ctx.pVdbe = p;
|
||||
MemSetTypeFlag(ctx.pOut, MEM_Null);
|
||||
ctx.fErrorOrAux = 0;
|
||||
@@ -1594,7 +1611,7 @@ case OP_Function: {
|
||||
sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(ctx.pOut));
|
||||
rc = ctx.isError;
|
||||
}
|
||||
sqlite3VdbeDeleteAuxData(p, pc, pOp->p1);
|
||||
sqlite3VdbeDeleteAuxData(p, (int)(pOp - aOp), pOp->p1);
|
||||
}
|
||||
|
||||
/* Copy the result of the function into register P3 */
|
||||
@@ -1723,8 +1740,7 @@ case OP_MustBeInt: { /* jump, in1 */
|
||||
rc = SQLITE_MISMATCH;
|
||||
goto abort_due_to_error;
|
||||
}else{
|
||||
pc = pOp->p2 - 1;
|
||||
break;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1910,7 +1926,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
|
||||
}else{
|
||||
VdbeBranchTaken(2,3);
|
||||
if( pOp->p5 & SQLITE_JUMPIFNULL ){
|
||||
pc = pOp->p2-1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1962,6 +1978,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
|
||||
default: res = res>=0; break;
|
||||
}
|
||||
|
||||
/* Undo any changes made by applyAffinity() to the input registers. */
|
||||
assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) );
|
||||
pIn1->flags = flags1;
|
||||
assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) );
|
||||
pIn3->flags = flags3;
|
||||
|
||||
if( pOp->p5 & SQLITE_STOREP2 ){
|
||||
pOut = &aMem[pOp->p2];
|
||||
memAboutToChange(p, pOut);
|
||||
@@ -1971,14 +1993,9 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
|
||||
}else{
|
||||
VdbeBranchTaken(res!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3);
|
||||
if( res ){
|
||||
pc = pOp->p2-1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
}
|
||||
/* Undo any changes made by applyAffinity() to the input registers. */
|
||||
assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) );
|
||||
pIn1->flags = flags1;
|
||||
assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) );
|
||||
pIn3->flags = flags3;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2073,11 +2090,11 @@ case OP_Compare: {
|
||||
*/
|
||||
case OP_Jump: { /* jump */
|
||||
if( iCompare<0 ){
|
||||
pc = pOp->p1 - 1; VdbeBranchTaken(0,3);
|
||||
VdbeBranchTaken(0,3); pOp = &aOp[pOp->p1 - 1];
|
||||
}else if( iCompare==0 ){
|
||||
pc = pOp->p2 - 1; VdbeBranchTaken(1,3);
|
||||
VdbeBranchTaken(1,3); pOp = &aOp[pOp->p2 - 1];
|
||||
}else{
|
||||
pc = pOp->p3 - 1; VdbeBranchTaken(2,3);
|
||||
VdbeBranchTaken(2,3); pOp = &aOp[pOp->p3 - 1];
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2187,7 +2204,7 @@ case OP_Once: { /* jump */
|
||||
assert( pOp->p1<p->nOnceFlag );
|
||||
VdbeBranchTaken(p->aOnceFlag[pOp->p1]!=0, 2);
|
||||
if( p->aOnceFlag[pOp->p1] ){
|
||||
pc = pOp->p2-1;
|
||||
goto jump_to_p2;
|
||||
}else{
|
||||
p->aOnceFlag[pOp->p1] = 1;
|
||||
}
|
||||
@@ -2222,7 +2239,7 @@ case OP_IfNot: { /* jump, in1 */
|
||||
}
|
||||
VdbeBranchTaken(c!=0, 2);
|
||||
if( c ){
|
||||
pc = pOp->p2-1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2236,7 +2253,7 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */
|
||||
pIn1 = &aMem[pOp->p1];
|
||||
VdbeBranchTaken( (pIn1->flags & MEM_Null)!=0, 2);
|
||||
if( (pIn1->flags & MEM_Null)!=0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2250,7 +2267,7 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */
|
||||
pIn1 = &aMem[pOp->p1];
|
||||
VdbeBranchTaken( (pIn1->flags & MEM_Null)==0, 2);
|
||||
if( (pIn1->flags & MEM_Null)==0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2731,7 +2748,7 @@ case OP_MakeRecord: {
|
||||
** opened by cursor P1 in register P2
|
||||
*/
|
||||
#ifndef SQLITE_OMIT_BTREECOUNT
|
||||
case OP_Count: { /* out2-prerelease */
|
||||
case OP_Count: { /* out2 */
|
||||
i64 nEntry;
|
||||
BtCursor *pCrsr;
|
||||
|
||||
@@ -2739,6 +2756,7 @@ case OP_Count: { /* out2-prerelease */
|
||||
assert( pCrsr );
|
||||
nEntry = 0; /* Not needed. Only used to silence a warning. */
|
||||
rc = sqlite3BtreeCount(pCrsr, &nEntry);
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->u.i = nEntry;
|
||||
break;
|
||||
}
|
||||
@@ -2852,7 +2870,7 @@ case OP_Savepoint: {
|
||||
}
|
||||
db->autoCommit = 1;
|
||||
if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
|
||||
p->pc = pc;
|
||||
p->pc = (int)(pOp - aOp);
|
||||
db->autoCommit = 0;
|
||||
p->rc = rc = SQLITE_BUSY;
|
||||
goto vdbe_return;
|
||||
@@ -2971,7 +2989,7 @@ case OP_AutoCommit: {
|
||||
}else{
|
||||
db->autoCommit = (u8)desiredAutoCommit;
|
||||
if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
|
||||
p->pc = pc;
|
||||
p->pc = (int)(pOp - aOp);
|
||||
db->autoCommit = (u8)(1-desiredAutoCommit);
|
||||
p->rc = rc = SQLITE_BUSY;
|
||||
goto vdbe_return;
|
||||
@@ -3048,7 +3066,7 @@ case OP_Transaction: {
|
||||
if( pBt ){
|
||||
rc = sqlite3BtreeBeginTrans(pBt, pOp->p2);
|
||||
if( rc==SQLITE_BUSY ){
|
||||
p->pc = pc;
|
||||
p->pc = (int)(pOp - aOp);
|
||||
p->rc = rc = SQLITE_BUSY;
|
||||
goto vdbe_return;
|
||||
}
|
||||
@@ -3127,7 +3145,7 @@ case OP_Transaction: {
|
||||
** must be started or there must be an open cursor) before
|
||||
** executing this instruction.
|
||||
*/
|
||||
case OP_ReadCookie: { /* out2-prerelease */
|
||||
case OP_ReadCookie: { /* out2 */
|
||||
int iMeta;
|
||||
int iDb;
|
||||
int iCookie;
|
||||
@@ -3141,6 +3159,7 @@ case OP_ReadCookie: { /* out2-prerelease */
|
||||
assert( DbMaskTest(p->btreeMask, iDb) );
|
||||
|
||||
sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta);
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->u.i = iMeta;
|
||||
break;
|
||||
}
|
||||
@@ -3462,7 +3481,7 @@ case OP_SequenceTest: {
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC->pSorter );
|
||||
if( (pC->seqCount++)==0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3639,7 +3658,7 @@ case OP_SeekGT: { /* jump, in3 */
|
||||
if( (pIn3->flags & MEM_Real)==0 ){
|
||||
/* If the P3 value cannot be converted into any kind of a number,
|
||||
** then the seek is not possible, so jump to P2 */
|
||||
pc = pOp->p2 - 1; VdbeBranchTaken(1,2);
|
||||
VdbeBranchTaken(1,2); goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3730,7 +3749,7 @@ case OP_SeekGT: { /* jump, in3 */
|
||||
assert( pOp->p2>0 );
|
||||
VdbeBranchTaken(res!=0,2);
|
||||
if( res ){
|
||||
pc = pOp->p2 - 1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3824,6 +3843,7 @@ case OP_NoConflict: /* jump, in3 */
|
||||
case OP_NotFound: /* jump, in3 */
|
||||
case OP_Found: { /* jump, in3 */
|
||||
int alreadyExists;
|
||||
int takeJump;
|
||||
int ii;
|
||||
VdbeCursor *pC;
|
||||
int res;
|
||||
@@ -3846,7 +3866,7 @@ case OP_Found: { /* jump, in3 */
|
||||
pIn3 = &aMem[pOp->p3];
|
||||
assert( pC->pCursor!=0 );
|
||||
assert( pC->isTable==0 );
|
||||
pFree = 0; /* Not needed. Only used to suppress a compiler warning. */
|
||||
pFree = 0;
|
||||
if( pOp->p4.i>0 ){
|
||||
r.pKeyInfo = pC->pKeyInfo;
|
||||
r.nField = (u16)pOp->p4.i;
|
||||
@@ -3869,21 +3889,20 @@ case OP_Found: { /* jump, in3 */
|
||||
sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey);
|
||||
}
|
||||
pIdxKey->default_rc = 0;
|
||||
takeJump = 0;
|
||||
if( pOp->opcode==OP_NoConflict ){
|
||||
/* For the OP_NoConflict opcode, take the jump if any of the
|
||||
** input fields are NULL, since any key with a NULL will not
|
||||
** conflict */
|
||||
for(ii=0; ii<pIdxKey->nField; ii++){
|
||||
if( pIdxKey->aMem[ii].flags & MEM_Null ){
|
||||
pc = pOp->p2 - 1; VdbeBranchTaken(1,2);
|
||||
takeJump = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, pIdxKey, 0, 0, &res);
|
||||
if( pOp->p4.i==0 ){
|
||||
sqlite3DbFree(db, pFree);
|
||||
}
|
||||
sqlite3DbFree(db, pFree);
|
||||
if( rc!=SQLITE_OK ){
|
||||
break;
|
||||
}
|
||||
@@ -3894,10 +3913,10 @@ case OP_Found: { /* jump, in3 */
|
||||
pC->cacheStatus = CACHE_STALE;
|
||||
if( pOp->opcode==OP_Found ){
|
||||
VdbeBranchTaken(alreadyExists!=0,2);
|
||||
if( alreadyExists ) pc = pOp->p2 - 1;
|
||||
if( alreadyExists ) goto jump_to_p2;
|
||||
}else{
|
||||
VdbeBranchTaken(alreadyExists==0,2);
|
||||
if( !alreadyExists ) pc = pOp->p2 - 1;
|
||||
VdbeBranchTaken(takeJump||alreadyExists==0,2);
|
||||
if( takeJump || !alreadyExists ) goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3946,10 +3965,8 @@ case OP_NotExists: { /* jump, in3 */
|
||||
pC->cacheStatus = CACHE_STALE;
|
||||
pC->deferredMoveto = 0;
|
||||
VdbeBranchTaken(res!=0,2);
|
||||
if( res!=0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
pC->seekResult = res;
|
||||
if( res!=0 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3961,9 +3978,10 @@ case OP_NotExists: { /* jump, in3 */
|
||||
** The sequence number on the cursor is incremented after this
|
||||
** instruction.
|
||||
*/
|
||||
case OP_Sequence: { /* out2-prerelease */
|
||||
case OP_Sequence: { /* out2 */
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
assert( p->apCsr[pOp->p1]!=0 );
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->u.i = p->apCsr[pOp->p1]->seqCount++;
|
||||
break;
|
||||
}
|
||||
@@ -3984,7 +4002,7 @@ case OP_Sequence: { /* out2-prerelease */
|
||||
** generated record number. This P3 mechanism is used to help implement the
|
||||
** AUTOINCREMENT feature.
|
||||
*/
|
||||
case OP_NewRowid: { /* out2-prerelease */
|
||||
case OP_NewRowid: { /* out2 */
|
||||
i64 v; /* The new rowid */
|
||||
VdbeCursor *pC; /* Cursor of table to get the new rowid */
|
||||
int res; /* Result of an sqlite3BtreeLast() */
|
||||
@@ -3994,6 +4012,7 @@ case OP_NewRowid: { /* out2-prerelease */
|
||||
|
||||
v = 0;
|
||||
res = 0;
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
@@ -4357,9 +4376,7 @@ case OP_SorterCompare: {
|
||||
res = 0;
|
||||
rc = sqlite3VdbeSorterCompare(pC, pIn3, nKeyCol, &res);
|
||||
VdbeBranchTaken(res!=0,2);
|
||||
if( res ){
|
||||
pc = pOp->p2-1;
|
||||
}
|
||||
if( res ) goto jump_to_p2;
|
||||
break;
|
||||
};
|
||||
|
||||
@@ -4488,12 +4505,13 @@ case OP_RowData: {
|
||||
** be a separate OP_VRowid opcode for use with virtual tables, but this
|
||||
** one opcode now works for both table types.
|
||||
*/
|
||||
case OP_Rowid: { /* out2-prerelease */
|
||||
case OP_Rowid: { /* out2 */
|
||||
VdbeCursor *pC;
|
||||
i64 v;
|
||||
sqlite3_vtab *pVtab;
|
||||
const sqlite3_module *pModule;
|
||||
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
@@ -4579,7 +4597,7 @@ case OP_Last: { /* jump */
|
||||
#endif
|
||||
if( pOp->p2>0 ){
|
||||
VdbeBranchTaken(res!=0,2);
|
||||
if( res ) pc = pOp->p2 - 1;
|
||||
if( res ) goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -4643,9 +4661,7 @@ case OP_Rewind: { /* jump */
|
||||
pC->nullRow = (u8)res;
|
||||
assert( pOp->p2>0 && pOp->p2<p->nOp );
|
||||
VdbeBranchTaken(res!=0,2);
|
||||
if( res ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
if( res ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -4756,11 +4772,11 @@ next_tail:
|
||||
VdbeBranchTaken(res==0,2);
|
||||
if( res==0 ){
|
||||
pC->nullRow = 0;
|
||||
pc = pOp->p2 - 1;
|
||||
p->aCounter[pOp->p5]++;
|
||||
#ifdef SQLITE_TEST
|
||||
sqlite3_search_count++;
|
||||
#endif
|
||||
goto jump_to_p2_and_check_for_interrupt;
|
||||
}else{
|
||||
pC->nullRow = 1;
|
||||
}
|
||||
@@ -4868,11 +4884,12 @@ case OP_IdxDelete: {
|
||||
**
|
||||
** See also: Rowid, MakeRecord.
|
||||
*/
|
||||
case OP_IdxRowid: { /* out2-prerelease */
|
||||
case OP_IdxRowid: { /* out2 */
|
||||
BtCursor *pCrsr;
|
||||
VdbeCursor *pC;
|
||||
i64 rowid;
|
||||
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
@@ -4985,9 +5002,7 @@ case OP_IdxGE: { /* jump */
|
||||
res++;
|
||||
}
|
||||
VdbeBranchTaken(res>0,2);
|
||||
if( res>0 ){
|
||||
pc = pOp->p2 - 1 ;
|
||||
}
|
||||
if( res>0 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5011,11 +5026,12 @@ case OP_IdxGE: { /* jump */
|
||||
**
|
||||
** See also: Clear
|
||||
*/
|
||||
case OP_Destroy: { /* out2-prerelease */
|
||||
case OP_Destroy: { /* out2 */
|
||||
int iMoved;
|
||||
int iDb;
|
||||
|
||||
assert( p->readOnly==0 );
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->flags = MEM_Null;
|
||||
if( db->nVdbeRead > db->nVDestroy+1 ){
|
||||
rc = SQLITE_LOCKED;
|
||||
@@ -5124,12 +5140,13 @@ case OP_ResetSorter: {
|
||||
**
|
||||
** See documentation on OP_CreateTable for additional information.
|
||||
*/
|
||||
case OP_CreateIndex: /* out2-prerelease */
|
||||
case OP_CreateTable: { /* out2-prerelease */
|
||||
case OP_CreateIndex: /* out2 */
|
||||
case OP_CreateTable: { /* out2 */
|
||||
int pgno;
|
||||
int flags;
|
||||
Db *pDb;
|
||||
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pgno = 0;
|
||||
assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
||||
assert( DbMaskTest(p->btreeMask, pOp->p1) );
|
||||
@@ -5355,12 +5372,12 @@ case OP_RowSetRead: { /* jump, in1, out3 */
|
||||
){
|
||||
/* The boolean index is empty */
|
||||
sqlite3VdbeMemSetNull(pIn1);
|
||||
pc = pOp->p2 - 1;
|
||||
VdbeBranchTaken(1,2);
|
||||
goto jump_to_p2_and_check_for_interrupt;
|
||||
}else{
|
||||
/* A value was pulled from the index */
|
||||
sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val);
|
||||
VdbeBranchTaken(0,2);
|
||||
sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val);
|
||||
}
|
||||
goto check_for_interrupt;
|
||||
}
|
||||
@@ -5411,10 +5428,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */
|
||||
if( iSet ){
|
||||
exists = sqlite3RowSetTest(pIn1->u.pRowSet, iSet, pIn3->u.i);
|
||||
VdbeBranchTaken(exists!=0,2);
|
||||
if( exists ){
|
||||
pc = pOp->p2 - 1;
|
||||
break;
|
||||
}
|
||||
if( exists ) goto jump_to_p2;
|
||||
}
|
||||
if( iSet>=0 ){
|
||||
sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i);
|
||||
@@ -5503,7 +5517,7 @@ case OP_Program: { /* jump */
|
||||
pFrame->v = p;
|
||||
pFrame->nChildMem = nMem;
|
||||
pFrame->nChildCsr = pProgram->nCsr;
|
||||
pFrame->pc = pc;
|
||||
pFrame->pc = (int)(pOp - aOp);
|
||||
pFrame->aMem = p->aMem;
|
||||
pFrame->nMem = p->nMem;
|
||||
pFrame->apCsr = p->apCsr;
|
||||
@@ -5526,7 +5540,7 @@ case OP_Program: { /* jump */
|
||||
pFrame = pRt->u.pFrame;
|
||||
assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem );
|
||||
assert( pProgram->nCsr==pFrame->nChildCsr );
|
||||
assert( pc==pFrame->pc );
|
||||
assert( (int)(pOp - aOp)==pFrame->pc );
|
||||
}
|
||||
|
||||
p->nFrame++;
|
||||
@@ -5547,7 +5561,7 @@ case OP_Program: { /* jump */
|
||||
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
|
||||
p->anExec = 0;
|
||||
#endif
|
||||
pc = -1;
|
||||
pOp = &aOp[-1];
|
||||
memset(p->aOnceFlag, 0, p->nOnceFlag);
|
||||
|
||||
break;
|
||||
@@ -5565,9 +5579,10 @@ case OP_Program: { /* jump */
|
||||
** the value of the P1 argument to the value of the P1 argument to the
|
||||
** calling OP_Program instruction.
|
||||
*/
|
||||
case OP_Param: { /* out2-prerelease */
|
||||
case OP_Param: { /* out2 */
|
||||
VdbeFrame *pFrame;
|
||||
Mem *pIn;
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pFrame = p->pFrame;
|
||||
pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1];
|
||||
sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem);
|
||||
@@ -5611,10 +5626,10 @@ case OP_FkCounter: {
|
||||
case OP_FkIfZero: { /* jump */
|
||||
if( pOp->p1 ){
|
||||
VdbeBranchTaken(db->nDeferredCons==0 && db->nDeferredImmCons==0, 2);
|
||||
if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) pc = pOp->p2-1;
|
||||
if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) goto jump_to_p2;
|
||||
}else{
|
||||
VdbeBranchTaken(p->nFkConstraint==0 && db->nDeferredImmCons==0, 2);
|
||||
if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) pc = pOp->p2-1;
|
||||
if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -5665,9 +5680,7 @@ case OP_IfPos: { /* jump, in1 */
|
||||
pIn1 = &aMem[pOp->p1];
|
||||
assert( pIn1->flags&MEM_Int );
|
||||
VdbeBranchTaken( pIn1->u.i>0, 2);
|
||||
if( pIn1->u.i>0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
if( pIn1->u.i>0 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5682,9 +5695,7 @@ case OP_IfNeg: { /* jump, in1 */
|
||||
assert( pIn1->flags&MEM_Int );
|
||||
pIn1->u.i += pOp->p3;
|
||||
VdbeBranchTaken(pIn1->u.i<0, 2);
|
||||
if( pIn1->u.i<0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
if( pIn1->u.i<0 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5701,7 +5712,7 @@ case OP_IfNotZero: { /* jump, in1 */
|
||||
VdbeBranchTaken(pIn1->u.i<0, 2);
|
||||
if( pIn1->u.i ){
|
||||
pIn1->u.i += pOp->p3;
|
||||
pc = pOp->p2 - 1;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -5717,9 +5728,7 @@ case OP_DecrJumpZero: { /* jump, in1 */
|
||||
assert( pIn1->flags&MEM_Int );
|
||||
pIn1->u.i--;
|
||||
VdbeBranchTaken(pIn1->u.i==0, 2);
|
||||
if( pIn1->u.i==0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
if( pIn1->u.i==0 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5735,9 +5744,7 @@ case OP_JumpZeroIncr: { /* jump, in1 */
|
||||
pIn1 = &aMem[pOp->p1];
|
||||
assert( pIn1->flags&MEM_Int );
|
||||
VdbeBranchTaken(pIn1->u.i==0, 2);
|
||||
if( (pIn1->u.i++)==0 ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
if( (pIn1->u.i++)==0 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5779,7 +5786,7 @@ case OP_AggStep: {
|
||||
ctx.pOut = &t;
|
||||
ctx.isError = 0;
|
||||
ctx.pVdbe = p;
|
||||
ctx.iOp = pc;
|
||||
ctx.iOp = (int)(pOp - aOp);
|
||||
ctx.skipFlag = 0;
|
||||
(ctx.pFunc->xStep)(&ctx, n, apVal); /* IMP: R-24505-23230 */
|
||||
if( ctx.isError ){
|
||||
@@ -5874,7 +5881,7 @@ case OP_Checkpoint: {
|
||||
**
|
||||
** Write a string containing the final journal-mode to register P2.
|
||||
*/
|
||||
case OP_JournalMode: { /* out2-prerelease */
|
||||
case OP_JournalMode: { /* out2 */
|
||||
Btree *pBt; /* Btree to change journal mode of */
|
||||
Pager *pPager; /* Pager associated with pBt */
|
||||
int eNew; /* New journal mode */
|
||||
@@ -5883,6 +5890,7 @@ case OP_JournalMode: { /* out2-prerelease */
|
||||
const char *zFilename; /* Name of database file for pPager */
|
||||
#endif
|
||||
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
eNew = pOp->p3;
|
||||
assert( eNew==PAGER_JOURNALMODE_DELETE
|
||||
|| eNew==PAGER_JOURNALMODE_TRUNCATE
|
||||
@@ -5999,8 +6007,8 @@ case OP_IncrVacuum: { /* jump */
|
||||
rc = sqlite3BtreeIncrVacuum(pBt);
|
||||
VdbeBranchTaken(rc==SQLITE_DONE,2);
|
||||
if( rc==SQLITE_DONE ){
|
||||
pc = pOp->p2 - 1;
|
||||
rc = SQLITE_OK;
|
||||
goto jump_to_p2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -6210,25 +6218,19 @@ case OP_VFilter: { /* jump */
|
||||
iQuery = (int)pQuery->u.i;
|
||||
|
||||
/* Invoke the xFilter method */
|
||||
{
|
||||
res = 0;
|
||||
apArg = p->apArg;
|
||||
for(i = 0; i<nArg; i++){
|
||||
apArg[i] = &pArgc[i+1];
|
||||
}
|
||||
|
||||
rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg);
|
||||
sqlite3VtabImportErrmsg(p, pVtab);
|
||||
if( rc==SQLITE_OK ){
|
||||
res = pModule->xEof(pVtabCursor);
|
||||
}
|
||||
VdbeBranchTaken(res!=0,2);
|
||||
if( res ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
res = 0;
|
||||
apArg = p->apArg;
|
||||
for(i = 0; i<nArg; i++){
|
||||
apArg[i] = &pArgc[i+1];
|
||||
}
|
||||
rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg);
|
||||
sqlite3VtabImportErrmsg(p, pVtab);
|
||||
if( rc==SQLITE_OK ){
|
||||
res = pModule->xEof(pVtabCursor);
|
||||
}
|
||||
pCur->nullRow = 0;
|
||||
|
||||
VdbeBranchTaken(res!=0,2);
|
||||
if( res ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_VIRTUALTABLE */
|
||||
@@ -6315,7 +6317,7 @@ case OP_VNext: { /* jump */
|
||||
VdbeBranchTaken(!res,2);
|
||||
if( !res ){
|
||||
/* If there is data, jump to P2 */
|
||||
pc = pOp->p2 - 1;
|
||||
goto jump_to_p2_and_check_for_interrupt;
|
||||
}
|
||||
goto check_for_interrupt;
|
||||
}
|
||||
@@ -6438,7 +6440,8 @@ case OP_VUpdate: {
|
||||
**
|
||||
** Write the current number of pages in database P1 to memory cell P2.
|
||||
*/
|
||||
case OP_Pagecount: { /* out2-prerelease */
|
||||
case OP_Pagecount: { /* out2 */
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt);
|
||||
break;
|
||||
}
|
||||
@@ -6454,10 +6457,11 @@ case OP_Pagecount: { /* out2-prerelease */
|
||||
**
|
||||
** Store the maximum page count after the change in register P2.
|
||||
*/
|
||||
case OP_MaxPgcnt: { /* out2-prerelease */
|
||||
case OP_MaxPgcnt: { /* out2 */
|
||||
unsigned int newMax;
|
||||
Btree *pBt;
|
||||
|
||||
pOut = out2Prerelease(p, pOp);
|
||||
pBt = db->aDb[pOp->p1].pBt;
|
||||
newMax = 0;
|
||||
if( pOp->p3 ){
|
||||
@@ -6486,9 +6490,6 @@ case OP_Init: { /* jump */
|
||||
char *zTrace;
|
||||
char *z;
|
||||
|
||||
if( pOp->p2 ){
|
||||
pc = pOp->p2 - 1;
|
||||
}
|
||||
#ifndef SQLITE_OMIT_TRACE
|
||||
if( db->xTrace
|
||||
&& !p->doingRerun
|
||||
@@ -6516,6 +6517,7 @@ case OP_Init: { /* jump */
|
||||
}
|
||||
#endif /* SQLITE_DEBUG */
|
||||
#endif /* SQLITE_OMIT_TRACE */
|
||||
if( pOp->p2 ) goto jump_to_p2;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -6558,12 +6560,12 @@ default: { /* This is really OP_Noop and OP_Explain */
|
||||
** the evaluator loop. So we can leave it out when NDEBUG is defined.
|
||||
*/
|
||||
#ifndef NDEBUG
|
||||
assert( pc>=-1 && pc<p->nOp );
|
||||
assert( pOp>=&aOp[-1] && pOp<&aOp[p->nOp] );
|
||||
|
||||
#ifdef SQLITE_DEBUG
|
||||
if( db->flags & SQLITE_VdbeTrace ){
|
||||
if( rc!=0 ) printf("rc=%d\n",rc);
|
||||
if( pOp->opflags & (OPFLG_OUT2_PRERELEASE|OPFLG_OUT2) ){
|
||||
if( pOp->opflags & (OPFLG_OUT2) ){
|
||||
registerTrace(pOp->p2, &aMem[pOp->p2]);
|
||||
}
|
||||
if( pOp->opflags & OPFLG_OUT3 ){
|
||||
@@ -6582,7 +6584,7 @@ vdbe_error_halt:
|
||||
p->rc = rc;
|
||||
testcase( sqlite3GlobalConfig.xLog!=0 );
|
||||
sqlite3_log(rc, "statement aborts at %d: [%s] %s",
|
||||
pc, p->zSql, p->zErrMsg);
|
||||
(int)(pOp - aOp), p->zSql, p->zErrMsg);
|
||||
sqlite3VdbeHalt(p);
|
||||
if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
|
||||
rc = SQLITE_ERROR;
|
||||
|
Reference in New Issue
Block a user