]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add loops and rows counters to "USE TEMP B-TREE FOR ORDER BY" records. Also fix the...
authordan <Dan Kennedy>
Mon, 5 Dec 2022 18:19:56 +0000 (18:19 +0000)
committerdan <Dan Kennedy>
Mon, 5 Dec 2022 18:19:56 +0000 (18:19 +0000)
FossilOrigin-Name: 41a0e05e8c0fca3b803fe4bd017a157c172b2ca518356a2a4d4ed4f12d01a1e3

manifest
manifest.uuid
src/expr.c
src/hwtime.h
src/select.c
src/vdbe.c
src/vdbe.h
src/vdbeapi.c
src/vdbeaux.c
test/scanstatus2.test

index 7ca1c989db1790d25c7c45f7ae69162fa2f36c17..881e5d52a05635704023accbde6e573cee459de4 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sSQLITE_SCANSTAT_NCYCLE\sso\sthat\sit\sreports\son\svirtual\stables.
-D 2022-12-03T21:24:26.253
+C Add\sloops\sand\srows\scounters\sto\s"USE\sTEMP\sB-TREE\sFOR\sORDER\sBY"\srecords.\sAlso\sfix\sthe\ssqliteHwtime()\sfunction\sso\sthat\sit\sreturns\sa\s64-bit\svalue.
+D 2022-12-05T18:19:56.530
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -595,14 +595,14 @@ F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5
 F src/dbpage.c f1a87f4ebcf22284e0aaf0697862f4ccfc120dcd6db3d8dfa3b049b2580c01d8
 F src/dbstat.c a56a7ad1163a9888d46cd5820be2e65354fb1aa04ed6909f7c3e5831e0ee2c29
 F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e
-F src/expr.c 02a24db96257d0d0dfc82401a6720ae3156cd20b60b84db9523aaf87884a3254
+F src/expr.c d0ce060008452653e9c7bcdce8b1e3ff078fbbd5f9f80b530b3ab99bb70a8078
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
 F src/func.c 7e86074afc4dc702691a29b7801f6dcc191db092b52e8bbe69dcd2f7be52194d
 F src/global.c e06ff8e0acd85aec13563c9ecb44fbbf38232ccf73594998fd880b92d619594b
 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
-F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144
+F src/hwtime.h b638809e083b601b618df877b2e89cb87c2a47a01f4def10be4c4ebb54664ac7
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
 F src/insert.c 1b11a2e33ee52db93c02fddac67e39d00161d61b69fac2675b82f2aa68c1b61c
 F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6
@@ -645,7 +645,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633
 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
-F src/select.c f6674cdcb839f118cf931b0c49e94d5fd37007a616239f62882d02df51cacbe7
+F src/select.c 321f29e431fbb71e594cc7026391a827a0270237597d2e2401244e7602dea8bd
 F src/shell.c.in 8cfe0c7dbd3ac8f9eca40fdad85d90f22362a89ab9ad8d64826fd0ad5e408d13
 F src/sqlite.h.in 3ba99a3c2b414b9ad36d06e2f273ab6077f5f74e4d79630aee047394b92f7c7f
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -717,11 +717,11 @@ F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
 F src/util.c 313f3154e2b85a447326f5dd15de8d31a4df6ab0c3579bd58f426ff634ec9050
 F src/vacuum.c 84ce7f01f8a7a08748e107a441db83bcec13970190ddcb0c9ff522adbc1c23fd
-F src/vdbe.c 5f5cc749c999d65e2115bb3ec555f7ac0ecfbda7f47526272d53a032e9d083b1
-F src/vdbe.h 77b3fb0abe5c5edaca849816584f0fd019c0f91e80410ef2d65f57fcf290ddd8
+F src/vdbe.c e744259050ec9bbcd47acf9a03a66fe3305d7429c823995de11ed524ca06d16f
+F src/vdbe.h 6d921884cf8ec6a53efba99f8b68e32e955367631743e29039840e781aaf547c
 F src/vdbeInt.h e83be1eea422758d42302941e96e59d93193c373da655a87befdc03a851e0f95
-F src/vdbeapi.c 35b4ca406f9a4bfd23fb7016b6d36280a5c1d68372b69271d6fbfcceead4b8ab
-F src/vdbeaux.c 7dcaff5933e4fbe5983be435b7cd2951d5f3ebd0f2acaf70fed4271dbfb57981
+F src/vdbeapi.c 56a27f44784dc0dbf4cdc0f7f3e45cdf6d2b2b17ee95b3a5d43165427135c2ea
+F src/vdbeaux.c 42e3632fa1fea7e4f9cf5a59c4b1e1c5e07931b796bc670a096eed68fe5ade11
 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
 F src/vdbemem.c 6cfed43758d57b6e3b99d9cdedfeccd86e45a07e427b22d8487cbdbebb6c522a
 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
