More simplifications to vdbe.c. Remove a NEVER() from vdbe.c that is possible
after all. (CVS 6796) FossilOrigin-Name: c8f009bd24cb4e4b5ce9fbfd8ab09921f19d41af
This commit is contained in:
parent
3582c8f7ae
commit
653b82a516
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
||||
C If\san\sOOM\serror\soccurs\sjust\safter\sobtaining\sa\sshared\slock\son\sthe\sdatabase\sfile,\srelease\sthe\slock\sbefore\sreturning.\s(CVS\s6795)
|
||||
D 2009-06-22T05:43:24
|
||||
C More\ssimplifications\sto\svdbe.c.\s\sRemove\sa\sNEVER()\sfrom\svdbe.c\sthat\sis\spossible\nafter\sall.\s(CVS\s6796)
|
||||
D 2009-06-22T11:10:48
|
||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||
F Makefile.in 8b8fb7823264331210cddf103831816c286ba446
|
||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||
@ -203,7 +203,7 @@ F src/update.c 6ae6c26adff8dc34532d578f66e6cfde04b5d177
|
||||
F src/utf.c 9541d28f40441812c0b40f00334372a0542c00ff
|
||||
F src/util.c a7e981e032c3c9c0887d50d7e658a33cb355b43d
|
||||
F src/vacuum.c 0e14f371ea3326c6b8cfba257286d798cd20db59
|
||||
F src/vdbe.c 67ec344095e6d9d68292aec3be3d96295561b8d6
|
||||
F src/vdbe.c 1507638139808e854fd58b9112d65221244040d6
|
||||
F src/vdbe.h 35a648bc3279a120da24f34d9a25213ec15daf8a
|
||||
F src/vdbeInt.h 7823eac611229163c6a5df0e9e0d54ffcda527e7
|
||||
F src/vdbeapi.c 73bd1d2c57b953bc688d1d8c84b24c2084c2aec7
|
||||
@ -736,7 +736,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746
|
||||
P 16680f05bd169dfb1b4bf0eb082e69701f9b07ab
|
||||
R 6e54a2a88699861ffa872d10b9c1ee9c
|
||||
U danielk1977
|
||||
Z 3e419879a697596c75cae7156314a88e
|
||||
P 971a9650f66f079630489c34e40003eee97d1683
|
||||
R 30c799203416212bb38dcdf20431687b
|
||||
U drh
|
||||
Z a2040a8c613ec65598b68da6e231fca8
|
||||
|
@ -1 +1 @@
|
||||
971a9650f66f079630489c34e40003eee97d1683
|
||||
c8f009bd24cb4e4b5ce9fbfd8ab09921f19d41af
|
148
src/vdbe.c
148
src/vdbe.c
@ -43,7 +43,7 @@
|
||||
** in this file for details. If in doubt, do not deviate from existing
|
||||
** commenting and indentation practices when changing or adding code.
|
||||
**
|
||||
** $Id: vdbe.c,v 1.858 2009/06/22 00:55:31 drh Exp $
|
||||
** $Id: vdbe.c,v 1.859 2009/06/22 11:10:48 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "vdbeInt.h"
|
||||
@ -2467,15 +2467,13 @@ case OP_Count: { /* out2-prerelease */
|
||||
** has an index of 1.
|
||||
*/
|
||||
case OP_Statement: {
|
||||
int i;
|
||||
Btree *pBt;
|
||||
if( db->autoCommit==0 || db->activeVdbeCnt>1 ){
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<db->nDb );
|
||||
assert( db->aDb[i].pBt!=0 );
|
||||
pBt = db->aDb[i].pBt;
|
||||
assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
||||
assert( db->aDb[pOp->p1].pBt!=0 );
|
||||
pBt = db->aDb[pOp->p1].pBt;
|
||||
assert( sqlite3BtreeIsInTrans(pBt) );
|
||||
assert( (p->btreeMask & (1<<i))!=0 );
|
||||
assert( (p->btreeMask & (1<<pOp->p1))!=0 );
|
||||
if( p->iStatement==0 ){
|
||||
assert( db->nStatement>=0 && db->nSavepoint>=0 );
|
||||
db->nStatement++;
|
||||
@ -2717,13 +2715,11 @@ case OP_AutoCommit: {
|
||||
** If P2 is zero, then a read-lock is obtained on the database file.
|
||||
*/
|
||||
case OP_Transaction: {
|
||||
int i;
|
||||
Btree *pBt;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<db->nDb );
|
||||
assert( (p->btreeMask & (1<<i))!=0 );
|
||||
pBt = db->aDb[i].pBt;
|
||||
assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
||||
assert( (p->btreeMask & (1<<pOp->p1))!=0 );
|
||||
pBt = db->aDb[pOp->p1].pBt;
|
||||
|
||||
if( pBt ){
|
||||
rc = sqlite3BtreeBeginTrans(pBt, pOp->p2);
|
||||
@ -2912,7 +2908,6 @@ case OP_OpenRead:
|
||||
case OP_OpenWrite: {
|
||||
int nField;
|
||||
KeyInfo *pKeyInfo;
|
||||
int i;
|
||||
int p2;
|
||||
int iDb;
|
||||
int wrFlag;
|
||||
@ -2923,7 +2918,6 @@ case OP_OpenWrite: {
|
||||
|
||||
nField = 0;
|
||||
pKeyInfo = 0;
|
||||
i = pOp->p1;
|
||||
p2 = pOp->p2;
|
||||
iDb = pOp->p3;
|
||||
assert( iDb>=0 && iDb<db->nDb );
|
||||
@ -2945,12 +2939,11 @@ case OP_OpenWrite: {
|
||||
pIn2 = &p->aMem[p2];
|
||||
sqlite3VdbeMemIntegerify(pIn2);
|
||||
p2 = (int)pIn2->u.i;
|
||||
if( NEVER(p2<2) ) {
|
||||
if( p2<2 ) {
|
||||
rc = SQLITE_CORRUPT_BKPT;
|
||||
goto abort_due_to_error;
|
||||
}
|
||||
}
|
||||
assert( i>=0 );
|
||||
if( pOp->p4type==P4_KEYINFO ){
|
||||
pKeyInfo = pOp->p4.pKeyInfo;
|
||||
pKeyInfo->enc = ENC(p->db);
|
||||
@ -2958,7 +2951,8 @@ case OP_OpenWrite: {
|
||||
}else if( pOp->p4type==P4_INT32 ){
|
||||
nField = pOp->p4.i;
|
||||
}
|
||||
pCur = allocateCursor(p, i, nField, iDb, 1);
|
||||
assert( pOp->p1>=0 );
|
||||
pCur = allocateCursor(p, pOp->p1, nField, iDb, 1);
|
||||
if( pCur==0 ) goto no_mem;
|
||||
pCur->nullRow = 1;
|
||||
rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->pCursor);
|
||||
@ -3025,7 +3019,6 @@ case OP_OpenWrite: {
|
||||
** that created confusion with the whole virtual-table idea.
|
||||
*/
|
||||
case OP_OpenEphemeral: {
|
||||
int i;
|
||||
VdbeCursor *pCx;
|
||||
static const int openFlags =
|
||||
SQLITE_OPEN_READWRITE |
|
||||
@ -3034,9 +3027,8 @@ case OP_OpenEphemeral: {
|
||||
SQLITE_OPEN_DELETEONCLOSE |
|
||||
SQLITE_OPEN_TRANSIENT_DB;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 );
|
||||
pCx = allocateCursor(p, i, pOp->p2, -1, 1);
|
||||
assert( pOp->p1>=0 );
|
||||
pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
|
||||
if( pCx==0 ) goto no_mem;
|
||||
pCx->nullRow = 1;
|
||||
rc = sqlite3BtreeFactory(db, 0, 1, SQLITE_DEFAULT_TEMP_CACHE_SIZE, openFlags,
|
||||
@ -3095,12 +3087,10 @@ case OP_OpenEphemeral: {
|
||||
** the pseudo-table.
|
||||
*/
|
||||
case OP_OpenPseudo: {
|
||||
int i;
|
||||
VdbeCursor *pCx;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 );
|
||||
pCx = allocateCursor(p, i, pOp->p3, -1, 0);
|
||||
assert( pOp->p1>=0 );
|
||||
pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0);
|
||||
if( pCx==0 ) goto no_mem;
|
||||
pCx->nullRow = 1;
|
||||
pCx->pseudoTable = 1;
|
||||
@ -3116,11 +3106,9 @@ case OP_OpenPseudo: {
|
||||
** currently open, this instruction is a no-op.
|
||||
*/
|
||||
case OP_Close: {
|
||||
int i;
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
sqlite3VdbeFreeCursor(p, p->apCsr[i]);
|
||||
p->apCsr[i] = 0;
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]);
|
||||
p->apCsr[pOp->p1] = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3180,7 +3168,6 @@ case OP_SeekLt: /* jump, in3 */
|
||||
case OP_SeekLe: /* jump, in3 */
|
||||
case OP_SeekGe: /* jump, in3 */
|
||||
case OP_SeekGt: { /* jump, in3 */
|
||||
int i;
|
||||
int res;
|
||||
int oc;
|
||||
VdbeCursor *pC;
|
||||
@ -3188,10 +3175,9 @@ case OP_SeekGt: { /* jump, in3 */
|
||||
int nField;
|
||||
i64 iKey; /* The rowid we are to seek to */
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
assert( pOp->p2!=0 );
|
||||
pC = p->apCsr[i];
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
if( pC->pCursor!=0 ){
|
||||
oc = pOp->opcode;
|
||||
@ -3322,12 +3308,10 @@ case OP_SeekGt: { /* jump, in3 */
|
||||
** occur, no unnecessary I/O happens.
|
||||
*/
|
||||
case OP_Seek: { /* in2 */
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
if( ALWAYS(pC->pCursor!=0) ){
|
||||
assert( pC->isTable );
|
||||
@ -3554,10 +3538,9 @@ case OP_NotExists: { /* jump, in3 */
|
||||
** instruction.
|
||||
*/
|
||||
case OP_Sequence: { /* out2-prerelease */
|
||||
int i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
assert( p->apCsr[i]!=0 );
|
||||
pOut->u.i = p->apCsr[i]->seqCount++;
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
assert( p->apCsr[pOp->p1]!=0 );
|
||||
pOut->u.i = p->apCsr[pOp->p1]->seqCount++;
|
||||
MemSetTypeFlag(pOut, MEM_Int);
|
||||
break;
|
||||
}
|
||||
@ -3717,7 +3700,6 @@ case OP_Insert: {
|
||||
Mem *pData;
|
||||
Mem *pKey;
|
||||
i64 iKey; /* The integer ROWID or key for the record to be inserted */
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
int nZero;
|
||||
int seekResult;
|
||||
@ -3727,9 +3709,8 @@ case OP_Insert: {
|
||||
|
||||
pData = &p->aMem[pOp->p2];
|
||||
pKey = &p->aMem[pOp->p3];
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
assert( pC->pCursor!=0 || pC->pseudoTable );
|
||||
assert( pKey->flags & MEM_Int );
|
||||
@ -3818,14 +3799,12 @@ case OP_Insert: {
|
||||
** using OP_NotFound prior to invoking this opcode.
|
||||
*/
|
||||
case OP_Delete: {
|
||||
int i;
|
||||
i64 iKey;
|
||||
VdbeCursor *pC;
|
||||
|
||||
i = pOp->p1;
|
||||
iKey = 0;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
assert( pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */
|
||||
|
||||
@ -3892,18 +3871,16 @@ case OP_ResetCount: {
|
||||
*/
|
||||
case OP_RowKey:
|
||||
case OP_RowData: {
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
BtCursor *pCrsr;
|
||||
u32 n;
|
||||
i64 n64;
|
||||
|
||||
i = pOp->p1;
|
||||
pOut = &p->aMem[pOp->p2];
|
||||
|
||||
/* Note that RowKey and RowData are really exactly the same instruction */
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC->isTable || pOp->opcode==OP_RowKey );
|
||||
assert( pC->isIndex || pOp->opcode==OP_RowData );
|
||||
assert( pC!=0 );
|
||||
@ -3951,15 +3928,13 @@ case OP_RowData: {
|
||||
** one opcode now works for both table types.
|
||||
*/
|
||||
case OP_Rowid: { /* out2-prerelease */
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
i64 v;
|
||||
sqlite3_vtab *pVtab;
|
||||
const sqlite3_module *pModule;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
if( pC->nullRow ){
|
||||
/* Do nothing so that reg[P2] remains NULL */
|
||||
@ -4002,12 +3977,10 @@ case OP_Rowid: { /* out2-prerelease */
|
||||
** write a NULL.
|
||||
*/
|
||||
case OP_NullRow: {
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
pC->nullRow = 1;
|
||||
pC->rowidIsValid = 0;
|
||||
@ -4026,14 +3999,12 @@ case OP_NullRow: {
|
||||
** to the following instruction.
|
||||
*/
|
||||
case OP_Last: { /* jump */
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
BtCursor *pCrsr;
|
||||
int res;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
pCrsr = pC->pCursor;
|
||||
assert( pCrsr!=0 );
|
||||
@ -4078,14 +4049,12 @@ case OP_Sort: { /* jump */
|
||||
** to the following instruction.
|
||||
*/
|
||||
case OP_Rewind: { /* jump */
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
BtCursor *pCrsr;
|
||||
int res;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
pC = p->apCsr[i];
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
if( (pCrsr = pC->pCursor)!=0 ){
|
||||
rc = sqlite3BtreeFirst(pCrsr, &res);
|
||||
@ -4168,17 +4137,17 @@ case OP_Next: { /* jump */
|
||||
** for tables is OP_Insert.
|
||||
*/
|
||||
case OP_IdxInsert: { /* in2 */
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
BtCursor *pCrsr;
|
||||
int nKey;
|
||||
const char *zKey;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
assert( p->apCsr[i]!=0 );
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
assert( pIn2->flags & MEM_Blob );
|
||||
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||
pCrsr = pC->pCursor;
|
||||
if( pCrsr!=0 ){
|
||||
assert( pC->isTable==0 );
|
||||
rc = ExpandBlob(pIn2);
|
||||
if( rc==SQLITE_OK ){
|
||||
@ -4201,16 +4170,16 @@ case OP_IdxInsert: { /* in2 */
|
||||
** index opened by cursor P1.
|
||||
*/
|
||||
case OP_IdxDelete: {
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
BtCursor *pCrsr;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( pOp->p3>0 );
|
||||
assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem+1 );
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
assert( p->apCsr[i]!=0 );
|
||||
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
pCrsr = pC->pCursor;
|
||||
if( pCrsr!=0 ){
|
||||
int res;
|
||||
UnpackedRecord r;
|
||||
r.pKeyInfo = pC->pKeyInfo;
|
||||
@ -4236,15 +4205,15 @@ case OP_IdxDelete: {
|
||||
** See also: Rowid, MakeRecord.
|
||||
*/
|
||||
case OP_IdxRowid: { /* out2-prerelease */
|
||||
int i;
|
||||
BtCursor *pCrsr;
|
||||
VdbeCursor *pC;
|
||||
i64 rowid;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
assert( p->apCsr[i]!=0 );
|
||||
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
pCrsr = pC->pCursor;
|
||||
if( pCrsr!=0 ){
|
||||
rc = sqlite3VdbeCursorMoveto(pC);
|
||||
if( rc ) goto abort_due_to_error;
|
||||
assert( pC->deferredMoveto==0 );
|
||||
@ -4289,15 +4258,14 @@ case OP_IdxRowid: { /* out2-prerelease */
|
||||
*/
|
||||
case OP_IdxLT: /* jump, in3 */
|
||||
case OP_IdxGE: { /* jump, in3 */
|
||||
int i;
|
||||
VdbeCursor *pC;
|
||||
int res;
|
||||
UnpackedRecord r;
|
||||
|
||||
i = pOp->p1;
|
||||
assert( i>=0 && i<p->nCursor );
|
||||
assert( p->apCsr[i]!=0 );
|
||||
if( (pC = p->apCsr[i])->pCursor!=0 ){
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
if( pC->pCursor!=0 ){
|
||||
assert( pC->deferredMoveto==0 );
|
||||
assert( pOp->p5==0 || pOp->p5==1 );
|
||||
assert( pOp->p4type==P4_INT32 );
|
||||
|
Loading…
x
Reference in New Issue
Block a user