mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Completely unroll the dimension loop inside of cellArea() in RTREE.
FossilOrigin-Name: 3c4c0126c287f844220b65e00fec17c059fbb7c8
This commit is contained in:
@ -1879,11 +1879,27 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
|
||||
** Return the N-dimensional volumn of the cell stored in *p.
|
||||
*/
|
||||
static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){
|
||||
RtreeDValue area;
|
||||
int ii;
|
||||
area = DCOORD(p->aCoord[1]) - DCOORD(p->aCoord[0]);
|
||||
for(ii=2; ii<pRtree->nDim2; ii+=2){
|
||||
area *= DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]);
|
||||
RtreeDValue area = (RtreeDValue)1;
|
||||
assert( pRtree->nDim>=1 && pRtree->nDim<=5 );
|
||||
#ifndef SQLITE_RTREE_INT_ONLY
|
||||
if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
|
||||
switch( pRtree->nDim ){
|
||||
case 5: area = p->aCoord[9].f - p->aCoord[8].f;
|
||||
case 4: area *= p->aCoord[7].f - p->aCoord[6].f;
|
||||
case 3: area *= p->aCoord[5].f - p->aCoord[4].f;
|
||||
case 2: area *= p->aCoord[3].f - p->aCoord[2].f;
|
||||
default: area *= p->aCoord[1].f - p->aCoord[0].f;
|
||||
}
|
||||
}else
|
||||
#endif
|
||||
{
|
||||
switch( pRtree->nDim ){
|
||||
case 5: area = p->aCoord[9].i - p->aCoord[8].i;
|
||||
case 4: area *= p->aCoord[7].i - p->aCoord[6].i;
|
||||
case 3: area *= p->aCoord[5].i - p->aCoord[4].i;
|
||||
case 2: area *= p->aCoord[3].i - p->aCoord[2].i;
|
||||
default: area *= p->aCoord[1].i - p->aCoord[0].i;
|
||||
}
|
||||
}
|
||||
return area;
|
||||
}
|
||||
|
Reference in New Issue
Block a user