From: drh Date: Fri, 21 Oct 2016 17:25:47 +0000 (+0000) Subject: Add the btree_sample(INDEX,LOCATION,LIMIT) pragma. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a3c79ae7cd8de1145f3492703c240cb376573d66;p=thirdparty%2Fsqlite.git Add the btree_sample(INDEX,LOCATION,LIMIT) pragma. FossilOrigin-Name: affc2ef5ee3d8885e74051fd508a3d6f8c313857 --- diff --git a/manifest b/manifest index ab3ba2497d..539805fc1c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\sin\sthe\sest_count\spragma\sfor\sindexes\sand\sWITHOUT\sROWID\stables. -D 2016-10-21T15:36:51.551 +C Add\sthe\sbtree_sample(INDEX,LOCATION,LIMIT)\spragma. +D 2016-10-21T17:25:47.070 F Makefile.in 6fd48ffcf7c2deea7499062d1f3747f986c19678 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5151cc64c4c05f3455f4f692ad11410a810d937f @@ -329,7 +329,7 @@ F src/auth.c 930b376a9c56998557367e6f7f8aaeac82a2a792 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 3ee4c8b2c94ed3a7377256e18199e6ff5cf33f63 F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73 -F src/btree.c c58b8a52ad8a74d48835a0471fadec0851d113fb +F src/btree.c 955375bb1537dc16d9b59ad6fcfe31c5a140d1e3 F src/btree.h 012576c1d0000e96ccc785c6fe22b4be8211f0d9 F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5 F src/build.c e22e66fb34e1e50bb7869a510923bfe58db3071a @@ -379,8 +379,8 @@ F src/parse.y 07f68096c97093793ed04d69db8bb75e55c3e00e F src/pcache.c 5ff2a08f76a9c1b22f43eb063b7068fb085465ac F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490 F src/pcache1.c e3967219b2a92b9edcb9324a4ba75009090d3953 -F src/pragma.c e33c2c772e838402ff940eed581992a693a4a91a -F src/pragma.h 30d6559672c6755be452ea5fdf2e9bf32acc69a3 +F src/pragma.c 3ef6e3168ed02ebc8247b3fc0d612b6fc6b0db24 +F src/pragma.h 74d46e32bdc7abb2d01710162ff96cfb483699b6 F src/prepare.c b1140c3d0cf59bc85ace00ce363153041b424b7a F src/printf.c a5f0ca08ddede803c241266abb46356ec748ded1 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 @@ -453,7 +453,7 @@ F src/update.c 8179e699dbd45b92934fd02d3d8e3732e8da8802 F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c F src/util.c 3e2da6101888d073e79ecc6af5e0a2f70fa1e498 F src/vacuum.c 913970b9d86dd6c2b8063ef1af421880f1464ec3 -F src/vdbe.c c07f9a771c82619be14cc5368b19623ed8f3a30d +F src/vdbe.c 55ea5eb95860106a8f665231f8d0c6b55dbf8974 F src/vdbe.h c044be7050ac6bf596eecc6ab159f5dbc020a3b7 F src/vdbeInt.h 0a18713d0a2fec6807d076bd333d9bf3e57530cd F src/vdbeapi.c 8272f9342c39ab8d7eb4b9decc6caa7bc75b7d83 @@ -1464,7 +1464,7 @@ F tool/mkmsvcmin.tcl 2f12f7fa8858bbe61cf81820a2da96c79ed1ca8d F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl a01d2c1d8a6205b03fc635adf3735b4c523befd3 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl bf6417cc44d42c1d024ac7036b59b9a8d4476470 +F tool/mkpragmatab.tcl c5ce5c56a8193196efcd195f09572a073445397f F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl fef88397668ae83166735c41af99d79f56afaabb F tool/mksqlite3c.tcl 06b2e6a0f21cc0a5d70fbbd136b3e0a96470645e @@ -1526,7 +1526,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 340822afbe0c6b47fdd789c56acd9e1058a434cb -R e90ad2ebf1bcb25a55e3e2678b19c035 +P c39fd9b8f11b3f1df489df1df4197fe4a670732c +R 6376d702c2a44655952c143d8109c737 U drh -Z 01c14e3ae29abee9ef7e5b8de3cc1480 +Z a6dc86cd66f951dc83fd16ce4ecf3406 diff --git a/manifest.uuid b/manifest.uuid index b65dc96bc3..87232ebeea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c39fd9b8f11b3f1df489df1df4197fe4a670732c \ No newline at end of file +affc2ef5ee3d8885e74051fd508a3d6f8c313857 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 696e1be98c..07c7eadaad 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5095,8 +5095,10 @@ int sqlite3BtreeMovetoProportional( }else{ perChild = mx/pPage->nCell; rx = x/perChild; + if( rx>=pPage->nCell ) rx = pPage->nCell-1; } pCur->aiIdx[pCur->iPage] = rx; + return SQLITE_OK; } diff --git a/src/pragma.c b/src/pragma.c index b2eedbcf0a..c512d3ba8d 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1430,6 +1430,84 @@ void sqlite3Pragma( } break; + /* + ** PRAGMA btree_sample(,,); + ** + ** Seek in through the first of rows and + ** then begin returning rows, one by one. A max of rows will + ** be returned. + */ + case PragTyp_BTREE_SAMPLE: { + Index *pIdx; + Table *pTab = 0; + Pgno iRoot = 0; + int nCol = 0; + const char *zName = 0; + int iLimit = 10; + int i; + int regResult; + int regLimit; + int addrTop; + int addrJmp; + int addrSkip; + double r; + if( (pIdx = sqlite3FindIndex(db, zRight, zDb))!=0 ){ + iRoot = pIdx->tnum; + zName = pIdx->zName; + nCol = pIdx->nColumn; + }else if( (pTab = sqlite3FindTable(db, zRight, zDb))!=0 ){ + zName = pTab->zName; + if( HasRowid(pTab) ){ + iRoot = pTab->tnum; + nCol = pTab->nCol; + }else{ + pIdx = sqlite3PrimaryKeyIndex(pTab); + iRoot = pIdx->tnum; + nCol = pIdx->nColumn; + } + }else{ + break; + } + sqlite3VdbeSetNumCols(v, nCol); + for(i=0; inId>=2 ){ + const char *z = pValues->a[1].zName; + sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8); + }else{ + r = 0.5; + } + if( r<0.0 ) r = 0.0; + if( r>1.0 ) r = 1.0; + if( pValues->nId>=3 ){ + iLimit = sqlite3Atoi(pValues->a[2].zName); + } + pParse->nTab++; + sqlite3TableLock(pParse, iDb, iRoot, 0, zName); + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3VdbeAddOp4Int(v, OP_OpenRead, 0, iRoot, iDb, nCol); + if( pIdx ) sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + regLimit = ++pParse->nMem; + regResult = pParse->nMem+1; + pParse->nMem += nCol; + sqlite3VdbeAddOp2(v, OP_Integer, iLimit, regLimit); + addrSkip = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_EstRowCnt, 0, regResult, (int)(r*1000000000)); + addrTop = sqlite3VdbeCurrentAddr(v); + for(i=0; iflags = MEM_Real; pOut->u.r = n; + pC->nullRow = 0; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; break; } diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index cc2c3e2630..cac776d668 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -254,6 +254,9 @@ set pragma_def { NAME: est_count FLAG: NeedSchema + NAME: btree_sample + FLAG: NeedSchema + NAME: encoding IF: !defined(SQLITE_OMIT_UTF16)