diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pragma.c | 6 | ||||
-rw-r--r-- | src/vdbe.c | 20 |
2 files changed, 21 insertions, 5 deletions
diff --git a/src/pragma.c b/src/pragma.c index 9e7dc2be2..29c83480f 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1681,6 +1681,9 @@ void sqlite3Pragma( { OP_IfNotZero, 1, 4, 0}, /* 1 */ { OP_String8, 0, 3, 0}, /* 2 */ { OP_ResultRow, 3, 1, 0}, /* 3 */ + { OP_Halt, 0, 0, 0}, /* 4 */ + { OP_String8, 0, 3, 0}, /* 5 */ + { OP_Goto, 0, 3, 0}, /* 6 */ }; VdbeOp *aOp; @@ -1689,7 +1692,10 @@ void sqlite3Pragma( aOp[0].p2 = 1-mxErr; aOp[2].p4type = P4_STATIC; aOp[2].p4.z = "ok"; + aOp[5].p4type = P4_STATIC; + aOp[5].p4.z = (char*)sqlite3ErrStr(SQLITE_CORRUPT); } + sqlite3VdbeChangeP3(v, 0, sqlite3VdbeCurrentAddr(v)-2); } } break; diff --git a/src/vdbe.c b/src/vdbe.c index 70e745afe..37699bbba 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2461,8 +2461,7 @@ case OP_Column: { ** extra bytes for the header length itself. 32768*3 + 3 = 98307. */ if( aOffset[0] > 98307 || aOffset[0] > pC->payloadSize ){ - rc = SQLITE_CORRUPT_BKPT; - goto abort_due_to_error; + goto op_column_corrupt; } }else{ /* This is an optimization. By skipping over the first few tests @@ -2535,8 +2534,7 @@ case OP_Column: { zHdr = zEndHdr; }else{ if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); - rc = SQLITE_CORRUPT_BKPT; - goto abort_due_to_error; + goto op_column_corrupt; } } @@ -2631,6 +2629,15 @@ op_column_out: UPDATE_MAX_BLOBSIZE(pDest); REGISTER_TRACE(pOp->p3, pDest); break; + +op_column_corrupt: + if( aOp[0].p3>0 ){ + pOp = &aOp[aOp[0].p3-1]; + break; + }else{ + rc = SQLITE_CORRUPT_BKPT; + goto abort_due_to_error; + } } /* Opcode: Affinity P1 P2 * P4 * @@ -7015,7 +7022,7 @@ case OP_Function: { } -/* Opcode: Init P1 P2 * P4 * +/* Opcode: Init P1 P2 P3 P4 * ** Synopsis: Start at P2 ** ** Programs contain a single instance of this opcode as the very first @@ -7029,6 +7036,9 @@ case OP_Function: { ** ** Increment the value of P1 so that OP_Once opcodes will jump the ** first time they are evaluated for this run. +** +** If P3 is not zero, then it is an address to jump to if an SQLITE_CORRUPT +** error is encountered. */ case OP_Init: { /* jump */ char *zTrace; |