Home | History | Annotate | Download | only in rtree
      1 /*
      2 ** 2001 September 15
      3 **
      4 ** The author disclaims copyright to this source code.  In place of
      5 ** a legal notice, here is a blessing:
      6 **
      7 **    May you do good and not evil.
      8 **    May you find forgiveness for yourself and forgive others.
      9 **    May you share freely, never taking more than you give.
     10 **
     11 *************************************************************************
     12 ** This file contains code for implementations of the r-tree and r*-tree
     13 ** algorithms packaged as an SQLite virtual table module.
     14 */
     15 
     16 /*
     17 ** Database Format of R-Tree Tables
     18 ** --------------------------------
     19 **
     20 ** The data structure for a single virtual r-tree table is stored in three
     21 ** native SQLite tables declared as follows. In each case, the '%' character
     22 ** in the table name is replaced with the user-supplied name of the r-tree
     23 ** table.
     24 **
     25 **   CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data BLOB)
     26 **   CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)
     27 **   CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER)
     28 **
     29 ** The data for each node of the r-tree structure is stored in the %_node
     30 ** table. For each node that is not the root node of the r-tree, there is
     31 ** an entry in the %_parent table associating the node with its parent.
     32 ** And for each row of data in the table, there is an entry in the %_rowid
     33 ** table that maps from the entries rowid to the id of the node that it
     34 ** is stored on.
     35 **
     36 ** The root node of an r-tree always exists, even if the r-tree table is
     37 ** empty. The nodeno of the root node is always 1. All other nodes in the
     38 ** table must be the same size as the root node. The content of each node
     39 ** is formatted as follows:
     40 **
     41 **   1. If the node is the root node (node 1), then the first 2 bytes
     42 **      of the node contain the tree depth as a big-endian integer.
     43 **      For non-root nodes, the first 2 bytes are left unused.
     44 **
     45 **   2. The next 2 bytes contain the number of entries currently
     46 **      stored in the node.
     47 **
     48 **   3. The remainder of the node contains the node entries. Each entry
     49 **      consists of a single 8-byte integer followed by an even number
     50 **      of 4-byte coordinates. For leaf nodes the integer is the rowid
     51 **      of a record. For internal nodes it is the node number of a
     52 **      child page.
     53 */
     54 
     55 #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE)
     56 
     57 /*
     58 ** This file contains an implementation of a couple of different variants
     59 ** of the r-tree algorithm. See the README file for further details. The
     60 ** same data-structure is used for all, but the algorithms for insert and
     61 ** delete operations vary. The variants used are selected at compile time
     62 ** by defining the following symbols:
     63 */
     64 
     65 /* Either, both or none of the following may be set to activate
     66 ** r*tree variant algorithms.
     67 */
     68 #define VARIANT_RSTARTREE_CHOOSESUBTREE 0
     69 #define VARIANT_RSTARTREE_REINSERT      1
     70 
     71 /*
     72 ** Exactly one of the following must be set to 1.
     73 */
     74 #define VARIANT_GUTTMAN_QUADRATIC_SPLIT 0
     75 #define VARIANT_GUTTMAN_LINEAR_SPLIT    0
     76 #define VARIANT_RSTARTREE_SPLIT         1
     77 
     78 #define VARIANT_GUTTMAN_SPLIT \
     79         (VARIANT_GUTTMAN_LINEAR_SPLIT||VARIANT_GUTTMAN_QUADRATIC_SPLIT)
     80 
     81 #if VARIANT_GUTTMAN_QUADRATIC_SPLIT
     82   #define PickNext QuadraticPickNext
     83   #define PickSeeds QuadraticPickSeeds
     84   #define AssignCells splitNodeGuttman
     85 #endif
     86 #if VARIANT_GUTTMAN_LINEAR_SPLIT
     87   #define PickNext LinearPickNext
     88   #define PickSeeds LinearPickSeeds
     89   #define AssignCells splitNodeGuttman
     90 #endif
     91 #if VARIANT_RSTARTREE_SPLIT
     92   #define AssignCells splitNodeStartree
     93 #endif
     94 
     95 #if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
     96 # define NDEBUG 1
     97 #endif
     98 
     99 #ifndef SQLITE_CORE
    100   #include "sqlite3ext.h"
    101   SQLITE_EXTENSION_INIT1
    102 #else
    103   #include "sqlite3.h"
    104 #endif
    105 
    106 #include <string.h>
    107 #include <assert.h>
    108 
    109 #ifndef SQLITE_AMALGAMATION
    110 #include "sqlite3rtree.h"
    111 typedef sqlite3_int64 i64;
    112 typedef unsigned char u8;
    113 typedef unsigned int u32;
    114 #endif
    115 
    116 /*  The following macro is used to suppress compiler warnings.
    117 */
    118 #ifndef UNUSED_PARAMETER
    119 # define UNUSED_PARAMETER(x) (void)(x)
    120 #endif
    121 
    122 typedef struct Rtree Rtree;
    123 typedef struct RtreeCursor RtreeCursor;
    124 typedef struct RtreeNode RtreeNode;
    125 typedef struct RtreeCell RtreeCell;
    126 typedef struct RtreeConstraint RtreeConstraint;
    127 typedef struct RtreeMatchArg RtreeMatchArg;
    128 typedef struct RtreeGeomCallback RtreeGeomCallback;
    129 typedef union RtreeCoord RtreeCoord;
    130 
    131 /* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */
    132 #define RTREE_MAX_DIMENSIONS 5
    133 
    134 /* Size of hash table Rtree.aHash. This hash table is not expected to
    135 ** ever contain very many entries, so a fixed number of buckets is
    136 ** used.
    137 */
    138 #define HASHSIZE 128
    139 
    140 /*
    141 ** An rtree virtual-table object.
    142 */
    143 struct Rtree {
    144   sqlite3_vtab base;
    145   sqlite3 *db;                /* Host database connection */
    146   int iNodeSize;              /* Size in bytes of each node in the node table */
    147   int nDim;                   /* Number of dimensions */
    148   int nBytesPerCell;          /* Bytes consumed per cell */
    149   int iDepth;                 /* Current depth of the r-tree structure */
    150   char *zDb;                  /* Name of database containing r-tree table */
    151   char *zName;                /* Name of r-tree table */
    152   RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */
    153   int nBusy;                  /* Current number of users of this structure */
    154 
    155   /* List of nodes removed during a CondenseTree operation. List is
    156   ** linked together via the pointer normally used for hash chains -
    157   ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree
    158   ** headed by the node (leaf nodes have RtreeNode.iNode==0).
    159   */
    160   RtreeNode *pDeleted;
    161   int iReinsertHeight;        /* Height of sub-trees Reinsert() has run on */
    162 
    163   /* Statements to read/write/delete a record from xxx_node */
    164   sqlite3_stmt *pReadNode;
    165   sqlite3_stmt *pWriteNode;
    166   sqlite3_stmt *pDeleteNode;
    167 
    168   /* Statements to read/write/delete a record from xxx_rowid */
    169   sqlite3_stmt *pReadRowid;
    170   sqlite3_stmt *pWriteRowid;
    171   sqlite3_stmt *pDeleteRowid;
    172 
    173   /* Statements to read/write/delete a record from xxx_parent */
    174   sqlite3_stmt *pReadParent;
    175   sqlite3_stmt *pWriteParent;
    176   sqlite3_stmt *pDeleteParent;
    177 
    178   int eCoordType;
    179 };
    180 
    181 /* Possible values for eCoordType: */
    182 #define RTREE_COORD_REAL32 0
    183 #define RTREE_COORD_INT32  1
    184 
    185 /*
    186 ** The minimum number of cells allowed for a node is a third of the
    187 ** maximum. In Gutman's notation:
    188 **
    189 **     m = M/3
    190 **
    191 ** If an R*-tree "Reinsert" operation is required, the same number of
    192 ** cells are removed from the overfull node and reinserted into the tree.
    193 */
    194 #define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3)
    195 #define RTREE_REINSERT(p) RTREE_MINCELLS(p)
    196 #define RTREE_MAXCELLS 51
    197 
    198 /*
    199 ** The smallest possible node-size is (512-64)==448 bytes. And the largest
    200 ** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates).
    201 ** Therefore all non-root nodes must contain at least 3 entries. Since
    202 ** 2^40 is greater than 2^64, an r-tree structure always has a depth of
    203 ** 40 or less.
    204 */
    205 #define RTREE_MAX_DEPTH 40
    206 
    207 /*
    208 ** An rtree cursor object.
    209 */
    210 struct RtreeCursor {
    211   sqlite3_vtab_cursor base;
    212   RtreeNode *pNode;                 /* Node cursor is currently pointing at */
    213   int iCell;                        /* Index of current cell in pNode */
    214   int iStrategy;                    /* Copy of idxNum search parameter */
    215   int nConstraint;                  /* Number of entries in aConstraint */
    216   RtreeConstraint *aConstraint;     /* Search constraints. */
    217 };
    218 
    219 union RtreeCoord {
    220   float f;
    221   int i;
    222 };
    223 
    224 /*
    225 ** The argument is an RtreeCoord. Return the value stored within the RtreeCoord
    226 ** formatted as a double. This macro assumes that local variable pRtree points
    227 ** to the Rtree structure associated with the RtreeCoord.
    228 */
    229 #define DCOORD(coord) (                           \
    230   (pRtree->eCoordType==RTREE_COORD_REAL32) ?      \
    231     ((double)coord.f) :                           \
    232     ((double)coord.i)                             \
    233 )
    234 
    235 /*
    236 ** A search constraint.
    237 */
    238 struct RtreeConstraint {
    239   int iCoord;                     /* Index of constrained coordinate */
    240   int op;                         /* Constraining operation */
    241   double rValue;                  /* Constraint value. */
    242   int (*xGeom)(sqlite3_rtree_geometry *, int, double *, int *);
    243   sqlite3_rtree_geometry *pGeom;  /* Constraint callback argument for a MATCH */
    244 };
    245 
    246 /* Possible values for RtreeConstraint.op */
    247 #define RTREE_EQ    0x41
    248 #define RTREE_LE    0x42
    249 #define RTREE_LT    0x43
    250 #define RTREE_GE    0x44
    251 #define RTREE_GT    0x45
    252 #define RTREE_MATCH 0x46
    253 
    254 /*
    255 ** An rtree structure node.
    256 */
    257 struct RtreeNode {
    258   RtreeNode *pParent;               /* Parent node */
    259   i64 iNode;
    260   int nRef;
    261   int isDirty;
    262   u8 *zData;
    263   RtreeNode *pNext;                 /* Next node in this hash chain */
    264 };
    265 #define NCELL(pNode) readInt16(&(pNode)->zData[2])
    266 
    267 /*
    268 ** Structure to store a deserialized rtree record.
    269 */
    270 struct RtreeCell {
    271   i64 iRowid;
    272   RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2];
    273 };
    274 
    275 
    276 /*
    277 ** Value for the first field of every RtreeMatchArg object. The MATCH
    278 ** operator tests that the first field of a blob operand matches this
    279 ** value to avoid operating on invalid blobs (which could cause a segfault).
    280 */
    281 #define RTREE_GEOMETRY_MAGIC 0x891245AB
    282 
    283 /*
    284 ** An instance of this structure must be supplied as a blob argument to
    285 ** the right-hand-side of an SQL MATCH operator used to constrain an
    286 ** r-tree query.
    287 */
    288 struct RtreeMatchArg {
    289   u32 magic;                      /* Always RTREE_GEOMETRY_MAGIC */
    290   int (*xGeom)(sqlite3_rtree_geometry *, int, double *, int *);
    291   void *pContext;
    292   int nParam;
    293   double aParam[1];
    294 };
    295 
    296 /*
    297 ** When a geometry callback is created (see sqlite3_rtree_geometry_callback),
    298 ** a single instance of the following structure is allocated. It is used
    299 ** as the context for the user-function created by by s_r_g_c(). The object
    300 ** is eventually deleted by the destructor mechanism provided by
    301 ** sqlite3_create_function_v2() (which is called by s_r_g_c() to create
    302 ** the geometry callback function).
    303 */
    304 struct RtreeGeomCallback {
    305   int (*xGeom)(sqlite3_rtree_geometry *, int, double *, int *);
    306   void *pContext;
    307 };
    308 
    309 #ifndef MAX
    310 # define MAX(x,y) ((x) < (y) ? (y) : (x))
    311 #endif
    312 #ifndef MIN
    313 # define MIN(x,y) ((x) > (y) ? (y) : (x))
    314 #endif
    315 
    316 /*
    317 ** Functions to deserialize a 16 bit integer, 32 bit real number and
    318 ** 64 bit integer. The deserialized value is returned.
    319 */
    320 static int readInt16(u8 *p){
    321   return (p[0]<<8) + p[1];
    322 }
    323 static void readCoord(u8 *p, RtreeCoord *pCoord){
    324   u32 i = (
    325     (((u32)p[0]) << 24) +
    326     (((u32)p[1]) << 16) +
    327     (((u32)p[2]) <<  8) +
    328     (((u32)p[3]) <<  0)
    329   );
    330   *(u32 *)pCoord = i;
    331 }
    332 static i64 readInt64(u8 *p){
    333   return (
    334     (((i64)p[0]) << 56) +
    335     (((i64)p[1]) << 48) +
    336     (((i64)p[2]) << 40) +
    337     (((i64)p[3]) << 32) +
    338     (((i64)p[4]) << 24) +
    339     (((i64)p[5]) << 16) +
    340     (((i64)p[6]) <<  8) +
    341     (((i64)p[7]) <<  0)
    342   );
    343 }
    344 
    345 /*
    346 ** Functions to serialize a 16 bit integer, 32 bit real number and
    347 ** 64 bit integer. The value returned is the number of bytes written
    348 ** to the argument buffer (always 2, 4 and 8 respectively).
    349 */
    350 static int writeInt16(u8 *p, int i){
    351   p[0] = (i>> 8)&0xFF;
    352   p[1] = (i>> 0)&0xFF;
    353   return 2;
    354 }
    355 static int writeCoord(u8 *p, RtreeCoord *pCoord){
    356   u32 i;
    357   assert( sizeof(RtreeCoord)==4 );
    358   assert( sizeof(u32)==4 );
    359   i = *(u32 *)pCoord;
    360   p[0] = (i>>24)&0xFF;
    361   p[1] = (i>>16)&0xFF;
    362   p[2] = (i>> 8)&0xFF;
    363   p[3] = (i>> 0)&0xFF;
    364   return 4;
    365 }
    366 static int writeInt64(u8 *p, i64 i){
    367   p[0] = (i>>56)&0xFF;
    368   p[1] = (i>>48)&0xFF;
    369   p[2] = (i>>40)&0xFF;
    370   p[3] = (i>>32)&0xFF;
    371   p[4] = (i>>24)&0xFF;
    372   p[5] = (i>>16)&0xFF;
    373   p[6] = (i>> 8)&0xFF;
    374   p[7] = (i>> 0)&0xFF;
    375   return 8;
    376 }
    377 
    378 /*
    379 ** Increment the reference count of node p.
    380 */
    381 static void nodeReference(RtreeNode *p){
    382   if( p ){
    383     p->nRef++;
    384   }
    385 }
    386 
    387 /*
    388 ** Clear the content of node p (set all bytes to 0x00).
    389 */
    390 static void nodeZero(Rtree *pRtree, RtreeNode *p){
    391   memset(&p->zData[2], 0, pRtree->iNodeSize-2);
    392   p->isDirty = 1;
    393 }
    394 
    395 /*
    396 ** Given a node number iNode, return the corresponding key to use
    397 ** in the Rtree.aHash table.
    398 */
    399 static int nodeHash(i64 iNode){
    400   return (
    401     (iNode>>56) ^ (iNode>>48) ^ (iNode>>40) ^ (iNode>>32) ^
    402     (iNode>>24) ^ (iNode>>16) ^ (iNode>> 8) ^ (iNode>> 0)
    403   ) % HASHSIZE;
    404 }
    405 
    406 /*
    407 ** Search the node hash table for node iNode. If found, return a pointer
    408 ** to it. Otherwise, return 0.
    409 */
    410 static RtreeNode *nodeHashLookup(Rtree *pRtree, i64 iNode){
    411   RtreeNode *p;
    412   for(p=pRtree->aHash[nodeHash(iNode)]; p && p->iNode!=iNode; p=p->pNext);
    413   return p;
    414 }
    415 
    416 /*
    417 ** Add node pNode to the node hash table.
    418 */
    419 static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){
    420   int iHash;
    421   assert( pNode->pNext==0 );
    422   iHash = nodeHash(pNode->iNode);
    423   pNode->pNext = pRtree->aHash[iHash];
    424   pRtree->aHash[iHash] = pNode;
    425 }
    426 
    427 /*
    428 ** Remove node pNode from the node hash table.
    429 */
    430 static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){
    431   RtreeNode **pp;
    432   if( pNode->iNode!=0 ){
    433     pp = &pRtree->aHash[nodeHash(pNode->iNode)];
    434     for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); }
    435     *pp = pNode->pNext;
    436     pNode->pNext = 0;
    437   }
    438 }
    439 
    440 /*
    441 ** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0),
    442 ** indicating that node has not yet been assigned a node number. It is
    443 ** assigned a node number when nodeWrite() is called to write the
    444 ** node contents out to the database.
    445 */
    446 static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){
    447   RtreeNode *pNode;
    448   pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize);
    449   if( pNode ){
    450     memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize);
    451     pNode->zData = (u8 *)&pNode[1];
    452     pNode->nRef = 1;
    453     pNode->pParent = pParent;
    454     pNode->isDirty = 1;
    455     nodeReference(pParent);
    456   }
    457   return pNode;
    458 }
    459 
    460 /*
    461 ** Obtain a reference to an r-tree node.
    462 */
    463 static int
    464 nodeAcquire(
    465   Rtree *pRtree,             /* R-tree structure */
    466   i64 iNode,                 /* Node number to load */
    467   RtreeNode *pParent,        /* Either the parent node or NULL */
    468   RtreeNode **ppNode         /* OUT: Acquired node */
    469 ){
    470   int rc;
    471   int rc2 = SQLITE_OK;
    472   RtreeNode *pNode;
    473 
    474   /* Check if the requested node is already in the hash table. If so,
    475   ** increase its reference count and return it.
    476   */
    477   if( (pNode = nodeHashLookup(pRtree, iNode)) ){
    478     assert( !pParent || !pNode->pParent || pNode->pParent==pParent );
    479     if( pParent && !pNode->pParent ){
    480       nodeReference(pParent);
    481       pNode->pParent = pParent;
    482     }
    483     pNode->nRef++;
    484     *ppNode = pNode;
    485     return SQLITE_OK;
    486   }
    487 
    488   sqlite3_bind_int64(pRtree->pReadNode, 1, iNode);
    489   rc = sqlite3_step(pRtree->pReadNode);
    490   if( rc==SQLITE_ROW ){
    491     const u8 *zBlob = sqlite3_column_blob(pRtree->pReadNode, 0);
    492     if( pRtree->iNodeSize==sqlite3_column_bytes(pRtree->pReadNode, 0) ){
    493       pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize);
    494       if( !pNode ){
    495         rc2 = SQLITE_NOMEM;
    496       }else{
    497         pNode->pParent = pParent;
    498         pNode->zData = (u8 *)&pNode[1];
    499         pNode->nRef = 1;
    500         pNode->iNode = iNode;
    501         pNode->isDirty = 0;
    502         pNode->pNext = 0;
    503         memcpy(pNode->zData, zBlob, pRtree->iNodeSize);
    504         nodeReference(pParent);
    505       }
    506     }
    507   }
    508   rc = sqlite3_reset(pRtree->pReadNode);
    509   if( rc==SQLITE_OK ) rc = rc2;
    510 
    511   /* If the root node was just loaded, set pRtree->iDepth to the height
    512   ** of the r-tree structure. A height of zero means all data is stored on
    513   ** the root node. A height of one means the children of the root node
    514   ** are the leaves, and so on. If the depth as specified on the root node
    515   ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
    516   */
    517   if( pNode && iNode==1 ){
    518     pRtree->iDepth = readInt16(pNode->zData);
    519     if( pRtree->iDepth>RTREE_MAX_DEPTH ){
    520       rc = SQLITE_CORRUPT;
    521     }
    522   }
    523 
    524   /* If no error has occurred so far, check if the "number of entries"
    525   ** field on the node is too large. If so, set the return code to
    526   ** SQLITE_CORRUPT.
    527   */
    528   if( pNode && rc==SQLITE_OK ){
    529     if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){
    530       rc = SQLITE_CORRUPT;
    531     }
    532   }
    533 
    534   if( rc==SQLITE_OK ){
    535     if( pNode!=0 ){
    536       nodeHashInsert(pRtree, pNode);
    537     }else{
    538       rc = SQLITE_CORRUPT;
    539     }
    540     *ppNode = pNode;
    541   }else{
    542     sqlite3_free(pNode);
    543     *ppNode = 0;
    544   }
    545 
    546   return rc;
    547 }
    548 
    549 /*
    550 ** Overwrite cell iCell of node pNode with the contents of pCell.
    551 */
    552 static void nodeOverwriteCell(
    553   Rtree *pRtree,
    554   RtreeNode *pNode,
    555   RtreeCell *pCell,
    556   int iCell
    557 ){
    558   int ii;
    559   u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
    560   p += writeInt64(p, pCell->iRowid);
    561   for(ii=0; ii<(pRtree->nDim*2); ii++){
    562     p += writeCoord(p, &pCell->aCoord[ii]);
    563   }
    564   pNode->isDirty = 1;
    565 }
    566 
    567 /*
    568 ** Remove cell the cell with index iCell from node pNode.
    569 */
    570 static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){
    571   u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
    572   u8 *pSrc = &pDst[pRtree->nBytesPerCell];
    573   int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell;
    574   memmove(pDst, pSrc, nByte);
    575   writeInt16(&pNode->zData[2], NCELL(pNode)-1);
    576   pNode->isDirty = 1;
    577 }
    578 
    579 /*
    580 ** Insert the contents of cell pCell into node pNode. If the insert
    581 ** is successful, return SQLITE_OK.
    582 **
    583 ** If there is not enough free space in pNode, return SQLITE_FULL.
    584 */
    585 static int
    586 nodeInsertCell(
    587   Rtree *pRtree,
    588   RtreeNode *pNode,
    589   RtreeCell *pCell
    590 ){
    591   int nCell;                    /* Current number of cells in pNode */
    592   int nMaxCell;                 /* Maximum number of cells for pNode */
    593 
    594   nMaxCell = (pRtree->iNodeSize-4)/pRtree->nBytesPerCell;
    595   nCell = NCELL(pNode);
    596 
    597   assert( nCell<=nMaxCell );
    598   if( nCell<nMaxCell ){
    599     nodeOverwriteCell(pRtree, pNode, pCell, nCell);
    600     writeInt16(&pNode->zData[2], nCell+1);
    601     pNode->isDirty = 1;
    602   }
    603 
    604   return (nCell==nMaxCell);
    605 }
    606 
    607 /*
    608 ** If the node is dirty, write it out to the database.
    609 */
    610 static int
    611 nodeWrite(Rtree *pRtree, RtreeNode *pNode){
    612   int rc = SQLITE_OK;
    613   if( pNode->isDirty ){
    614     sqlite3_stmt *p = pRtree->pWriteNode;
    615     if( pNode->iNode ){
    616       sqlite3_bind_int64(p, 1, pNode->iNode);
    617     }else{
    618       sqlite3_bind_null(p, 1);
    619     }
    620     sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC);
    621     sqlite3_step(p);
    622     pNode->isDirty = 0;
    623     rc = sqlite3_reset(p);
    624     if( pNode->iNode==0 && rc==SQLITE_OK ){
    625       pNode->iNode = sqlite3_last_insert_rowid(pRtree->db);
    626       nodeHashInsert(pRtree, pNode);
    627     }
    628   }
    629   return rc;
    630 }
    631 
    632 /*
    633 ** Release a reference to a node. If the node is dirty and the reference
    634 ** count drops to zero, the node data is written to the database.
    635 */
    636 static int
    637 nodeRelease(Rtree *pRtree, RtreeNode *pNode){
    638   int rc = SQLITE_OK;
    639   if( pNode ){
    640     assert( pNode->nRef>0 );
    641     pNode->nRef--;
    642     if( pNode->nRef==0 ){
    643       if( pNode->iNode==1 ){
    644         pRtree->iDepth = -1;
    645       }
    646       if( pNode->pParent ){
    647         rc = nodeRelease(pRtree, pNode->pParent);
    648       }
    649       if( rc==SQLITE_OK ){
    650         rc = nodeWrite(pRtree, pNode);
    651       }
    652       nodeHashDelete(pRtree, pNode);
    653       sqlite3_free(pNode);
    654     }
    655   }
    656   return rc;
    657 }
    658 
    659 /*
    660 ** Return the 64-bit integer value associated with cell iCell of
    661 ** node pNode. If pNode is a leaf node, this is a rowid. If it is
    662 ** an internal node, then the 64-bit integer is a child page number.
    663 */
    664 static i64 nodeGetRowid(
    665   Rtree *pRtree,
    666   RtreeNode *pNode,
    667   int iCell
    668 ){
    669   assert( iCell<NCELL(pNode) );
    670   return readInt64(&pNode->zData[4 + pRtree->nBytesPerCell*iCell]);
    671 }
    672 
    673 /*
    674 ** Return coordinate iCoord from cell iCell in node pNode.
    675 */
    676 static void nodeGetCoord(
    677   Rtree *pRtree,
    678   RtreeNode *pNode,
    679   int iCell,
    680   int iCoord,
    681   RtreeCoord *pCoord           /* Space to write result to */
    682 ){
    683   readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord);
    684 }
    685 
    686 /*
    687 ** Deserialize cell iCell of node pNode. Populate the structure pointed
    688 ** to by pCell with the results.
    689 */
    690 static void nodeGetCell(
    691   Rtree *pRtree,
    692   RtreeNode *pNode,
    693   int iCell,
    694   RtreeCell *pCell
    695 ){
    696   int ii;
    697   pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell);
    698   for(ii=0; ii<pRtree->nDim*2; ii++){
    699     nodeGetCoord(pRtree, pNode, iCell, ii, &pCell->aCoord[ii]);
    700   }
    701 }
    702 
    703 
    704 /* Forward declaration for the function that does the work of
    705 ** the virtual table module xCreate() and xConnect() methods.
    706 */
    707 static int rtreeInit(
    708   sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int
    709 );
    710 
    711 /*
    712 ** Rtree virtual table module xCreate method.
    713 */
    714 static int rtreeCreate(
    715   sqlite3 *db,
    716   void *pAux,
    717   int argc, const char *const*argv,
    718   sqlite3_vtab **ppVtab,
    719   char **pzErr
    720 ){
    721   return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1);
    722 }
    723 
    724 /*
    725 ** Rtree virtual table module xConnect method.
    726 */
    727 static int rtreeConnect(
    728   sqlite3 *db,
    729   void *pAux,
    730   int argc, const char *const*argv,
    731   sqlite3_vtab **ppVtab,
    732   char **pzErr
    733 ){
    734   return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 0);
    735 }
    736 
    737 /*
    738 ** Increment the r-tree reference count.
    739 */
    740 static void rtreeReference(Rtree *pRtree){
    741   pRtree->nBusy++;
    742 }
    743 
    744 /*
    745 ** Decrement the r-tree reference count. When the reference count reaches
    746 ** zero the structure is deleted.
    747 */
    748 static void rtreeRelease(Rtree *pRtree){
    749   pRtree->nBusy--;
    750   if( pRtree->nBusy==0 ){
    751     sqlite3_finalize(pRtree->pReadNode);
    752     sqlite3_finalize(pRtree->pWriteNode);
    753     sqlite3_finalize(pRtree->pDeleteNode);
    754     sqlite3_finalize(pRtree->pReadRowid);
    755     sqlite3_finalize(pRtree->pWriteRowid);
    756     sqlite3_finalize(pRtree->pDeleteRowid);
    757     sqlite3_finalize(pRtree->pReadParent);
    758     sqlite3_finalize(pRtree->pWriteParent);
    759     sqlite3_finalize(pRtree->pDeleteParent);
    760     sqlite3_free(pRtree);
    761   }
    762 }
    763 
    764 /*
    765 ** Rtree virtual table module xDisconnect method.
    766 */
    767 static int rtreeDisconnect(sqlite3_vtab *pVtab){
    768   rtreeRelease((Rtree *)pVtab);
    769   return SQLITE_OK;
    770 }
    771 
    772 /*
    773 ** Rtree virtual table module xDestroy method.
    774 */
    775 static int rtreeDestroy(sqlite3_vtab *pVtab){
    776   Rtree *pRtree = (Rtree *)pVtab;
    777   int rc;
    778   char *zCreate = sqlite3_mprintf(
    779     "DROP TABLE '%q'.'%q_node';"
    780     "DROP TABLE '%q'.'%q_rowid';"
    781     "DROP TABLE '%q'.'%q_parent';",
    782     pRtree->zDb, pRtree->zName,
    783     pRtree->zDb, pRtree->zName,
    784     pRtree->zDb, pRtree->zName
    785   );
    786   if( !zCreate ){
    787     rc = SQLITE_NOMEM;
    788   }else{
    789     rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0);
    790     sqlite3_free(zCreate);
    791   }
    792   if( rc==SQLITE_OK ){
    793     rtreeRelease(pRtree);
    794   }
    795 
    796   return rc;
    797 }
    798 
    799 /*
    800 ** Rtree virtual table module xOpen method.
    801 */
    802 static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
    803   int rc = SQLITE_NOMEM;
    804   RtreeCursor *pCsr;
    805 
    806   pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor));
    807   if( pCsr ){
    808     memset(pCsr, 0, sizeof(RtreeCursor));
    809     pCsr->base.pVtab = pVTab;
    810     rc = SQLITE_OK;
    811   }
    812   *ppCursor = (sqlite3_vtab_cursor *)pCsr;
    813 
    814   return rc;
    815 }
    816 
    817 
    818 /*
    819 ** Free the RtreeCursor.aConstraint[] array and its contents.
    820 */
    821 static void freeCursorConstraints(RtreeCursor *pCsr){
    822   if( pCsr->aConstraint ){
    823     int i;                        /* Used to iterate through constraint array */
    824     for(i=0; i<pCsr->nConstraint; i++){
    825       sqlite3_rtree_geometry *pGeom = pCsr->aConstraint[i].pGeom;
    826       if( pGeom ){
    827         if( pGeom->xDelUser ) pGeom->xDelUser(pGeom->pUser);
    828         sqlite3_free(pGeom);
    829       }
    830     }
    831     sqlite3_free(pCsr->aConstraint);
    832     pCsr->aConstraint = 0;
    833   }
    834 }
    835 
    836 /*
    837 ** Rtree virtual table module xClose method.
    838 */
    839 static int rtreeClose(sqlite3_vtab_cursor *cur){
    840   Rtree *pRtree = (Rtree *)(cur->pVtab);
    841   int rc;
    842   RtreeCursor *pCsr = (RtreeCursor *)cur;
    843   freeCursorConstraints(pCsr);
    844   rc = nodeRelease(pRtree, pCsr->pNode);
    845   sqlite3_free(pCsr);
    846   return rc;
    847 }
    848 
    849 /*
    850 ** Rtree virtual table module xEof method.
    851 **
    852 ** Return non-zero if the cursor does not currently point to a valid
    853 ** record (i.e if the scan has finished), or zero otherwise.
    854 */
    855 static int rtreeEof(sqlite3_vtab_cursor *cur){
    856   RtreeCursor *pCsr = (RtreeCursor *)cur;
    857   return (pCsr->pNode==0);
    858 }
    859 
    860 /*
    861 ** The r-tree constraint passed as the second argument to this function is
    862 ** guaranteed to be a MATCH constraint.
    863 */
    864 static int testRtreeGeom(
    865   Rtree *pRtree,                  /* R-Tree object */
    866   RtreeConstraint *pConstraint,   /* MATCH constraint to test */
    867   RtreeCell *pCell,               /* Cell to test */
    868   int *pbRes                      /* OUT: Test result */
    869 ){
    870   int i;
    871   double aCoord[RTREE_MAX_DIMENSIONS*2];
    872   int nCoord = pRtree->nDim*2;
    873 
    874   assert( pConstraint->op==RTREE_MATCH );
    875   assert( pConstraint->pGeom );
    876 
    877   for(i=0; i<nCoord; i++){
    878     aCoord[i] = DCOORD(pCell->aCoord[i]);
    879   }
    880   return pConstraint->xGeom(pConstraint->pGeom, nCoord, aCoord, pbRes);
    881 }
    882 
    883 /*
    884 ** Cursor pCursor currently points to a cell in a non-leaf page.
    885 ** Set *pbEof to true if the sub-tree headed by the cell is filtered
    886 ** (excluded) by the constraints in the pCursor->aConstraint[]
    887 ** array, or false otherwise.
    888 **
    889 ** Return SQLITE_OK if successful or an SQLite error code if an error
    890 ** occurs within a geometry callback.
    891 */
    892 static int testRtreeCell(Rtree *pRtree, RtreeCursor *pCursor, int *pbEof){
    893   RtreeCell cell;
    894   int ii;
    895   int bRes = 0;
    896   int rc = SQLITE_OK;
    897 
    898   nodeGetCell(pRtree, pCursor->pNode, pCursor->iCell, &cell);
    899   for(ii=0; bRes==0 && ii<pCursor->nConstraint; ii++){
    900     RtreeConstraint *p = &pCursor->aConstraint[ii];
    901     double cell_min = DCOORD(cell.aCoord[(p->iCoord>>1)*2]);
    902     double cell_max = DCOORD(cell.aCoord[(p->iCoord>>1)*2+1]);
    903 
    904     assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE
    905         || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_MATCH
    906     );
    907 
    908     switch( p->op ){
    909       case RTREE_LE: case RTREE_LT:
    910         bRes = p->rValue<cell_min;
    911         break;
    912 
    913       case RTREE_GE: case RTREE_GT:
    914         bRes = p->rValue>cell_max;
    915         break;
    916 
    917       case RTREE_EQ:
    918         bRes = (p->rValue>cell_max || p->rValue<cell_min);
    919         break;
    920 
    921       default: {
    922         assert( p->op==RTREE_MATCH );
    923         rc = testRtreeGeom(pRtree, p, &cell, &bRes);
    924         bRes = !bRes;
    925         break;
    926       }
    927     }
    928   }
    929 
    930   *pbEof = bRes;
    931   return rc;
    932 }
    933 
    934 /*
    935 ** Test if the cell that cursor pCursor currently points to
    936 ** would be filtered (excluded) by the constraints in the
    937 ** pCursor->aConstraint[] array. If so, set *pbEof to true before
    938 ** returning. If the cell is not filtered (excluded) by the constraints,
    939 ** set pbEof to zero.
    940 **
    941 ** Return SQLITE_OK if successful or an SQLite error code if an error
    942 ** occurs within a geometry callback.
    943 **
    944 ** This function assumes that the cell is part of a leaf node.
    945 */
    946 static int testRtreeEntry(Rtree *pRtree, RtreeCursor *pCursor, int *pbEof){
    947   RtreeCell cell;
    948   int ii;
    949   *pbEof = 0;
    950 
    951   nodeGetCell(pRtree, pCursor->pNode, pCursor->iCell, &cell);
    952   for(ii=0; ii<pCursor->nConstraint; ii++){
    953     RtreeConstraint *p = &pCursor->aConstraint[ii];
    954     double coord = DCOORD(cell.aCoord[p->iCoord]);
    955     int res;
    956     assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE
    957         || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_MATCH
    958     );
    959     switch( p->op ){
    960       case RTREE_LE: res = (coord<=p->rValue); break;
    961       case RTREE_LT: res = (coord<p->rValue);  break;
    962       case RTREE_GE: res = (coord>=p->rValue); break;
    963       case RTREE_GT: res = (coord>p->rValue);  break;
    964       case RTREE_EQ: res = (coord==p->rValue); break;
    965       default: {
    966         int rc;
    967         assert( p->op==RTREE_MATCH );
    968         rc = testRtreeGeom(pRtree, p, &cell, &res);
    969         if( rc!=SQLITE_OK ){
    970           return rc;
    971         }
    972         break;
    973       }
    974     }
    975 
    976     if( !res ){
    977       *pbEof = 1;
    978       return SQLITE_OK;
    979     }
    980   }
    981 
    982   return SQLITE_OK;
    983 }
    984 
    985 /*
    986 ** Cursor pCursor currently points at a node that heads a sub-tree of
    987 ** height iHeight (if iHeight==0, then the node is a leaf). Descend
    988 ** to point to the left-most cell of the sub-tree that matches the
    989 ** configured constraints.
    990 */
    991 static int descendToCell(
    992   Rtree *pRtree,
    993   RtreeCursor *pCursor,
    994   int iHeight,
    995   int *pEof                 /* OUT: Set to true if cannot descend */
    996 ){
    997   int isEof;
    998   int rc;
    999   int ii;
   1000   RtreeNode *pChild;
   1001   sqlite3_int64 iRowid;
   1002 
   1003   RtreeNode *pSavedNode = pCursor->pNode;
   1004   int iSavedCell = pCursor->iCell;
   1005 
   1006   assert( iHeight>=0 );
   1007 
   1008   if( iHeight==0 ){
   1009     rc = testRtreeEntry(pRtree, pCursor, &isEof);
   1010   }else{
   1011     rc = testRtreeCell(pRtree, pCursor, &isEof);
   1012   }
   1013   if( rc!=SQLITE_OK || isEof || iHeight==0 ){
   1014     goto descend_to_cell_out;
   1015   }
   1016 
   1017   iRowid = nodeGetRowid(pRtree, pCursor->pNode, pCursor->iCell);
   1018   rc = nodeAcquire(pRtree, iRowid, pCursor->pNode, &pChild);
   1019   if( rc!=SQLITE_OK ){
   1020     goto descend_to_cell_out;
   1021   }
   1022 
   1023   nodeRelease(pRtree, pCursor->pNode);
   1024   pCursor->pNode = pChild;
   1025   isEof = 1;
   1026   for(ii=0; isEof && ii<NCELL(pChild); ii++){
   1027     pCursor->iCell = ii;
   1028     rc = descendToCell(pRtree, pCursor, iHeight-1, &isEof);
   1029     if( rc!=SQLITE_OK ){
   1030       goto descend_to_cell_out;
   1031     }
   1032   }
   1033 
   1034   if( isEof ){
   1035     assert( pCursor->pNode==pChild );
   1036     nodeReference(pSavedNode);
   1037     nodeRelease(pRtree, pChild);
   1038     pCursor->pNode = pSavedNode;
   1039     pCursor->iCell = iSavedCell;
   1040   }
   1041 
   1042 descend_to_cell_out:
   1043   *pEof = isEof;
   1044   return rc;
   1045 }
   1046 
   1047 /*
   1048 ** One of the cells in node pNode is guaranteed to have a 64-bit
   1049 ** integer value equal to iRowid. Return the index of this cell.
   1050 */
   1051 static int nodeRowidIndex(
   1052   Rtree *pRtree,
   1053   RtreeNode *pNode,
   1054   i64 iRowid,
   1055   int *piIndex
   1056 ){
   1057   int ii;
   1058   int nCell = NCELL(pNode);
   1059   for(ii=0; ii<nCell; ii++){
   1060     if( nodeGetRowid(pRtree, pNode, ii)==iRowid ){
   1061       *piIndex = ii;
   1062       return SQLITE_OK;
   1063     }
   1064   }
   1065   return SQLITE_CORRUPT;
   1066 }
   1067 
   1068 /*
   1069 ** Return the index of the cell containing a pointer to node pNode
   1070 ** in its parent. If pNode is the root node, return -1.
   1071 */
   1072 static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode, int *piIndex){
   1073   RtreeNode *pParent = pNode->pParent;
   1074   if( pParent ){
   1075     return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex);
   1076   }
   1077   *piIndex = -1;
   1078   return SQLITE_OK;
   1079 }
   1080 
   1081 /*
   1082 ** Rtree virtual table module xNext method.
   1083 */
   1084 static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){
   1085   Rtree *pRtree = (Rtree *)(pVtabCursor->pVtab);
   1086   RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
   1087   int rc = SQLITE_OK;
   1088 
   1089   /* RtreeCursor.pNode must not be NULL. If is is NULL, then this cursor is
   1090   ** already at EOF. It is against the rules to call the xNext() method of
   1091   ** a cursor that has already reached EOF.
   1092   */
   1093   assert( pCsr->pNode );
   1094 
   1095   if( pCsr->iStrategy==1 ){
   1096     /* This "scan" is a direct lookup by rowid. There is no next entry. */
   1097     nodeRelease(pRtree, pCsr->pNode);
   1098     pCsr->pNode = 0;
   1099   }else{
   1100     /* Move to the next entry that matches the configured constraints. */
   1101     int iHeight = 0;
   1102     while( pCsr->pNode ){
   1103       RtreeNode *pNode = pCsr->pNode;
   1104       int nCell = NCELL(pNode);
   1105       for(pCsr->iCell++; pCsr->iCell<nCell; pCsr->iCell++){
   1106         int isEof;
   1107         rc = descendToCell(pRtree, pCsr, iHeight, &isEof);
   1108         if( rc!=SQLITE_OK || !isEof ){
   1109           return rc;
   1110         }
   1111       }
   1112       pCsr->pNode = pNode->pParent;
   1113       rc = nodeParentIndex(pRtree, pNode, &pCsr->iCell);
   1114       if( rc!=SQLITE_OK ){
   1115         return rc;
   1116       }
   1117       nodeReference(pCsr->pNode);
   1118       nodeRelease(pRtree, pNode);
   1119       iHeight++;
   1120     }
   1121   }
   1122 
   1123   return rc;
   1124 }
   1125 
   1126 /*
   1127 ** Rtree virtual table module xRowid method.
   1128 */
   1129 static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){
   1130   Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
   1131   RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
   1132 
   1133   assert(pCsr->pNode);
   1134   *pRowid = nodeGetRowid(pRtree, pCsr->pNode, pCsr->iCell);
   1135 
   1136   return SQLITE_OK;
   1137 }
   1138 
   1139 /*
   1140 ** Rtree virtual table module xColumn method.
   1141 */
   1142 static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
   1143   Rtree *pRtree = (Rtree *)cur->pVtab;
   1144   RtreeCursor *pCsr = (RtreeCursor *)cur;
   1145 
   1146   if( i==0 ){
   1147     i64 iRowid = nodeGetRowid(pRtree, pCsr->pNode, pCsr->iCell);
   1148     sqlite3_result_int64(ctx, iRowid);
   1149   }else{
   1150     RtreeCoord c;
   1151     nodeGetCoord(pRtree, pCsr->pNode, pCsr->iCell, i-1, &c);
   1152     if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
   1153       sqlite3_result_double(ctx, c.f);
   1154     }else{
   1155       assert( pRtree->eCoordType==RTREE_COORD_INT32 );
   1156       sqlite3_result_int(ctx, c.i);
   1157     }
   1158   }
   1159 
   1160   return SQLITE_OK;
   1161 }
   1162 
   1163 /*
   1164 ** Use nodeAcquire() to obtain the leaf node containing the record with
   1165 ** rowid iRowid. If successful, set *ppLeaf to point to the node and
   1166 ** return SQLITE_OK. If there is no such record in the table, set
   1167 ** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf
   1168 ** to zero and return an SQLite error code.
   1169 */
   1170 static int findLeafNode(Rtree *pRtree, i64 iRowid, RtreeNode **ppLeaf){
   1171   int rc;
   1172   *ppLeaf = 0;
   1173   sqlite3_bind_int64(pRtree->pReadRowid, 1, iRowid);
   1174   if( sqlite3_step(pRtree->pReadRowid)==SQLITE_ROW ){
   1175     i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0);
   1176     rc = nodeAcquire(pRtree, iNode, 0, ppLeaf);
   1177     sqlite3_reset(pRtree->pReadRowid);
   1178   }else{
   1179     rc = sqlite3_reset(pRtree->pReadRowid);
   1180   }
   1181   return rc;
   1182 }
   1183 
   1184 /*
   1185 ** This function is called to configure the RtreeConstraint object passed
   1186 ** as the second argument for a MATCH constraint. The value passed as the
   1187 ** first argument to this function is the right-hand operand to the MATCH
   1188 ** operator.
   1189 */
   1190 static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){
   1191   RtreeMatchArg *p;
   1192   sqlite3_rtree_geometry *pGeom;
   1193   int nBlob;
   1194 
   1195   /* Check that value is actually a blob. */
   1196   if( !sqlite3_value_type(pValue)==SQLITE_BLOB ) return SQLITE_ERROR;
   1197 
   1198   /* Check that the blob is roughly the right size. */
   1199   nBlob = sqlite3_value_bytes(pValue);
   1200   if( nBlob<(int)sizeof(RtreeMatchArg)
   1201    || ((nBlob-sizeof(RtreeMatchArg))%sizeof(double))!=0
   1202   ){
   1203     return SQLITE_ERROR;
   1204   }
   1205 
   1206   pGeom = (sqlite3_rtree_geometry *)sqlite3_malloc(
   1207       sizeof(sqlite3_rtree_geometry) + nBlob
   1208   );
   1209   if( !pGeom ) return SQLITE_NOMEM;
   1210   memset(pGeom, 0, sizeof(sqlite3_rtree_geometry));
   1211   p = (RtreeMatchArg *)&pGeom[1];
   1212 
   1213   memcpy(p, sqlite3_value_blob(pValue), nBlob);
   1214   if( p->magic!=RTREE_GEOMETRY_MAGIC
   1215    || nBlob!=(int)(sizeof(RtreeMatchArg) + (p->nParam-1)*sizeof(double))
   1216   ){
   1217     sqlite3_free(pGeom);
   1218     return SQLITE_ERROR;
   1219   }
   1220 
   1221   pGeom->pContext = p->pContext;
   1222   pGeom->nParam = p->nParam;
   1223   pGeom->aParam = p->aParam;
   1224 
   1225   pCons->xGeom = p->xGeom;
   1226   pCons->pGeom = pGeom;
   1227   return SQLITE_OK;
   1228 }
   1229 
   1230 /*
   1231 ** Rtree virtual table module xFilter method.
   1232 */
   1233 static int rtreeFilter(
   1234   sqlite3_vtab_cursor *pVtabCursor,
   1235   int idxNum, const char *idxStr,
   1236   int argc, sqlite3_value **argv
   1237 ){
   1238   Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
   1239   RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
   1240 
   1241   RtreeNode *pRoot = 0;
   1242   int ii;
   1243   int rc = SQLITE_OK;
   1244 
   1245   rtreeReference(pRtree);
   1246 
   1247   freeCursorConstraints(pCsr);
   1248   pCsr->iStrategy = idxNum;
   1249 
   1250   if( idxNum==1 ){
   1251     /* Special case - lookup by rowid. */
   1252     RtreeNode *pLeaf;        /* Leaf on which the required cell resides */
   1253     i64 iRowid = sqlite3_value_int64(argv[0]);
   1254     rc = findLeafNode(pRtree, iRowid, &pLeaf);
   1255     pCsr->pNode = pLeaf;
   1256     if( pLeaf ){
   1257       assert( rc==SQLITE_OK );
   1258       rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &pCsr->iCell);
   1259     }
   1260   }else{
   1261     /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array
   1262     ** with the configured constraints.
   1263     */
   1264     if( argc>0 ){
   1265       pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc);
   1266       pCsr->nConstraint = argc;
   1267       if( !pCsr->aConstraint ){
   1268         rc = SQLITE_NOMEM;
   1269       }else{
   1270         memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc);
   1271         assert( (idxStr==0 && argc==0) || (int)strlen(idxStr)==argc*2 );
   1272         for(ii=0; ii<argc; ii++){
   1273           RtreeConstraint *p = &pCsr->aConstraint[ii];
   1274           p->op = idxStr[ii*2];
   1275           p->iCoord = idxStr[ii*2+1]-'a';
   1276           if( p->op==RTREE_MATCH ){
   1277             /* A MATCH operator. The right-hand-side must be a blob that
   1278             ** can be cast into an RtreeMatchArg object. One created using
   1279             ** an sqlite3_rtree_geometry_callback() SQL user function.
   1280             */
   1281             rc = deserializeGeometry(argv[ii], p);
   1282             if( rc!=SQLITE_OK ){
   1283               break;
   1284             }
   1285           }else{
   1286             p->rValue = sqlite3_value_double(argv[ii]);
   1287           }
   1288         }
   1289       }
   1290     }
   1291 
   1292     if( rc==SQLITE_OK ){
   1293       pCsr->pNode = 0;
   1294       rc = nodeAcquire(pRtree, 1, 0, &pRoot);
   1295     }
   1296     if( rc==SQLITE_OK ){
   1297       int isEof = 1;
   1298       int nCell = NCELL(pRoot);
   1299       pCsr->pNode = pRoot;
   1300       for(pCsr->iCell=0; rc==SQLITE_OK && pCsr->iCell<nCell; pCsr->iCell++){
   1301         assert( pCsr->pNode==pRoot );
   1302         rc = descendToCell(pRtree, pCsr, pRtree->iDepth, &isEof);
   1303         if( !isEof ){
   1304           break;
   1305         }
   1306       }
   1307       if( rc==SQLITE_OK && isEof ){
   1308         assert( pCsr->pNode==pRoot );
   1309         nodeRelease(pRtree, pRoot);
   1310         pCsr->pNode = 0;
   1311       }
   1312       assert( rc!=SQLITE_OK || !pCsr->pNode || pCsr->iCell<NCELL(pCsr->pNode) );
   1313     }
   1314   }
   1315 
   1316   rtreeRelease(pRtree);
   1317   return rc;
   1318 }
   1319 
   1320 /*
   1321 ** Rtree virtual table module xBestIndex method. There are three
   1322 ** table scan strategies to choose from (in order from most to
   1323 ** least desirable):
   1324 **
   1325 **   idxNum     idxStr        Strategy
   1326 **   ------------------------------------------------
   1327 **     1        Unused        Direct lookup by rowid.
   1328 **     2        See below     R-tree query or full-table scan.
   1329 **   ------------------------------------------------
   1330 **
   1331 ** If strategy 1 is used, then idxStr is not meaningful. If strategy
   1332 ** 2 is used, idxStr is formatted to contain 2 bytes for each
   1333 ** constraint used. The first two bytes of idxStr correspond to
   1334 ** the constraint in sqlite3_index_info.aConstraintUsage[] with
   1335 ** (argvIndex==1) etc.
   1336 **
   1337 ** The first of each pair of bytes in idxStr identifies the constraint
   1338 ** operator as follows:
   1339 **
   1340 **   Operator    Byte Value
   1341 **   ----------------------
   1342 **      =        0x41 ('A')
   1343 **     <=        0x42 ('B')
   1344 **      <        0x43 ('C')
   1345 **     >=        0x44 ('D')
   1346 **      >        0x45 ('E')
   1347 **   MATCH       0x46 ('F')
   1348 **   ----------------------
   1349 **
   1350 ** The second of each pair of bytes identifies the coordinate column
   1351 ** to which the constraint applies. The leftmost coordinate column
   1352 ** is 'a', the second from the left 'b' etc.
   1353 */
   1354 static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
   1355   int rc = SQLITE_OK;
   1356   int ii;
   1357 
   1358   int iIdx = 0;
   1359   char zIdxStr[RTREE_MAX_DIMENSIONS*8+1];
   1360   memset(zIdxStr, 0, sizeof(zIdxStr));
   1361   UNUSED_PARAMETER(tab);
   1362 
   1363   assert( pIdxInfo->idxStr==0 );
   1364   for(ii=0; ii<pIdxInfo->nConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){
   1365     struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
   1366 
   1367     if( p->usable && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
   1368       /* We have an equality constraint on the rowid. Use strategy 1. */
   1369       int jj;
   1370       for(jj=0; jj<ii; jj++){
   1371         pIdxInfo->aConstraintUsage[jj].argvIndex = 0;
   1372         pIdxInfo->aConstraintUsage[jj].omit = 0;
   1373       }
   1374       pIdxInfo->idxNum = 1;
   1375       pIdxInfo->aConstraintUsage[ii].argvIndex = 1;
   1376       pIdxInfo->aConstraintUsage[jj].omit = 1;
   1377 
   1378       /* This strategy involves a two rowid lookups on an B-Tree structures
   1379       ** and then a linear search of an R-Tree node. This should be
   1380       ** considered almost as quick as a direct rowid lookup (for which
   1381       ** sqlite uses an internal cost of 0.0).
   1382       */
   1383       pIdxInfo->estimatedCost = 10.0;
   1384       return SQLITE_OK;
   1385     }
   1386 
   1387     if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){
   1388       u8 op;
   1389       switch( p->op ){
   1390         case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break;
   1391         case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break;
   1392         case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break;
   1393         case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break;
   1394         case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break;
   1395         default:
   1396           assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH );
   1397           op = RTREE_MATCH;
   1398           break;
   1399       }
   1400       zIdxStr[iIdx++] = op;
   1401       zIdxStr[iIdx++] = p->iColumn - 1 + 'a';
   1402       pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2);
   1403       pIdxInfo->aConstraintUsage[ii].omit = 1;
   1404     }
   1405   }
   1406 
   1407   pIdxInfo->idxNum = 2;
   1408   pIdxInfo->needToFreeIdxStr = 1;
   1409   if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){
   1410     return SQLITE_NOMEM;
   1411   }
   1412   assert( iIdx>=0 );
   1413   pIdxInfo->estimatedCost = (2000000.0 / (double)(iIdx + 1));
   1414   return rc;
   1415 }
   1416 
   1417 /*
   1418 ** Return the N-dimensional volumn of the cell stored in *p.
   1419 */
   1420 static float cellArea(Rtree *pRtree, RtreeCell *p){
   1421   float area = 1.0;
   1422   int ii;
   1423   for(ii=0; ii<(pRtree->nDim*2); ii+=2){
   1424     area = area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
   1425   }
   1426   return area;
   1427 }
   1428 
   1429 /*
   1430 ** Return the margin length of cell p. The margin length is the sum
   1431 ** of the objects size in each dimension.
   1432 */
   1433 static float cellMargin(Rtree *pRtree, RtreeCell *p){
   1434   float margin = 0.0;
   1435   int ii;
   1436   for(ii=0; ii<(pRtree->nDim*2); ii+=2){
   1437     margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
   1438   }
   1439   return margin;
   1440 }
   1441 
   1442 /*
   1443 ** Store the union of cells p1 and p2 in p1.
   1444 */
   1445 static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
   1446   int ii;
   1447   if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
   1448     for(ii=0; ii<(pRtree->nDim*2); ii+=2){
   1449       p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f);
   1450       p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f);
   1451     }
   1452   }else{
   1453     for(ii=0; ii<(pRtree->nDim*2); ii+=2){
   1454       p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i);
   1455       p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i);
   1456     }
   1457   }
   1458 }
   1459 
   1460 /*
   1461 ** Return true if the area covered by p2 is a subset of the area covered
   1462 ** by p1. False otherwise.
   1463 */
   1464 static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
   1465   int ii;
   1466   int isInt = (pRtree->eCoordType==RTREE_COORD_INT32);
   1467   for(ii=0; ii<(pRtree->nDim*2); ii+=2){
   1468     RtreeCoord *a1 = &p1->aCoord[ii];
   1469     RtreeCoord *a2 = &p2->aCoord[ii];
   1470     if( (!isInt && (a2[0].f<a1[0].f || a2[1].f>a1[1].f))
   1471      || ( isInt && (a2[0].i<a1[0].i || a2[1].i>a1[1].i))
   1472     ){
   1473       return 0;
   1474     }
   1475   }
   1476   return 1;
   1477 }
   1478 
   1479 /*
   1480 ** Return the amount cell p would grow by if it were unioned with pCell.
   1481 */
   1482 static float cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){
   1483   float area;
   1484   RtreeCell cell;
   1485   memcpy(&cell, p, sizeof(RtreeCell));
   1486   area = cellArea(pRtree, &cell);
   1487   cellUnion(pRtree, &cell, pCell);
   1488   return (cellArea(pRtree, &cell)-area);
   1489 }
   1490 
   1491 #if VARIANT_RSTARTREE_CHOOSESUBTREE || VARIANT_RSTARTREE_SPLIT
   1492 static float cellOverlap(
   1493   Rtree *pRtree,
   1494   RtreeCell *p,
   1495   RtreeCell *aCell,
   1496   int nCell,
   1497   int iExclude
   1498 ){
   1499   int ii;
   1500   float overlap = 0.0;
   1501   for(ii=0; ii<nCell; ii++){
   1502 #if VARIANT_RSTARTREE_CHOOSESUBTREE
   1503     if( ii!=iExclude )
   1504 #else
   1505     assert( iExclude==-1 );
   1506     UNUSED_PARAMETER(iExclude);
   1507 #endif
   1508     {
   1509       int jj;
   1510       float o = 1.0;
   1511       for(jj=0; jj<(pRtree->nDim*2); jj+=2){
   1512         double x1;
   1513         double x2;
   1514 
   1515         x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj]));
   1516         x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1]));
   1517 
   1518         if( x2<x1 ){
   1519           o = 0.0;
   1520           break;
   1521         }else{
   1522           o = o * (x2-x1);
   1523         }
   1524       }
   1525       overlap += o;
   1526     }
   1527   }
   1528   return overlap;
   1529 }
   1530 #endif
   1531 
   1532 #if VARIANT_RSTARTREE_CHOOSESUBTREE
   1533 static float cellOverlapEnlargement(
   1534   Rtree *pRtree,
   1535   RtreeCell *p,
   1536   RtreeCell *pInsert,
   1537   RtreeCell *aCell,
   1538   int nCell,
   1539   int iExclude
   1540 ){
   1541   float before;
   1542   float after;
   1543   before = cellOverlap(pRtree, p, aCell, nCell, iExclude);
   1544   cellUnion(pRtree, p, pInsert);
   1545   after = cellOverlap(pRtree, p, aCell, nCell, iExclude);
   1546   return after-before;
   1547 }
   1548 #endif
   1549 
   1550 
   1551 /*
   1552 ** This function implements the ChooseLeaf algorithm from Gutman[84].
   1553 ** ChooseSubTree in r*tree terminology.
   1554 */
   1555 static int ChooseLeaf(
   1556   Rtree *pRtree,               /* Rtree table */
   1557   RtreeCell *pCell,            /* Cell to insert into rtree */
   1558   int iHeight,                 /* Height of sub-tree rooted at pCell */
   1559   RtreeNode **ppLeaf           /* OUT: Selected leaf page */
   1560 ){
   1561   int rc;
   1562   int ii;
   1563   RtreeNode *pNode;
   1564   rc = nodeAcquire(pRtree, 1, 0, &pNode);
   1565 
   1566   for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
   1567     int iCell;
   1568     sqlite3_int64 iBest;
   1569 
   1570     float fMinGrowth;
   1571     float fMinArea;
   1572     float fMinOverlap;
   1573 
   1574     int nCell = NCELL(pNode);
   1575     RtreeCell cell;
   1576     RtreeNode *pChild;
   1577 
   1578     RtreeCell *aCell = 0;
   1579 
   1580 #if VARIANT_RSTARTREE_CHOOSESUBTREE
   1581     if( ii==(pRtree->iDepth-1) ){
   1582       int jj;
   1583       aCell = sqlite3_malloc(sizeof(RtreeCell)*nCell);
   1584       if( !aCell ){
   1585         rc = SQLITE_NOMEM;
   1586         nodeRelease(pRtree, pNode);
   1587         pNode = 0;
   1588         continue;
   1589       }
   1590       for(jj=0; jj<nCell; jj++){
   1591         nodeGetCell(pRtree, pNode, jj, &aCell[jj]);
   1592       }
   1593     }
   1594 #endif
   1595 
   1596     /* Select the child node which will be enlarged the least if pCell
   1597     ** is inserted into it. Resolve ties by choosing the entry with
   1598     ** the smallest area.
   1599     */
   1600     for(iCell=0; iCell<nCell; iCell++){
   1601       int bBest = 0;
   1602       float growth;
   1603       float area;
   1604       float overlap = 0.0;
   1605       nodeGetCell(pRtree, pNode, iCell, &cell);
   1606       growth = cellGrowth(pRtree, &cell, pCell);
   1607       area = cellArea(pRtree, &cell);
   1608 
   1609 #if VARIANT_RSTARTREE_CHOOSESUBTREE
   1610       if( ii==(pRtree->iDepth-1) ){
   1611         overlap = cellOverlapEnlargement(pRtree,&cell,pCell,aCell,nCell,iCell);
   1612       }
   1613       if( (iCell==0)
   1614        || (overlap<fMinOverlap)
   1615        || (overlap==fMinOverlap && growth<fMinGrowth)
   1616        || (overlap==fMinOverlap && growth==fMinGrowth && area<fMinArea)
   1617       ){
   1618         bBest = 1;
   1619       }
   1620 #else
   1621       if( iCell==0||growth<fMinGrowth||(growth==fMinGrowth && area<fMinArea) ){
   1622         bBest = 1;
   1623       }
   1624 #endif
   1625       if( bBest ){
   1626         fMinOverlap = overlap;
   1627         fMinGrowth = growth;
   1628         fMinArea = area;
   1629         iBest = cell.iRowid;
   1630       }
   1631     }
   1632 
   1633     sqlite3_free(aCell);
   1634     rc = nodeAcquire(pRtree, iBest, pNode, &pChild);
   1635     nodeRelease(pRtree, pNode);
   1636     pNode = pChild;
   1637   }
   1638 
   1639   *ppLeaf = pNode;
   1640   return rc;
   1641 }
   1642 
   1643 /*
   1644 ** A cell with the same content as pCell has just been inserted into
   1645 ** the node pNode. This function updates the bounding box cells in
   1646 ** all ancestor elements.
   1647 */
   1648 static int AdjustTree(
   1649   Rtree *pRtree,                    /* Rtree table */
   1650   RtreeNode *pNode,                 /* Adjust ancestry of this node. */
   1651   RtreeCell *pCell                  /* This cell was just inserted */
   1652 ){
   1653   RtreeNode *p = pNode;
   1654   while( p->pParent ){
   1655     RtreeNode *pParent = p->pParent;
   1656     RtreeCell cell;
   1657     int iCell;
   1658 
   1659     if( nodeParentIndex(pRtree, p, &iCell) ){
   1660       return SQLITE_CORRUPT;
   1661     }
   1662 
   1663     nodeGetCell(pRtree, pParent, iCell, &cell);
   1664     if( !cellContains(pRtree, &cell, pCell) ){
   1665       cellUnion(pRtree, &cell, pCell);
   1666       nodeOverwriteCell(pRtree, pParent, &cell, iCell);
   1667     }
   1668 
   1669     p = pParent;
   1670   }
   1671   return SQLITE_OK;
   1672 }
   1673 
   1674 /*
   1675 ** Write mapping (iRowid->iNode) to the <rtree>_rowid table.
   1676 */
   1677 static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){
   1678   sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid);
   1679   sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode);
   1680   sqlite3_step(pRtree->pWriteRowid);
   1681   return sqlite3_reset(pRtree->pWriteRowid);
   1682 }
   1683 
   1684 /*
   1685 ** Write mapping (iNode->iPar) to the <rtree>_parent table.
   1686 */
   1687 static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){
   1688   sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode);
   1689   sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar);
   1690   sqlite3_step(pRtree->pWriteParent);
   1691   return sqlite3_reset(pRtree->pWriteParent);
   1692 }
   1693 
   1694 static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int);
   1695 
   1696 #if VARIANT_GUTTMAN_LINEAR_SPLIT
   1697 /*
   1698 ** Implementation of the linear variant of the PickNext() function from
   1699 ** Guttman[84].
   1700 */
   1701 static RtreeCell *LinearPickNext(
   1702   Rtree *pRtree,
   1703   RtreeCell *aCell,
   1704   int nCell,
   1705   RtreeCell *pLeftBox,
   1706   RtreeCell *pRightBox,
   1707   int *aiUsed
   1708 ){
   1709   int ii;
   1710   for(ii=0; aiUsed[ii]; ii++);
   1711   aiUsed[ii] = 1;
   1712   return &aCell[ii];
   1713 }
   1714 
   1715 /*
   1716 ** Implementation of the linear variant of the PickSeeds() function from
   1717 ** Guttman[84].
   1718 */
   1719 static void LinearPickSeeds(
   1720   Rtree *pRtree,
   1721   RtreeCell *aCell,
   1722   int nCell,
   1723   int *piLeftSeed,
   1724   int *piRightSeed
   1725 ){
   1726   int i;
   1727   int iLeftSeed = 0;
   1728   int iRightSeed = 1;
   1729   float maxNormalInnerWidth = 0.0;
   1730 
   1731   /* Pick two "seed" cells from the array of cells. The algorithm used
   1732   ** here is the LinearPickSeeds algorithm from Gutman[1984]. The
   1733   ** indices of the two seed cells in the array are stored in local
   1734   ** variables iLeftSeek and iRightSeed.
   1735   */
   1736   for(i=0; i<pRtree->nDim; i++){
   1737     float x1 = DCOORD(aCell[0].aCoord[i*2]);
   1738     float x2 = DCOORD(aCell[0].aCoord[i*2+1]);
   1739     float x3 = x1;
   1740     float x4 = x2;
   1741     int jj;
   1742 
   1743     int iCellLeft = 0;
   1744     int iCellRight = 0;
   1745 
   1746     for(jj=1; jj<nCell; jj++){
   1747       float left = DCOORD(aCell[jj].aCoord[i*2]);
   1748       float right = DCOORD(aCell[jj].aCoord[i*2+1]);
   1749 
   1750       if( left<x1 ) x1 = left;
   1751       if( right>x4 ) x4 = right;
   1752       if( left>x3 ){
   1753         x3 = left;
   1754         iCellRight = jj;
   1755       }
   1756       if( right<x2 ){
   1757         x2 = right;
   1758         iCellLeft = jj;
   1759       }
   1760     }
   1761 
   1762     if( x4!=x1 ){
   1763       float normalwidth = (x3 - x2) / (x4 - x1);
   1764       if( normalwidth>maxNormalInnerWidth ){
   1765         iLeftSeed = iCellLeft;
   1766         iRightSeed = iCellRight;
   1767       }
   1768     }
   1769   }
   1770 
   1771   *piLeftSeed = iLeftSeed;
   1772   *piRightSeed = iRightSeed;
   1773 }
   1774 #endif /* VARIANT_GUTTMAN_LINEAR_SPLIT */
   1775 
   1776 #if VARIANT_GUTTMAN_QUADRATIC_SPLIT
   1777 /*
   1778 ** Implementation of the quadratic variant of the PickNext() function from
   1779 ** Guttman[84].
   1780 */
   1781 static RtreeCell *QuadraticPickNext(
   1782   Rtree *pRtree,
   1783   RtreeCell *aCell,
   1784   int nCell,
   1785   RtreeCell *pLeftBox,
   1786   RtreeCell *pRightBox,
   1787   int *aiUsed
   1788 ){
   1789   #define FABS(a) ((a)<0.0?-1.0*(a):(a))
   1790 
   1791   int iSelect = -1;
   1792   float fDiff;
   1793   int ii;
   1794   for(ii=0; ii<nCell; ii++){
   1795     if( aiUsed[ii]==0 ){
   1796       float left = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
   1797       float right = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
   1798       float diff = FABS(right-left);
   1799       if( iSelect<0 || diff>fDiff ){
   1800         fDiff = diff;
   1801         iSelect = ii;
   1802       }
   1803     }
   1804   }
   1805   aiUsed[iSelect] = 1;
   1806   return &aCell[iSelect];
   1807 }
   1808 
   1809 /*
   1810 ** Implementation of the quadratic variant of the PickSeeds() function from
   1811 ** Guttman[84].
   1812 */
   1813 static void QuadraticPickSeeds(
   1814   Rtree *pRtree,
   1815   RtreeCell *aCell,
   1816   int nCell,
   1817   int *piLeftSeed,
   1818   int *piRightSeed
   1819 ){
   1820   int ii;
   1821   int jj;
   1822 
   1823   int iLeftSeed = 0;
   1824   int iRightSeed = 1;
   1825   float fWaste = 0.0;
   1826 
   1827   for(ii=0; ii<nCell; ii++){
   1828     for(jj=ii+1; jj<nCell; jj++){
   1829       float right = cellArea(pRtree, &aCell[jj]);
   1830       float growth = cellGrowth(pRtree, &aCell[ii], &aCell[jj]);
   1831       float waste = growth - right;
   1832 
   1833       if( waste>fWaste ){
   1834         iLeftSeed = ii;
   1835         iRightSeed = jj;
   1836         fWaste = waste;
   1837       }
   1838     }
   1839   }
   1840 
   1841   *piLeftSeed = iLeftSeed;
   1842   *piRightSeed = iRightSeed;
   1843 }
   1844 #endif /* VARIANT_GUTTMAN_QUADRATIC_SPLIT */
   1845 
   1846 /*
   1847 ** Arguments aIdx, aDistance and aSpare all point to arrays of size
   1848 ** nIdx. The aIdx array contains the set of integers from 0 to
   1849 ** (nIdx-1) in no particular order. This function sorts the values
   1850 ** in aIdx according to the indexed values in aDistance. For
   1851 ** example, assuming the inputs:
   1852 **
   1853 **   aIdx      = { 0,   1,   2,   3 }
   1854 **   aDistance = { 5.0, 2.0, 7.0, 6.0 }
   1855 **
   1856 ** this function sets the aIdx array to contain:
   1857 **
   1858 **   aIdx      = { 0,   1,   2,   3 }
   1859 **
   1860 ** The aSpare array is used as temporary working space by the
   1861 ** sorting algorithm.
   1862 */
   1863 static void SortByDistance(
   1864   int *aIdx,
   1865   int nIdx,
   1866   float *aDistance,
   1867   int *aSpare
   1868 ){
   1869   if( nIdx>1 ){
   1870     int iLeft = 0;
   1871     int iRight = 0;
   1872 
   1873     int nLeft = nIdx/2;
   1874     int nRight = nIdx-nLeft;
   1875     int *aLeft = aIdx;
   1876     int *aRight = &aIdx[nLeft];
   1877 
   1878     SortByDistance(aLeft, nLeft, aDistance, aSpare);
   1879     SortByDistance(aRight, nRight, aDistance, aSpare);
   1880 
   1881     memcpy(aSpare, aLeft, sizeof(int)*nLeft);
   1882     aLeft = aSpare;
   1883 
   1884     while( iLeft<nLeft || iRight<nRight ){
   1885       if( iLeft==nLeft ){
   1886         aIdx[iLeft+iRight] = aRight[iRight];
   1887         iRight++;
   1888       }else if( iRight==nRight ){
   1889         aIdx[iLeft+iRight] = aLeft[iLeft];
   1890         iLeft++;
   1891       }else{
   1892         float fLeft = aDistance[aLeft[iLeft]];
   1893         float fRight = aDistance[aRight[iRight]];
   1894         if( fLeft<fRight ){
   1895           aIdx[iLeft+iRight] = aLeft[iLeft];
   1896           iLeft++;
   1897         }else{
   1898           aIdx[iLeft+iRight] = aRight[iRight];
   1899           iRight++;
   1900         }
   1901       }
   1902     }
   1903 
   1904 #if 0
   1905     /* Check that the sort worked */
   1906     {
   1907       int jj;
   1908       for(jj=1; jj<nIdx; jj++){
   1909         float left = aDistance[aIdx[jj-1]];
   1910         float right = aDistance[aIdx[jj]];
   1911         assert( left<=right );
   1912       }
   1913     }
   1914 #endif
   1915   }
   1916 }
   1917 
   1918 /*
   1919 ** Arguments aIdx, aCell and aSpare all point to arrays of size
   1920 ** nIdx. The aIdx array contains the set of integers from 0 to
   1921 ** (nIdx-1) in no particular order. This function sorts the values
   1922 ** in aIdx according to dimension iDim of the cells in aCell. The
   1923 ** minimum value of dimension iDim is considered first, the
   1924 ** maximum used to break ties.
   1925 **
   1926 ** The aSpare array is used as temporary working space by the
   1927 ** sorting algorithm.
   1928 */
   1929 static void SortByDimension(
   1930   Rtree *pRtree,
   1931   int *aIdx,
   1932   int nIdx,
   1933   int iDim,
   1934   RtreeCell *aCell,
   1935   int *aSpare
   1936 ){
   1937   if( nIdx>1 ){
   1938 
   1939     int iLeft = 0;
   1940     int iRight = 0;
   1941 
   1942     int nLeft = nIdx/2;
   1943     int nRight = nIdx-nLeft;
   1944     int *aLeft = aIdx;
   1945     int *aRight = &aIdx[nLeft];
   1946 
   1947     SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare);
   1948     SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare);
   1949 
   1950     memcpy(aSpare, aLeft, sizeof(int)*nLeft);
   1951     aLeft = aSpare;
   1952     while( iLeft<nLeft || iRight<nRight ){
   1953       double xleft1 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2]);
   1954       double xleft2 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2+1]);
   1955       double xright1 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2]);
   1956       double xright2 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2+1]);
   1957       if( (iLeft!=nLeft) && ((iRight==nRight)
   1958        || (xleft1<xright1)
   1959        || (xleft1==xright1 && xleft2<xright2)
   1960       )){
   1961         aIdx[iLeft+iRight] = aLeft[iLeft];
   1962         iLeft++;
   1963       }else{
   1964         aIdx[iLeft+iRight] = aRight[iRight];
   1965         iRight++;
   1966       }
   1967     }
   1968 
   1969 #if 0
   1970     /* Check that the sort worked */
   1971     {
   1972       int jj;
   1973       for(jj=1; jj<nIdx; jj++){
   1974         float xleft1 = aCell[aIdx[jj-1]].aCoord[iDim*2];
   1975         float xleft2 = aCell[aIdx[jj-1]].aCoord[iDim*2+1];
   1976         float xright1 = aCell[aIdx[jj]].aCoord[iDim*2];
   1977         float xright2 = aCell[aIdx[jj]].aCoord[iDim*2+1];
   1978         assert( xleft1<=xright1 && (xleft1<xright1 || xleft2<=xright2) );
   1979       }
   1980     }
   1981 #endif
   1982   }
   1983 }
   1984 
   1985 #if VARIANT_RSTARTREE_SPLIT
   1986 /*
   1987 ** Implementation of the R*-tree variant of SplitNode from Beckman[1990].
   1988 */
   1989 static int splitNodeStartree(
   1990   Rtree *pRtree,
   1991   RtreeCell *aCell,
   1992   int nCell,
   1993   RtreeNode *pLeft,
   1994   RtreeNode *pRight,
   1995   RtreeCell *pBboxLeft,
   1996   RtreeCell *pBboxRight
   1997 ){
   1998   int **aaSorted;
   1999   int *aSpare;
   2000   int ii;
   2001 
   2002   int iBestDim;
   2003   int iBestSplit;
   2004   float fBestMargin;
   2005 
   2006   int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int));
   2007 
   2008   aaSorted = (int **)sqlite3_malloc(nByte);
   2009   if( !aaSorted ){
   2010     return SQLITE_NOMEM;
   2011   }
   2012 
   2013   aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell];
   2014   memset(aaSorted, 0, nByte);
   2015   for(ii=0; ii<pRtree->nDim; ii++){
   2016     int jj;
   2017     aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell];
   2018     for(jj=0; jj<nCell; jj++){
   2019       aaSorted[ii][jj] = jj;
   2020     }
   2021     SortByDimension(pRtree, aaSorted[ii], nCell, ii, aCell, aSpare);
   2022   }
   2023 
   2024   for(ii=0; ii<pRtree->nDim; ii++){
   2025     float margin = 0.0;
   2026     float fBestOverlap;
   2027     float fBestArea;
   2028     int iBestLeft;
   2029     int nLeft;
   2030 
   2031     for(
   2032       nLeft=RTREE_MINCELLS(pRtree);
   2033       nLeft<=(nCell-RTREE_MINCELLS(pRtree));
   2034       nLeft++
   2035     ){
   2036       RtreeCell left;
   2037       RtreeCell right;
   2038       int kk;
   2039       float overlap;
   2040       float area;
   2041 
   2042       memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell));
   2043       memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell));
   2044       for(kk=1; kk<(nCell-1); kk++){
   2045         if( kk<nLeft ){
   2046           cellUnion(pRtree, &left, &aCell[aaSorted[ii][kk]]);
   2047         }else{
   2048           cellUnion(pRtree, &right, &aCell[aaSorted[ii][kk]]);
   2049         }
   2050       }
   2051       margin += cellMargin(pRtree, &left);
   2052       margin += cellMargin(pRtree, &right);
   2053       overlap = cellOverlap(pRtree, &left, &right, 1, -1);
   2054       area = cellArea(pRtree, &left) + cellArea(pRtree, &right);
   2055       if( (nLeft==RTREE_MINCELLS(pRtree))
   2056        || (overlap<fBestOverlap)
   2057        || (overlap==fBestOverlap && area<fBestArea)
   2058       ){
   2059         iBestLeft = nLeft;
   2060         fBestOverlap = overlap;
   2061         fBestArea = area;
   2062       }
   2063     }
   2064 
   2065     if( ii==0 || margin<fBestMargin ){
   2066       iBestDim = ii;
   2067       fBestMargin = margin;
   2068       iBestSplit = iBestLeft;
   2069     }
   2070   }
   2071 
   2072   memcpy(pBboxLeft, &aCell[aaSorted[iBestDim][0]], sizeof(RtreeCell));
   2073   memcpy(pBboxRight, &aCell[aaSorted[iBestDim][iBestSplit]], sizeof(RtreeCell));
   2074   for(ii=0; ii<nCell; ii++){
   2075     RtreeNode *pTarget = (ii<iBestSplit)?pLeft:pRight;
   2076     RtreeCell *pBbox = (ii<iBestSplit)?pBboxLeft:pBboxRight;
   2077     RtreeCell *pCell = &aCell[aaSorted[iBestDim][ii]];
   2078     nodeInsertCell(pRtree, pTarget, pCell);
   2079     cellUnion(pRtree, pBbox, pCell);
   2080   }
   2081 
   2082   sqlite3_free(aaSorted);
   2083   return SQLITE_OK;
   2084 }
   2085 #endif
   2086 
   2087 #if VARIANT_GUTTMAN_SPLIT
   2088 /*
   2089 ** Implementation of the regular R-tree SplitNode from Guttman[1984].
   2090 */
   2091 static int splitNodeGuttman(
   2092   Rtree *pRtree,
   2093   RtreeCell *aCell,
   2094   int nCell,
   2095   RtreeNode *pLeft,
   2096   RtreeNode *pRight,
   2097   RtreeCell *pBboxLeft,
   2098   RtreeCell *pBboxRight
   2099 ){
   2100   int iLeftSeed = 0;
   2101   int iRightSeed = 1;
   2102   int *aiUsed;
   2103   int i;
   2104 
   2105   aiUsed = sqlite3_malloc(sizeof(int)*nCell);
   2106   if( !aiUsed ){
   2107     return SQLITE_NOMEM;
   2108   }
   2109   memset(aiUsed, 0, sizeof(int)*nCell);
   2110 
   2111   PickSeeds(pRtree, aCell, nCell, &iLeftSeed, &iRightSeed);
   2112 
   2113   memcpy(pBboxLeft, &aCell[iLeftSeed], sizeof(RtreeCell));
   2114   memcpy(pBboxRight, &aCell[iRightSeed], sizeof(RtreeCell));
   2115   nodeInsertCell(pRtree, pLeft, &aCell[iLeftSeed]);
   2116   nodeInsertCell(pRtree, pRight, &aCell[iRightSeed]);
   2117   aiUsed[iLeftSeed] = 1;
   2118   aiUsed[iRightSeed] = 1;
   2119 
   2120   for(i=nCell-2; i>0; i--){
   2121     RtreeCell *pNext;
   2122     pNext = PickNext(pRtree, aCell, nCell, pBboxLeft, pBboxRight, aiUsed);
   2123     float diff =
   2124       cellGrowth(pRtree, pBboxLeft, pNext) -
   2125       cellGrowth(pRtree, pBboxRight, pNext)
   2126     ;
   2127     if( (RTREE_MINCELLS(pRtree)-NCELL(pRight)==i)
   2128      || (diff>0.0 && (RTREE_MINCELLS(pRtree)-NCELL(pLeft)!=i))
   2129     ){
   2130       nodeInsertCell(pRtree, pRight, pNext);
   2131       cellUnion(pRtree, pBboxRight, pNext);
   2132     }else{
   2133       nodeInsertCell(pRtree, pLeft, pNext);
   2134       cellUnion(pRtree, pBboxLeft, pNext);
   2135     }
   2136   }
   2137 
   2138   sqlite3_free(aiUsed);
   2139   return SQLITE_OK;
   2140 }
   2141 #endif
   2142 
   2143 static int updateMapping(
   2144   Rtree *pRtree,
   2145   i64 iRowid,
   2146   RtreeNode *pNode,
   2147   int iHeight
   2148 ){
   2149   int (*xSetMapping)(Rtree *, sqlite3_int64, sqlite3_int64);
   2150   xSetMapping = ((iHeight==0)?rowidWrite:parentWrite);
   2151   if( iHeight>0 ){
   2152     RtreeNode *pChild = nodeHashLookup(pRtree, iRowid);
   2153     if( pChild ){
   2154       nodeRelease(pRtree, pChild->pParent);
   2155       nodeReference(pNode);
   2156       pChild->pParent = pNode;
   2157     }
   2158   }
   2159   return xSetMapping(pRtree, iRowid, pNode->iNode);
   2160 }
   2161 
   2162 static int SplitNode(
   2163   Rtree *pRtree,
   2164   RtreeNode *pNode,
   2165   RtreeCell *pCell,
   2166   int iHeight
   2167 ){
   2168   int i;
   2169   int newCellIsRight = 0;
   2170 
   2171   int rc = SQLITE_OK;
   2172   int nCell = NCELL(pNode);
   2173   RtreeCell *aCell;
   2174   int *aiUsed;
   2175 
   2176   RtreeNode *pLeft = 0;
   2177   RtreeNode *pRight = 0;
   2178 
   2179   RtreeCell leftbbox;
   2180   RtreeCell rightbbox;
   2181 
   2182   /* Allocate an array and populate it with a copy of pCell and
   2183   ** all cells from node pLeft. Then zero the original node.
   2184   */
   2185   aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1));
   2186   if( !aCell ){
   2187     rc = SQLITE_NOMEM;
   2188     goto splitnode_out;
   2189   }
   2190   aiUsed = (int *)&aCell[nCell+1];
   2191   memset(aiUsed, 0, sizeof(int)*(nCell+1));
   2192   for(i=0; i<nCell; i++){
   2193     nodeGetCell(pRtree, pNode, i, &aCell[i]);
   2194   }
   2195   nodeZero(pRtree, pNode);
   2196   memcpy(&aCell[nCell], pCell, sizeof(RtreeCell));
   2197   nCell++;
   2198 
   2199   if( pNode->iNode==1 ){
   2200     pRight = nodeNew(pRtree, pNode);
   2201     pLeft = nodeNew(pRtree, pNode);
   2202     pRtree->iDepth++;
   2203     pNode->isDirty = 1;
   2204     writeInt16(pNode->zData, pRtree->iDepth);
   2205   }else{
   2206     pLeft = pNode;
   2207     pRight = nodeNew(pRtree, pLeft->pParent);
   2208     nodeReference(pLeft);
   2209   }
   2210 
   2211   if( !pLeft || !pRight ){
   2212     rc = SQLITE_NOMEM;
   2213     goto splitnode_out;
   2214   }
   2215 
   2216   memset(pLeft->zData, 0, pRtree->iNodeSize);
   2217   memset(pRight->zData, 0, pRtree->iNodeSize);
   2218 
   2219   rc = AssignCells(pRtree, aCell, nCell, pLeft, pRight, &leftbbox, &rightbbox);
   2220   if( rc!=SQLITE_OK ){
   2221     goto splitnode_out;
   2222   }
   2223 
   2224   /* Ensure both child nodes have node numbers assigned to them by calling
   2225   ** nodeWrite(). Node pRight always needs a node number, as it was created
   2226   ** by nodeNew() above. But node pLeft sometimes already has a node number.
   2227   ** In this case avoid the all to nodeWrite().
   2228   */
   2229   if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight))
   2230    || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft)))
   2231   ){
   2232     goto splitnode_out;
   2233   }
   2234 
   2235   rightbbox.iRowid = pRight->iNode;
   2236   leftbbox.iRowid = pLeft->iNode;
   2237 
   2238   if( pNode->iNode==1 ){
   2239     rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1);
   2240     if( rc!=SQLITE_OK ){
   2241       goto splitnode_out;
   2242     }
   2243   }else{
   2244     RtreeNode *pParent = pLeft->pParent;
   2245     int iCell;
   2246     rc = nodeParentIndex(pRtree, pLeft, &iCell);
   2247     if( rc==SQLITE_OK ){
   2248       nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell);
   2249       rc = AdjustTree(pRtree, pParent, &leftbbox);
   2250     }
   2251     if( rc!=SQLITE_OK ){
   2252       goto splitnode_out;
   2253     }
   2254   }
   2255   if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){
   2256     goto splitnode_out;
   2257   }
   2258 
   2259   for(i=0; i<NCELL(pRight); i++){
   2260     i64 iRowid = nodeGetRowid(pRtree, pRight, i);
   2261     rc = updateMapping(pRtree, iRowid, pRight, iHeight);
   2262     if( iRowid==pCell->iRowid ){
   2263       newCellIsRight = 1;
   2264     }
   2265     if( rc!=SQLITE_OK ){
   2266       goto splitnode_out;
   2267     }
   2268   }
   2269   if( pNode->iNode==1 ){
   2270     for(i=0; i<NCELL(pLeft); i++){
   2271       i64 iRowid = nodeGetRowid(pRtree, pLeft, i);
   2272       rc = updateMapping(pRtree, iRowid, pLeft, iHeight);
   2273       if( rc!=SQLITE_OK ){
   2274         goto splitnode_out;
   2275       }
   2276     }
   2277   }else if( newCellIsRight==0 ){
   2278     rc = updateMapping(pRtree, pCell->iRowid, pLeft, iHeight);
   2279   }
   2280 
   2281   if( rc==SQLITE_OK ){
   2282     rc = nodeRelease(pRtree, pRight);
   2283     pRight = 0;
   2284   }
   2285   if( rc==SQLITE_OK ){
   2286     rc = nodeRelease(pRtree, pLeft);
   2287     pLeft = 0;
   2288   }
   2289 
   2290 splitnode_out:
   2291   nodeRelease(pRtree, pRight);
   2292   nodeRelease(pRtree, pLeft);
   2293   sqlite3_free(aCell);
   2294   return rc;
   2295 }
   2296 
   2297 /*
   2298 ** If node pLeaf is not the root of the r-tree and its pParent pointer is
   2299 ** still NULL, load all ancestor nodes of pLeaf into memory and populate
   2300 ** the pLeaf->pParent chain all the way up to the root node.
   2301 **
   2302 ** This operation is required when a row is deleted (or updated - an update
   2303 ** is implemented as a delete followed by an insert). SQLite provides the
   2304 ** rowid of the row to delete, which can be used to find the leaf on which
   2305 ** the entry resides (argument pLeaf). Once the leaf is located, this
   2306 ** function is called to determine its ancestry.
   2307 */
   2308 static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){
   2309   int rc = SQLITE_OK;
   2310   RtreeNode *pChild = pLeaf;
   2311   while( rc==SQLITE_OK && pChild->iNode!=1 && pChild->pParent==0 ){
   2312     int rc2 = SQLITE_OK;          /* sqlite3_reset() return code */
   2313     sqlite3_bind_int64(pRtree->pReadParent, 1, pChild->iNode);
   2314     rc = sqlite3_step(pRtree->pReadParent);
   2315     if( rc==SQLITE_ROW ){
   2316       RtreeNode *pTest;           /* Used to test for reference loops */
   2317       i64 iNode;                  /* Node number of parent node */
   2318 
   2319       /* Before setting pChild->pParent, test that we are not creating a
   2320       ** loop of references (as we would if, say, pChild==pParent). We don't
   2321       ** want to do this as it leads to a memory leak when trying to delete
   2322       ** the referenced counted node structures.
   2323       */
   2324       iNode = sqlite3_column_int64(pRtree->pReadParent, 0);
   2325       for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent);
   2326       if( !pTest ){
   2327         rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent);
   2328       }
   2329     }
   2330     rc = sqlite3_reset(pRtree->pReadParent);
   2331     if( rc==SQLITE_OK ) rc = rc2;
   2332     if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT;
   2333     pChild = pChild->pParent;
   2334   }
   2335   return rc;
   2336 }
   2337 
   2338 static int deleteCell(Rtree *, RtreeNode *, int, int);
   2339 
   2340 static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){
   2341   int rc;
   2342   int rc2;
   2343   RtreeNode *pParent;
   2344   int iCell;
   2345 
   2346   assert( pNode->nRef==1 );
   2347 
   2348   /* Remove the entry in the parent cell. */
   2349   rc = nodeParentIndex(pRtree, pNode, &iCell);
   2350   if( rc==SQLITE_OK ){
   2351     pParent = pNode->pParent;
   2352     pNode->pParent = 0;
   2353     rc = deleteCell(pRtree, pParent, iCell, iHeight+1);
   2354   }
   2355   rc2 = nodeRelease(pRtree, pParent);
   2356   if( rc==SQLITE_OK ){
   2357     rc = rc2;
   2358   }
   2359   if( rc!=SQLITE_OK ){
   2360     return rc;
   2361   }
   2362 
   2363   /* Remove the xxx_node entry. */
   2364   sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode);
   2365   sqlite3_step(pRtree->pDeleteNode);
   2366   if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){
   2367     return rc;
   2368   }
   2369 
   2370   /* Remove the xxx_parent entry. */
   2371   sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode);
   2372   sqlite3_step(pRtree->pDeleteParent);
   2373   if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){
   2374     return rc;
   2375   }
   2376 
   2377   /* Remove the node from the in-memory hash table and link it into
   2378   ** the Rtree.pDeleted list. Its contents will be re-inserted later on.
   2379   */
   2380   nodeHashDelete(pRtree, pNode);
   2381   pNode->iNode = iHeight;
   2382   pNode->pNext = pRtree->pDeleted;
   2383   pNode->nRef++;
   2384   pRtree->pDeleted = pNode;
   2385 
   2386   return SQLITE_OK;
   2387 }
   2388 
   2389 static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){
   2390   RtreeNode *pParent = pNode->pParent;
   2391   int rc = SQLITE_OK;
   2392   if( pParent ){
   2393     int ii;
   2394     int nCell = NCELL(pNode);
   2395     RtreeCell box;                            /* Bounding box for pNode */
   2396     nodeGetCell(pRtree, pNode, 0, &box);
   2397     for(ii=1; ii<nCell; ii++){
   2398       RtreeCell cell;
   2399       nodeGetCell(pRtree, pNode, ii, &cell);
   2400       cellUnion(pRtree, &box, &cell);
   2401     }
   2402     box.iRowid = pNode->iNode;
   2403     rc = nodeParentIndex(pRtree, pNode, &ii);
   2404     if( rc==SQLITE_OK ){
   2405       nodeOverwriteCell(pRtree, pParent, &box, ii);
   2406       rc = fixBoundingBox(pRtree, pParent);
   2407     }
   2408   }
   2409   return rc;
   2410 }
   2411 
   2412 /*
   2413 ** Delete the cell at index iCell of node pNode. After removing the
   2414 ** cell, adjust the r-tree data structure if required.
   2415 */
   2416 static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){
   2417   RtreeNode *pParent;
   2418   int rc;
   2419 
   2420   if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){
   2421     return rc;
   2422   }
   2423 
   2424   /* Remove the cell from the node. This call just moves bytes around
   2425   ** the in-memory node image, so it cannot fail.
   2426   */
   2427   nodeDeleteCell(pRtree, pNode, iCell);
   2428 
   2429   /* If the node is not the tree root and now has less than the minimum
   2430   ** number of cells, remove it from the tree. Otherwise, update the
   2431   ** cell in the parent node so that it tightly contains the updated
   2432   ** node.
   2433   */
   2434   pParent = pNode->pParent;
   2435   assert( pParent || pNode->iNode==1 );
   2436   if( pParent ){
   2437     if( NCELL(pNode)<RTREE_MINCELLS(pRtree) ){
   2438       rc = removeNode(pRtree, pNode, iHeight);
   2439     }else{
   2440       rc = fixBoundingBox(pRtree, pNode);
   2441     }
   2442   }
   2443 
   2444   return rc;
   2445 }
   2446 
   2447 static int Reinsert(
   2448   Rtree *pRtree,
   2449   RtreeNode *pNode,
   2450   RtreeCell *pCell,
   2451   int iHeight
   2452 ){
   2453   int *aOrder;
   2454   int *aSpare;
   2455   RtreeCell *aCell;
   2456   float *aDistance;
   2457   int nCell;
   2458   float aCenterCoord[RTREE_MAX_DIMENSIONS];
   2459   int iDim;
   2460   int ii;
   2461   int rc = SQLITE_OK;
   2462 
   2463   memset(aCenterCoord, 0, sizeof(float)*RTREE_MAX_DIMENSIONS);
   2464 
   2465   nCell = NCELL(pNode)+1;
   2466 
   2467   /* Allocate the buffers used by this operation. The allocation is
   2468   ** relinquished before this function returns.
   2469   */
   2470   aCell = (RtreeCell *)sqlite3_malloc(nCell * (
   2471     sizeof(RtreeCell) +         /* aCell array */
   2472     sizeof(int)       +         /* aOrder array */
   2473     sizeof(int)       +         /* aSpare array */
   2474     sizeof(float)               /* aDistance array */
   2475   ));
   2476   if( !aCell ){
   2477     return SQLITE_NOMEM;
   2478   }
   2479   aOrder    = (int *)&aCell[nCell];
   2480   aSpare    = (int *)&aOrder[nCell];
   2481   aDistance = (float *)&aSpare[nCell];
   2482 
   2483   for(ii=0; ii<nCell; ii++){
   2484     if( ii==(nCell-1) ){
   2485       memcpy(&aCell[ii], pCell, sizeof(RtreeCell));
   2486     }else{
   2487       nodeGetCell(pRtree, pNode, ii, &aCell[ii]);
   2488     }
   2489     aOrder[ii] = ii;
   2490     for(iDim=0; iDim<pRtree->nDim; iDim++){
   2491       aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]);
   2492       aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]);
   2493     }
   2494   }
   2495   for(iDim=0; iDim<pRtree->nDim; iDim++){
   2496     aCenterCoord[iDim] = aCenterCoord[iDim]/((float)nCell*2.0);
   2497   }
   2498 
   2499   for(ii=0; ii<nCell; ii++){
   2500     aDistance[ii] = 0.0;
   2501     for(iDim=0; iDim<pRtree->nDim; iDim++){
   2502       float coord = DCOORD(aCell[ii].aCoord[iDim*2+1]) -
   2503           DCOORD(aCell[ii].aCoord[iDim*2]);
   2504       aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]);
   2505     }
   2506   }
   2507 
   2508   SortByDistance(aOrder, nCell, aDistance, aSpare);
   2509   nodeZero(pRtree, pNode);
   2510 
   2511   for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){
   2512     RtreeCell *p = &aCell[aOrder[ii]];
   2513     nodeInsertCell(pRtree, pNode, p);
   2514     if( p->iRowid==pCell->iRowid ){
   2515       if( iHeight==0 ){
   2516         rc = rowidWrite(pRtree, p->iRowid, pNode->iNode);
   2517       }else{
   2518         rc = parentWrite(pRtree, p->iRowid, pNode->iNode);
   2519       }
   2520     }
   2521   }
   2522   if( rc==SQLITE_OK ){
   2523     rc = fixBoundingBox(pRtree, pNode);
   2524   }
   2525   for(; rc==SQLITE_OK && ii<nCell; ii++){
   2526     /* Find a node to store this cell in. pNode->iNode currently contains
   2527     ** the height of the sub-tree headed by the cell.
   2528     */
   2529     RtreeNode *pInsert;
   2530     RtreeCell *p = &aCell[aOrder[ii]];
   2531     rc = ChooseLeaf(pRtree, p, iHeight, &pInsert);
   2532     if( rc==SQLITE_OK ){
   2533       int rc2;
   2534       rc = rtreeInsertCell(pRtree, pInsert, p, iHeight);
   2535       rc2 = nodeRelease(pRtree, pInsert);
   2536       if( rc==SQLITE_OK ){
   2537         rc = rc2;
   2538       }
   2539     }
   2540   }
   2541 
   2542   sqlite3_free(aCell);
   2543   return rc;
   2544 }
   2545 
   2546 /*
   2547 ** Insert cell pCell into node pNode. Node pNode is the head of a
   2548 ** subtree iHeight high (leaf nodes have iHeight==0).
   2549 */
   2550 static int rtreeInsertCell(
   2551   Rtree *pRtree,
   2552   RtreeNode *pNode,
   2553   RtreeCell *pCell,
   2554   int iHeight
   2555 ){
   2556   int rc = SQLITE_OK;
   2557   if( iHeight>0 ){
   2558     RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid);
   2559     if( pChild ){
   2560       nodeRelease(pRtree, pChild->pParent);
   2561       nodeReference(pNode);
   2562       pChild->pParent = pNode;
   2563     }
   2564   }
   2565   if( nodeInsertCell(pRtree, pNode, pCell) ){
   2566 #if VARIANT_RSTARTREE_REINSERT
   2567     if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){
   2568       rc = SplitNode(pRtree, pNode, pCell, iHeight);
   2569     }else{
   2570       pRtree->iReinsertHeight = iHeight;
   2571       rc = Reinsert(pRtree, pNode, pCell, iHeight);
   2572     }
   2573 #else
   2574     rc = SplitNode(pRtree, pNode, pCell, iHeight);
   2575 #endif
   2576   }else{
   2577     rc = AdjustTree(pRtree, pNode, pCell);
   2578     if( rc==SQLITE_OK ){
   2579       if( iHeight==0 ){
   2580         rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode);
   2581       }else{
   2582         rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode);
   2583       }
   2584     }
   2585   }
   2586   return rc;
   2587 }
   2588 
   2589 static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){
   2590   int ii;
   2591   int rc = SQLITE_OK;
   2592   int nCell = NCELL(pNode);
   2593 
   2594   for(ii=0; rc==SQLITE_OK && ii<nCell; ii++){
   2595     RtreeNode *pInsert;
   2596     RtreeCell cell;
   2597     nodeGetCell(pRtree, pNode, ii, &cell);
   2598 
   2599     /* Find a node to store this cell in. pNode->iNode currently contains
   2600     ** the height of the sub-tree headed by the cell.
   2601     */
   2602     rc = ChooseLeaf(pRtree, &cell, pNode->iNode, &pInsert);
   2603     if( rc==SQLITE_OK ){
   2604       int rc2;
   2605       rc = rtreeInsertCell(pRtree, pInsert, &cell, pNode->iNode);
   2606       rc2 = nodeRelease(pRtree, pInsert);
   2607       if( rc==SQLITE_OK ){
   2608         rc = rc2;
   2609       }
   2610     }
   2611   }
   2612   return rc;
   2613 }
   2614 
   2615 /*
   2616 ** Select a currently unused rowid for a new r-tree record.
   2617 */
   2618 static int newRowid(Rtree *pRtree, i64 *piRowid){
   2619   int rc;
   2620   sqlite3_bind_null(pRtree->pWriteRowid, 1);
   2621   sqlite3_bind_null(pRtree->pWriteRowid, 2);
   2622   sqlite3_step(pRtree->pWriteRowid);
   2623   rc = sqlite3_reset(pRtree->pWriteRowid);
   2624   *piRowid = sqlite3_last_insert_rowid(pRtree->db);
   2625   return rc;
   2626 }
   2627 
   2628 /*
   2629 ** The xUpdate method for rtree module virtual tables.
   2630 */
   2631 static int rtreeUpdate(
   2632   sqlite3_vtab *pVtab,
   2633   int nData,
   2634   sqlite3_value **azData,
   2635   sqlite_int64 *pRowid
   2636 ){
   2637   Rtree *pRtree = (Rtree *)pVtab;
   2638   int rc = SQLITE_OK;
   2639 
   2640   rtreeReference(pRtree);
   2641 
   2642   assert(nData>=1);
   2643 
   2644   /* If azData[0] is not an SQL NULL value, it is the rowid of a
   2645   ** record to delete from the r-tree table. The following block does
   2646   ** just that.
   2647   */
   2648   if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){
   2649     i64 iDelete;                /* The rowid to delete */
   2650     RtreeNode *pLeaf;           /* Leaf node containing record iDelete */
   2651     int iCell;                  /* Index of iDelete cell in pLeaf */
   2652     RtreeNode *pRoot;
   2653 
   2654     /* Obtain a reference to the root node to initialise Rtree.iDepth */
   2655     rc = nodeAcquire(pRtree, 1, 0, &pRoot);
   2656 
   2657     /* Obtain a reference to the leaf node that contains the entry
   2658     ** about to be deleted.
   2659     */
   2660     if( rc==SQLITE_OK ){
   2661       iDelete = sqlite3_value_int64(azData[0]);
   2662       rc = findLeafNode(pRtree, iDelete, &pLeaf);
   2663     }
   2664 
   2665     /* Delete the cell in question from the leaf node. */
   2666     if( rc==SQLITE_OK ){
   2667       int rc2;
   2668       rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell);
   2669       if( rc==SQLITE_OK ){
   2670         rc = deleteCell(pRtree, pLeaf, iCell, 0);
   2671       }
   2672       rc2 = nodeRelease(pRtree, pLeaf);
   2673       if( rc==SQLITE_OK ){
   2674         rc = rc2;
   2675       }
   2676     }
   2677 
   2678     /* Delete the corresponding entry in the <rtree>_rowid table. */
   2679     if( rc==SQLITE_OK ){
   2680       sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete);
   2681       sqlite3_step(pRtree->pDeleteRowid);
   2682       rc = sqlite3_reset(pRtree->pDeleteRowid);
   2683     }
   2684 
   2685     /* Check if the root node now has exactly one child. If so, remove
   2686     ** it, schedule the contents of the child for reinsertion and
   2687     ** reduce the tree height by one.
   2688     **
   2689     ** This is equivalent to copying the contents of the child into
   2690     ** the root node (the operation that Gutman's paper says to perform
   2691     ** in this scenario).
   2692     */
   2693     if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){
   2694       int rc2;
   2695       RtreeNode *pChild;
   2696       i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
   2697       rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
   2698       if( rc==SQLITE_OK ){
   2699         rc = removeNode(pRtree, pChild, pRtree->iDepth-1);
   2700       }
   2701       rc2 = nodeRelease(pRtree, pChild);
   2702       if( rc==SQLITE_OK ) rc = rc2;
   2703       if( rc==SQLITE_OK ){
   2704         pRtree->iDepth--;
   2705         writeInt16(pRoot->zData, pRtree->iDepth);
   2706         pRoot->isDirty = 1;
   2707       }
   2708     }
   2709 
   2710     /* Re-insert the contents of any underfull nodes removed from the tree. */
   2711     for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){
   2712       if( rc==SQLITE_OK ){
   2713         rc = reinsertNodeContent(pRtree, pLeaf);
   2714       }
   2715       pRtree->pDeleted = pLeaf->pNext;
   2716       sqlite3_free(pLeaf);
   2717     }
   2718 
   2719     /* Release the reference to the root node. */
   2720     if( rc==SQLITE_OK ){
   2721       rc = nodeRelease(pRtree, pRoot);
   2722     }else{
   2723       nodeRelease(pRtree, pRoot);
   2724     }
   2725   }
   2726 
   2727   /* If the azData[] array contains more than one element, elements
   2728   ** (azData[2]..azData[argc-1]) contain a new record to insert into
   2729   ** the r-tree structure.
   2730   */
   2731   if( rc==SQLITE_OK && nData>1 ){
   2732     /* Insert a new record into the r-tree */
   2733     RtreeCell cell;
   2734     int ii;
   2735     RtreeNode *pLeaf;
   2736 
   2737     /* Populate the cell.aCoord[] array. The first coordinate is azData[3]. */
   2738     assert( nData==(pRtree->nDim*2 + 3) );
   2739     if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
   2740       for(ii=0; ii<(pRtree->nDim*2); ii+=2){
   2741         cell.aCoord[ii].f = (float)sqlite3_value_double(azData[ii+3]);
   2742         cell.aCoord[ii+1].f = (float)sqlite3_value_double(azData[ii+4]);
   2743         if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){
   2744           rc = SQLITE_CONSTRAINT;
   2745           goto constraint;
   2746         }
   2747       }
   2748     }else{
   2749       for(ii=0; ii<(pRtree->nDim*2); ii+=2){
   2750         cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]);
   2751         cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]);
   2752         if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){
   2753           rc = SQLITE_CONSTRAINT;
   2754           goto constraint;
   2755         }
   2756       }
   2757     }
   2758 
   2759     /* Figure out the rowid of the new row. */
   2760     if( sqlite3_value_type(azData[2])==SQLITE_NULL ){
   2761       rc = newRowid(pRtree, &cell.iRowid);
   2762     }else{
   2763       cell.iRowid = sqlite3_value_int64(azData[2]);
   2764       sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
   2765       if( SQLITE_ROW==sqlite3_step(pRtree->pReadRowid) ){
   2766         sqlite3_reset(pRtree->pReadRowid);
   2767         rc = SQLITE_CONSTRAINT;
   2768         goto constraint;
   2769       }
   2770       rc = sqlite3_reset(pRtree->pReadRowid);
   2771     }
   2772     *pRowid = cell.iRowid;
   2773 
   2774     if( rc==SQLITE_OK ){
   2775       rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf);
   2776     }
   2777     if( rc==SQLITE_OK ){
   2778       int rc2;
   2779       pRtree->iReinsertHeight = -1;
   2780       rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0);
   2781       rc2 = nodeRelease(pRtree, pLeaf);
   2782       if( rc==SQLITE_OK ){
   2783         rc = rc2;
   2784       }
   2785     }
   2786   }
   2787 
   2788 constraint:
   2789   rtreeRelease(pRtree);
   2790   return rc;
   2791 }
   2792 
   2793 /*
   2794 ** The xRename method for rtree module virtual tables.
   2795 */
   2796 static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){
   2797   Rtree *pRtree = (Rtree *)pVtab;
   2798   int rc = SQLITE_NOMEM;
   2799   char *zSql = sqlite3_mprintf(
   2800     "ALTER TABLE %Q.'%q_node'   RENAME TO \"%w_node\";"
   2801     "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";"
   2802     "ALTER TABLE %Q.'%q_rowid'  RENAME TO \"%w_rowid\";"
   2803     , pRtree->zDb, pRtree->zName, zNewName
   2804     , pRtree->zDb, pRtree->zName, zNewName
   2805     , pRtree->zDb, pRtree->zName, zNewName
   2806   );
   2807   if( zSql ){
   2808     rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0);
   2809     sqlite3_free(zSql);
   2810   }
   2811   return rc;
   2812 }
   2813 
   2814 static sqlite3_module rtreeModule = {
   2815   0,                         /* iVersion */
   2816   rtreeCreate,                /* xCreate - create a table */
   2817   rtreeConnect,               /* xConnect - connect to an existing table */
   2818   rtreeBestIndex,             /* xBestIndex - Determine search strategy */
   2819   rtreeDisconnect,            /* xDisconnect - Disconnect from a table */
   2820   rtreeDestroy,               /* xDestroy - Drop a table */
   2821   rtreeOpen,                  /* xOpen - open a cursor */
   2822   rtreeClose,                 /* xClose - close a cursor */
   2823   rtreeFilter,                /* xFilter - configure scan constraints */
   2824   rtreeNext,                  /* xNext - advance a cursor */
   2825   rtreeEof,                   /* xEof */
   2826   rtreeColumn,                /* xColumn - read data */
   2827   rtreeRowid,                 /* xRowid - read data */
   2828   rtreeUpdate,                /* xUpdate - write data */
   2829   0,                          /* xBegin - begin transaction */
   2830   0,                          /* xSync - sync transaction */
   2831   0,                          /* xCommit - commit transaction */
   2832   0,                          /* xRollback - rollback transaction */
   2833   0,                          /* xFindFunction - function overloading */
   2834   rtreeRename                 /* xRename - rename the table */
   2835 };
   2836 
   2837 static int rtreeSqlInit(
   2838   Rtree *pRtree,
   2839   sqlite3 *db,
   2840   const char *zDb,
   2841   const char *zPrefix,
   2842   int isCreate
   2843 ){
   2844   int rc = SQLITE_OK;
   2845 
   2846   #define N_STATEMENT 9
   2847   static const char *azSql[N_STATEMENT] = {
   2848     /* Read and write the xxx_node table */
   2849     "SELECT data FROM '%q'.'%q_node' WHERE nodeno = :1",
   2850     "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
   2851     "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
   2852 
   2853     /* Read and write the xxx_rowid table */
   2854     "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
   2855     "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
   2856     "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
   2857 
   2858     /* Read and write the xxx_parent table */
   2859     "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
   2860     "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
   2861     "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
   2862   };
   2863   sqlite3_stmt **appStmt[N_STATEMENT];
   2864   int i;
   2865 
   2866   pRtree->db = db;
   2867 
   2868   if( isCreate ){
   2869     char *zCreate = sqlite3_mprintf(
   2870 "CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
   2871 "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
   2872 "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER);"
   2873 "INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
   2874       zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize
   2875     );
   2876     if( !zCreate ){
   2877       return SQLITE_NOMEM;
   2878     }
   2879     rc = sqlite3_exec(db, zCreate, 0, 0, 0);
   2880     sqlite3_free(zCreate);
   2881     if( rc!=SQLITE_OK ){
   2882       return rc;
   2883     }
   2884   }
   2885 
   2886   appStmt[0] = &pRtree->pReadNode;
   2887   appStmt[1] = &pRtree->pWriteNode;
   2888   appStmt[2] = &pRtree->pDeleteNode;
   2889   appStmt[3] = &pRtree->pReadRowid;
   2890   appStmt[4] = &pRtree->pWriteRowid;
   2891   appStmt[5] = &pRtree->pDeleteRowid;
   2892   appStmt[6] = &pRtree->pReadParent;
   2893   appStmt[7] = &pRtree->pWriteParent;
   2894   appStmt[8] = &pRtree->pDeleteParent;
   2895 
   2896   for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
   2897     char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
   2898     if( zSql ){
   2899       rc = sqlite3_prepare_v2(db, zSql, -1, appStmt[i], 0);
   2900     }else{
   2901       rc = SQLITE_NOMEM;
   2902     }
   2903     sqlite3_free(zSql);
   2904   }
   2905 
   2906   return rc;
   2907 }
   2908 
   2909 /*
   2910 ** The second argument to this function contains the text of an SQL statement
   2911 ** that returns a single integer value. The statement is compiled and executed
   2912 ** using database connection db. If successful, the integer value returned
   2913 ** is written to *piVal and SQLITE_OK returned. Otherwise, an SQLite error
   2914 ** code is returned and the value of *piVal after returning is not defined.
   2915 */
   2916 static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){
   2917   int rc = SQLITE_NOMEM;
   2918   if( zSql ){
   2919     sqlite3_stmt *pStmt = 0;
   2920     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
   2921     if( rc==SQLITE_OK ){
   2922       if( SQLITE_ROW==sqlite3_step(pStmt) ){
   2923         *piVal = sqlite3_column_int(pStmt, 0);
   2924       }
   2925       rc = sqlite3_finalize(pStmt);
   2926     }
   2927   }
   2928   return rc;
   2929 }
   2930 
   2931 /*
   2932 ** This function is called from within the xConnect() or xCreate() method to
   2933 ** determine the node-size used by the rtree table being created or connected
   2934 ** to. If successful, pRtree->iNodeSize is populated and SQLITE_OK returned.
   2935 ** Otherwise, an SQLite error code is returned.
   2936 **
   2937 ** If this function is being called as part of an xConnect(), then the rtree
   2938 ** table already exists. In this case the node-size is determined by inspecting
   2939 ** the root node of the tree.
   2940 **
   2941 ** Otherwise, for an xCreate(), use 64 bytes less than the database page-size.
   2942 ** This ensures that each node is stored on a single database page. If the
   2943 ** database page-size is so large that more than RTREE_MAXCELLS entries
   2944 ** would fit in a single node, use a smaller node-size.
   2945 */
   2946 static int getNodeSize(
   2947   sqlite3 *db,                    /* Database handle */
   2948   Rtree *pRtree,                  /* Rtree handle */
   2949   int isCreate                    /* True for xCreate, false for xConnect */
   2950 ){
   2951   int rc;
   2952   char *zSql;
   2953   if( isCreate ){
   2954     int iPageSize;
   2955     zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb);
   2956     rc = getIntFromStmt(db, zSql, &iPageSize);
   2957     if( rc==SQLITE_OK ){
   2958       pRtree->iNodeSize = iPageSize-64;
   2959       if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)<pRtree->iNodeSize ){
   2960         pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS;
   2961       }
   2962     }
   2963   }else{
   2964     zSql = sqlite3_mprintf(
   2965         "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1",
   2966         pRtree->zDb, pRtree->zName
   2967     );
   2968     rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize);
   2969   }
   2970 
   2971   sqlite3_free(zSql);
   2972   return rc;
   2973 }
   2974 
   2975 /*
   2976 ** This function is the implementation of both the xConnect and xCreate
   2977 ** methods of the r-tree virtual table.
   2978 **
   2979 **   argv[0]   -> module name
   2980 **   argv[1]   -> database name
   2981 **   argv[2]   -> table name
   2982 **   argv[...] -> column names...
   2983 */
   2984 static int rtreeInit(
   2985   sqlite3 *db,                        /* Database connection */
   2986   void *pAux,                         /* One of the RTREE_COORD_* constants */
   2987   int argc, const char *const*argv,   /* Parameters to CREATE TABLE statement */
   2988   sqlite3_vtab **ppVtab,              /* OUT: New virtual table */
   2989   char **pzErr,                       /* OUT: Error message, if any */
   2990   int isCreate                        /* True for xCreate, false for xConnect */
   2991 ){
   2992   int rc = SQLITE_OK;
   2993   Rtree *pRtree;
   2994   int nDb;              /* Length of string argv[1] */
   2995   int nName;            /* Length of string argv[2] */
   2996   int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32);
   2997 
   2998   const char *aErrMsg[] = {
   2999     0,                                                    /* 0 */
   3000     "Wrong number of columns for an rtree table",         /* 1 */
   3001     "Too few columns for an rtree table",                 /* 2 */
   3002     "Too many columns for an rtree table"                 /* 3 */
   3003   };
   3004 
   3005   int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2;
   3006   if( aErrMsg[iErr] ){
   3007     *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
   3008     return SQLITE_ERROR;
   3009   }
   3010 
   3011   /* Allocate the sqlite3_vtab structure */
   3012   nDb = strlen(argv[1]);
   3013   nName = strlen(argv[2]);
   3014   pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2);
   3015   if( !pRtree ){
   3016     return SQLITE_NOMEM;
   3017   }
   3018   memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2);
   3019   pRtree->nBusy = 1;
   3020   pRtree->base.pModule = &rtreeModule;
   3021   pRtree->zDb = (char *)&pRtree[1];
   3022   pRtree->zName = &pRtree->zDb[nDb+1];
   3023   pRtree->nDim = (argc-4)/2;
   3024   pRtree->nBytesPerCell = 8 + pRtree->nDim*4*2;
   3025   pRtree->eCoordType = eCoordType;
   3026   memcpy(pRtree->zDb, argv[1], nDb);
   3027   memcpy(pRtree->zName, argv[2], nName);
   3028 
   3029   /* Figure out the node size to use. */
   3030   rc = getNodeSize(db, pRtree, isCreate);
   3031 
   3032   /* Create/Connect to the underlying relational database schema. If
   3033   ** that is successful, call sqlite3_declare_vtab() to configure
   3034   ** the r-tree table schema.
   3035   */
   3036   if( rc==SQLITE_OK ){
   3037     if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){
   3038       *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
   3039     }else{
   3040       char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]);
   3041       char *zTmp;
   3042       int ii;
   3043       for(ii=4; zSql && ii<argc; ii++){
   3044         zTmp = zSql;
   3045         zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]);
   3046         sqlite3_free(zTmp);
   3047       }
   3048       if( zSql ){
   3049         zTmp = zSql;
   3050         zSql = sqlite3_mprintf("%s);", zTmp);
   3051         sqlite3_free(zTmp);
   3052       }
   3053       if( !zSql ){
   3054         rc = SQLITE_NOMEM;
   3055       }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
   3056         *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
   3057       }
   3058       sqlite3_free(zSql);
   3059     }
   3060   }
   3061 
   3062   if( rc==SQLITE_OK ){
   3063     *ppVtab = (sqlite3_vtab *)pRtree;
   3064   }else{
   3065     rtreeRelease(pRtree);
   3066   }
   3067   return rc;
   3068 }
   3069 
   3070 
   3071 /*
   3072 ** Implementation of a scalar function that decodes r-tree nodes to
   3073 ** human readable strings. This can be used for debugging and analysis.
   3074 **
   3075 ** The scalar function takes two arguments, a blob of data containing
   3076 ** an r-tree node, and the number of dimensions the r-tree indexes.
   3077 ** For a two-dimensional r-tree structure called "rt", to deserialize
   3078 ** all nodes, a statement like:
   3079 **
   3080 **   SELECT rtreenode(2, data) FROM rt_node;
   3081 **
   3082 ** The human readable string takes the form of a Tcl list with one
   3083 ** entry for each cell in the r-tree node. Each entry is itself a
   3084 ** list, containing the 8-byte rowid/pageno followed by the
   3085 ** <num-dimension>*2 coordinates.
   3086 */
   3087 static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
   3088   char *zText = 0;
   3089   RtreeNode node;
   3090   Rtree tree;
   3091   int ii;
   3092 
   3093   UNUSED_PARAMETER(nArg);
   3094   memset(&node, 0, sizeof(RtreeNode));
   3095   memset(&tree, 0, sizeof(Rtree));
   3096   tree.nDim = sqlite3_value_int(apArg[0]);
   3097   tree.nBytesPerCell = 8 + 8 * tree.nDim;
   3098   node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
   3099 
   3100   for(ii=0; ii<NCELL(&node); ii++){
   3101     char zCell[512];
   3102     int nCell = 0;
   3103     RtreeCell cell;
   3104     int jj;
   3105 
   3106     nodeGetCell(&tree, &node, ii, &cell);
   3107     sqlite3_snprintf(512-nCell,&zCell[nCell],"%lld", cell.iRowid);
   3108     nCell = strlen(zCell);
   3109     for(jj=0; jj<tree.nDim*2; jj++){
   3110       sqlite3_snprintf(512-nCell,&zCell[nCell]," %f",(double)cell.aCoord[jj].f);
   3111       nCell = strlen(zCell);
   3112     }
   3113 
   3114     if( zText ){
   3115       char *zTextNew = sqlite3_mprintf("%s {%s}", zText, zCell);
   3116       sqlite3_free(zText);
   3117       zText = zTextNew;
   3118     }else{
   3119       zText = sqlite3_mprintf("{%s}", zCell);
   3120     }
   3121   }
   3122 
   3123   sqlite3_result_text(ctx, zText, -1, sqlite3_free);
   3124 }
   3125 
   3126 static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
   3127   UNUSED_PARAMETER(nArg);
   3128   if( sqlite3_value_type(apArg[0])!=SQLITE_BLOB
   3129    || sqlite3_value_bytes(apArg[0])<2
   3130   ){
   3131     sqlite3_result_error(ctx, "Invalid argument to rtreedepth()", -1);
   3132   }else{
   3133     u8 *zBlob = (u8 *)sqlite3_value_blob(apArg[0]);
   3134     sqlite3_result_int(ctx, readInt16(zBlob));
   3135   }
   3136 }
   3137 
   3138 /*
   3139 ** Register the r-tree module with database handle db. This creates the
   3140 ** virtual table module "rtree" and the debugging/analysis scalar
   3141 ** function "rtreenode".
   3142 */
   3143 int sqlite3RtreeInit(sqlite3 *db){
   3144   const int utf8 = SQLITE_UTF8;
   3145   int rc;
   3146 
   3147   rc = sqlite3_create_function(db, "rtreenode", 2, utf8, 0, rtreenode, 0, 0);
   3148   if( rc==SQLITE_OK ){
   3149     rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0);
   3150   }
   3151   if( rc==SQLITE_OK ){
   3152     void *c = (void *)RTREE_COORD_REAL32;
   3153     rc = sqlite3_create_module_v2(db, "rtree", &rtreeModule, c, 0);
   3154   }
   3155   if( rc==SQLITE_OK ){
   3156     void *c = (void *)RTREE_COORD_INT32;
   3157     rc = sqlite3_create_module_v2(db, "rtree_i32", &rtreeModule, c, 0);
   3158   }
   3159 
   3160   return rc;
   3161 }
   3162 
   3163 /*
   3164 ** A version of sqlite3_free() that can be used as a callback. This is used
   3165 ** in two places - as the destructor for the blob value returned by the
   3166 ** invocation of a geometry function, and as the destructor for the geometry
   3167 ** functions themselves.
   3168 */
   3169 static void doSqlite3Free(void *p){
   3170   sqlite3_free(p);
   3171 }
   3172 
   3173 /*
   3174 ** Each call to sqlite3_rtree_geometry_callback() creates an ordinary SQLite
   3175 ** scalar user function. This C function is the callback used for all such
   3176 ** registered SQL functions.
   3177 **
   3178 ** The scalar user functions return a blob that is interpreted by r-tree
   3179 ** table MATCH operators.
   3180 */
   3181 static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){
   3182   RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx);
   3183   RtreeMatchArg *pBlob;
   3184   int nBlob;
   3185 
   3186   nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(double);
   3187   pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob);
   3188   if( !pBlob ){
   3189     sqlite3_result_error_nomem(ctx);
   3190   }else{
   3191     int i;
   3192     pBlob->magic = RTREE_GEOMETRY_MAGIC;
   3193     pBlob->xGeom = pGeomCtx->xGeom;
   3194     pBlob->pContext = pGeomCtx->pContext;
   3195     pBlob->nParam = nArg;
   3196     for(i=0; i<nArg; i++){
   3197       pBlob->aParam[i] = sqlite3_value_double(aArg[i]);
   3198     }
   3199     sqlite3_result_blob(ctx, pBlob, nBlob, doSqlite3Free);
   3200   }
   3201 }
   3202 
   3203 /*
   3204 ** Register a new geometry function for use with the r-tree MATCH operator.
   3205 */
   3206 int sqlite3_rtree_geometry_callback(
   3207   sqlite3 *db,
   3208   const char *zGeom,
   3209   int (*xGeom)(sqlite3_rtree_geometry *, int, double *, int *),
   3210   void *pContext
   3211 ){
   3212   RtreeGeomCallback *pGeomCtx;      /* Context object for new user-function */
   3213 
   3214   /* Allocate and populate the context object. */
   3215   pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback));
   3216   if( !pGeomCtx ) return SQLITE_NOMEM;
   3217   pGeomCtx->xGeom = xGeom;
   3218   pGeomCtx->pContext = pContext;
   3219 
   3220   /* Create the new user-function. Register a destructor function to delete
   3221   ** the context object when it is no longer required.  */
   3222   return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY,
   3223       (void *)pGeomCtx, geomCallback, 0, 0, doSqlite3Free
   3224   );
   3225 }
   3226 
   3227 #if !SQLITE_CORE
   3228 int sqlite3_extension_init(
   3229   sqlite3 *db,
   3230   char **pzErrMsg,
   3231   const sqlite3_api_routines *pApi
   3232 ){
   3233   SQLITE_EXTENSION_INIT2(pApi)
   3234   return sqlite3RtreeInit(db);
   3235 }
   3236 #endif
   3237 
   3238 #endif
   3239