@@ -1457,7 +1457,7 @@ F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7
 F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa
 F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2
 F test/scanstatus.test 7dbcfd6adc6a8df6abc59f83d6da5a27e1bce0b2f6fa55147c8176d7c44e0450
-F test/scanstatus2.test 799129ea953ba1235d4d5e7f59375cdff79f9185142773ed5d9e1c2c14500833
+F test/scanstatus2.test 503c8529111fbac777b225b846f3a31a020e80950d40763b65953fae46e9ceb9
 F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431
 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5
 F test/schema3.test 8ed4ae66e082cdd8b1b1f22d8549e1e7a0db4527a8e6ee8b6193053ee1e5c9ce
@@ -2066,8 +2066,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 365011ae8b7e3fcaa2c4ea9601231a3ef2223e60d7a53ec33013109dca22ad58
-R d4e70f090a6234401994809de206bf5b
+P 622d8eb3724bee617b55d6fb71f1a2d683db6858065adced6bf3ce9525bcd6b5
+R 26a74ba4d9b4917db1af945f6ebd0886
 U dan
-Z 77f61cda4725a7748ad22a19d7f4eb4e
+Z 549ef47ca8c045470c46bb8ad599992d
 # Remove this line to create a well-formed Fossil manifest.
index b1c968e110b3900b5c5cbce43d051aa508ddfd12..6c7d1a6e12db032d9ed01f827913b808536318fa 100644 (file)
@@ -1 +1 @@
-622d8eb3724bee617b55d6fb71f1a2d683db6858065adced6bf3ce9525bcd6b5
\ No newline at end of file
+41a0e05e8c0fca3b803fe4bd017a157c172b2ca518356a2a4d4ed4f12d01a1e3
\ No newline at end of file
index 1528877e2397acbbd554feca0c9b2084db0281d0..592e9dd25cbc34c142e19ea954855584d79932ee 100644 (file)
@@ -3314,6 +3314,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
   */
   ExplainQueryPlan2(addrExplain, (pParse, 1, "%sSCALAR SUBQUERY %d",
         addrOnce?"":"CORRELATED ", pSel->selId));
+  sqlite3VdbeScanStatusCounters(v, addrExplain, addrExplain, -1);
   nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1;
   sqlite3SelectDestInit(&dest, 0, pParse->nMem+1);
   pParse->nMem += nReg;
index 037c55a9772f656b195e0c9580082d482b21a293..d27204a69ca0847b3f4caa8484585580172af1dd 100644 (file)
@@ -48,9 +48,9 @@
 #elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__))
 
   __inline__ sqlite_uint64 sqlite3Hwtime(void){
-      unsigned long val;
-      __asm__ __volatile__ ("rdtsc" : "=A" (val));
-      return val;
+     unsigned int lo, hi;
+     __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+     return (sqlite_uint64)hi << 32 | lo;
   }
  
 #elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__))
index 7d010c6244c1abc938a0da9041c613426dba252f..34ba3f7a4ce921e983ed7791149f18b04453c56a 100644 (file)
@@ -66,7 +66,7 @@ struct SortCtx {
 #endif
   struct RowLoadInfo *pDeferredRowLoad;  /* Deferred row loading info or NULL */
 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
-  int addrPushStart;    /* First instruction to push data into sorter */
+  int addrPush;         /* First instruction to push data into sorter */
   int addrPushEnd;      /* Last instruction that pushes data into sorter */
 #endif
 };
