]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add and use the sqlite3VdbeZeroRegister() interface for coding the common zero-register
authordrh <drh@noemail.net>
Thu, 4 Feb 2016 02:34:24 +0000 (02:34 +0000)
committerdrh <drh@noemail.net>
Thu, 4 Feb 2016 02:34:24 +0000 (02:34 +0000)
operation of writing zero into a register.

FossilOrigin-Name: 1c8d300189ad54ef73886cdb0395acc595218ee5

14 files changed:
manifest
manifest.uuid
src/analyze.c
src/build.c
src/delete.c
src/expr.c
src/insert.c
src/pragma.c
src/select.c
src/update.c
src/vdbe.h
src/vdbeaux.c
src/where.c
src/wherecode.c

index 63d7f994de0df232dd4cb15ed69e5a5d93d601f5..c8fea6e9ce638cb400a42de7888d6eb4134c9b72 100644 (file)
--- 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
index bfccf07dec2481c64ed9ab4dbc4b9cf331c1fc9f..37270a3ff4aefd2af7f12e3310d4e64172d9cdab 100644 (file)
@@ -1 +1 @@
-632071bac5ff324a74cec9bdbba2deb60c0945e9
\ No newline at end of file
+1c8d300189ad54ef73886cdb0395acc595218ee5
\ No newline at end of file
index 4d777fa9f50f99173b3aa9f60dfcc6276c4c9950..82fdea6319255bd649e2cff3612bb6c1b4b85b13 100644 (file)
@@ -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 ){
index 3ca4c999470b205d18bdebd05d8ccb284f2e86fa..b81e4df06a49a8345e71d737291180e034e29105 100644 (file)
@@ -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
     {
index 5b5a5e3cb1000e4fc4568d9f2f3a9bef0a676571..efdb26b6fc6bceffcf282ec6e7644e29bcd32c86 100644 (file)
@@ -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
index c91db2834fbe50b83244374f676edc4678d8cec5..6a9e7dc57e935bdcd5c0cbbb40c2d37188e1fda0 100644 (file)
@@ -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;
     }
index 5f36c089f6b2ff4cebae22c9c7c42e1d865bd950..b975e2689d554383664fd90b9eda9fed99af3909 100644 (file)
@@ -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 */
index bde17d1e860c9999dc394bf51bd541db68a1c4eb..2365d3f28a067aad8eaa268c4a418e292e147c2f 100644 (file)
@@ -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);
index 891b123543b9227c8da065504f78ceeae7c5b339..5eb7a0ad8f3fe8bfdaeb7d80cce4af96dd2baf88 100644 (file)
@@ -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);
 
index a9735cadcad390c274f55f08482a3802f79ad0e2..992b835e1f1452ae40e4fab73fa029baf90339c9 100644 (file)
@@ -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);
index f09997bf942c306bf88e8bd63df6e1aa3db40127..dad86bbe3f495eec237366031c59d52daa3ca12b 100644 (file)
@@ -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);
index 632c1231aa57a13735c0c90fe161cd9505ee8408..9c77196eec8ee55f55d5dcfd6014c04863a5136c 100644 (file)
@@ -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.
index 8c8dfbb7b627f07086bf3eeb89bd8ecd3e4451ba..7c35bf4f2618e5ef8d1f1da517c8b4a30be67705 100644 (file)
@@ -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);
index f5f45da39731e1b21a2a1bb60299aebc0293b9ab..4feb10a2cbea1ef916a58838373ae050580981ae 100644 (file)
@@ -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