From: drh Date: Thu, 4 Feb 2016 02:34:24 +0000 (+0000) Subject: Add and use the sqlite3VdbeZeroRegister() interface for coding the common X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Fzero-register;p=thirdparty%2Fsqlite.git Add and use the sqlite3VdbeZeroRegister() interface for coding the common operation of writing zero into a register. FossilOrigin-Name: 1c8d300189ad54ef73886cdb0395acc595218ee5 --- diff --git a/manifest b/manifest index 63d7f994de..c8fea6e9ce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sVDBE\sloop,\sonly\scheck\sfor\sOOM\serrors\sat\sjumps\srather\sthan\safter\severy\nopcode,\sfor\sabout\sa\s0.5%\sperformance\sincrease. -D 2016-02-03T22:14:38.812 +C Add\sand\suse\sthe\ssqlite3VdbeZeroRegister()\sinterface\sfor\scoding\sthe\scommon\noperation\sof\swriting\szero\sinto\sa\sregister. +D 2016-02-04T02:34:24.402 F Makefile.in 027c1603f255390c43a426671055a31c0a65fdb4 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 72b7858f02017611c3ac1ddc965251017fed0845 @@ -285,7 +285,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 3fe13e97ab38317b092e2f3ae11267b40c9b5cbd -F src/analyze.c 0043d3e501f04297fed2bb50b488bc08d5c39f36 +F src/analyze.c e98b1f4c2b13d959f32616330d9f4f07c085fd37 F src/attach.c 07b3a34a1702dce92a7f1d3888c0c06222b63760 F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 2869a76c03eb393ee795416e2387005553df72bc @@ -294,14 +294,14 @@ F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73 F src/btree.c a2a0244ea3f0b3f57f75019c2f229c744ca5d202 F src/btree.h 368ceeb4bd9312dc8df2ffd64b4b7dbcf4db5f8e F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5 -F src/build.c 33dea2cef04c16a902c55f9d83b1a2065f213979 +F src/build.c 2d8094638dfd8a6f4053b4258c7941f1e0b7be63 F src/callback.c 29ae4faba226c7ebb9aee93016b5ce8a8f071261 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 60e135af364d777a9ab41c97e5e89cd224da6198 F src/date.c 997651e3ee6c2818fbf7fcdb7156cef9eb3ece20 F src/dbstat.c b2ec6793eef97aebb4d171d490a4ffdfa9f2475c -F src/delete.c 33ed87dc0746b1f8ce186f62b608bf40801af9c0 -F src/expr.c d10c1cdef5810cdbf73adc9f9b383684230b360a +F src/delete.c b08e36ce9b97795447f82c5b5cad311ac4fbc7bb +F src/expr.c b37b5a2f27b8eeb0b901d9ba385971923d6aea45 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c66d3e5b35d4d95b5c1e2ee6c12f5df13a7f9ad6 F src/func.c 42b24923328f65849f52f1659efb2a0907ad78fd @@ -309,7 +309,7 @@ F src/global.c bd5a0af3f30b0c01be6db756c626cd3c33a3d260 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 3e2462294fc8bc6e46f377ec824ff315e79fc36d +F src/insert.c 7a7a82490ca8a66c2f9fec166a6b6027cc0ccabc F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/loadext.c 84996d7d70a605597d79c1f1d7b2012a5fd34f2b @@ -341,14 +341,14 @@ F src/parse.y 426a91fbbbf7cdde3fd4b8798de7317a8782bec5 F src/pcache.c 73895411fa6b7bd6f0091212feabbe833b358d23 F src/pcache.h 4d0ccaad264d360981ec5e6a2b596d6e85242545 F src/pcache1.c 72f644dc9e1468c72922eff5904048427b817051 -F src/pragma.c 3c4f3fadf05893e289f2adf3a20c671a842cadec +F src/pragma.c eb3a712e0b24486c495d36851f693f2551ebd36d F src/pragma.h 64c78a648751b9f4f297276c4eb7507b14b4628c F src/prepare.c db85f0451ba93ecb3c1e497c279abece5cb5aead F src/printf.c 98a5cef7fc84577ab8a3098cfa48ecfa5a70b9f8 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 9f7ce3a3c087afb7597b7c916c99126ff3f12f0c F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c ea6f3b0c279aa37eb3701792d094673a7ad1bf88 +F src/select.c 5ae632f5f20a753409b6ae78b4299571bda32199 F src/shell.c dcd7a83645ef2a58ee9c6d0ea4714d877d7835c4 F src/sqlite.h.in cf22ad1d52dca2c9862d63833e581028119aab7e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -409,15 +409,15 @@ F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 5606871a377f390af7040ec3c12e0d183512d785 F src/treeview.c dc39ccf04e9331237388b9cb73289c9d87ea050b F src/trigger.c 72d876b2d0c66604a112362bdae07dae9b104816 -F src/update.c 17332f9fe818cbc0444c36a811800af8498af4c3 +F src/update.c 37568d17f9b669c20933880b267c52ea2259961d F src/utf.c 10cc2519e82e3369344d0969ad4b1a333dc86d18 F src/util.c 72d40df0a52d3f30b462a15f0e094fcbade6dc82 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 F src/vdbe.c f0c2e2fb8cbff761ea8602058406c151b9325e8d -F src/vdbe.h 7a733ea8aac1b77305a67698e784fa3484ee3337 +F src/vdbe.h 89da2c031e0f955b9878d59e01968394cf7bd0d4 F src/vdbeInt.h 4b69d5451bcadd473e745af53ef1e8abfdce0a79 F src/vdbeapi.c 9d640d5efd9a140a6bda8da53b220aa258167993 -F src/vdbeaux.c 23b38b447ebf5991de1d3d456003c58cf523a5da +F src/vdbeaux.c fdfae9e38069e47affdecca2b8991185ff815721 F src/vdbeblob.c 3b570b730109e8f653d9d2081649f6e7015113db F src/vdbemem.c b9181e77eca2a095929d46250daf85c8d2621fc0 F src/vdbesort.c ef3c6d1f1a7d44cf67bb2bee59ea3d1fe5bad174 @@ -427,9 +427,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c d21b99fd1458159d0b1ecdccc8ee6ada4fdc4c54 F src/wal.h 2f7c831cf3b071fa548bf2d5cac640846a7ff19c F src/walker.c 0f142b5bd3ed2041fc52d773880748b212e63354 -F src/where.c af9bf5dcec1a0e52726c550924aa91d837166251 +F src/where.c 623e45511a1f06f9d18f052adffbe070c76c216b F src/whereInt.h 78b6b4de94db84aecbdc07fe3e38f648eb391e9a -F src/wherecode.c 923f5d04b379b7417bc29f3b86b5eae9d1923d72 +F src/wherecode.c f5229eb1fc6ab68044687e4333ef7ae45223e7a8 F src/whereexpr.c 197a448b52073aee43eca3a2233fc113369eb2d4 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1423,7 +1423,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 ca11f46db047e7f131cef3893f73824758a2076b -R 59ea01ed7c88b6674116d0bfaf73cf15 +P 632071bac5ff324a74cec9bdbba2deb60c0945e9 +R f3f250db64ef887f8b8cd1a7359ad874 +T *branch * zero-register +T *sym-zero-register * +T -sym-trunk * U drh -Z 96f5f7409c64154023cc6759eed6c5b3 +Z 9c3c28bd6ffefbe1fa26840473fc0b1b diff --git a/manifest.uuid b/manifest.uuid index bfccf07dec..37270a3ff4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -632071bac5ff324a74cec9bdbba2deb60c0945e9 \ No newline at end of file +1c8d300189ad54ef73886cdb0395acc595218ee5 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 4d777fa9f5..82fdea6319 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1109,7 +1109,7 @@ static void analyzeOneTable( */ addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); + sqlite3VdbeZeroRegister(v, regChng); addrNextRow = sqlite3VdbeCurrentAddr(v); if( nColTest>0 ){ diff --git a/src/build.c b/src/build.c index 3ca4c99947..b81e4df06a 100644 --- a/src/build.c +++ b/src/build.c @@ -998,7 +998,7 @@ void sqlite3StartTable( */ #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) if( isView || isVirtual ){ - sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2); + sqlite3VdbeZeroRegister(v, reg2); }else #endif { diff --git a/src/delete.c b/src/delete.c index 5b5a5e3cb1..efdb26b6fc 100644 --- a/src/delete.c +++ b/src/delete.c @@ -354,7 +354,7 @@ void sqlite3DeleteFrom( */ if( db->flags & SQLITE_CountRows ){ memCnt = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt); + sqlite3VdbeZeroRegister(v, memCnt); } #ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION diff --git a/src/expr.c b/src/expr.c index c91db2834f..6a9e7dc57e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1617,7 +1617,7 @@ int sqlite3CodeOnce(Parse *pParse){ */ static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ int addr1; - sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); + sqlite3VdbeZeroRegister(v, regHasNull); addr1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); @@ -2048,7 +2048,7 @@ int sqlite3CodeSubselect( VdbeComment((v, "Init subquery result")); }else{ dest.eDest = SRT_Exists; - sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + sqlite3VdbeZeroRegister(v, dest.iSDParm); VdbeComment((v, "Init EXISTS result")); } sqlite3ExprDelete(pParse->db, pSel->pLimit); @@ -2860,7 +2860,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ addr = sqlite3VdbeAddOp1(v, op, r1); VdbeCoverageIf(v, op==TK_ISNULL); VdbeCoverageIf(v, op==TK_NOTNULL); - sqlite3VdbeAddOp2(v, OP_Integer, 0, target); + sqlite3VdbeZeroRegister(v, target); sqlite3VdbeJumpHere(v, addr); break; } diff --git a/src/insert.c b/src/insert.c index 5f36c089f6..b975e2689d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -779,7 +779,7 @@ void sqlite3Insert( */ if( db->flags & SQLITE_CountRows ){ regRowCount = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + sqlite3VdbeZeroRegister(v, regRowCount); } /* If this is not a view, open the table and and all indices */ diff --git a/src/pragma.c b/src/pragma.c index bde17d1e86..2365d3f28a 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1502,9 +1502,9 @@ void sqlite3Pragma( sqlite3ExprCacheClear(pParse); sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, 1, 0, &iDataCur, &iIdxCur); - sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); + sqlite3VdbeZeroRegister(v, 7); for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ - sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ + sqlite3VdbeZeroRegister(v, 8+j); /* index entries counter */ } pParse->nMem = MAX(pParse->nMem, 8+j); sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); diff --git a/src/select.c b/src/select.c index 891b123543..5eb7a0ad8f 100644 --- a/src/select.c +++ b/src/select.c @@ -2900,7 +2900,7 @@ static int multiSelectOrderBy( assert( nOrderBy>=nExpr || db->mallocFailed ); regPrev = pParse->nMem+1; pParse->nMem += nExpr+1; - sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev); + sqlite3VdbeZeroRegister(v, regPrev); pKeyDup = sqlite3KeyInfoAlloc(db, nExpr, 1); if( pKeyDup ){ assert( sqlite3KeyInfoIsWriteable(pKeyDup) ); @@ -5004,7 +5004,7 @@ int sqlite3Select( int retAddr; assert( pItem->addrFillSub==0 ); pItem->regReturn = ++pParse->nMem; - topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + topAddr = sqlite3VdbeZeroRegister(v, pItem->regReturn); pItem->addrFillSub = topAddr+1; if( pItem->fg.isCorrelated==0 ){ /* If the subquery is not correlated and if we are not inside of @@ -5271,9 +5271,9 @@ int sqlite3Select( pParse->nMem += pGroupBy->nExpr; iBMem = pParse->nMem + 1; pParse->nMem += pGroupBy->nExpr; - sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag); + sqlite3VdbeZeroRegister(v, iAbortFlag); VdbeComment((v, "clear abort flag")); - sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); + sqlite3VdbeZeroRegister(v, iUseFlag); VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1); diff --git a/src/update.c b/src/update.c index a9735cadca..992b835e1f 100644 --- a/src/update.c +++ b/src/update.c @@ -406,7 +406,7 @@ void sqlite3Update( */ if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){ regRowCount = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + sqlite3VdbeZeroRegister(v, regRowCount); } labelBreak = sqlite3VdbeMakeLabel(v); diff --git a/src/vdbe.h b/src/vdbe.h index f09997bf94..dad86bbe3f 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -175,6 +175,7 @@ int sqlite3VdbeAddOp1(Vdbe*,int,int); int sqlite3VdbeAddOp2(Vdbe*,int,int,int); int sqlite3VdbeGoto(Vdbe*,int); int sqlite3VdbeLoadString(Vdbe*,int,const char*); +int sqlite3VdbeZeroRegister(Vdbe*,int); void sqlite3VdbeMultiLoad(Vdbe*,int,const char*,...); int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 632c1231aa..9c77196eec 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -234,6 +234,12 @@ int sqlite3VdbeLoadString(Vdbe *p, int iDest, const char *zStr){ return sqlite3VdbeAddOp4(p, OP_String8, 0, iDest, 0, zStr, 0); } +/* Generate code to zero a register +*/ +int sqlite3VdbeZeroRegister(Vdbe *p, int iDest){ + return sqlite3VdbeAddOp3(p, OP_Integer, 0, iDest, 0); +} + /* ** Generate code that initializes multiple registers to string or integer ** constants. The registers begin with iDest and increase consecutively. diff --git a/src/where.c b/src/where.c index 8c8dfbb7b6..7c35bf4f26 100644 --- a/src/where.c +++ b/src/where.c @@ -757,7 +757,7 @@ static void constructAutomaticIndex( pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom]; if( pTabItem->fg.viaCoroutine ){ int regYield = pTabItem->regReturn; - addrCounter = sqlite3VdbeAddOp2(v, OP_Integer, 0, 0); + addrCounter = sqlite3VdbeZeroRegister(v, 0); sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield); VdbeCoverage(v); diff --git a/src/wherecode.c b/src/wherecode.c index f5f45da397..4feb10a2cb 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -854,7 +854,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( */ if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ pLevel->iLeftJoin = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); + sqlite3VdbeZeroRegister(v, pLevel->iLeftJoin); VdbeComment((v, "init LEFT JOIN no-match flag")); } @@ -1427,7 +1427,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( } regRowid = ++pParse->nMem; } - iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); + iRetInit = sqlite3VdbeZeroRegister(v, regReturn); /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y ** Then for every term xN, evaluate as the subexpression: xN AND z