Annotation of embedaddon/sqlite3/ext/rtree/rtree.c, revision 1.1.1.1

1.1       misho       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_VTAB;
                    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_VTAB.
                    527:   */
                    528:   if( pNode && rc==SQLITE_OK ){
                    529:     if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){
                    530:       rc = SQLITE_CORRUPT_VTAB;
                    531:     }
                    532:   }
                    533: 
                    534:   if( rc==SQLITE_OK ){
                    535:     if( pNode!=0 ){
                    536:       nodeHashInsert(pRtree, pNode);
                    537:     }else{
                    538:       rc = SQLITE_CORRUPT_VTAB;
                    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_VTAB;
                   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)
                   1272:                 || (idxStr && (int)strlen(idxStr)==argc*2) );
                   1273:         for(ii=0; ii<argc; ii++){
                   1274:           RtreeConstraint *p = &pCsr->aConstraint[ii];
                   1275:           p->op = idxStr[ii*2];
                   1276:           p->iCoord = idxStr[ii*2+1]-'a';
                   1277:           if( p->op==RTREE_MATCH ){
                   1278:             /* A MATCH operator. The right-hand-side must be a blob that
                   1279:             ** can be cast into an RtreeMatchArg object. One created using
                   1280:             ** an sqlite3_rtree_geometry_callback() SQL user function.
                   1281:             */
                   1282:             rc = deserializeGeometry(argv[ii], p);
                   1283:             if( rc!=SQLITE_OK ){
                   1284:               break;
                   1285:             }
                   1286:           }else{
                   1287:             p->rValue = sqlite3_value_double(argv[ii]);
                   1288:           }
                   1289:         }
                   1290:       }
                   1291:     }
                   1292:   
                   1293:     if( rc==SQLITE_OK ){
                   1294:       pCsr->pNode = 0;
                   1295:       rc = nodeAcquire(pRtree, 1, 0, &pRoot);
                   1296:     }
                   1297:     if( rc==SQLITE_OK ){
                   1298:       int isEof = 1;
                   1299:       int nCell = NCELL(pRoot);
                   1300:       pCsr->pNode = pRoot;
                   1301:       for(pCsr->iCell=0; rc==SQLITE_OK && pCsr->iCell<nCell; pCsr->iCell++){
                   1302:         assert( pCsr->pNode==pRoot );
                   1303:         rc = descendToCell(pRtree, pCsr, pRtree->iDepth, &isEof);
                   1304:         if( !isEof ){
                   1305:           break;
                   1306:         }
                   1307:       }
                   1308:       if( rc==SQLITE_OK && isEof ){
                   1309:         assert( pCsr->pNode==pRoot );
                   1310:         nodeRelease(pRtree, pRoot);
                   1311:         pCsr->pNode = 0;
                   1312:       }
                   1313:       assert( rc!=SQLITE_OK || !pCsr->pNode || pCsr->iCell<NCELL(pCsr->pNode) );
                   1314:     }
                   1315:   }
                   1316: 
                   1317:   rtreeRelease(pRtree);
                   1318:   return rc;
                   1319: }
                   1320: 
                   1321: /*
                   1322: ** Rtree virtual table module xBestIndex method. There are three
                   1323: ** table scan strategies to choose from (in order from most to 
                   1324: ** least desirable):
                   1325: **
                   1326: **   idxNum     idxStr        Strategy
                   1327: **   ------------------------------------------------
                   1328: **     1        Unused        Direct lookup by rowid.
                   1329: **     2        See below     R-tree query or full-table scan.
                   1330: **   ------------------------------------------------
                   1331: **
                   1332: ** If strategy 1 is used, then idxStr is not meaningful. If strategy
                   1333: ** 2 is used, idxStr is formatted to contain 2 bytes for each 
                   1334: ** constraint used. The first two bytes of idxStr correspond to 
                   1335: ** the constraint in sqlite3_index_info.aConstraintUsage[] with
                   1336: ** (argvIndex==1) etc.
                   1337: **
                   1338: ** The first of each pair of bytes in idxStr identifies the constraint
                   1339: ** operator as follows:
                   1340: **
                   1341: **   Operator    Byte Value
                   1342: **   ----------------------
                   1343: **      =        0x41 ('A')
                   1344: **     <=        0x42 ('B')
                   1345: **      <        0x43 ('C')
                   1346: **     >=        0x44 ('D')
                   1347: **      >        0x45 ('E')
                   1348: **   MATCH       0x46 ('F')
                   1349: **   ----------------------
                   1350: **
                   1351: ** The second of each pair of bytes identifies the coordinate column
                   1352: ** to which the constraint applies. The leftmost coordinate column
                   1353: ** is 'a', the second from the left 'b' etc.
                   1354: */
                   1355: static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
                   1356:   int rc = SQLITE_OK;
                   1357:   int ii;
                   1358: 
                   1359:   int iIdx = 0;
                   1360:   char zIdxStr[RTREE_MAX_DIMENSIONS*8+1];
                   1361:   memset(zIdxStr, 0, sizeof(zIdxStr));
                   1362:   UNUSED_PARAMETER(tab);
                   1363: 
                   1364:   assert( pIdxInfo->idxStr==0 );
                   1365:   for(ii=0; ii<pIdxInfo->nConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){
                   1366:     struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
                   1367: 
                   1368:     if( p->usable && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
                   1369:       /* We have an equality constraint on the rowid. Use strategy 1. */
                   1370:       int jj;
                   1371:       for(jj=0; jj<ii; jj++){
                   1372:         pIdxInfo->aConstraintUsage[jj].argvIndex = 0;
                   1373:         pIdxInfo->aConstraintUsage[jj].omit = 0;
                   1374:       }
                   1375:       pIdxInfo->idxNum = 1;
                   1376:       pIdxInfo->aConstraintUsage[ii].argvIndex = 1;
                   1377:       pIdxInfo->aConstraintUsage[jj].omit = 1;
                   1378: 
                   1379:       /* This strategy involves a two rowid lookups on an B-Tree structures
                   1380:       ** and then a linear search of an R-Tree node. This should be 
                   1381:       ** considered almost as quick as a direct rowid lookup (for which 
                   1382:       ** sqlite uses an internal cost of 0.0).
                   1383:       */ 
                   1384:       pIdxInfo->estimatedCost = 10.0;
                   1385:       return SQLITE_OK;
                   1386:     }
                   1387: 
                   1388:     if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){
                   1389:       u8 op;
                   1390:       switch( p->op ){
                   1391:         case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break;
                   1392:         case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break;
                   1393:         case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break;
                   1394:         case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break;
                   1395:         case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break;
                   1396:         default:
                   1397:           assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH );
                   1398:           op = RTREE_MATCH; 
                   1399:           break;
                   1400:       }
                   1401:       zIdxStr[iIdx++] = op;
                   1402:       zIdxStr[iIdx++] = p->iColumn - 1 + 'a';
                   1403:       pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2);
                   1404:       pIdxInfo->aConstraintUsage[ii].omit = 1;
                   1405:     }
                   1406:   }
                   1407: 
                   1408:   pIdxInfo->idxNum = 2;
                   1409:   pIdxInfo->needToFreeIdxStr = 1;
                   1410:   if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){
                   1411:     return SQLITE_NOMEM;
                   1412:   }
                   1413:   assert( iIdx>=0 );
                   1414:   pIdxInfo->estimatedCost = (2000000.0 / (double)(iIdx + 1));
                   1415:   return rc;
                   1416: }
                   1417: 
                   1418: /*
                   1419: ** Return the N-dimensional volumn of the cell stored in *p.
                   1420: */
                   1421: static float cellArea(Rtree *pRtree, RtreeCell *p){
                   1422:   float area = 1.0;
                   1423:   int ii;
                   1424:   for(ii=0; ii<(pRtree->nDim*2); ii+=2){
                   1425:     area = (float)(area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii])));
                   1426:   }
                   1427:   return area;
                   1428: }
                   1429: 
                   1430: /*
                   1431: ** Return the margin length of cell p. The margin length is the sum
                   1432: ** of the objects size in each dimension.
                   1433: */
                   1434: static float cellMargin(Rtree *pRtree, RtreeCell *p){
                   1435:   float margin = 0.0;
                   1436:   int ii;
                   1437:   for(ii=0; ii<(pRtree->nDim*2); ii+=2){
                   1438:     margin += (float)(DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
                   1439:   }
                   1440:   return margin;
                   1441: }
                   1442: 
                   1443: /*
                   1444: ** Store the union of cells p1 and p2 in p1.
                   1445: */
                   1446: static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
                   1447:   int ii;
                   1448:   if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
                   1449:     for(ii=0; ii<(pRtree->nDim*2); ii+=2){
                   1450:       p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f);
                   1451:       p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f);
                   1452:     }
                   1453:   }else{
                   1454:     for(ii=0; ii<(pRtree->nDim*2); ii+=2){
                   1455:       p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i);
                   1456:       p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i);
                   1457:     }
                   1458:   }
                   1459: }
                   1460: 
                   1461: /*
                   1462: ** Return true if the area covered by p2 is a subset of the area covered
                   1463: ** by p1. False otherwise.
                   1464: */
                   1465: static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
                   1466:   int ii;
                   1467:   int isInt = (pRtree->eCoordType==RTREE_COORD_INT32);
                   1468:   for(ii=0; ii<(pRtree->nDim*2); ii+=2){
                   1469:     RtreeCoord *a1 = &p1->aCoord[ii];
                   1470:     RtreeCoord *a2 = &p2->aCoord[ii];
                   1471:     if( (!isInt && (a2[0].f<a1[0].f || a2[1].f>a1[1].f)) 
                   1472:      || ( isInt && (a2[0].i<a1[0].i || a2[1].i>a1[1].i)) 
                   1473:     ){
                   1474:       return 0;
                   1475:     }
                   1476:   }
                   1477:   return 1;
                   1478: }
                   1479: 
                   1480: /*
                   1481: ** Return the amount cell p would grow by if it were unioned with pCell.
                   1482: */
                   1483: static float cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){
                   1484:   float area;
                   1485:   RtreeCell cell;
                   1486:   memcpy(&cell, p, sizeof(RtreeCell));
                   1487:   area = cellArea(pRtree, &cell);
                   1488:   cellUnion(pRtree, &cell, pCell);
                   1489:   return (cellArea(pRtree, &cell)-area);
                   1490: }
                   1491: 
                   1492: #if VARIANT_RSTARTREE_CHOOSESUBTREE || VARIANT_RSTARTREE_SPLIT
                   1493: static float cellOverlap(
                   1494:   Rtree *pRtree, 
                   1495:   RtreeCell *p, 
                   1496:   RtreeCell *aCell, 
                   1497:   int nCell, 
                   1498:   int iExclude
                   1499: ){
                   1500:   int ii;
                   1501:   float overlap = 0.0;
                   1502:   for(ii=0; ii<nCell; ii++){
                   1503: #if VARIANT_RSTARTREE_CHOOSESUBTREE
                   1504:     if( ii!=iExclude )
                   1505: #else
                   1506:     assert( iExclude==-1 );
                   1507:     UNUSED_PARAMETER(iExclude);
                   1508: #endif
                   1509:     {
                   1510:       int jj;
                   1511:       float o = 1.0;
                   1512:       for(jj=0; jj<(pRtree->nDim*2); jj+=2){
                   1513:         double x1;
                   1514:         double x2;
                   1515: 
                   1516:         x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj]));
                   1517:         x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1]));
                   1518: 
                   1519:         if( x2<x1 ){
                   1520:           o = 0.0;
                   1521:           break;
                   1522:         }else{
                   1523:           o = o * (float)(x2-x1);
                   1524:         }
                   1525:       }
                   1526:       overlap += o;
                   1527:     }
                   1528:   }
                   1529:   return overlap;
                   1530: }
                   1531: #endif
                   1532: 
                   1533: #if VARIANT_RSTARTREE_CHOOSESUBTREE
                   1534: static float cellOverlapEnlargement(
                   1535:   Rtree *pRtree, 
                   1536:   RtreeCell *p, 
                   1537:   RtreeCell *pInsert, 
                   1538:   RtreeCell *aCell, 
                   1539:   int nCell, 
                   1540:   int iExclude
                   1541: ){
                   1542:   double before;
                   1543:   double after;
                   1544:   before = cellOverlap(pRtree, p, aCell, nCell, iExclude);
                   1545:   cellUnion(pRtree, p, pInsert);
                   1546:   after = cellOverlap(pRtree, p, aCell, nCell, iExclude);
                   1547:   return (float)(after-before);
                   1548: }
                   1549: #endif
                   1550: 
                   1551: 
                   1552: /*
                   1553: ** This function implements the ChooseLeaf algorithm from Gutman[84].
                   1554: ** ChooseSubTree in r*tree terminology.
                   1555: */
                   1556: static int ChooseLeaf(
                   1557:   Rtree *pRtree,               /* Rtree table */
                   1558:   RtreeCell *pCell,            /* Cell to insert into rtree */
                   1559:   int iHeight,                 /* Height of sub-tree rooted at pCell */
                   1560:   RtreeNode **ppLeaf           /* OUT: Selected leaf page */
                   1561: ){
                   1562:   int rc;
                   1563:   int ii;
                   1564:   RtreeNode *pNode;
                   1565:   rc = nodeAcquire(pRtree, 1, 0, &pNode);
                   1566: 
                   1567:   for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
                   1568:     int iCell;
                   1569:     sqlite3_int64 iBest = 0;
                   1570: 
                   1571:     float fMinGrowth = 0.0;
                   1572:     float fMinArea = 0.0;
                   1573: #if VARIANT_RSTARTREE_CHOOSESUBTREE
                   1574:     float fMinOverlap = 0.0;
                   1575:     float overlap;
                   1576: #endif
                   1577: 
                   1578:     int nCell = NCELL(pNode);
                   1579:     RtreeCell cell;
                   1580:     RtreeNode *pChild;
                   1581: 
                   1582:     RtreeCell *aCell = 0;
                   1583: 
                   1584: #if VARIANT_RSTARTREE_CHOOSESUBTREE
                   1585:     if( ii==(pRtree->iDepth-1) ){
                   1586:       int jj;
                   1587:       aCell = sqlite3_malloc(sizeof(RtreeCell)*nCell);
                   1588:       if( !aCell ){
                   1589:         rc = SQLITE_NOMEM;
                   1590:         nodeRelease(pRtree, pNode);
                   1591:         pNode = 0;
                   1592:         continue;
                   1593:       }
                   1594:       for(jj=0; jj<nCell; jj++){
                   1595:         nodeGetCell(pRtree, pNode, jj, &aCell[jj]);
                   1596:       }
                   1597:     }
                   1598: #endif
                   1599: 
                   1600:     /* Select the child node which will be enlarged the least if pCell
                   1601:     ** is inserted into it. Resolve ties by choosing the entry with
                   1602:     ** the smallest area.
                   1603:     */
                   1604:     for(iCell=0; iCell<nCell; iCell++){
                   1605:       int bBest = 0;
                   1606:       float growth;
                   1607:       float area;
                   1608:       nodeGetCell(pRtree, pNode, iCell, &cell);
                   1609:       growth = cellGrowth(pRtree, &cell, pCell);
                   1610:       area = cellArea(pRtree, &cell);
                   1611: 
                   1612: #if VARIANT_RSTARTREE_CHOOSESUBTREE
                   1613:       if( ii==(pRtree->iDepth-1) ){
                   1614:         overlap = cellOverlapEnlargement(pRtree,&cell,pCell,aCell,nCell,iCell);
                   1615:       }else{
                   1616:         overlap = 0.0;
                   1617:       }
                   1618:       if( (iCell==0) 
                   1619:        || (overlap<fMinOverlap) 
                   1620:        || (overlap==fMinOverlap && growth<fMinGrowth)
                   1621:        || (overlap==fMinOverlap && growth==fMinGrowth && area<fMinArea)
                   1622:       ){
                   1623:         bBest = 1;
                   1624:         fMinOverlap = overlap;
                   1625:       }
                   1626: #else
                   1627:       if( iCell==0||growth<fMinGrowth||(growth==fMinGrowth && area<fMinArea) ){
                   1628:         bBest = 1;
                   1629:       }
                   1630: #endif
                   1631:       if( bBest ){
                   1632:         fMinGrowth = growth;
                   1633:         fMinArea = area;
                   1634:         iBest = cell.iRowid;
                   1635:       }
                   1636:     }
                   1637: 
                   1638:     sqlite3_free(aCell);
                   1639:     rc = nodeAcquire(pRtree, iBest, pNode, &pChild);
                   1640:     nodeRelease(pRtree, pNode);
                   1641:     pNode = pChild;
                   1642:   }
                   1643: 
                   1644:   *ppLeaf = pNode;
                   1645:   return rc;
                   1646: }
                   1647: 
                   1648: /*
                   1649: ** A cell with the same content as pCell has just been inserted into
                   1650: ** the node pNode. This function updates the bounding box cells in
                   1651: ** all ancestor elements.
                   1652: */
                   1653: static int AdjustTree(
                   1654:   Rtree *pRtree,                    /* Rtree table */
                   1655:   RtreeNode *pNode,                 /* Adjust ancestry of this node. */
                   1656:   RtreeCell *pCell                  /* This cell was just inserted */
                   1657: ){
                   1658:   RtreeNode *p = pNode;
                   1659:   while( p->pParent ){
                   1660:     RtreeNode *pParent = p->pParent;
                   1661:     RtreeCell cell;
                   1662:     int iCell;
                   1663: 
                   1664:     if( nodeParentIndex(pRtree, p, &iCell) ){
                   1665:       return SQLITE_CORRUPT_VTAB;
                   1666:     }
                   1667: 
                   1668:     nodeGetCell(pRtree, pParent, iCell, &cell);
                   1669:     if( !cellContains(pRtree, &cell, pCell) ){
                   1670:       cellUnion(pRtree, &cell, pCell);
                   1671:       nodeOverwriteCell(pRtree, pParent, &cell, iCell);
                   1672:     }
                   1673:  
                   1674:     p = pParent;
                   1675:   }
                   1676:   return SQLITE_OK;
                   1677: }
                   1678: 
                   1679: /*
                   1680: ** Write mapping (iRowid->iNode) to the <rtree>_rowid table.
                   1681: */
                   1682: static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){
                   1683:   sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid);
                   1684:   sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode);
                   1685:   sqlite3_step(pRtree->pWriteRowid);
                   1686:   return sqlite3_reset(pRtree->pWriteRowid);
                   1687: }
                   1688: 
                   1689: /*
                   1690: ** Write mapping (iNode->iPar) to the <rtree>_parent table.
                   1691: */
                   1692: static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){
                   1693:   sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode);
                   1694:   sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar);
                   1695:   sqlite3_step(pRtree->pWriteParent);
                   1696:   return sqlite3_reset(pRtree->pWriteParent);
                   1697: }
                   1698: 
                   1699: static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int);
                   1700: 
                   1701: #if VARIANT_GUTTMAN_LINEAR_SPLIT
                   1702: /*
                   1703: ** Implementation of the linear variant of the PickNext() function from
                   1704: ** Guttman[84].
                   1705: */
                   1706: static RtreeCell *LinearPickNext(
                   1707:   Rtree *pRtree,
                   1708:   RtreeCell *aCell, 
                   1709:   int nCell, 
                   1710:   RtreeCell *pLeftBox, 
                   1711:   RtreeCell *pRightBox,
                   1712:   int *aiUsed
                   1713: ){
                   1714:   int ii;
                   1715:   for(ii=0; aiUsed[ii]; ii++);
                   1716:   aiUsed[ii] = 1;
                   1717:   return &aCell[ii];
                   1718: }
                   1719: 
                   1720: /*
                   1721: ** Implementation of the linear variant of the PickSeeds() function from
                   1722: ** Guttman[84].
                   1723: */
                   1724: static void LinearPickSeeds(
                   1725:   Rtree *pRtree,
                   1726:   RtreeCell *aCell, 
                   1727:   int nCell, 
                   1728:   int *piLeftSeed, 
                   1729:   int *piRightSeed
                   1730: ){
                   1731:   int i;
                   1732:   int iLeftSeed = 0;
                   1733:   int iRightSeed = 1;
                   1734:   float maxNormalInnerWidth = 0.0;
                   1735: 
                   1736:   /* Pick two "seed" cells from the array of cells. The algorithm used
                   1737:   ** here is the LinearPickSeeds algorithm from Gutman[1984]. The 
                   1738:   ** indices of the two seed cells in the array are stored in local
                   1739:   ** variables iLeftSeek and iRightSeed.
                   1740:   */
                   1741:   for(i=0; i<pRtree->nDim; i++){
                   1742:     float x1 = DCOORD(aCell[0].aCoord[i*2]);
                   1743:     float x2 = DCOORD(aCell[0].aCoord[i*2+1]);
                   1744:     float x3 = x1;
                   1745:     float x4 = x2;
                   1746:     int jj;
                   1747: 
                   1748:     int iCellLeft = 0;
                   1749:     int iCellRight = 0;
                   1750: 
                   1751:     for(jj=1; jj<nCell; jj++){
                   1752:       float left = DCOORD(aCell[jj].aCoord[i*2]);
                   1753:       float right = DCOORD(aCell[jj].aCoord[i*2+1]);
                   1754: 
                   1755:       if( left<x1 ) x1 = left;
                   1756:       if( right>x4 ) x4 = right;
                   1757:       if( left>x3 ){
                   1758:         x3 = left;
                   1759:         iCellRight = jj;
                   1760:       }
                   1761:       if( right<x2 ){
                   1762:         x2 = right;
                   1763:         iCellLeft = jj;
                   1764:       }
                   1765:     }
                   1766: 
                   1767:     if( x4!=x1 ){
                   1768:       float normalwidth = (x3 - x2) / (x4 - x1);
                   1769:       if( normalwidth>maxNormalInnerWidth ){
                   1770:         iLeftSeed = iCellLeft;
                   1771:         iRightSeed = iCellRight;
                   1772:       }
                   1773:     }
                   1774:   }
                   1775: 
                   1776:   *piLeftSeed = iLeftSeed;
                   1777:   *piRightSeed = iRightSeed;
                   1778: }
                   1779: #endif /* VARIANT_GUTTMAN_LINEAR_SPLIT */
                   1780: 
                   1781: #if VARIANT_GUTTMAN_QUADRATIC_SPLIT
                   1782: /*
                   1783: ** Implementation of the quadratic variant of the PickNext() function from
                   1784: ** Guttman[84].
                   1785: */
                   1786: static RtreeCell *QuadraticPickNext(
                   1787:   Rtree *pRtree,
                   1788:   RtreeCell *aCell, 
                   1789:   int nCell, 
                   1790:   RtreeCell *pLeftBox, 
                   1791:   RtreeCell *pRightBox,
                   1792:   int *aiUsed
                   1793: ){
                   1794:   #define FABS(a) ((a)<0.0?-1.0*(a):(a))
                   1795: 
                   1796:   int iSelect = -1;
                   1797:   float fDiff;
                   1798:   int ii;
                   1799:   for(ii=0; ii<nCell; ii++){
                   1800:     if( aiUsed[ii]==0 ){
                   1801:       float left = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
                   1802:       float right = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
                   1803:       float diff = FABS(right-left);
                   1804:       if( iSelect<0 || diff>fDiff ){
                   1805:         fDiff = diff;
                   1806:         iSelect = ii;
                   1807:       }
                   1808:     }
                   1809:   }
                   1810:   aiUsed[iSelect] = 1;
                   1811:   return &aCell[iSelect];
                   1812: }
                   1813: 
                   1814: /*
                   1815: ** Implementation of the quadratic variant of the PickSeeds() function from
                   1816: ** Guttman[84].
                   1817: */
                   1818: static void QuadraticPickSeeds(
                   1819:   Rtree *pRtree,
                   1820:   RtreeCell *aCell, 
                   1821:   int nCell, 
                   1822:   int *piLeftSeed, 
                   1823:   int *piRightSeed
                   1824: ){
                   1825:   int ii;
                   1826:   int jj;
                   1827: 
                   1828:   int iLeftSeed = 0;
                   1829:   int iRightSeed = 1;
                   1830:   float fWaste = 0.0;
                   1831: 
                   1832:   for(ii=0; ii<nCell; ii++){
                   1833:     for(jj=ii+1; jj<nCell; jj++){
                   1834:       float right = cellArea(pRtree, &aCell[jj]);
                   1835:       float growth = cellGrowth(pRtree, &aCell[ii], &aCell[jj]);
                   1836:       float waste = growth - right;
                   1837: 
                   1838:       if( waste>fWaste ){
                   1839:         iLeftSeed = ii;
                   1840:         iRightSeed = jj;
                   1841:         fWaste = waste;
                   1842:       }
                   1843:     }
                   1844:   }
                   1845: 
                   1846:   *piLeftSeed = iLeftSeed;
                   1847:   *piRightSeed = iRightSeed;
                   1848: }
                   1849: #endif /* VARIANT_GUTTMAN_QUADRATIC_SPLIT */
                   1850: 
                   1851: /*
                   1852: ** Arguments aIdx, aDistance and aSpare all point to arrays of size
                   1853: ** nIdx. The aIdx array contains the set of integers from 0 to 
                   1854: ** (nIdx-1) in no particular order. This function sorts the values
                   1855: ** in aIdx according to the indexed values in aDistance. For
                   1856: ** example, assuming the inputs:
                   1857: **
                   1858: **   aIdx      = { 0,   1,   2,   3 }
                   1859: **   aDistance = { 5.0, 2.0, 7.0, 6.0 }
                   1860: **
                   1861: ** this function sets the aIdx array to contain:
                   1862: **
                   1863: **   aIdx      = { 0,   1,   2,   3 }
                   1864: **
                   1865: ** The aSpare array is used as temporary working space by the
                   1866: ** sorting algorithm.
                   1867: */
                   1868: static void SortByDistance(
                   1869:   int *aIdx, 
                   1870:   int nIdx, 
                   1871:   float *aDistance, 
                   1872:   int *aSpare
                   1873: ){
                   1874:   if( nIdx>1 ){
                   1875:     int iLeft = 0;
                   1876:     int iRight = 0;
                   1877: 
                   1878:     int nLeft = nIdx/2;
                   1879:     int nRight = nIdx-nLeft;
                   1880:     int *aLeft = aIdx;
                   1881:     int *aRight = &aIdx[nLeft];
                   1882: 
                   1883:     SortByDistance(aLeft, nLeft, aDistance, aSpare);
                   1884:     SortByDistance(aRight, nRight, aDistance, aSpare);
                   1885: 
                   1886:     memcpy(aSpare, aLeft, sizeof(int)*nLeft);
                   1887:     aLeft = aSpare;
                   1888: 
                   1889:     while( iLeft<nLeft || iRight<nRight ){
                   1890:       if( iLeft==nLeft ){
                   1891:         aIdx[iLeft+iRight] = aRight[iRight];
                   1892:         iRight++;
                   1893:       }else if( iRight==nRight ){
                   1894:         aIdx[iLeft+iRight] = aLeft[iLeft];
                   1895:         iLeft++;
                   1896:       }else{
                   1897:         float fLeft = aDistance[aLeft[iLeft]];
                   1898:         float fRight = aDistance[aRight[iRight]];
                   1899:         if( fLeft<fRight ){
                   1900:           aIdx[iLeft+iRight] = aLeft[iLeft];
                   1901:           iLeft++;
                   1902:         }else{
                   1903:           aIdx[iLeft+iRight] = aRight[iRight];
                   1904:           iRight++;
                   1905:         }
                   1906:       }
                   1907:     }
                   1908: 
                   1909: #if 0
                   1910:     /* Check that the sort worked */
                   1911:     {
                   1912:       int jj;
                   1913:       for(jj=1; jj<nIdx; jj++){
                   1914:         float left = aDistance[aIdx[jj-1]];
                   1915:         float right = aDistance[aIdx[jj]];
                   1916:         assert( left<=right );
                   1917:       }
                   1918:     }
                   1919: #endif
                   1920:   }
                   1921: }
                   1922: 
                   1923: /*
                   1924: ** Arguments aIdx, aCell and aSpare all point to arrays of size
                   1925: ** nIdx. The aIdx array contains the set of integers from 0 to 
                   1926: ** (nIdx-1) in no particular order. This function sorts the values
                   1927: ** in aIdx according to dimension iDim of the cells in aCell. The
                   1928: ** minimum value of dimension iDim is considered first, the
                   1929: ** maximum used to break ties.
                   1930: **
                   1931: ** The aSpare array is used as temporary working space by the
                   1932: ** sorting algorithm.
                   1933: */
                   1934: static void SortByDimension(
                   1935:   Rtree *pRtree,
                   1936:   int *aIdx, 
                   1937:   int nIdx, 
                   1938:   int iDim, 
                   1939:   RtreeCell *aCell, 
                   1940:   int *aSpare
                   1941: ){
                   1942:   if( nIdx>1 ){
                   1943: 
                   1944:     int iLeft = 0;
                   1945:     int iRight = 0;
                   1946: 
                   1947:     int nLeft = nIdx/2;
                   1948:     int nRight = nIdx-nLeft;
                   1949:     int *aLeft = aIdx;
                   1950:     int *aRight = &aIdx[nLeft];
                   1951: 
                   1952:     SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare);
                   1953:     SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare);
                   1954: 
                   1955:     memcpy(aSpare, aLeft, sizeof(int)*nLeft);
                   1956:     aLeft = aSpare;
                   1957:     while( iLeft<nLeft || iRight<nRight ){
                   1958:       double xleft1 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2]);
                   1959:       double xleft2 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2+1]);
                   1960:       double xright1 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2]);
                   1961:       double xright2 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2+1]);
                   1962:       if( (iLeft!=nLeft) && ((iRight==nRight)
                   1963:        || (xleft1<xright1)
                   1964:        || (xleft1==xright1 && xleft2<xright2)
                   1965:       )){
                   1966:         aIdx[iLeft+iRight] = aLeft[iLeft];
                   1967:         iLeft++;
                   1968:       }else{
                   1969:         aIdx[iLeft+iRight] = aRight[iRight];
                   1970:         iRight++;
                   1971:       }
                   1972:     }
                   1973: 
                   1974: #if 0
                   1975:     /* Check that the sort worked */
                   1976:     {
                   1977:       int jj;
                   1978:       for(jj=1; jj<nIdx; jj++){
                   1979:         float xleft1 = aCell[aIdx[jj-1]].aCoord[iDim*2];
                   1980:         float xleft2 = aCell[aIdx[jj-1]].aCoord[iDim*2+1];
                   1981:         float xright1 = aCell[aIdx[jj]].aCoord[iDim*2];
                   1982:         float xright2 = aCell[aIdx[jj]].aCoord[iDim*2+1];
                   1983:         assert( xleft1<=xright1 && (xleft1<xright1 || xleft2<=xright2) );
                   1984:       }
                   1985:     }
                   1986: #endif
                   1987:   }
                   1988: }
                   1989: 
                   1990: #if VARIANT_RSTARTREE_SPLIT
                   1991: /*
                   1992: ** Implementation of the R*-tree variant of SplitNode from Beckman[1990].
                   1993: */
                   1994: static int splitNodeStartree(
                   1995:   Rtree *pRtree,
                   1996:   RtreeCell *aCell,
                   1997:   int nCell,
                   1998:   RtreeNode *pLeft,
                   1999:   RtreeNode *pRight,
                   2000:   RtreeCell *pBboxLeft,
                   2001:   RtreeCell *pBboxRight
                   2002: ){
                   2003:   int **aaSorted;
                   2004:   int *aSpare;
                   2005:   int ii;
                   2006: 
                   2007:   int iBestDim = 0;
                   2008:   int iBestSplit = 0;
                   2009:   float fBestMargin = 0.0;
                   2010: 
                   2011:   int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int));
                   2012: 
                   2013:   aaSorted = (int **)sqlite3_malloc(nByte);
                   2014:   if( !aaSorted ){
                   2015:     return SQLITE_NOMEM;
                   2016:   }
                   2017: 
                   2018:   aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell];
                   2019:   memset(aaSorted, 0, nByte);
                   2020:   for(ii=0; ii<pRtree->nDim; ii++){
                   2021:     int jj;
                   2022:     aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell];
                   2023:     for(jj=0; jj<nCell; jj++){
                   2024:       aaSorted[ii][jj] = jj;
                   2025:     }
                   2026:     SortByDimension(pRtree, aaSorted[ii], nCell, ii, aCell, aSpare);
                   2027:   }
                   2028: 
                   2029:   for(ii=0; ii<pRtree->nDim; ii++){
                   2030:     float margin = 0.0;
                   2031:     float fBestOverlap = 0.0;
                   2032:     float fBestArea = 0.0;
                   2033:     int iBestLeft = 0;
                   2034:     int nLeft;
                   2035: 
                   2036:     for(
                   2037:       nLeft=RTREE_MINCELLS(pRtree); 
                   2038:       nLeft<=(nCell-RTREE_MINCELLS(pRtree)); 
                   2039:       nLeft++
                   2040:     ){
                   2041:       RtreeCell left;
                   2042:       RtreeCell right;
                   2043:       int kk;
                   2044:       float overlap;
                   2045:       float area;
                   2046: 
                   2047:       memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell));
                   2048:       memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell));
                   2049:       for(kk=1; kk<(nCell-1); kk++){
                   2050:         if( kk<nLeft ){
                   2051:           cellUnion(pRtree, &left, &aCell[aaSorted[ii][kk]]);
                   2052:         }else{
                   2053:           cellUnion(pRtree, &right, &aCell[aaSorted[ii][kk]]);
                   2054:         }
                   2055:       }
                   2056:       margin += cellMargin(pRtree, &left);
                   2057:       margin += cellMargin(pRtree, &right);
                   2058:       overlap = cellOverlap(pRtree, &left, &right, 1, -1);
                   2059:       area = cellArea(pRtree, &left) + cellArea(pRtree, &right);
                   2060:       if( (nLeft==RTREE_MINCELLS(pRtree))
                   2061:        || (overlap<fBestOverlap)
                   2062:        || (overlap==fBestOverlap && area<fBestArea)
                   2063:       ){
                   2064:         iBestLeft = nLeft;
                   2065:         fBestOverlap = overlap;
                   2066:         fBestArea = area;
                   2067:       }
                   2068:     }
                   2069: 
                   2070:     if( ii==0 || margin<fBestMargin ){
                   2071:       iBestDim = ii;
                   2072:       fBestMargin = margin;
                   2073:       iBestSplit = iBestLeft;
                   2074:     }
                   2075:   }
                   2076: 
                   2077:   memcpy(pBboxLeft, &aCell[aaSorted[iBestDim][0]], sizeof(RtreeCell));
                   2078:   memcpy(pBboxRight, &aCell[aaSorted[iBestDim][iBestSplit]], sizeof(RtreeCell));
                   2079:   for(ii=0; ii<nCell; ii++){
                   2080:     RtreeNode *pTarget = (ii<iBestSplit)?pLeft:pRight;
                   2081:     RtreeCell *pBbox = (ii<iBestSplit)?pBboxLeft:pBboxRight;
                   2082:     RtreeCell *pCell = &aCell[aaSorted[iBestDim][ii]];
                   2083:     nodeInsertCell(pRtree, pTarget, pCell);
                   2084:     cellUnion(pRtree, pBbox, pCell);
                   2085:   }
                   2086: 
                   2087:   sqlite3_free(aaSorted);
                   2088:   return SQLITE_OK;
                   2089: }
                   2090: #endif
                   2091: 
                   2092: #if VARIANT_GUTTMAN_SPLIT
                   2093: /*
                   2094: ** Implementation of the regular R-tree SplitNode from Guttman[1984].
                   2095: */
                   2096: static int splitNodeGuttman(
                   2097:   Rtree *pRtree,
                   2098:   RtreeCell *aCell,
                   2099:   int nCell,
                   2100:   RtreeNode *pLeft,
                   2101:   RtreeNode *pRight,
                   2102:   RtreeCell *pBboxLeft,
                   2103:   RtreeCell *pBboxRight
                   2104: ){
                   2105:   int iLeftSeed = 0;
                   2106:   int iRightSeed = 1;
                   2107:   int *aiUsed;
                   2108:   int i;
                   2109: 
                   2110:   aiUsed = sqlite3_malloc(sizeof(int)*nCell);
                   2111:   if( !aiUsed ){
                   2112:     return SQLITE_NOMEM;
                   2113:   }
                   2114:   memset(aiUsed, 0, sizeof(int)*nCell);
                   2115: 
                   2116:   PickSeeds(pRtree, aCell, nCell, &iLeftSeed, &iRightSeed);
                   2117: 
                   2118:   memcpy(pBboxLeft, &aCell[iLeftSeed], sizeof(RtreeCell));
                   2119:   memcpy(pBboxRight, &aCell[iRightSeed], sizeof(RtreeCell));
                   2120:   nodeInsertCell(pRtree, pLeft, &aCell[iLeftSeed]);
                   2121:   nodeInsertCell(pRtree, pRight, &aCell[iRightSeed]);
                   2122:   aiUsed[iLeftSeed] = 1;
                   2123:   aiUsed[iRightSeed] = 1;
                   2124: 
                   2125:   for(i=nCell-2; i>0; i--){
                   2126:     RtreeCell *pNext;
                   2127:     pNext = PickNext(pRtree, aCell, nCell, pBboxLeft, pBboxRight, aiUsed);
                   2128:     float diff =  
                   2129:       cellGrowth(pRtree, pBboxLeft, pNext) - 
                   2130:       cellGrowth(pRtree, pBboxRight, pNext)
                   2131:     ;
                   2132:     if( (RTREE_MINCELLS(pRtree)-NCELL(pRight)==i)
                   2133:      || (diff>0.0 && (RTREE_MINCELLS(pRtree)-NCELL(pLeft)!=i))
                   2134:     ){
                   2135:       nodeInsertCell(pRtree, pRight, pNext);
                   2136:       cellUnion(pRtree, pBboxRight, pNext);
                   2137:     }else{
                   2138:       nodeInsertCell(pRtree, pLeft, pNext);
                   2139:       cellUnion(pRtree, pBboxLeft, pNext);
                   2140:     }
                   2141:   }
                   2142: 
                   2143:   sqlite3_free(aiUsed);
                   2144:   return SQLITE_OK;
                   2145: }
                   2146: #endif
                   2147: 
                   2148: static int updateMapping(
                   2149:   Rtree *pRtree, 
                   2150:   i64 iRowid, 
                   2151:   RtreeNode *pNode, 
                   2152:   int iHeight
                   2153: ){
                   2154:   int (*xSetMapping)(Rtree *, sqlite3_int64, sqlite3_int64);
                   2155:   xSetMapping = ((iHeight==0)?rowidWrite:parentWrite);
                   2156:   if( iHeight>0 ){
                   2157:     RtreeNode *pChild = nodeHashLookup(pRtree, iRowid);
                   2158:     if( pChild ){
                   2159:       nodeRelease(pRtree, pChild->pParent);
                   2160:       nodeReference(pNode);
                   2161:       pChild->pParent = pNode;
                   2162:     }
                   2163:   }
                   2164:   return xSetMapping(pRtree, iRowid, pNode->iNode);
                   2165: }
                   2166: 
                   2167: static int SplitNode(
                   2168:   Rtree *pRtree,
                   2169:   RtreeNode *pNode,
                   2170:   RtreeCell *pCell,
                   2171:   int iHeight
                   2172: ){
                   2173:   int i;
                   2174:   int newCellIsRight = 0;
                   2175: 
                   2176:   int rc = SQLITE_OK;
                   2177:   int nCell = NCELL(pNode);
                   2178:   RtreeCell *aCell;
                   2179:   int *aiUsed;
                   2180: 
                   2181:   RtreeNode *pLeft = 0;
                   2182:   RtreeNode *pRight = 0;
                   2183: 
                   2184:   RtreeCell leftbbox;
                   2185:   RtreeCell rightbbox;
                   2186: 
                   2187:   /* Allocate an array and populate it with a copy of pCell and 
                   2188:   ** all cells from node pLeft. Then zero the original node.
                   2189:   */
                   2190:   aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1));
                   2191:   if( !aCell ){
                   2192:     rc = SQLITE_NOMEM;
                   2193:     goto splitnode_out;
                   2194:   }
                   2195:   aiUsed = (int *)&aCell[nCell+1];
                   2196:   memset(aiUsed, 0, sizeof(int)*(nCell+1));
                   2197:   for(i=0; i<nCell; i++){
                   2198:     nodeGetCell(pRtree, pNode, i, &aCell[i]);
                   2199:   }
                   2200:   nodeZero(pRtree, pNode);
                   2201:   memcpy(&aCell[nCell], pCell, sizeof(RtreeCell));
                   2202:   nCell++;
                   2203: 
                   2204:   if( pNode->iNode==1 ){
                   2205:     pRight = nodeNew(pRtree, pNode);
                   2206:     pLeft = nodeNew(pRtree, pNode);
                   2207:     pRtree->iDepth++;
                   2208:     pNode->isDirty = 1;
                   2209:     writeInt16(pNode->zData, pRtree->iDepth);
                   2210:   }else{
                   2211:     pLeft = pNode;
                   2212:     pRight = nodeNew(pRtree, pLeft->pParent);
                   2213:     nodeReference(pLeft);
                   2214:   }
                   2215: 
                   2216:   if( !pLeft || !pRight ){
                   2217:     rc = SQLITE_NOMEM;
                   2218:     goto splitnode_out;
                   2219:   }
                   2220: 
                   2221:   memset(pLeft->zData, 0, pRtree->iNodeSize);
                   2222:   memset(pRight->zData, 0, pRtree->iNodeSize);
                   2223: 
                   2224:   rc = AssignCells(pRtree, aCell, nCell, pLeft, pRight, &leftbbox, &rightbbox);
                   2225:   if( rc!=SQLITE_OK ){
                   2226:     goto splitnode_out;
                   2227:   }
                   2228: 
                   2229:   /* Ensure both child nodes have node numbers assigned to them by calling
                   2230:   ** nodeWrite(). Node pRight always needs a node number, as it was created
                   2231:   ** by nodeNew() above. But node pLeft sometimes already has a node number.
                   2232:   ** In this case avoid the all to nodeWrite().
                   2233:   */
                   2234:   if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight))
                   2235:    || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft)))
                   2236:   ){
                   2237:     goto splitnode_out;
                   2238:   }
                   2239: 
                   2240:   rightbbox.iRowid = pRight->iNode;
                   2241:   leftbbox.iRowid = pLeft->iNode;
                   2242: 
                   2243:   if( pNode->iNode==1 ){
                   2244:     rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1);
                   2245:     if( rc!=SQLITE_OK ){
                   2246:       goto splitnode_out;
                   2247:     }
                   2248:   }else{
                   2249:     RtreeNode *pParent = pLeft->pParent;
                   2250:     int iCell;
                   2251:     rc = nodeParentIndex(pRtree, pLeft, &iCell);
                   2252:     if( rc==SQLITE_OK ){
                   2253:       nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell);
                   2254:       rc = AdjustTree(pRtree, pParent, &leftbbox);
                   2255:     }
                   2256:     if( rc!=SQLITE_OK ){
                   2257:       goto splitnode_out;
                   2258:     }
                   2259:   }
                   2260:   if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){
                   2261:     goto splitnode_out;
                   2262:   }
                   2263: 
                   2264:   for(i=0; i<NCELL(pRight); i++){
                   2265:     i64 iRowid = nodeGetRowid(pRtree, pRight, i);
                   2266:     rc = updateMapping(pRtree, iRowid, pRight, iHeight);
                   2267:     if( iRowid==pCell->iRowid ){
                   2268:       newCellIsRight = 1;
                   2269:     }
                   2270:     if( rc!=SQLITE_OK ){
                   2271:       goto splitnode_out;
                   2272:     }
                   2273:   }
                   2274:   if( pNode->iNode==1 ){
                   2275:     for(i=0; i<NCELL(pLeft); i++){
                   2276:       i64 iRowid = nodeGetRowid(pRtree, pLeft, i);
                   2277:       rc = updateMapping(pRtree, iRowid, pLeft, iHeight);
                   2278:       if( rc!=SQLITE_OK ){
                   2279:         goto splitnode_out;
                   2280:       }
                   2281:     }
                   2282:   }else if( newCellIsRight==0 ){
                   2283:     rc = updateMapping(pRtree, pCell->iRowid, pLeft, iHeight);
                   2284:   }
                   2285: 
                   2286:   if( rc==SQLITE_OK ){
                   2287:     rc = nodeRelease(pRtree, pRight);
                   2288:     pRight = 0;
                   2289:   }
                   2290:   if( rc==SQLITE_OK ){
                   2291:     rc = nodeRelease(pRtree, pLeft);
                   2292:     pLeft = 0;
                   2293:   }
                   2294: 
                   2295: splitnode_out:
                   2296:   nodeRelease(pRtree, pRight);
                   2297:   nodeRelease(pRtree, pLeft);
                   2298:   sqlite3_free(aCell);
                   2299:   return rc;
                   2300: }
                   2301: 
                   2302: /*
                   2303: ** If node pLeaf is not the root of the r-tree and its pParent pointer is 
                   2304: ** still NULL, load all ancestor nodes of pLeaf into memory and populate
                   2305: ** the pLeaf->pParent chain all the way up to the root node.
                   2306: **
                   2307: ** This operation is required when a row is deleted (or updated - an update
                   2308: ** is implemented as a delete followed by an insert). SQLite provides the
                   2309: ** rowid of the row to delete, which can be used to find the leaf on which
                   2310: ** the entry resides (argument pLeaf). Once the leaf is located, this 
                   2311: ** function is called to determine its ancestry.
                   2312: */
                   2313: static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){
                   2314:   int rc = SQLITE_OK;
                   2315:   RtreeNode *pChild = pLeaf;
                   2316:   while( rc==SQLITE_OK && pChild->iNode!=1 && pChild->pParent==0 ){
                   2317:     int rc2 = SQLITE_OK;          /* sqlite3_reset() return code */
                   2318:     sqlite3_bind_int64(pRtree->pReadParent, 1, pChild->iNode);
                   2319:     rc = sqlite3_step(pRtree->pReadParent);
                   2320:     if( rc==SQLITE_ROW ){
                   2321:       RtreeNode *pTest;           /* Used to test for reference loops */
                   2322:       i64 iNode;                  /* Node number of parent node */
                   2323: 
                   2324:       /* Before setting pChild->pParent, test that we are not creating a
                   2325:       ** loop of references (as we would if, say, pChild==pParent). We don't
                   2326:       ** want to do this as it leads to a memory leak when trying to delete
                   2327:       ** the referenced counted node structures.
                   2328:       */
                   2329:       iNode = sqlite3_column_int64(pRtree->pReadParent, 0);
                   2330:       for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent);
                   2331:       if( !pTest ){
                   2332:         rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent);
                   2333:       }
                   2334:     }
                   2335:     rc = sqlite3_reset(pRtree->pReadParent);
                   2336:     if( rc==SQLITE_OK ) rc = rc2;
                   2337:     if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB;
                   2338:     pChild = pChild->pParent;
                   2339:   }
                   2340:   return rc;
                   2341: }
                   2342: 
                   2343: static int deleteCell(Rtree *, RtreeNode *, int, int);
                   2344: 
                   2345: static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){
                   2346:   int rc;
                   2347:   int rc2;
                   2348:   RtreeNode *pParent = 0;
                   2349:   int iCell;
                   2350: 
                   2351:   assert( pNode->nRef==1 );
                   2352: 
                   2353:   /* Remove the entry in the parent cell. */
                   2354:   rc = nodeParentIndex(pRtree, pNode, &iCell);
                   2355:   if( rc==SQLITE_OK ){
                   2356:     pParent = pNode->pParent;
                   2357:     pNode->pParent = 0;
                   2358:     rc = deleteCell(pRtree, pParent, iCell, iHeight+1);
                   2359:   }
                   2360:   rc2 = nodeRelease(pRtree, pParent);
                   2361:   if( rc==SQLITE_OK ){
                   2362:     rc = rc2;
                   2363:   }
                   2364:   if( rc!=SQLITE_OK ){
                   2365:     return rc;
                   2366:   }
                   2367: 
                   2368:   /* Remove the xxx_node entry. */
                   2369:   sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode);
                   2370:   sqlite3_step(pRtree->pDeleteNode);
                   2371:   if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){
                   2372:     return rc;
                   2373:   }
                   2374: 
                   2375:   /* Remove the xxx_parent entry. */
                   2376:   sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode);
                   2377:   sqlite3_step(pRtree->pDeleteParent);
                   2378:   if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){
                   2379:     return rc;
                   2380:   }
                   2381:   
                   2382:   /* Remove the node from the in-memory hash table and link it into
                   2383:   ** the Rtree.pDeleted list. Its contents will be re-inserted later on.
                   2384:   */
                   2385:   nodeHashDelete(pRtree, pNode);
                   2386:   pNode->iNode = iHeight;
                   2387:   pNode->pNext = pRtree->pDeleted;
                   2388:   pNode->nRef++;
                   2389:   pRtree->pDeleted = pNode;
                   2390: 
                   2391:   return SQLITE_OK;
                   2392: }
                   2393: 
                   2394: static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){
                   2395:   RtreeNode *pParent = pNode->pParent;
                   2396:   int rc = SQLITE_OK; 
                   2397:   if( pParent ){
                   2398:     int ii; 
                   2399:     int nCell = NCELL(pNode);
                   2400:     RtreeCell box;                            /* Bounding box for pNode */
                   2401:     nodeGetCell(pRtree, pNode, 0, &box);
                   2402:     for(ii=1; ii<nCell; ii++){
                   2403:       RtreeCell cell;
                   2404:       nodeGetCell(pRtree, pNode, ii, &cell);
                   2405:       cellUnion(pRtree, &box, &cell);
                   2406:     }
                   2407:     box.iRowid = pNode->iNode;
                   2408:     rc = nodeParentIndex(pRtree, pNode, &ii);
                   2409:     if( rc==SQLITE_OK ){
                   2410:       nodeOverwriteCell(pRtree, pParent, &box, ii);
                   2411:       rc = fixBoundingBox(pRtree, pParent);
                   2412:     }
                   2413:   }
                   2414:   return rc;
                   2415: }
                   2416: 
                   2417: /*
                   2418: ** Delete the cell at index iCell of node pNode. After removing the
                   2419: ** cell, adjust the r-tree data structure if required.
                   2420: */
                   2421: static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){
                   2422:   RtreeNode *pParent;
                   2423:   int rc;
                   2424: 
                   2425:   if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){
                   2426:     return rc;
                   2427:   }
                   2428: 
                   2429:   /* Remove the cell from the node. This call just moves bytes around
                   2430:   ** the in-memory node image, so it cannot fail.
                   2431:   */
                   2432:   nodeDeleteCell(pRtree, pNode, iCell);
                   2433: 
                   2434:   /* If the node is not the tree root and now has less than the minimum
                   2435:   ** number of cells, remove it from the tree. Otherwise, update the
                   2436:   ** cell in the parent node so that it tightly contains the updated
                   2437:   ** node.
                   2438:   */
                   2439:   pParent = pNode->pParent;
                   2440:   assert( pParent || pNode->iNode==1 );
                   2441:   if( pParent ){
                   2442:     if( NCELL(pNode)<RTREE_MINCELLS(pRtree) ){
                   2443:       rc = removeNode(pRtree, pNode, iHeight);
                   2444:     }else{
                   2445:       rc = fixBoundingBox(pRtree, pNode);
                   2446:     }
                   2447:   }
                   2448: 
                   2449:   return rc;
                   2450: }
                   2451: 
                   2452: static int Reinsert(
                   2453:   Rtree *pRtree, 
                   2454:   RtreeNode *pNode, 
                   2455:   RtreeCell *pCell, 
                   2456:   int iHeight
                   2457: ){
                   2458:   int *aOrder;
                   2459:   int *aSpare;
                   2460:   RtreeCell *aCell;
                   2461:   float *aDistance;
                   2462:   int nCell;
                   2463:   float aCenterCoord[RTREE_MAX_DIMENSIONS];
                   2464:   int iDim;
                   2465:   int ii;
                   2466:   int rc = SQLITE_OK;
                   2467: 
                   2468:   memset(aCenterCoord, 0, sizeof(float)*RTREE_MAX_DIMENSIONS);
                   2469: 
                   2470:   nCell = NCELL(pNode)+1;
                   2471: 
                   2472:   /* Allocate the buffers used by this operation. The allocation is
                   2473:   ** relinquished before this function returns.
                   2474:   */
                   2475:   aCell = (RtreeCell *)sqlite3_malloc(nCell * (
                   2476:     sizeof(RtreeCell) +         /* aCell array */
                   2477:     sizeof(int)       +         /* aOrder array */
                   2478:     sizeof(int)       +         /* aSpare array */
                   2479:     sizeof(float)               /* aDistance array */
                   2480:   ));
                   2481:   if( !aCell ){
                   2482:     return SQLITE_NOMEM;
                   2483:   }
                   2484:   aOrder    = (int *)&aCell[nCell];
                   2485:   aSpare    = (int *)&aOrder[nCell];
                   2486:   aDistance = (float *)&aSpare[nCell];
                   2487: 
                   2488:   for(ii=0; ii<nCell; ii++){
                   2489:     if( ii==(nCell-1) ){
                   2490:       memcpy(&aCell[ii], pCell, sizeof(RtreeCell));
                   2491:     }else{
                   2492:       nodeGetCell(pRtree, pNode, ii, &aCell[ii]);
                   2493:     }
                   2494:     aOrder[ii] = ii;
                   2495:     for(iDim=0; iDim<pRtree->nDim; iDim++){
                   2496:       aCenterCoord[iDim] += (float)DCOORD(aCell[ii].aCoord[iDim*2]);
                   2497:       aCenterCoord[iDim] += (float)DCOORD(aCell[ii].aCoord[iDim*2+1]);
                   2498:     }
                   2499:   }
                   2500:   for(iDim=0; iDim<pRtree->nDim; iDim++){
                   2501:     aCenterCoord[iDim] = (float)(aCenterCoord[iDim]/((float)nCell*2.0));
                   2502:   }
                   2503: 
                   2504:   for(ii=0; ii<nCell; ii++){
                   2505:     aDistance[ii] = 0.0;
                   2506:     for(iDim=0; iDim<pRtree->nDim; iDim++){
                   2507:       float coord = (float)(DCOORD(aCell[ii].aCoord[iDim*2+1]) - 
                   2508:           DCOORD(aCell[ii].aCoord[iDim*2]));
                   2509:       aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]);
                   2510:     }
                   2511:   }
                   2512: 
                   2513:   SortByDistance(aOrder, nCell, aDistance, aSpare);
                   2514:   nodeZero(pRtree, pNode);
                   2515: 
                   2516:   for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){
                   2517:     RtreeCell *p = &aCell[aOrder[ii]];
                   2518:     nodeInsertCell(pRtree, pNode, p);
                   2519:     if( p->iRowid==pCell->iRowid ){
                   2520:       if( iHeight==0 ){
                   2521:         rc = rowidWrite(pRtree, p->iRowid, pNode->iNode);
                   2522:       }else{
                   2523:         rc = parentWrite(pRtree, p->iRowid, pNode->iNode);
                   2524:       }
                   2525:     }
                   2526:   }
                   2527:   if( rc==SQLITE_OK ){
                   2528:     rc = fixBoundingBox(pRtree, pNode);
                   2529:   }
                   2530:   for(; rc==SQLITE_OK && ii<nCell; ii++){
                   2531:     /* Find a node to store this cell in. pNode->iNode currently contains
                   2532:     ** the height of the sub-tree headed by the cell.
                   2533:     */
                   2534:     RtreeNode *pInsert;
                   2535:     RtreeCell *p = &aCell[aOrder[ii]];
                   2536:     rc = ChooseLeaf(pRtree, p, iHeight, &pInsert);
                   2537:     if( rc==SQLITE_OK ){
                   2538:       int rc2;
                   2539:       rc = rtreeInsertCell(pRtree, pInsert, p, iHeight);
                   2540:       rc2 = nodeRelease(pRtree, pInsert);
                   2541:       if( rc==SQLITE_OK ){
                   2542:         rc = rc2;
                   2543:       }
                   2544:     }
                   2545:   }
                   2546: 
                   2547:   sqlite3_free(aCell);
                   2548:   return rc;
                   2549: }
                   2550: 
                   2551: /*
                   2552: ** Insert cell pCell into node pNode. Node pNode is the head of a 
                   2553: ** subtree iHeight high (leaf nodes have iHeight==0).
                   2554: */
                   2555: static int rtreeInsertCell(
                   2556:   Rtree *pRtree,
                   2557:   RtreeNode *pNode,
                   2558:   RtreeCell *pCell,
                   2559:   int iHeight
                   2560: ){
                   2561:   int rc = SQLITE_OK;
                   2562:   if( iHeight>0 ){
                   2563:     RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid);
                   2564:     if( pChild ){
                   2565:       nodeRelease(pRtree, pChild->pParent);
                   2566:       nodeReference(pNode);
                   2567:       pChild->pParent = pNode;
                   2568:     }
                   2569:   }
                   2570:   if( nodeInsertCell(pRtree, pNode, pCell) ){
                   2571: #if VARIANT_RSTARTREE_REINSERT
                   2572:     if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){
                   2573:       rc = SplitNode(pRtree, pNode, pCell, iHeight);
                   2574:     }else{
                   2575:       pRtree->iReinsertHeight = iHeight;
                   2576:       rc = Reinsert(pRtree, pNode, pCell, iHeight);
                   2577:     }
                   2578: #else
                   2579:     rc = SplitNode(pRtree, pNode, pCell, iHeight);
                   2580: #endif
                   2581:   }else{
                   2582:     rc = AdjustTree(pRtree, pNode, pCell);
                   2583:     if( rc==SQLITE_OK ){
                   2584:       if( iHeight==0 ){
                   2585:         rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode);
                   2586:       }else{
                   2587:         rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode);
                   2588:       }
                   2589:     }
                   2590:   }
                   2591:   return rc;
                   2592: }
                   2593: 
                   2594: static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){
                   2595:   int ii;
                   2596:   int rc = SQLITE_OK;
                   2597:   int nCell = NCELL(pNode);
                   2598: 
                   2599:   for(ii=0; rc==SQLITE_OK && ii<nCell; ii++){
                   2600:     RtreeNode *pInsert;
                   2601:     RtreeCell cell;
                   2602:     nodeGetCell(pRtree, pNode, ii, &cell);
                   2603: 
                   2604:     /* Find a node to store this cell in. pNode->iNode currently contains
                   2605:     ** the height of the sub-tree headed by the cell.
                   2606:     */
                   2607:     rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert);
                   2608:     if( rc==SQLITE_OK ){
                   2609:       int rc2;
                   2610:       rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode);
                   2611:       rc2 = nodeRelease(pRtree, pInsert);
                   2612:       if( rc==SQLITE_OK ){
                   2613:         rc = rc2;
                   2614:       }
                   2615:     }
                   2616:   }
                   2617:   return rc;
                   2618: }
                   2619: 
                   2620: /*
                   2621: ** Select a currently unused rowid for a new r-tree record.
                   2622: */
                   2623: static int newRowid(Rtree *pRtree, i64 *piRowid){
                   2624:   int rc;
                   2625:   sqlite3_bind_null(pRtree->pWriteRowid, 1);
                   2626:   sqlite3_bind_null(pRtree->pWriteRowid, 2);
                   2627:   sqlite3_step(pRtree->pWriteRowid);
                   2628:   rc = sqlite3_reset(pRtree->pWriteRowid);
                   2629:   *piRowid = sqlite3_last_insert_rowid(pRtree->db);
                   2630:   return rc;
                   2631: }
                   2632: 
                   2633: /*
                   2634: ** Remove the entry with rowid=iDelete from the r-tree structure.
                   2635: */
                   2636: static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
                   2637:   int rc;                         /* Return code */
                   2638:   RtreeNode *pLeaf;               /* Leaf node containing record iDelete */
                   2639:   int iCell;                      /* Index of iDelete cell in pLeaf */
                   2640:   RtreeNode *pRoot;               /* Root node of rtree structure */
                   2641: 
                   2642: 
                   2643:   /* Obtain a reference to the root node to initialise Rtree.iDepth */
                   2644:   rc = nodeAcquire(pRtree, 1, 0, &pRoot);
                   2645: 
                   2646:   /* Obtain a reference to the leaf node that contains the entry 
                   2647:   ** about to be deleted. 
                   2648:   */
                   2649:   if( rc==SQLITE_OK ){
                   2650:     rc = findLeafNode(pRtree, iDelete, &pLeaf);
                   2651:   }
                   2652: 
                   2653:   /* Delete the cell in question from the leaf node. */
                   2654:   if( rc==SQLITE_OK ){
                   2655:     int rc2;
                   2656:     rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell);
                   2657:     if( rc==SQLITE_OK ){
                   2658:       rc = deleteCell(pRtree, pLeaf, iCell, 0);
                   2659:     }
                   2660:     rc2 = nodeRelease(pRtree, pLeaf);
                   2661:     if( rc==SQLITE_OK ){
                   2662:       rc = rc2;
                   2663:     }
                   2664:   }
                   2665: 
                   2666:   /* Delete the corresponding entry in the <rtree>_rowid table. */
                   2667:   if( rc==SQLITE_OK ){
                   2668:     sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete);
                   2669:     sqlite3_step(pRtree->pDeleteRowid);
                   2670:     rc = sqlite3_reset(pRtree->pDeleteRowid);
                   2671:   }
                   2672: 
                   2673:   /* Check if the root node now has exactly one child. If so, remove
                   2674:   ** it, schedule the contents of the child for reinsertion and 
                   2675:   ** reduce the tree height by one.
                   2676:   **
                   2677:   ** This is equivalent to copying the contents of the child into
                   2678:   ** the root node (the operation that Gutman's paper says to perform 
                   2679:   ** in this scenario).
                   2680:   */
                   2681:   if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){
                   2682:     int rc2;
                   2683:     RtreeNode *pChild;
                   2684:     i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
                   2685:     rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
                   2686:     if( rc==SQLITE_OK ){
                   2687:       rc = removeNode(pRtree, pChild, pRtree->iDepth-1);
                   2688:     }
                   2689:     rc2 = nodeRelease(pRtree, pChild);
                   2690:     if( rc==SQLITE_OK ) rc = rc2;
                   2691:     if( rc==SQLITE_OK ){
                   2692:       pRtree->iDepth--;
                   2693:       writeInt16(pRoot->zData, pRtree->iDepth);
                   2694:       pRoot->isDirty = 1;
                   2695:     }
                   2696:   }
                   2697: 
                   2698:   /* Re-insert the contents of any underfull nodes removed from the tree. */
                   2699:   for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){
                   2700:     if( rc==SQLITE_OK ){
                   2701:       rc = reinsertNodeContent(pRtree, pLeaf);
                   2702:     }
                   2703:     pRtree->pDeleted = pLeaf->pNext;
                   2704:     sqlite3_free(pLeaf);
                   2705:   }
                   2706: 
                   2707:   /* Release the reference to the root node. */
                   2708:   if( rc==SQLITE_OK ){
                   2709:     rc = nodeRelease(pRtree, pRoot);
                   2710:   }else{
                   2711:     nodeRelease(pRtree, pRoot);
                   2712:   }
                   2713: 
                   2714:   return rc;
                   2715: }
                   2716: 
                   2717: /*
                   2718: ** The xUpdate method for rtree module virtual tables.
                   2719: */
                   2720: static int rtreeUpdate(
                   2721:   sqlite3_vtab *pVtab, 
                   2722:   int nData, 
                   2723:   sqlite3_value **azData, 
                   2724:   sqlite_int64 *pRowid
                   2725: ){
                   2726:   Rtree *pRtree = (Rtree *)pVtab;
                   2727:   int rc = SQLITE_OK;
                   2728:   RtreeCell cell;                 /* New cell to insert if nData>1 */
                   2729:   int bHaveRowid = 0;             /* Set to 1 after new rowid is determined */
                   2730: 
                   2731:   rtreeReference(pRtree);
                   2732:   assert(nData>=1);
                   2733: 
                   2734:   /* Constraint handling. A write operation on an r-tree table may return
                   2735:   ** SQLITE_CONSTRAINT for two reasons:
                   2736:   **
                   2737:   **   1. A duplicate rowid value, or
                   2738:   **   2. The supplied data violates the "x2>=x1" constraint.
                   2739:   **
                   2740:   ** In the first case, if the conflict-handling mode is REPLACE, then
                   2741:   ** the conflicting row can be removed before proceeding. In the second
                   2742:   ** case, SQLITE_CONSTRAINT must be returned regardless of the
                   2743:   ** conflict-handling mode specified by the user.
                   2744:   */
                   2745:   if( nData>1 ){
                   2746:     int ii;
                   2747: 
                   2748:     /* Populate the cell.aCoord[] array. The first coordinate is azData[3]. */
                   2749:     assert( nData==(pRtree->nDim*2 + 3) );
                   2750:     if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
                   2751:       for(ii=0; ii<(pRtree->nDim*2); ii+=2){
                   2752:         cell.aCoord[ii].f = (float)sqlite3_value_double(azData[ii+3]);
                   2753:         cell.aCoord[ii+1].f = (float)sqlite3_value_double(azData[ii+4]);
                   2754:         if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){
                   2755:           rc = SQLITE_CONSTRAINT;
                   2756:           goto constraint;
                   2757:         }
                   2758:       }
                   2759:     }else{
                   2760:       for(ii=0; ii<(pRtree->nDim*2); ii+=2){
                   2761:         cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]);
                   2762:         cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]);
                   2763:         if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){
                   2764:           rc = SQLITE_CONSTRAINT;
                   2765:           goto constraint;
                   2766:         }
                   2767:       }
                   2768:     }
                   2769: 
                   2770:     /* If a rowid value was supplied, check if it is already present in 
                   2771:     ** the table. If so, the constraint has failed. */
                   2772:     if( sqlite3_value_type(azData[2])!=SQLITE_NULL ){
                   2773:       cell.iRowid = sqlite3_value_int64(azData[2]);
                   2774:       if( sqlite3_value_type(azData[0])==SQLITE_NULL
                   2775:        || sqlite3_value_int64(azData[0])!=cell.iRowid
                   2776:       ){
                   2777:         int steprc;
                   2778:         sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
                   2779:         steprc = sqlite3_step(pRtree->pReadRowid);
                   2780:         rc = sqlite3_reset(pRtree->pReadRowid);
                   2781:         if( SQLITE_ROW==steprc ){
                   2782:           if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){
                   2783:             rc = rtreeDeleteRowid(pRtree, cell.iRowid);
                   2784:           }else{
                   2785:             rc = SQLITE_CONSTRAINT;
                   2786:             goto constraint;
                   2787:           }
                   2788:         }
                   2789:       }
                   2790:       bHaveRowid = 1;
                   2791:     }
                   2792:   }
                   2793: 
                   2794:   /* If azData[0] is not an SQL NULL value, it is the rowid of a
                   2795:   ** record to delete from the r-tree table. The following block does
                   2796:   ** just that.
                   2797:   */
                   2798:   if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){
                   2799:     rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(azData[0]));
                   2800:   }
                   2801: 
                   2802:   /* If the azData[] array contains more than one element, elements
                   2803:   ** (azData[2]..azData[argc-1]) contain a new record to insert into
                   2804:   ** the r-tree structure.
                   2805:   */
                   2806:   if( rc==SQLITE_OK && nData>1 ){
                   2807:     /* Insert the new record into the r-tree */
                   2808:     RtreeNode *pLeaf;
                   2809: 
                   2810:     /* Figure out the rowid of the new row. */
                   2811:     if( bHaveRowid==0 ){
                   2812:       rc = newRowid(pRtree, &cell.iRowid);
                   2813:     }
                   2814:     *pRowid = cell.iRowid;
                   2815: 
                   2816:     if( rc==SQLITE_OK ){
                   2817:       rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf);
                   2818:     }
                   2819:     if( rc==SQLITE_OK ){
                   2820:       int rc2;
                   2821:       pRtree->iReinsertHeight = -1;
                   2822:       rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0);
                   2823:       rc2 = nodeRelease(pRtree, pLeaf);
                   2824:       if( rc==SQLITE_OK ){
                   2825:         rc = rc2;
                   2826:       }
                   2827:     }
                   2828:   }
                   2829: 
                   2830: constraint:
                   2831:   rtreeRelease(pRtree);
                   2832:   return rc;
                   2833: }
                   2834: 
                   2835: /*
                   2836: ** The xRename method for rtree module virtual tables.
                   2837: */
                   2838: static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){
                   2839:   Rtree *pRtree = (Rtree *)pVtab;
                   2840:   int rc = SQLITE_NOMEM;
                   2841:   char *zSql = sqlite3_mprintf(
                   2842:     "ALTER TABLE %Q.'%q_node'   RENAME TO \"%w_node\";"
                   2843:     "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";"
                   2844:     "ALTER TABLE %Q.'%q_rowid'  RENAME TO \"%w_rowid\";"
                   2845:     , pRtree->zDb, pRtree->zName, zNewName 
                   2846:     , pRtree->zDb, pRtree->zName, zNewName 
                   2847:     , pRtree->zDb, pRtree->zName, zNewName
                   2848:   );
                   2849:   if( zSql ){
                   2850:     rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0);
                   2851:     sqlite3_free(zSql);
                   2852:   }
                   2853:   return rc;
                   2854: }
                   2855: 
                   2856: static sqlite3_module rtreeModule = {
                   2857:   0,                          /* iVersion */
                   2858:   rtreeCreate,                /* xCreate - create a table */
                   2859:   rtreeConnect,               /* xConnect - connect to an existing table */
                   2860:   rtreeBestIndex,             /* xBestIndex - Determine search strategy */
                   2861:   rtreeDisconnect,            /* xDisconnect - Disconnect from a table */
                   2862:   rtreeDestroy,               /* xDestroy - Drop a table */
                   2863:   rtreeOpen,                  /* xOpen - open a cursor */
                   2864:   rtreeClose,                 /* xClose - close a cursor */
                   2865:   rtreeFilter,                /* xFilter - configure scan constraints */
                   2866:   rtreeNext,                  /* xNext - advance a cursor */
                   2867:   rtreeEof,                   /* xEof */
                   2868:   rtreeColumn,                /* xColumn - read data */
                   2869:   rtreeRowid,                 /* xRowid - read data */
                   2870:   rtreeUpdate,                /* xUpdate - write data */
                   2871:   0,                          /* xBegin - begin transaction */
                   2872:   0,                          /* xSync - sync transaction */
                   2873:   0,                          /* xCommit - commit transaction */
                   2874:   0,                          /* xRollback - rollback transaction */
                   2875:   0,                          /* xFindFunction - function overloading */
                   2876:   rtreeRename,                /* xRename - rename the table */
                   2877:   0,                          /* xSavepoint */
                   2878:   0,                          /* xRelease */
                   2879:   0                           /* xRollbackTo */
                   2880: };
                   2881: 
                   2882: static int rtreeSqlInit(
                   2883:   Rtree *pRtree, 
                   2884:   sqlite3 *db, 
                   2885:   const char *zDb, 
                   2886:   const char *zPrefix, 
                   2887:   int isCreate
                   2888: ){
                   2889:   int rc = SQLITE_OK;
                   2890: 
                   2891:   #define N_STATEMENT 9
                   2892:   static const char *azSql[N_STATEMENT] = {
                   2893:     /* Read and write the xxx_node table */
                   2894:     "SELECT data FROM '%q'.'%q_node' WHERE nodeno = :1",
                   2895:     "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
                   2896:     "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
                   2897: 
                   2898:     /* Read and write the xxx_rowid table */
                   2899:     "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
                   2900:     "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
                   2901:     "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
                   2902: 
                   2903:     /* Read and write the xxx_parent table */
                   2904:     "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
                   2905:     "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
                   2906:     "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
                   2907:   };
                   2908:   sqlite3_stmt **appStmt[N_STATEMENT];
                   2909:   int i;
                   2910: 
                   2911:   pRtree->db = db;
                   2912: 
                   2913:   if( isCreate ){
                   2914:     char *zCreate = sqlite3_mprintf(
                   2915: "CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
                   2916: "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
                   2917: "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER);"
                   2918: "INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
                   2919:       zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize
                   2920:     );
                   2921:     if( !zCreate ){
                   2922:       return SQLITE_NOMEM;
                   2923:     }
                   2924:     rc = sqlite3_exec(db, zCreate, 0, 0, 0);
                   2925:     sqlite3_free(zCreate);
                   2926:     if( rc!=SQLITE_OK ){
                   2927:       return rc;
                   2928:     }
                   2929:   }
                   2930: 
                   2931:   appStmt[0] = &pRtree->pReadNode;
                   2932:   appStmt[1] = &pRtree->pWriteNode;
                   2933:   appStmt[2] = &pRtree->pDeleteNode;
                   2934:   appStmt[3] = &pRtree->pReadRowid;
                   2935:   appStmt[4] = &pRtree->pWriteRowid;
                   2936:   appStmt[5] = &pRtree->pDeleteRowid;
                   2937:   appStmt[6] = &pRtree->pReadParent;
                   2938:   appStmt[7] = &pRtree->pWriteParent;
                   2939:   appStmt[8] = &pRtree->pDeleteParent;
                   2940: 
                   2941:   for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
                   2942:     char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
                   2943:     if( zSql ){
                   2944:       rc = sqlite3_prepare_v2(db, zSql, -1, appStmt[i], 0); 
                   2945:     }else{
                   2946:       rc = SQLITE_NOMEM;
                   2947:     }
                   2948:     sqlite3_free(zSql);
                   2949:   }
                   2950: 
                   2951:   return rc;
                   2952: }
                   2953: 
                   2954: /*
                   2955: ** The second argument to this function contains the text of an SQL statement
                   2956: ** that returns a single integer value. The statement is compiled and executed
                   2957: ** using database connection db. If successful, the integer value returned
                   2958: ** is written to *piVal and SQLITE_OK returned. Otherwise, an SQLite error
                   2959: ** code is returned and the value of *piVal after returning is not defined.
                   2960: */
                   2961: static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){
                   2962:   int rc = SQLITE_NOMEM;
                   2963:   if( zSql ){
                   2964:     sqlite3_stmt *pStmt = 0;
                   2965:     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
                   2966:     if( rc==SQLITE_OK ){
                   2967:       if( SQLITE_ROW==sqlite3_step(pStmt) ){
                   2968:         *piVal = sqlite3_column_int(pStmt, 0);
                   2969:       }
                   2970:       rc = sqlite3_finalize(pStmt);
                   2971:     }
                   2972:   }
                   2973:   return rc;
                   2974: }
                   2975: 
                   2976: /*
                   2977: ** This function is called from within the xConnect() or xCreate() method to
                   2978: ** determine the node-size used by the rtree table being created or connected
                   2979: ** to. If successful, pRtree->iNodeSize is populated and SQLITE_OK returned.
                   2980: ** Otherwise, an SQLite error code is returned.
                   2981: **
                   2982: ** If this function is being called as part of an xConnect(), then the rtree
                   2983: ** table already exists. In this case the node-size is determined by inspecting
                   2984: ** the root node of the tree.
                   2985: **
                   2986: ** Otherwise, for an xCreate(), use 64 bytes less than the database page-size. 
                   2987: ** This ensures that each node is stored on a single database page. If the 
                   2988: ** database page-size is so large that more than RTREE_MAXCELLS entries 
                   2989: ** would fit in a single node, use a smaller node-size.
                   2990: */
                   2991: static int getNodeSize(
                   2992:   sqlite3 *db,                    /* Database handle */
                   2993:   Rtree *pRtree,                  /* Rtree handle */
                   2994:   int isCreate                    /* True for xCreate, false for xConnect */
                   2995: ){
                   2996:   int rc;
                   2997:   char *zSql;
                   2998:   if( isCreate ){
                   2999:     int iPageSize = 0;
                   3000:     zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb);
                   3001:     rc = getIntFromStmt(db, zSql, &iPageSize);
                   3002:     if( rc==SQLITE_OK ){
                   3003:       pRtree->iNodeSize = iPageSize-64;
                   3004:       if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)<pRtree->iNodeSize ){
                   3005:         pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS;
                   3006:       }
                   3007:     }
                   3008:   }else{
                   3009:     zSql = sqlite3_mprintf(
                   3010:         "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1",
                   3011:         pRtree->zDb, pRtree->zName
                   3012:     );
                   3013:     rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize);
                   3014:   }
                   3015: 
                   3016:   sqlite3_free(zSql);
                   3017:   return rc;
                   3018: }
                   3019: 
                   3020: /* 
                   3021: ** This function is the implementation of both the xConnect and xCreate
                   3022: ** methods of the r-tree virtual table.
                   3023: **
                   3024: **   argv[0]   -> module name
                   3025: **   argv[1]   -> database name
                   3026: **   argv[2]   -> table name
                   3027: **   argv[...] -> column names...
                   3028: */
                   3029: static int rtreeInit(
                   3030:   sqlite3 *db,                        /* Database connection */
                   3031:   void *pAux,                         /* One of the RTREE_COORD_* constants */
                   3032:   int argc, const char *const*argv,   /* Parameters to CREATE TABLE statement */
                   3033:   sqlite3_vtab **ppVtab,              /* OUT: New virtual table */
                   3034:   char **pzErr,                       /* OUT: Error message, if any */
                   3035:   int isCreate                        /* True for xCreate, false for xConnect */
                   3036: ){
                   3037:   int rc = SQLITE_OK;
                   3038:   Rtree *pRtree;
                   3039:   int nDb;              /* Length of string argv[1] */
                   3040:   int nName;            /* Length of string argv[2] */
                   3041:   int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32);
                   3042: 
                   3043:   const char *aErrMsg[] = {
                   3044:     0,                                                    /* 0 */
                   3045:     "Wrong number of columns for an rtree table",         /* 1 */
                   3046:     "Too few columns for an rtree table",                 /* 2 */
                   3047:     "Too many columns for an rtree table"                 /* 3 */
                   3048:   };
                   3049: 
                   3050:   int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2;
                   3051:   if( aErrMsg[iErr] ){
                   3052:     *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
                   3053:     return SQLITE_ERROR;
                   3054:   }
                   3055: 
                   3056:   sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
                   3057: 
                   3058:   /* Allocate the sqlite3_vtab structure */
                   3059:   nDb = strlen(argv[1]);
                   3060:   nName = strlen(argv[2]);
                   3061:   pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2);
                   3062:   if( !pRtree ){
                   3063:     return SQLITE_NOMEM;
                   3064:   }
                   3065:   memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2);
                   3066:   pRtree->nBusy = 1;
                   3067:   pRtree->base.pModule = &rtreeModule;
                   3068:   pRtree->zDb = (char *)&pRtree[1];
                   3069:   pRtree->zName = &pRtree->zDb[nDb+1];
                   3070:   pRtree->nDim = (argc-4)/2;
                   3071:   pRtree->nBytesPerCell = 8 + pRtree->nDim*4*2;
                   3072:   pRtree->eCoordType = eCoordType;
                   3073:   memcpy(pRtree->zDb, argv[1], nDb);
                   3074:   memcpy(pRtree->zName, argv[2], nName);
                   3075: 
                   3076:   /* Figure out the node size to use. */
                   3077:   rc = getNodeSize(db, pRtree, isCreate);
                   3078: 
                   3079:   /* Create/Connect to the underlying relational database schema. If
                   3080:   ** that is successful, call sqlite3_declare_vtab() to configure
                   3081:   ** the r-tree table schema.
                   3082:   */
                   3083:   if( rc==SQLITE_OK ){
                   3084:     if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){
                   3085:       *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
                   3086:     }else{
                   3087:       char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]);
                   3088:       char *zTmp;
                   3089:       int ii;
                   3090:       for(ii=4; zSql && ii<argc; ii++){
                   3091:         zTmp = zSql;
                   3092:         zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]);
                   3093:         sqlite3_free(zTmp);
                   3094:       }
                   3095:       if( zSql ){
                   3096:         zTmp = zSql;
                   3097:         zSql = sqlite3_mprintf("%s);", zTmp);
                   3098:         sqlite3_free(zTmp);
                   3099:       }
                   3100:       if( !zSql ){
                   3101:         rc = SQLITE_NOMEM;
                   3102:       }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
                   3103:         *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
                   3104:       }
                   3105:       sqlite3_free(zSql);
                   3106:     }
                   3107:   }
                   3108: 
                   3109:   if( rc==SQLITE_OK ){
                   3110:     *ppVtab = (sqlite3_vtab *)pRtree;
                   3111:   }else{
                   3112:     rtreeRelease(pRtree);
                   3113:   }
                   3114:   return rc;
                   3115: }
                   3116: 
                   3117: 
                   3118: /*
                   3119: ** Implementation of a scalar function that decodes r-tree nodes to
                   3120: ** human readable strings. This can be used for debugging and analysis.
                   3121: **
                   3122: ** The scalar function takes two arguments, a blob of data containing
                   3123: ** an r-tree node, and the number of dimensions the r-tree indexes.
                   3124: ** For a two-dimensional r-tree structure called "rt", to deserialize
                   3125: ** all nodes, a statement like:
                   3126: **
                   3127: **   SELECT rtreenode(2, data) FROM rt_node;
                   3128: **
                   3129: ** The human readable string takes the form of a Tcl list with one
                   3130: ** entry for each cell in the r-tree node. Each entry is itself a
                   3131: ** list, containing the 8-byte rowid/pageno followed by the 
                   3132: ** <num-dimension>*2 coordinates.
                   3133: */
                   3134: static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
                   3135:   char *zText = 0;
                   3136:   RtreeNode node;
                   3137:   Rtree tree;
                   3138:   int ii;
                   3139: 
                   3140:   UNUSED_PARAMETER(nArg);
                   3141:   memset(&node, 0, sizeof(RtreeNode));
                   3142:   memset(&tree, 0, sizeof(Rtree));
                   3143:   tree.nDim = sqlite3_value_int(apArg[0]);
                   3144:   tree.nBytesPerCell = 8 + 8 * tree.nDim;
                   3145:   node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
                   3146: 
                   3147:   for(ii=0; ii<NCELL(&node); ii++){
                   3148:     char zCell[512];
                   3149:     int nCell = 0;
                   3150:     RtreeCell cell;
                   3151:     int jj;
                   3152: 
                   3153:     nodeGetCell(&tree, &node, ii, &cell);
                   3154:     sqlite3_snprintf(512-nCell,&zCell[nCell],"%lld", cell.iRowid);
                   3155:     nCell = strlen(zCell);
                   3156:     for(jj=0; jj<tree.nDim*2; jj++){
                   3157:       sqlite3_snprintf(512-nCell,&zCell[nCell]," %f",(double)cell.aCoord[jj].f);
                   3158:       nCell = strlen(zCell);
                   3159:     }
                   3160: 
                   3161:     if( zText ){
                   3162:       char *zTextNew = sqlite3_mprintf("%s {%s}", zText, zCell);
                   3163:       sqlite3_free(zText);
                   3164:       zText = zTextNew;
                   3165:     }else{
                   3166:       zText = sqlite3_mprintf("{%s}", zCell);
                   3167:     }
                   3168:   }
                   3169:   
                   3170:   sqlite3_result_text(ctx, zText, -1, sqlite3_free);
                   3171: }
                   3172: 
                   3173: static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
                   3174:   UNUSED_PARAMETER(nArg);
                   3175:   if( sqlite3_value_type(apArg[0])!=SQLITE_BLOB 
                   3176:    || sqlite3_value_bytes(apArg[0])<2
                   3177:   ){
                   3178:     sqlite3_result_error(ctx, "Invalid argument to rtreedepth()", -1); 
                   3179:   }else{
                   3180:     u8 *zBlob = (u8 *)sqlite3_value_blob(apArg[0]);
                   3181:     sqlite3_result_int(ctx, readInt16(zBlob));
                   3182:   }
                   3183: }
                   3184: 
                   3185: /*
                   3186: ** Register the r-tree module with database handle db. This creates the
                   3187: ** virtual table module "rtree" and the debugging/analysis scalar 
                   3188: ** function "rtreenode".
                   3189: */
                   3190: int sqlite3RtreeInit(sqlite3 *db){
                   3191:   const int utf8 = SQLITE_UTF8;
                   3192:   int rc;
                   3193: 
                   3194:   rc = sqlite3_create_function(db, "rtreenode", 2, utf8, 0, rtreenode, 0, 0);
                   3195:   if( rc==SQLITE_OK ){
                   3196:     rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0);
                   3197:   }
                   3198:   if( rc==SQLITE_OK ){
                   3199:     void *c = (void *)RTREE_COORD_REAL32;
                   3200:     rc = sqlite3_create_module_v2(db, "rtree", &rtreeModule, c, 0);
                   3201:   }
                   3202:   if( rc==SQLITE_OK ){
                   3203:     void *c = (void *)RTREE_COORD_INT32;
                   3204:     rc = sqlite3_create_module_v2(db, "rtree_i32", &rtreeModule, c, 0);
                   3205:   }
                   3206: 
                   3207:   return rc;
                   3208: }
                   3209: 
                   3210: /*
                   3211: ** A version of sqlite3_free() that can be used as a callback. This is used
                   3212: ** in two places - as the destructor for the blob value returned by the
                   3213: ** invocation of a geometry function, and as the destructor for the geometry
                   3214: ** functions themselves.
                   3215: */
                   3216: static void doSqlite3Free(void *p){
                   3217:   sqlite3_free(p);
                   3218: }
                   3219: 
                   3220: /*
                   3221: ** Each call to sqlite3_rtree_geometry_callback() creates an ordinary SQLite
                   3222: ** scalar user function. This C function is the callback used for all such
                   3223: ** registered SQL functions.
                   3224: **
                   3225: ** The scalar user functions return a blob that is interpreted by r-tree
                   3226: ** table MATCH operators.
                   3227: */
                   3228: static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){
                   3229:   RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx);
                   3230:   RtreeMatchArg *pBlob;
                   3231:   int nBlob;
                   3232: 
                   3233:   nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(double);
                   3234:   pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob);
                   3235:   if( !pBlob ){
                   3236:     sqlite3_result_error_nomem(ctx);
                   3237:   }else{
                   3238:     int i;
                   3239:     pBlob->magic = RTREE_GEOMETRY_MAGIC;
                   3240:     pBlob->xGeom = pGeomCtx->xGeom;
                   3241:     pBlob->pContext = pGeomCtx->pContext;
                   3242:     pBlob->nParam = nArg;
                   3243:     for(i=0; i<nArg; i++){
                   3244:       pBlob->aParam[i] = sqlite3_value_double(aArg[i]);
                   3245:     }
                   3246:     sqlite3_result_blob(ctx, pBlob, nBlob, doSqlite3Free);
                   3247:   }
                   3248: }
                   3249: 
                   3250: /*
                   3251: ** Register a new geometry function for use with the r-tree MATCH operator.
                   3252: */
                   3253: int sqlite3_rtree_geometry_callback(
                   3254:   sqlite3 *db,
                   3255:   const char *zGeom,
                   3256:   int (*xGeom)(sqlite3_rtree_geometry *, int, double *, int *),
                   3257:   void *pContext
                   3258: ){
                   3259:   RtreeGeomCallback *pGeomCtx;      /* Context object for new user-function */
                   3260: 
                   3261:   /* Allocate and populate the context object. */
                   3262:   pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback));
                   3263:   if( !pGeomCtx ) return SQLITE_NOMEM;
                   3264:   pGeomCtx->xGeom = xGeom;
                   3265:   pGeomCtx->pContext = pContext;
                   3266: 
                   3267:   /* Create the new user-function. Register a destructor function to delete
                   3268:   ** the context object when it is no longer required.  */
                   3269:   return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, 
                   3270:       (void *)pGeomCtx, geomCallback, 0, 0, doSqlite3Free
                   3271:   );
                   3272: }
                   3273: 
                   3274: #if !SQLITE_CORE
                   3275: int sqlite3_extension_init(
                   3276:   sqlite3 *db,
                   3277:   char **pzErrMsg,
                   3278:   const sqlite3_api_routines *pApi
                   3279: ){
                   3280:   SQLITE_EXTENSION_INIT2(pApi)
                   3281:   return sqlite3RtreeInit(db);
                   3282: }
                   3283: #endif
                   3284: 
                   3285: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>