From: drh Date: Sat, 21 Nov 2015 17:53:06 +0000 (+0000) Subject: Add a new OP_BColumn opcode where the cursor is guaranteed to be of type X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Fbtree-column-opcode;p=thirdparty%2Fsqlite.git Add a new OP_BColumn opcode where the cursor is guaranteed to be of type CURTYPE_BTREE and is thus able to skip some checks and run slightly faster. FossilOrigin-Name: 093e0d10a81adc078dcb3e08e33ce89bdbe53789 --- diff --git a/manifest b/manifest index 48ad5f5d35..2e1305c8e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sover-length\ssource\scode\slines.\s\sNo\slogic\schanges. -D 2015-11-21T17:27:42.127 +C Add\sa\snew\sOP_BColumn\sopcode\swhere\sthe\scursor\sis\sguaranteed\sto\sbe\sof\stype\nCURTYPE_BTREE\sand\sis\sthus\sable\sto\sskip\ssome\schecks\sand\srun\sslightly\sfaster. +D 2015-11-21T17:53:06.758 F Makefile.in d828db6afa6c1fa060d01e33e4674408df1942a1 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc e928e68168df69b353300ac87c10105206653a03 @@ -402,11 +402,11 @@ F src/update.c 40e51cd0883cb5bfd6abb7d8a7cd8aa47fab2945 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c e802e8e311a0d6c48cd1b3e89db164f6f0248d70 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 -F src/vdbe.c b56b2fc9b2f2d0a99d1dbd02d47efaacec253a4c +F src/vdbe.c 8694c0e6497cd21e19e30ac059f933ac5d9abea2 F src/vdbe.h efb7a8c1459e31f3ea4377824c6a7e4cb5068637 F src/vdbeInt.h 75c2e82ee3357e9210c06474f8d9bdf12c81105d F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca -F src/vdbeaux.c b660c995256e3d3e2cb47ccd20b82a1c342fa093 +F src/vdbeaux.c 16e21a6ae0c290f17f6e7395d80686622cafeaa2 F src/vdbeblob.c fdc4a81605ae7a35ae94a55bd768b66d6be16f15 F src/vdbemem.c fdd1578e47bea61390d472de53c565781d81e045 F src/vdbesort.c a7ec02da4494c59dfd071126dd3726be5a11459d @@ -1404,7 +1404,10 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ff5716b89f99d9c4568a39f1f52524528a631623 -R 558d15295cc22b403e8d5cb8c3ebd48a +P 198d191b2f5ef7d63ac0093c701955c9052fd734 +R 047e676af06478b15f87435c78af3c91 +T *branch * btree-column-opcode +T *sym-btree-column-opcode * +T -sym-trunk * U drh -Z 0a3988f827c1f289bd36fdbbf324f548 +Z d7290cc1ec32ea2c40df94d6965d7340 diff --git a/manifest.uuid b/manifest.uuid index 48582621bb..f1aff2cebc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -198d191b2f5ef7d63ac0093c701955c9052fd734 \ No newline at end of file +093e0d10a81adc078dcb3e08e33ce89bdbe53789 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 66b507b285..10ebe8c3bf 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2375,12 +2375,20 @@ case OP_Column: { u16 fx; /* pDest->flags value */ Mem *pReg; /* PseudoTable input register */ + pC = p->apCsr[pOp->p1]; + if( pC->eCurType==CURTYPE_PSEUDO ) goto skip_moveto; + pOp->opcode = OP_BColumn; + +case OP_BColumn: + pC = p->apCsr[pOp->p1]; + rc = sqlite3VdbeCursorMoveto(pC); + if( rc ) goto abort_due_to_error; +skip_moveto: p2 = pOp->p2; assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); pDest = &aMem[pOp->p3]; memAboutToChange(p, pDest); assert( pOp->p1>=0 && pOp->p1nCursor ); - pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( p2nField ); aOffset = pC->aOffset; @@ -2390,8 +2398,6 @@ case OP_Column: { pCrsr = pC->uc.pCursor; /* If the cursor cache is stale, bring it up-to-date */ - rc = sqlite3VdbeCursorMoveto(pC); - if( rc ) goto abort_due_to_error; if( pC->cacheStatus!=p->cacheCtr ){ if( pC->nullRow ){ if( pC->eCurType==CURTYPE_PSEUDO ){ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9ced9480b7..6b9692874a 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3000,13 +3000,12 @@ int sqlite3VdbeCursorRestore(VdbeCursor *p){ ** not been deleted out from under the cursor, then this routine is a no-op. */ int sqlite3VdbeCursorMoveto(VdbeCursor *p){ - if( p->eCurType==CURTYPE_BTREE ){ - if( p->deferredMoveto ){ - return handleDeferredMoveto(p); - } - if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ - return handleMovedCursor(p); - } + assert( p->eCurType==CURTYPE_BTREE ); + if( p->deferredMoveto ){ + return handleDeferredMoveto(p); + } + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ + return handleMovedCursor(p); } return SQLITE_OK; }