@@ -726,7 +726,7 @@ static void pushOntoSorter(
   assert( nData==1 || regData==regOrigData || regOrigData==0 );
 
 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
-  pSort->addrPushStart = sqlite3VdbeCurrentAddr(v);
+  pSort->addrPush = sqlite3VdbeCurrentAddr(v);
 #endif
 
   if( nPrefixReg ){
@@ -1665,9 +1665,9 @@ static void generateSortTail(
   ExplainQueryPlan2(addrExplain, (pParse, 0, 
         "USE TEMP B-TREE FOR %sORDER BY", pSort->nOBSat>0?"RIGHT PART OF ":"")
   );
-  sqlite3VdbeScanStatusRange(
-      v, addrExplain, pSort->addrPushStart, pSort->addrPushEnd
-  );
+  sqlite3VdbeScanStatusRange(v, addrExplain,pSort->addrPush,pSort->addrPushEnd);
+  sqlite3VdbeScanStatusCounters(v, addrExplain, addrExplain, pSort->addrPush);
+
 
   assert( addrBreak<0 );
   if( pSort->labelBkOut ){
index 81642eb9294bbb6db03b500efb561c61a3fd1f53..1bf0ceb297dd03442fbaaa59812b4cb4f43920c4 100644 (file)
@@ -8735,6 +8735,7 @@ default: {          /* This is really OP_Noop, OP_Explain */
     assert( pnCycle );
     if( pnCycle ){
       *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
+      assert( *pnCycle < (((u64)1) << 48) );
       pnCycle = 0;
     }
 #elif defined(SQLITE_ENABLE_STMT_SCANSTATUS)
@@ -8820,9 +8821,14 @@ vdbe_return:
 #if defined(VDBE_PROFILE)
     if( pnCycle ){
       *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
+      assert( *pnCycle < (((u64)1) << 48) );
+      pnCycle = 0;
     }
 #elif defined(SQLITE_ENABLE_STMT_SCANSTATUS)
-  if( pnCycle ) *pnCycle += sqlite3Hwtime();
+  if( pnCycle ){
+    *pnCycle += sqlite3Hwtime();
+    pnCycle = 0;
+  }
 #endif
 
 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
index 8d0c8123f3b8ad8896240833aa8514577550ca9e..a199247434e95df90353a7261fdee7ba6725e076 100644 (file)
@@ -388,9 +388,11 @@ int sqlite3VdbeBytecodeVtabInit(sqlite3*);
 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
 void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const char*);
 void sqlite3VdbeScanStatusRange(Vdbe*, int, int, int);
+void sqlite3VdbeScanStatusCounters(Vdbe*, int, int, int);
 #else
 # define sqlite3VdbeScanStatus(a,b,c,d,e,f)
 # define sqlite3VdbeScanStatusRange(a,b,c,d)
+# define sqlite3VdbeScanStatusCounters(a,b,c,d)
 #endif
 
 #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
index 2b9b1087f2545bbb2c04934af67c167fa313a3d3..2e9a39578c841659445d1e2f574fcf392431d13c 100644 (file)
@@ -2142,7 +2142,7 @@ int sqlite3_stmt_scanstatus_v2(
   }else{
     for(idx=0; idx<p->nScan; idx++){
       pScan = &p->aScan[idx];
-      if( pScan->addrLoop ){
+      if( pScan->zName ){
         iScan--;
         if( iScan<0 ) break;
       }
index 74d3866c4885663b22f57f8363140a61637128c5..3078237a9d378d37108b5719659d92051a694efd 100644 (file)
@@ -1152,6 +1152,25 @@ void sqlite3VdbeScanStatusRange(
     }
   }
 }
+
+void sqlite3VdbeScanStatusCounters(
+  Vdbe *p, 
+  int addrExplain, 
+  int addrLoop, 
+  int addrVisit
+){
+  ScanStatus *pScan = 0;
+  int ii;
+  for(ii=p->nScan-1; ii>=0; ii--){
+    pScan = &p->aScan[ii];
+    if( pScan->addrExplain==addrExplain ) break;
+    pScan = 0;
+  }
+  if( pScan ){
+    pScan->addrLoop = addrLoop;
+    pScan->addrVisit = addrVisit;
+  }
+}
 #endif
 
 
index a7dfabc4ac4bdf6ff50a6a6b4abfd02d2e0742fb..784ed290d648de78615cf81014a58e6a6171104f 100644 (file)
@@ -135,7 +135,7 @@ QUERY (nCycle=nnn)
 ----SCAN t2
 --SCAN v2
 --SCAN t1
---USE TEMP B-TREE FOR ORDER BY
+--USE TEMP B-TREE FOR ORDER BY (nCycle=nnn)
 }
 
 #-------------------------------------------------------------------------
@@ -147,12 +147,11 @@ do_execsql_test 2.0 {
   INSERT INTO ft VALUES('ghi');
 }
 
-explain_i {
-  SELECT * FROM ft('def')
-  }
 do_graph_test 2.1 {
   SELECT * FROM ft('def')
 } {
+QUERY (nCycle=nnn)
+--SCAN ft VIRTUAL TABLE INDEX 0:M1 (nCycle=nnn)
 }
 
 finish_test