From: drh Date: Fri, 13 Nov 2009 20:52:43 +0000 (+0000) Subject: Performance improvements and size reductions on the OP_Seek* family of X-Git-Tag: fts3-refactor~1^2~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1f35012c11ea391a8984442ae25dfceaa9aeb2ce;p=thirdparty%2Fsqlite.git Performance improvements and size reductions on the OP_Seek* family of VDBE opcodes. FossilOrigin-Name: ed820f45cf4354b1e1db64049c47a07221a7ff6d --- diff --git a/manifest b/manifest index a85470290c..efad3c5cdc 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C Simplify\sthe\sOPFLG\sprocessing\slogic\sin\sthe\sVDBE\sfor\sa\sspeed\sboost\sin\sthe\nVDBE\sprocessing\sloop\sand\sa\sreduction\sin\scode\ssize. -D 2009-11-13T19:43:44 +C Performance\simprovements\sand\ssize\sreductions\son\sthe\sOP_Seek*\sfamily\sof\nVDBE\sopcodes. +D 2009-11-13T20:52:44 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 53f3dfa49f28ab5b80cb083fb7c9051e596bcfa1 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -210,7 +210,7 @@ F src/update.c 8efeb09822886e33c265dd96d29a3d865ea6dcf2 F src/utf.c dad16adcc0c35ef2437dca125a4b07419d361052 F src/util.c ad4f03079ba0fe83590d1cc9197e8e4844e38592 F src/vacuum.c 03309a08d549f9389cc3a3589afd4fadbdaf0679 -F src/vdbe.c bc7fe6c752a86adb63ddfdefe41c2912f0dbb207 +F src/vdbe.c 74158ea3fd68231720ba75ebec5072eda1ad8cf9 F src/vdbe.h 65cd747e36ad444cb1a17e529030942c45a61fe3 F src/vdbeInt.h 59c65e7b810836b9e946acee45c7b3c02b967d1b F src/vdbeapi.c 17680ab7a75ec938c5ba039a6c87489d01faf2cb @@ -771,14 +771,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P bdc45ba77fb77771c8ff46b8d6c2dd29e6d3b019 -R 5ea278d36772610aa788376c8fbcebe2 +P 3352b3eba545c3128efb7665ec91d4df3b16011d +R 2242fd95cd691be062201d4a6409f215 U drh -Z 259be306ad269f147c546ad8a52bafc1 +Z fdb196c2be03c08f60c67969937fe987 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFK/bbzoxKgR168RlERAnLoAKCIVxGvqT+6vMWYcfnTE0ON/9WBLwCfXEdv -WTqwwhvX+GL8mTOt3BiR/h8= -=9zc9 +iD8DBQFK/ccfoxKgR168RlERAsHZAJ45TKVOQRlFzMf0pR03Ik5X3PWGHgCfbTo2 +sR7n4qre/qrfhmog3CvnvbQ= +=5/U8 -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index 133a7c45f2..bc3cfba6e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3352b3eba545c3128efb7665ec91d4df3b16011d \ No newline at end of file +ed820f45cf4354b1e1db64049c47a07221a7ff6d \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 85fc902a79..b04e60e277 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3179,6 +3179,9 @@ case OP_SeekGt: { /* jump, in3 */ pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->pseudoTableReg==0 ); + assert( OP_SeekLe == OP_SeekLt+1 ); + assert( OP_SeekGe == OP_SeekLt+2 ); + assert( OP_SeekGt == OP_SeekLt+3 ); if( pC->pCursor!=0 ){ oc = pOp->opcode; pC->nullRow = 0; @@ -3208,12 +3211,12 @@ case OP_SeekGt: { /* jump, in3 */ ** integer. */ res = 1; if( pIn3->r<0 ){ - if( oc==OP_SeekGt || oc==OP_SeekGe ){ + if( oc>=OP_SeekGe ){ assert( oc==OP_SeekGe || oc==OP_SeekGt ); rc = sqlite3BtreeFirst(pC->pCursor, &res); if( rc!=SQLITE_OK ) goto abort_due_to_error; } }else{ - if( oc==OP_SeekLt || oc==OP_SeekLe ){ + if( oc<=OP_SeekLe ){ assert( oc==OP_SeekLt || oc==OP_SeekLe ); rc = sqlite3BtreeLast(pC->pCursor, &res); if( rc!=SQLITE_OK ) goto abort_due_to_error; } @@ -3245,11 +3248,20 @@ case OP_SeekGt: { /* jump, in3 */ assert( nField>0 ); r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)nField; - if( oc==OP_SeekGt || oc==OP_SeekLe ){ - r.flags = UNPACKED_INCRKEY; - }else{ - r.flags = 0; - } + + /* The next line of code computes as follows, only faster: + ** if( oc==OP_SeekGt || oc==OP_SeekLe ){ + ** r.flags = UNPACKED_INCRKEY; + ** }else{ + ** r.flags = 0; + ** } + */ + r.flags = UNPACKED_INCRKEY * (1 & (oc - OP_SeekLt)); + assert( oc!=OP_SeekGt || r.flags==UNPACKED_INCRKEY ); + assert( oc!=OP_SeekLe || r.flags==UNPACKED_INCRKEY ); + assert( oc!=OP_SeekGe || r.flags==0 ); + assert( oc!=OP_SeekLt || r.flags==0 ); + r.aMem = &p->aMem[pOp->p3]; rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, &r, 0, 0, &res); if( rc!=SQLITE_OK ){ @@ -3262,7 +3274,7 @@ case OP_SeekGt: { /* jump, in3 */ #ifdef SQLITE_TEST sqlite3_search_count++; #endif - if( oc==OP_SeekGe || oc==OP_SeekGt ){ + if( oc>=OP_SeekGe ){ assert( oc==OP_SeekGe || oc==OP_SeekGt ); if( res<0 || (res==0 && oc==OP_SeekGt) ){ rc = sqlite3BtreeNext(pC->pCursor, &res); if( rc!=SQLITE_OK ) goto abort_due_to_error;