-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
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
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
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
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
-08f74c45ecf711a2373af578d44470add9082377
\ No newline at end of file
+7b70b419c43b2c3b2daf11d833a1d60245bfaef5
\ No newline at end of file
){
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;
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;
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);
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
};
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 ){
*/
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{
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;
*pnRow = pBuilder->nMaxRowcnt;
}
}
-
+
return rc;
}
#endif /* defined(SQLITE_ENABLE_STAT4) */