From: dan Date: Wed, 7 Aug 2013 19:46:15 +0000 (+0000) Subject: Replace variable Index.avgEq (average number of rows in keys for which there is no... X-Git-Tag: version-3.8.1~132^2~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=eea568d68e4fefeb4409abfe51a058322549c624;p=thirdparty%2Fsqlite.git Replace variable Index.avgEq (average number of rows in keys for which there is no sample in sqlite_stat4) with vector Index.aAvgEq. FossilOrigin-Name: 7b70b419c43b2c3b2daf11d833a1d60245bfaef5 --- diff --git a/manifest b/manifest index 924a46707c..d23d9a5f36 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 3eba261736..843b9772c2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -08f74c45ecf711a2373af578d44470add9082377 \ No newline at end of file +7b70b419c43b2c3b2daf11d833a1d60245bfaef5 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index a17ff4f1b0..f5fe93ead8 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -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; inSample; 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; iColnColumn; iCol++){ + tRowcnt avgEq = 0; + tRowcnt nDLt = pSample->anDLt[iCol]; + if( nDLt>idx ){ + for(i=0, sumEq=0; iaSample[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); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e2bcaafd2c..19b0d5560d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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 }; diff --git a/src/where.c b/src/where.c index 28568bb0d6..0a300ca2f4 100644 --- a/src/where.c +++ b/src/where.c @@ -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 && iColnColumn ); for(i=0; inSample; i++){ int res = sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec); if( res>=0 ){ @@ -2433,18 +2435,18 @@ static int whereKeyStats( */ if( isEq ){ assert( inSample ); - 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) */