]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Replace variable Index.avgEq (average number of rows in keys for which there is no...
authordan <dan@noemail.net>
Wed, 7 Aug 2013 19:46:15 +0000 (19:46 +0000)
committerdan <dan@noemail.net>
Wed, 7 Aug 2013 19:46:15 +0000 (19:46 +0000)
FossilOrigin-Name: 7b70b419c43b2c3b2daf11d833a1d60245bfaef5

manifest
manifest.uuid
src/analyze.c
src/sqliteInt.h
src/where.c

index 924a46707c4175c9650188a612c1933ab25643d5..d23d9a5f36fe07c25d353f8f79460a71d6a2acb8 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\slatest\strunk\schanges\swith\sthis\sbranch.
-D 2013-08-07T18:42:27.752
+C Replace\svariable\sIndex.avgEq\s(average\snumber\sof\srows\sin\skeys\sfor\swhich\sthere\sis\sno\ssample\sin\ssqlite_stat4)\swith\svector\sIndex.aAvgEq.
+D 2013-08-07T19:46:15.623
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -157,7 +157,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc
 F sqlite3.pc.in ae6f59a76e862f5c561eb32a380228a02afc3cad
 F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083
-F src/analyze.c fcc42c3a9f4c3a048b20e138e3530b7f3d8470f6
+F src/analyze.c 0f54320fb58eedf3690dd9609e6176fff3f8c157
 F src/attach.c 1816f5a9eea8d2010fc2b22b44f0f63eb3a62704
 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
 F src/backup.c 43b348822db3e4cef48b2ae5a445fbeb6c73a165
@@ -221,7 +221,7 @@ F src/shell.c 128eb16ccec68509a4a2f1948f2483819bf63425
 F src/sqlite.h.in bd1451ba1ab681022a53bccc3c39580ba094a3ff
 F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0
 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
-F src/sqliteInt.h dfb02189a27dac993ee6635017dd3d6926508f5a
+F src/sqliteInt.h 0ff47977058e1babf0c4265f1791c379d172b02f
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -290,7 +290,7 @@ F src/vtab.c 2e8b489db47e20ae36cd247932dc671c9ded0624
 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
-F src/where.c 0051a3640491a67ce2d4abcbffc687a818bb49f7
+F src/where.c c973297fc29c5dae03a07d6deb479af432d24005
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
@@ -1106,7 +1106,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 812ed0c58fc5f729a2d4f16775fad6724cc367a6 0ad83ceb79767738bd06a28840cf84da0464ab4f
-R d674ab11a2de1d9766d2ac27cc923b51
+P 08f74c45ecf711a2373af578d44470add9082377
+R 4d9cb44bdbdf4b1edd0f4ec9caccbe56
 U dan
-Z 85dc674af92c540fb0c7cdb1bc5adf5a
+Z a128130e52d0e5080bab7e97885213b4
index 3eba2617364690e786fbba42e4b1abff08434b70..843b9772c2bfd75a32f4effb224c3be46a7bdaa1 100644 (file)
@@ -1 +1 @@
-08f74c45ecf711a2373af578d44470add9082377
\ No newline at end of file
+7b70b419c43b2c3b2daf11d833a1d60245bfaef5
\ No newline at end of file
index a17ff4f1b05403b0db77a23727c875436df307fb..f5fe93ead8b1f59078abad9693fdce24a2f3c26b 100644 (file)
@@ -327,7 +327,6 @@ static void stat4Push(
 ){
   Stat4Accum *p = (Stat4Accum*)sqlite3_value_blob(argv[0]);
   i64 rowid = sqlite3_value_int64(argv[1]);
-  i64 nSumEq = 0;                 /* Sum of all nEq parameters */
   struct Stat4Sample *pSample;
   u32 h;
   int iMin = p->iMin;
@@ -1176,14 +1175,15 @@ static int loadStat4(sqlite3 *db, const char *zDb){
     pIdx->nSample = nSample;
     nByte = sizeof(IndexSample) * nSample;
     nByte += sizeof(tRowcnt) * pIdx->nColumn * 3 * nSample;
+    nByte += pIdx->nColumn * sizeof(tRowcnt);    /* Space for Index.aAvgEq[] */
 
     pIdx->aSample = sqlite3DbMallocZero(db, nByte);
-    pIdx->avgEq = pIdx->aiRowEst[1];
     if( pIdx->aSample==0 ){
       sqlite3_finalize(pStmt);
       return SQLITE_NOMEM;
     }
     pSpace = (tRowcnt*)&pIdx->aSample[nSample];
+    pIdx->aAvgEq = pSpace; pSpace += pIdx->nColumn;
     for(i=0; i<pIdx->nSample; i++){
       pIdx->aSample[i].anEq = pSpace; pSpace += pIdx->nColumn;
       pIdx->aSample[i].anLt = pSpace; pSpace += pIdx->nColumn;
@@ -1229,11 +1229,17 @@ static int loadStat4(sqlite3 *db, const char *zDb){
     decodeIntArray((char*)sqlite3_column_text(pStmt,3), nCol, pSample->anDLt,0);
 
     if( idx==pIdx->nSample-1 ){
-      if( pSample->anDLt[0]>0 ){
-        for(i=0, sumEq=0; i<=idx-1; i++) sumEq += pIdx->aSample[i].anEq[0];
-        pIdx->avgEq = (pSample->anLt[0] - sumEq)/pSample->anDLt[0];
+      int iCol;
+      for(iCol=0; iCol<pIdx->nColumn; iCol++){
+        tRowcnt avgEq = 0;
+        tRowcnt nDLt = pSample->anDLt[iCol];
+        if( nDLt>idx ){
+          for(i=0, sumEq=0; i<idx; i++) sumEq += pIdx->aSample[i].anEq[iCol];
+          avgEq = (pSample->anLt[iCol] - sumEq)/(nDLt - idx);
+        }
+        if( avgEq==0 ) avgEq = 1;
+        pIdx->aAvgEq[iCol] = avgEq;
       }
-      if( pIdx->avgEq<=0 ) pIdx->avgEq = 1;
     }
 
     pSample->n = sqlite3_column_bytes(pStmt, 4);
index e2bcaafd2cff8d47ed23936ad246ad7fd8bb5fff..19b0d5560d9e3818f1f04be3cf3210fd9f6c1f25 100644 (file)
@@ -1551,7 +1551,7 @@ struct Index {
   unsigned uniqNotNull:1;  /* True if UNIQUE and NOT NULL for all columns */
 #ifdef SQLITE_ENABLE_STAT4
   int nSample;             /* Number of elements in aSample[] */
-  tRowcnt avgEq;           /* Average nEq value for key values not in aSample */
+  tRowcnt *aAvgEq;         /* Average nEq values for keys not in aSample */
   IndexSample *aSample;    /* Samples of the left-most key */
 #endif
 };
index 28568bb0d6234076bc336f0de3dcfcff09a5b549..0a300ca2f45cb9581b1bfe3d1210504d33dfd28f 100644 (file)
@@ -2418,7 +2418,9 @@ static int whereKeyStats(
   IndexSample *aSample = pIdx->aSample;
   int i;
   int isEq = 0;
+  int iCol = pRec->nField-1;
 
+  assert( pRec->nField>0 && iCol<pIdx->nColumn );
   for(i=0; i<pIdx->nSample; i++){
     int res = sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec);
     if( res>=0 ){
@@ -2433,18 +2435,18 @@ static int whereKeyStats(
   */
   if( isEq ){
     assert( i<pIdx->nSample );
-    aStat[0] = aSample[i].anLt[0];
-    aStat[1] = aSample[i].anEq[0];
+    aStat[0] = aSample[i].anLt[iCol];
+    aStat[1] = aSample[i].anEq[iCol];
   }else{
     tRowcnt iLower, iUpper, iGap;
     if( i==0 ){
       iLower = 0;
-      iUpper = aSample[0].anLt[0];
+      iUpper = aSample[0].anLt[iCol];
     }else{
-      iUpper = i>=pIdx->nSample ? pIdx->aiRowEst[0] : aSample[i].anLt[0];
-      iLower = aSample[i-1].anEq[0] + aSample[i-1].anLt[0];
+      iUpper = i>=pIdx->nSample ? pIdx->aiRowEst[0] : aSample[i].anLt[iCol];
+      iLower = aSample[i-1].anEq[iCol] + aSample[i-1].anLt[iCol];
     }
-    aStat[1] = pIdx->avgEq;
+    aStat[1] = pIdx->aAvgEq[iCol];
     if( iLower>=iUpper ){
       iGap = 0;
     }else{
@@ -2628,7 +2630,7 @@ static int whereEqualScanEst(
     return SQLITE_OK;
   }
 
-  aff = p->pTable->aCol[p->aiColumn[0]].affinity;
+  aff = p->pTable->aCol[p->aiColumn[nEq-1]].affinity;
   rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, aff, nEq-1, &bOk);
   pBuilder->pRec = pRec;
   if( rc!=SQLITE_OK ) return rc;
@@ -2643,7 +2645,7 @@ static int whereEqualScanEst(
       *pnRow = pBuilder->nMaxRowcnt;
     }
   }
-
+  
   return rc;
 }
 #endif /* defined(SQLITE_ENABLE_STAT4) */