| Index: third_party/sqlite/sqlite-src-3100200/src/test_rtree.c
|
| diff --git a/third_party/sqlite/src/src/test_rtree.c b/third_party/sqlite/sqlite-src-3100200/src/test_rtree.c
|
| similarity index 91%
|
| copy from third_party/sqlite/src/src/test_rtree.c
|
| copy to third_party/sqlite/sqlite-src-3100200/src/test_rtree.c
|
| index 9d19fa0e2c86657b56dc4c8a22cd37e5485c8cbb..797ec0026c83adf89966182a36e94af76f88ce40 100644
|
| --- a/third_party/sqlite/src/src/test_rtree.c
|
| +++ b/third_party/sqlite/sqlite-src-3100200/src/test_rtree.c
|
| @@ -13,7 +13,7 @@
|
| ** is not included in the SQLite library.
|
| */
|
|
|
| -#include <sqlite3.h>
|
| +#include "sqlite3.h"
|
| #include <tcl.h>
|
|
|
| /* Solely for the UNUSED_PARAMETER() macro. */
|
| @@ -155,6 +155,11 @@ static int circle_geom(
|
| /*
|
| ** Implementation of "circle" r-tree geometry callback using the
|
| ** 2nd-generation interface that allows scoring.
|
| +**
|
| +** Two calling forms:
|
| +**
|
| +** Qcircle(X,Y,Radius,eType) -- All values are doubles
|
| +** Qcircle('x:X y:Y r:R e:ETYPE') -- Single string parameter
|
| */
|
| static int circle_query_func(sqlite3_rtree_query_info *p){
|
| int i; /* Iterator variable */
|
| @@ -176,10 +181,9 @@ static int circle_query_func(sqlite3_rtree_query_info *p){
|
| ** Return an error if the table does not have exactly 2 dimensions. */
|
| if( p->nCoord!=4 ) return SQLITE_ERROR;
|
|
|
| - /* Test that the correct number of parameters (4) have been supplied,
|
| - ** and that the parameters are in range (that the radius of the circle
|
| - ** radius is greater than zero). */
|
| - if( p->nParam!=4 || p->aParam[2]<0.0 ) return SQLITE_ERROR;
|
| + /* Test that the correct number of parameters (1 or 4) have been supplied.
|
| + */
|
| + if( p->nParam!=4 && p->nParam!=1 ) return SQLITE_ERROR;
|
|
|
| /* Allocate a structure to cache parameter data in. Return SQLITE_NOMEM
|
| ** if the allocation fails. */
|
| @@ -191,10 +195,38 @@ static int circle_query_func(sqlite3_rtree_query_info *p){
|
| ** tested bounding boxes that intersect the circular region are detected
|
| ** is by testing if each corner of the bounding box lies within radius
|
| ** units of the center of the circle. */
|
| - pCircle->centerx = p->aParam[0];
|
| - pCircle->centery = p->aParam[1];
|
| - pCircle->radius = p->aParam[2];
|
| - pCircle->eScoreType = (int)p->aParam[3];
|
| + if( p->nParam==4 ){
|
| + pCircle->centerx = p->aParam[0];
|
| + pCircle->centery = p->aParam[1];
|
| + pCircle->radius = p->aParam[2];
|
| + pCircle->eScoreType = (int)p->aParam[3];
|
| + }else{
|
| + const char *z = (const char*)sqlite3_value_text(p->apSqlParam[0]);
|
| + pCircle->centerx = 0.0;
|
| + pCircle->centery = 0.0;
|
| + pCircle->radius = 0.0;
|
| + pCircle->eScoreType = 0;
|
| + while( z && z[0] ){
|
| + if( z[0]=='r' && z[1]==':' ){
|
| + pCircle->radius = atof(&z[2]);
|
| + }else if( z[0]=='x' && z[1]==':' ){
|
| + pCircle->centerx = atof(&z[2]);
|
| + }else if( z[0]=='y' && z[1]==':' ){
|
| + pCircle->centery = atof(&z[2]);
|
| + }else if( z[0]=='e' && z[1]==':' ){
|
| + pCircle->eScoreType = (int)atof(&z[2]);
|
| + }else if( z[0]==' ' ){
|
| + z++;
|
| + continue;
|
| + }
|
| + while( z[0]!=0 && z[0]!=' ' ) z++;
|
| + while( z[0]==' ' ) z++;
|
| + }
|
| + }
|
| + if( pCircle->radius<0.0 ){
|
| + sqlite3_free(pCircle);
|
| + return SQLITE_NOMEM;
|
| + }
|
|
|
| /* Define two bounding box regions. The first, aBox[0], extends to
|
| ** infinity in the X dimension. It covers the same range of the Y dimension
|
|
|