modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/rtree/rtree.c (about)

     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  #ifndef SQLITE_CORE
    58    #include "sqlite3ext.h"
    59    SQLITE_EXTENSION_INIT1
    60  #else
    61    #include "sqlite3.h"
    62  #endif
    63  
    64  #include <string.h>
    65  #include <assert.h>
    66  #include <stdio.h>
    67  
    68  #ifndef SQLITE_AMALGAMATION
    69  #include "sqlite3rtree.h"
    70  typedef sqlite3_int64 i64;
    71  typedef sqlite3_uint64 u64;
    72  typedef unsigned char u8;
    73  typedef unsigned short u16;
    74  typedef unsigned int u32;
    75  #endif
    76  
    77  /*  The following macro is used to suppress compiler warnings.
    78  */
    79  #ifndef UNUSED_PARAMETER
    80  # define UNUSED_PARAMETER(x) (void)(x)
    81  #endif
    82  
    83  typedef struct Rtree Rtree;
    84  typedef struct RtreeCursor RtreeCursor;
    85  typedef struct RtreeNode RtreeNode;
    86  typedef struct RtreeCell RtreeCell;
    87  typedef struct RtreeConstraint RtreeConstraint;
    88  typedef struct RtreeMatchArg RtreeMatchArg;
    89  typedef struct RtreeGeomCallback RtreeGeomCallback;
    90  typedef union RtreeCoord RtreeCoord;
    91  typedef struct RtreeSearchPoint RtreeSearchPoint;
    92  
    93  /* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */
    94  #define RTREE_MAX_DIMENSIONS 5
    95  
    96  /* Size of hash table Rtree.aHash. This hash table is not expected to
    97  ** ever contain very many entries, so a fixed number of buckets is 
    98  ** used.
    99  */
   100  #define HASHSIZE 97
   101  
   102  /* The xBestIndex method of this virtual table requires an estimate of
   103  ** the number of rows in the virtual table to calculate the costs of
   104  ** various strategies. If possible, this estimate is loaded from the
   105  ** sqlite_stat1 table (with RTREE_MIN_ROWEST as a hard-coded minimum).
   106  ** Otherwise, if no sqlite_stat1 entry is available, use 
   107  ** RTREE_DEFAULT_ROWEST.
   108  */
   109  #define RTREE_DEFAULT_ROWEST 1048576
   110  #define RTREE_MIN_ROWEST         100
   111  
   112  /* 
   113  ** An rtree virtual-table object.
   114  */
   115  struct Rtree {
   116    sqlite3_vtab base;          /* Base class.  Must be first */
   117    sqlite3 *db;                /* Host database connection */
   118    int iNodeSize;              /* Size in bytes of each node in the node table */
   119    u8 nDim;                    /* Number of dimensions */
   120    u8 nDim2;                   /* Twice the number of dimensions */
   121    u8 eCoordType;              /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */
   122    u8 nBytesPerCell;           /* Bytes consumed per cell */
   123    u8 inWrTrans;               /* True if inside write transaction */
   124    int iDepth;                 /* Current depth of the r-tree structure */
   125    char *zDb;                  /* Name of database containing r-tree table */
   126    char *zName;                /* Name of r-tree table */ 
   127    u32 nBusy;                  /* Current number of users of this structure */
   128    i64 nRowEst;                /* Estimated number of rows in this table */
   129    u32 nCursor;                /* Number of open cursors */
   130  
   131    /* List of nodes removed during a CondenseTree operation. List is
   132    ** linked together via the pointer normally used for hash chains -
   133    ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree 
   134    ** headed by the node (leaf nodes have RtreeNode.iNode==0).
   135    */
   136    RtreeNode *pDeleted;
   137    int iReinsertHeight;        /* Height of sub-trees Reinsert() has run on */
   138  
   139    /* Blob I/O on xxx_node */
   140    sqlite3_blob *pNodeBlob;
   141  
   142    /* Statements to read/write/delete a record from xxx_node */
   143    sqlite3_stmt *pWriteNode;
   144    sqlite3_stmt *pDeleteNode;
   145  
   146    /* Statements to read/write/delete a record from xxx_rowid */
   147    sqlite3_stmt *pReadRowid;
   148    sqlite3_stmt *pWriteRowid;
   149    sqlite3_stmt *pDeleteRowid;
   150  
   151    /* Statements to read/write/delete a record from xxx_parent */
   152    sqlite3_stmt *pReadParent;
   153    sqlite3_stmt *pWriteParent;
   154    sqlite3_stmt *pDeleteParent;
   155  
   156    RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ 
   157  };
   158  
   159  /* Possible values for Rtree.eCoordType: */
   160  #define RTREE_COORD_REAL32 0
   161  #define RTREE_COORD_INT32  1
   162  
   163  /*
   164  ** If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will
   165  ** only deal with integer coordinates.  No floating point operations
   166  ** will be done.
   167  */
   168  #ifdef SQLITE_RTREE_INT_ONLY
   169    typedef sqlite3_int64 RtreeDValue;       /* High accuracy coordinate */
   170    typedef int RtreeValue;                  /* Low accuracy coordinate */
   171  # define RTREE_ZERO 0
   172  #else
   173    typedef double RtreeDValue;              /* High accuracy coordinate */
   174    typedef float RtreeValue;                /* Low accuracy coordinate */
   175  # define RTREE_ZERO 0.0
   176  #endif
   177  
   178  /*
   179  ** When doing a search of an r-tree, instances of the following structure
   180  ** record intermediate results from the tree walk.
   181  **
   182  ** The id is always a node-id.  For iLevel>=1 the id is the node-id of
   183  ** the node that the RtreeSearchPoint represents.  When iLevel==0, however,
   184  ** the id is of the parent node and the cell that RtreeSearchPoint
   185  ** represents is the iCell-th entry in the parent node.
   186  */
   187  struct RtreeSearchPoint {
   188    RtreeDValue rScore;    /* The score for this node.  Smallest goes first. */
   189    sqlite3_int64 id;      /* Node ID */
   190    u8 iLevel;             /* 0=entries.  1=leaf node.  2+ for higher */
   191    u8 eWithin;            /* PARTLY_WITHIN or FULLY_WITHIN */
   192    u8 iCell;              /* Cell index within the node */
   193  };
   194  
   195  /*
   196  ** The minimum number of cells allowed for a node is a third of the 
   197  ** maximum. In Gutman's notation:
   198  **
   199  **     m = M/3
   200  **
   201  ** If an R*-tree "Reinsert" operation is required, the same number of
   202  ** cells are removed from the overfull node and reinserted into the tree.
   203  */
   204  #define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3)
   205  #define RTREE_REINSERT(p) RTREE_MINCELLS(p)
   206  #define RTREE_MAXCELLS 51
   207  
   208  /*
   209  ** The smallest possible node-size is (512-64)==448 bytes. And the largest
   210  ** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates).
   211  ** Therefore all non-root nodes must contain at least 3 entries. Since 
   212  ** 2^40 is greater than 2^64, an r-tree structure always has a depth of
   213  ** 40 or less.
   214  */
   215  #define RTREE_MAX_DEPTH 40
   216  
   217  
   218  /*
   219  ** Number of entries in the cursor RtreeNode cache.  The first entry is
   220  ** used to cache the RtreeNode for RtreeCursor.sPoint.  The remaining
   221  ** entries cache the RtreeNode for the first elements of the priority queue.
   222  */
   223  #define RTREE_CACHE_SZ  5
   224  
   225  /* 
   226  ** An rtree cursor object.
   227  */
   228  struct RtreeCursor {
   229    sqlite3_vtab_cursor base;         /* Base class.  Must be first */
   230    u8 atEOF;                         /* True if at end of search */
   231    u8 bPoint;                        /* True if sPoint is valid */
   232    int iStrategy;                    /* Copy of idxNum search parameter */
   233    int nConstraint;                  /* Number of entries in aConstraint */
   234    RtreeConstraint *aConstraint;     /* Search constraints. */
   235    int nPointAlloc;                  /* Number of slots allocated for aPoint[] */
   236    int nPoint;                       /* Number of slots used in aPoint[] */
   237    int mxLevel;                      /* iLevel value for root of the tree */
   238    RtreeSearchPoint *aPoint;         /* Priority queue for search points */
   239    RtreeSearchPoint sPoint;          /* Cached next search point */
   240    RtreeNode *aNode[RTREE_CACHE_SZ]; /* Rtree node cache */
   241    u32 anQueue[RTREE_MAX_DEPTH+1];   /* Number of queued entries by iLevel */
   242  };
   243  
   244  /* Return the Rtree of a RtreeCursor */
   245  #define RTREE_OF_CURSOR(X)   ((Rtree*)((X)->base.pVtab))
   246  
   247  /*
   248  ** A coordinate can be either a floating point number or a integer.  All
   249  ** coordinates within a single R-Tree are always of the same time.
   250  */
   251  union RtreeCoord {
   252    RtreeValue f;      /* Floating point value */
   253    int i;             /* Integer value */
   254    u32 u;             /* Unsigned for byte-order conversions */
   255  };
   256  
   257  /*
   258  ** The argument is an RtreeCoord. Return the value stored within the RtreeCoord
   259  ** formatted as a RtreeDValue (double or int64). This macro assumes that local
   260  ** variable pRtree points to the Rtree structure associated with the
   261  ** RtreeCoord.
   262  */
   263  #ifdef SQLITE_RTREE_INT_ONLY
   264  # define DCOORD(coord) ((RtreeDValue)coord.i)
   265  #else
   266  # define DCOORD(coord) (                           \
   267      (pRtree->eCoordType==RTREE_COORD_REAL32) ?      \
   268        ((double)coord.f) :                           \
   269        ((double)coord.i)                             \
   270    )
   271  #endif
   272  
   273  /*
   274  ** A search constraint.
   275  */
   276  struct RtreeConstraint {
   277    int iCoord;                     /* Index of constrained coordinate */
   278    int op;                         /* Constraining operation */
   279    union {
   280      RtreeDValue rValue;             /* Constraint value. */
   281      int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*);
   282      int (*xQueryFunc)(sqlite3_rtree_query_info*);
   283    } u;
   284    sqlite3_rtree_query_info *pInfo;  /* xGeom and xQueryFunc argument */
   285  };
   286  
   287  /* Possible values for RtreeConstraint.op */
   288  #define RTREE_EQ    0x41  /* A */
   289  #define RTREE_LE    0x42  /* B */
   290  #define RTREE_LT    0x43  /* C */
   291  #define RTREE_GE    0x44  /* D */
   292  #define RTREE_GT    0x45  /* E */
   293  #define RTREE_MATCH 0x46  /* F: Old-style sqlite3_rtree_geometry_callback() */
   294  #define RTREE_QUERY 0x47  /* G: New-style sqlite3_rtree_query_callback() */
   295  
   296  
   297  /* 
   298  ** An rtree structure node.
   299  */
   300  struct RtreeNode {
   301    RtreeNode *pParent;         /* Parent node */
   302    i64 iNode;                  /* The node number */
   303    int nRef;                   /* Number of references to this node */
   304    int isDirty;                /* True if the node needs to be written to disk */
   305    u8 *zData;                  /* Content of the node, as should be on disk */
   306    RtreeNode *pNext;           /* Next node in this hash collision chain */
   307  };
   308  
   309  /* Return the number of cells in a node  */
   310  #define NCELL(pNode) readInt16(&(pNode)->zData[2])
   311  
   312  /* 
   313  ** A single cell from a node, deserialized
   314  */
   315  struct RtreeCell {
   316    i64 iRowid;                                 /* Node or entry ID */
   317    RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2];  /* Bounding box coordinates */
   318  };
   319  
   320  
   321  /*
   322  ** This object becomes the sqlite3_user_data() for the SQL functions
   323  ** that are created by sqlite3_rtree_geometry_callback() and
   324  ** sqlite3_rtree_query_callback() and which appear on the right of MATCH
   325  ** operators in order to constrain a search.
   326  **
   327  ** xGeom and xQueryFunc are the callback functions.  Exactly one of 
   328  ** xGeom and xQueryFunc fields is non-NULL, depending on whether the
   329  ** SQL function was created using sqlite3_rtree_geometry_callback() or
   330  ** sqlite3_rtree_query_callback().
   331  ** 
   332  ** This object is deleted automatically by the destructor mechanism in
   333  ** sqlite3_create_function_v2().
   334  */
   335  struct RtreeGeomCallback {
   336    int (*xGeom)(sqlite3_rtree_geometry*, int, RtreeDValue*, int*);
   337    int (*xQueryFunc)(sqlite3_rtree_query_info*);
   338    void (*xDestructor)(void*);
   339    void *pContext;
   340  };
   341  
   342  /*
   343  ** An instance of this structure (in the form of a BLOB) is returned by
   344  ** the SQL functions that sqlite3_rtree_geometry_callback() and
   345  ** sqlite3_rtree_query_callback() create, and is read as the right-hand
   346  ** operand to the MATCH operator of an R-Tree.
   347  */
   348  struct RtreeMatchArg {
   349    u32 iSize;                  /* Size of this object */
   350    RtreeGeomCallback cb;       /* Info about the callback functions */
   351    int nParam;                 /* Number of parameters to the SQL function */
   352    sqlite3_value **apSqlParam; /* Original SQL parameter values */
   353    RtreeDValue aParam[1];      /* Values for parameters to the SQL function */
   354  };
   355  
   356  #ifndef MAX
   357  # define MAX(x,y) ((x) < (y) ? (y) : (x))
   358  #endif
   359  #ifndef MIN
   360  # define MIN(x,y) ((x) > (y) ? (y) : (x))
   361  #endif
   362  
   363  /* What version of GCC is being used.  0 means GCC is not being used .
   364  ** Note that the GCC_VERSION macro will also be set correctly when using
   365  ** clang, since clang works hard to be gcc compatible.  So the gcc
   366  ** optimizations will also work when compiling with clang.
   367  */
   368  #ifndef GCC_VERSION
   369  #if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC)
   370  # define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__)
   371  #else
   372  # define GCC_VERSION 0
   373  #endif
   374  #endif
   375  
   376  /* The testcase() macro should already be defined in the amalgamation.  If
   377  ** it is not, make it a no-op.
   378  */
   379  #ifndef SQLITE_AMALGAMATION
   380  # define testcase(X)
   381  #endif
   382  
   383  /*
   384  ** Macros to determine whether the machine is big or little endian,
   385  ** and whether or not that determination is run-time or compile-time.
   386  **
   387  ** For best performance, an attempt is made to guess at the byte-order
   388  ** using C-preprocessor macros.  If that is unsuccessful, or if
   389  ** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined
   390  ** at run-time.
   391  */
   392  #ifndef SQLITE_BYTEORDER
   393  #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
   394      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
   395      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
   396      defined(__arm__)
   397  # define SQLITE_BYTEORDER    1234
   398  #elif defined(sparc)    || defined(__ppc__)
   399  # define SQLITE_BYTEORDER    4321
   400  #else
   401  # define SQLITE_BYTEORDER    0     /* 0 means "unknown at compile-time" */
   402  #endif
   403  #endif
   404  
   405  
   406  /* What version of MSVC is being used.  0 means MSVC is not being used */
   407  #ifndef MSVC_VERSION
   408  #if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC)
   409  # define MSVC_VERSION _MSC_VER
   410  #else
   411  # define MSVC_VERSION 0
   412  #endif
   413  #endif
   414  
   415  /*
   416  ** Functions to deserialize a 16 bit integer, 32 bit real number and
   417  ** 64 bit integer. The deserialized value is returned.
   418  */
   419  static int readInt16(u8 *p){
   420    return (p[0]<<8) + p[1];
   421  }
   422  static void readCoord(u8 *p, RtreeCoord *pCoord){
   423    assert( ((((char*)p) - (char*)0)&3)==0 );  /* p is always 4-byte aligned */
   424  #if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
   425    pCoord->u = _byteswap_ulong(*(u32*)p);
   426  #elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
   427    pCoord->u = __builtin_bswap32(*(u32*)p);
   428  #elif SQLITE_BYTEORDER==4321
   429    pCoord->u = *(u32*)p;
   430  #else
   431    pCoord->u = (
   432      (((u32)p[0]) << 24) + 
   433      (((u32)p[1]) << 16) + 
   434      (((u32)p[2]) <<  8) + 
   435      (((u32)p[3]) <<  0)
   436    );
   437  #endif
   438  }
   439  static i64 readInt64(u8 *p){
   440  #if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
   441    u64 x;
   442    memcpy(&x, p, 8);
   443    return (i64)_byteswap_uint64(x);
   444  #elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
   445    u64 x;
   446    memcpy(&x, p, 8);
   447    return (i64)__builtin_bswap64(x);
   448  #elif SQLITE_BYTEORDER==4321
   449    i64 x;
   450    memcpy(&x, p, 8);
   451    return x;
   452  #else
   453    return (i64)(
   454      (((u64)p[0]) << 56) + 
   455      (((u64)p[1]) << 48) + 
   456      (((u64)p[2]) << 40) + 
   457      (((u64)p[3]) << 32) + 
   458      (((u64)p[4]) << 24) + 
   459      (((u64)p[5]) << 16) + 
   460      (((u64)p[6]) <<  8) + 
   461      (((u64)p[7]) <<  0)
   462    );
   463  #endif
   464  }
   465  
   466  /*
   467  ** Functions to serialize a 16 bit integer, 32 bit real number and
   468  ** 64 bit integer. The value returned is the number of bytes written
   469  ** to the argument buffer (always 2, 4 and 8 respectively).
   470  */
   471  static void writeInt16(u8 *p, int i){
   472    p[0] = (i>> 8)&0xFF;
   473    p[1] = (i>> 0)&0xFF;
   474  }
   475  static int writeCoord(u8 *p, RtreeCoord *pCoord){
   476    u32 i;
   477    assert( ((((char*)p) - (char*)0)&3)==0 );  /* p is always 4-byte aligned */
   478    assert( sizeof(RtreeCoord)==4 );
   479    assert( sizeof(u32)==4 );
   480  #if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
   481    i = __builtin_bswap32(pCoord->u);
   482    memcpy(p, &i, 4);
   483  #elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
   484    i = _byteswap_ulong(pCoord->u);
   485    memcpy(p, &i, 4);
   486  #elif SQLITE_BYTEORDER==4321
   487    i = pCoord->u;
   488    memcpy(p, &i, 4);
   489  #else
   490    i = pCoord->u;
   491    p[0] = (i>>24)&0xFF;
   492    p[1] = (i>>16)&0xFF;
   493    p[2] = (i>> 8)&0xFF;
   494    p[3] = (i>> 0)&0xFF;
   495  #endif
   496    return 4;
   497  }
   498  static int writeInt64(u8 *p, i64 i){
   499  #if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
   500    i = (i64)__builtin_bswap64((u64)i);
   501    memcpy(p, &i, 8);
   502  #elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
   503    i = (i64)_byteswap_uint64((u64)i);
   504    memcpy(p, &i, 8);
   505  #elif SQLITE_BYTEORDER==4321
   506    memcpy(p, &i, 8);
   507  #else
   508    p[0] = (i>>56)&0xFF;
   509    p[1] = (i>>48)&0xFF;
   510    p[2] = (i>>40)&0xFF;
   511    p[3] = (i>>32)&0xFF;
   512    p[4] = (i>>24)&0xFF;
   513    p[5] = (i>>16)&0xFF;
   514    p[6] = (i>> 8)&0xFF;
   515    p[7] = (i>> 0)&0xFF;
   516  #endif
   517    return 8;
   518  }
   519  
   520  /*
   521  ** Increment the reference count of node p.
   522  */
   523  static void nodeReference(RtreeNode *p){
   524    if( p ){
   525      p->nRef++;
   526    }
   527  }
   528  
   529  /*
   530  ** Clear the content of node p (set all bytes to 0x00).
   531  */
   532  static void nodeZero(Rtree *pRtree, RtreeNode *p){
   533    memset(&p->zData[2], 0, pRtree->iNodeSize-2);
   534    p->isDirty = 1;
   535  }
   536  
   537  /*
   538  ** Given a node number iNode, return the corresponding key to use
   539  ** in the Rtree.aHash table.
   540  */
   541  static int nodeHash(i64 iNode){
   542    return iNode % HASHSIZE;
   543  }
   544  
   545  /*
   546  ** Search the node hash table for node iNode. If found, return a pointer
   547  ** to it. Otherwise, return 0.
   548  */
   549  static RtreeNode *nodeHashLookup(Rtree *pRtree, i64 iNode){
   550    RtreeNode *p;
   551    for(p=pRtree->aHash[nodeHash(iNode)]; p && p->iNode!=iNode; p=p->pNext);
   552    return p;
   553  }
   554  
   555  /*
   556  ** Add node pNode to the node hash table.
   557  */
   558  static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){
   559    int iHash;
   560    assert( pNode->pNext==0 );
   561    iHash = nodeHash(pNode->iNode);
   562    pNode->pNext = pRtree->aHash[iHash];
   563    pRtree->aHash[iHash] = pNode;
   564  }
   565  
   566  /*
   567  ** Remove node pNode from the node hash table.
   568  */
   569  static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){
   570    RtreeNode **pp;
   571    if( pNode->iNode!=0 ){
   572      pp = &pRtree->aHash[nodeHash(pNode->iNode)];
   573      for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); }
   574      *pp = pNode->pNext;
   575      pNode->pNext = 0;
   576    }
   577  }
   578  
   579  /*
   580  ** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0),
   581  ** indicating that node has not yet been assigned a node number. It is
   582  ** assigned a node number when nodeWrite() is called to write the
   583  ** node contents out to the database.
   584  */
   585  static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){
   586    RtreeNode *pNode;
   587    pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize);
   588    if( pNode ){
   589      memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize);
   590      pNode->zData = (u8 *)&pNode[1];
   591      pNode->nRef = 1;
   592      pNode->pParent = pParent;
   593      pNode->isDirty = 1;
   594      nodeReference(pParent);
   595    }
   596    return pNode;
   597  }
   598  
   599  /*
   600  ** Clear the Rtree.pNodeBlob object
   601  */
   602  static void nodeBlobReset(Rtree *pRtree){
   603    if( pRtree->pNodeBlob && pRtree->inWrTrans==0 && pRtree->nCursor==0 ){
   604      sqlite3_blob *pBlob = pRtree->pNodeBlob;
   605      pRtree->pNodeBlob = 0;
   606      sqlite3_blob_close(pBlob);
   607    }
   608  }
   609  
   610  /*
   611  ** Obtain a reference to an r-tree node.
   612  */
   613  static int nodeAcquire(
   614    Rtree *pRtree,             /* R-tree structure */
   615    i64 iNode,                 /* Node number to load */
   616    RtreeNode *pParent,        /* Either the parent node or NULL */
   617    RtreeNode **ppNode         /* OUT: Acquired node */
   618  ){
   619    int rc = SQLITE_OK;
   620    RtreeNode *pNode = 0;
   621  
   622    /* Check if the requested node is already in the hash table. If so,
   623    ** increase its reference count and return it.
   624    */
   625    if( (pNode = nodeHashLookup(pRtree, iNode)) ){
   626      assert( !pParent || !pNode->pParent || pNode->pParent==pParent );
   627      if( pParent && !pNode->pParent ){
   628        nodeReference(pParent);
   629        pNode->pParent = pParent;
   630      }
   631      pNode->nRef++;
   632      *ppNode = pNode;
   633      return SQLITE_OK;
   634    }
   635  
   636    if( pRtree->pNodeBlob ){
   637      sqlite3_blob *pBlob = pRtree->pNodeBlob;
   638      pRtree->pNodeBlob = 0;
   639      rc = sqlite3_blob_reopen(pBlob, iNode);
   640      pRtree->pNodeBlob = pBlob;
   641      if( rc ){
   642        nodeBlobReset(pRtree);
   643        if( rc==SQLITE_NOMEM ) return SQLITE_NOMEM;
   644      }
   645    }
   646    if( pRtree->pNodeBlob==0 ){
   647      char *zTab = sqlite3_mprintf("%s_node", pRtree->zName);
   648      if( zTab==0 ) return SQLITE_NOMEM;
   649      rc = sqlite3_blob_open(pRtree->db, pRtree->zDb, zTab, "data", iNode, 0,
   650                             &pRtree->pNodeBlob);
   651      sqlite3_free(zTab);
   652    }
   653    if( rc ){
   654      nodeBlobReset(pRtree);
   655      *ppNode = 0;
   656      /* If unable to open an sqlite3_blob on the desired row, that can only
   657      ** be because the shadow tables hold erroneous data. */
   658      if( rc==SQLITE_ERROR ) rc = SQLITE_CORRUPT_VTAB;
   659    }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){
   660      pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize);
   661      if( !pNode ){
   662        rc = SQLITE_NOMEM;
   663      }else{
   664        pNode->pParent = pParent;
   665        pNode->zData = (u8 *)&pNode[1];
   666        pNode->nRef = 1;
   667        pNode->iNode = iNode;
   668        pNode->isDirty = 0;
   669        pNode->pNext = 0;
   670        rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData,
   671                               pRtree->iNodeSize, 0);
   672        nodeReference(pParent);
   673      }
   674    }
   675  
   676    /* If the root node was just loaded, set pRtree->iDepth to the height
   677    ** of the r-tree structure. A height of zero means all data is stored on
   678    ** the root node. A height of one means the children of the root node
   679    ** are the leaves, and so on. If the depth as specified on the root node
   680    ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
   681    */
   682    if( pNode && iNode==1 ){
   683      pRtree->iDepth = readInt16(pNode->zData);
   684      if( pRtree->iDepth>RTREE_MAX_DEPTH ){
   685        rc = SQLITE_CORRUPT_VTAB;
   686      }
   687    }
   688  
   689    /* If no error has occurred so far, check if the "number of entries"
   690    ** field on the node is too large. If so, set the return code to 
   691    ** SQLITE_CORRUPT_VTAB.
   692    */
   693    if( pNode && rc==SQLITE_OK ){
   694      if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){
   695        rc = SQLITE_CORRUPT_VTAB;
   696      }
   697    }
   698  
   699    if( rc==SQLITE_OK ){
   700      if( pNode!=0 ){
   701        nodeHashInsert(pRtree, pNode);
   702      }else{
   703        rc = SQLITE_CORRUPT_VTAB;
   704      }
   705      *ppNode = pNode;
   706    }else{
   707      sqlite3_free(pNode);
   708      *ppNode = 0;
   709    }
   710  
   711    return rc;
   712  }
   713  
   714  /*
   715  ** Overwrite cell iCell of node pNode with the contents of pCell.
   716  */
   717  static void nodeOverwriteCell(
   718    Rtree *pRtree,             /* The overall R-Tree */
   719    RtreeNode *pNode,          /* The node into which the cell is to be written */
   720    RtreeCell *pCell,          /* The cell to write */
   721    int iCell                  /* Index into pNode into which pCell is written */
   722  ){
   723    int ii;
   724    u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
   725    p += writeInt64(p, pCell->iRowid);
   726    for(ii=0; ii<pRtree->nDim2; ii++){
   727      p += writeCoord(p, &pCell->aCoord[ii]);
   728    }
   729    pNode->isDirty = 1;
   730  }
   731  
   732  /*
   733  ** Remove the cell with index iCell from node pNode.
   734  */
   735  static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){
   736    u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
   737    u8 *pSrc = &pDst[pRtree->nBytesPerCell];
   738    int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell;
   739    memmove(pDst, pSrc, nByte);
   740    writeInt16(&pNode->zData[2], NCELL(pNode)-1);
   741    pNode->isDirty = 1;
   742  }
   743  
   744  /*
   745  ** Insert the contents of cell pCell into node pNode. If the insert
   746  ** is successful, return SQLITE_OK.
   747  **
   748  ** If there is not enough free space in pNode, return SQLITE_FULL.
   749  */
   750  static int nodeInsertCell(
   751    Rtree *pRtree,                /* The overall R-Tree */
   752    RtreeNode *pNode,             /* Write new cell into this node */
   753    RtreeCell *pCell              /* The cell to be inserted */
   754  ){
   755    int nCell;                    /* Current number of cells in pNode */
   756    int nMaxCell;                 /* Maximum number of cells for pNode */
   757  
   758    nMaxCell = (pRtree->iNodeSize-4)/pRtree->nBytesPerCell;
   759    nCell = NCELL(pNode);
   760  
   761    assert( nCell<=nMaxCell );
   762    if( nCell<nMaxCell ){
   763      nodeOverwriteCell(pRtree, pNode, pCell, nCell);
   764      writeInt16(&pNode->zData[2], nCell+1);
   765      pNode->isDirty = 1;
   766    }
   767  
   768    return (nCell==nMaxCell);
   769  }
   770  
   771  /*
   772  ** If the node is dirty, write it out to the database.
   773  */
   774  static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){
   775    int rc = SQLITE_OK;
   776    if( pNode->isDirty ){
   777      sqlite3_stmt *p = pRtree->pWriteNode;
   778      if( pNode->iNode ){
   779        sqlite3_bind_int64(p, 1, pNode->iNode);
   780      }else{
   781        sqlite3_bind_null(p, 1);
   782      }
   783      sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC);
   784      sqlite3_step(p);
   785      pNode->isDirty = 0;
   786      rc = sqlite3_reset(p);
   787      if( pNode->iNode==0 && rc==SQLITE_OK ){
   788        pNode->iNode = sqlite3_last_insert_rowid(pRtree->db);
   789        nodeHashInsert(pRtree, pNode);
   790      }
   791    }
   792    return rc;
   793  }
   794  
   795  /*
   796  ** Release a reference to a node. If the node is dirty and the reference
   797  ** count drops to zero, the node data is written to the database.
   798  */
   799  static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){
   800    int rc = SQLITE_OK;
   801    if( pNode ){
   802      assert( pNode->nRef>0 );
   803      pNode->nRef--;
   804      if( pNode->nRef==0 ){
   805        if( pNode->iNode==1 ){
   806          pRtree->iDepth = -1;
   807        }
   808        if( pNode->pParent ){
   809          rc = nodeRelease(pRtree, pNode->pParent);
   810        }
   811        if( rc==SQLITE_OK ){
   812          rc = nodeWrite(pRtree, pNode);
   813        }
   814        nodeHashDelete(pRtree, pNode);
   815        sqlite3_free(pNode);
   816      }
   817    }
   818    return rc;
   819  }
   820  
   821  /*
   822  ** Return the 64-bit integer value associated with cell iCell of
   823  ** node pNode. If pNode is a leaf node, this is a rowid. If it is
   824  ** an internal node, then the 64-bit integer is a child page number.
   825  */
   826  static i64 nodeGetRowid(
   827    Rtree *pRtree,       /* The overall R-Tree */
   828    RtreeNode *pNode,    /* The node from which to extract the ID */
   829    int iCell            /* The cell index from which to extract the ID */
   830  ){
   831    assert( iCell<NCELL(pNode) );
   832    return readInt64(&pNode->zData[4 + pRtree->nBytesPerCell*iCell]);
   833  }
   834  
   835  /*
   836  ** Return coordinate iCoord from cell iCell in node pNode.
   837  */
   838  static void nodeGetCoord(
   839    Rtree *pRtree,               /* The overall R-Tree */
   840    RtreeNode *pNode,            /* The node from which to extract a coordinate */
   841    int iCell,                   /* The index of the cell within the node */
   842    int iCoord,                  /* Which coordinate to extract */
   843    RtreeCoord *pCoord           /* OUT: Space to write result to */
   844  ){
   845    readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord);
   846  }
   847  
   848  /*
   849  ** Deserialize cell iCell of node pNode. Populate the structure pointed
   850  ** to by pCell with the results.
   851  */
   852  static void nodeGetCell(
   853    Rtree *pRtree,               /* The overall R-Tree */
   854    RtreeNode *pNode,            /* The node containing the cell to be read */
   855    int iCell,                   /* Index of the cell within the node */
   856    RtreeCell *pCell             /* OUT: Write the cell contents here */
   857  ){
   858    u8 *pData;
   859    RtreeCoord *pCoord;
   860    int ii = 0;
   861    pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell);
   862    pData = pNode->zData + (12 + pRtree->nBytesPerCell*iCell);
   863    pCoord = pCell->aCoord;
   864    do{
   865      readCoord(pData, &pCoord[ii]);
   866      readCoord(pData+4, &pCoord[ii+1]);
   867      pData += 8;
   868      ii += 2;
   869    }while( ii<pRtree->nDim2 );
   870  }
   871  
   872  
   873  /* Forward declaration for the function that does the work of
   874  ** the virtual table module xCreate() and xConnect() methods.
   875  */
   876  static int rtreeInit(
   877    sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int
   878  );
   879  
   880  /* 
   881  ** Rtree virtual table module xCreate method.
   882  */
   883  static int rtreeCreate(
   884    sqlite3 *db,
   885    void *pAux,
   886    int argc, const char *const*argv,
   887    sqlite3_vtab **ppVtab,
   888    char **pzErr
   889  ){
   890    return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1);
   891  }
   892  
   893  /* 
   894  ** Rtree virtual table module xConnect method.
   895  */
   896  static int rtreeConnect(
   897    sqlite3 *db,
   898    void *pAux,
   899    int argc, const char *const*argv,
   900    sqlite3_vtab **ppVtab,
   901    char **pzErr
   902  ){
   903    return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 0);
   904  }
   905  
   906  /*
   907  ** Increment the r-tree reference count.
   908  */
   909  static void rtreeReference(Rtree *pRtree){
   910    pRtree->nBusy++;
   911  }
   912  
   913  /*
   914  ** Decrement the r-tree reference count. When the reference count reaches
   915  ** zero the structure is deleted.
   916  */
   917  static void rtreeRelease(Rtree *pRtree){
   918    pRtree->nBusy--;
   919    if( pRtree->nBusy==0 ){
   920      pRtree->inWrTrans = 0;
   921      pRtree->nCursor = 0;
   922      nodeBlobReset(pRtree);
   923      sqlite3_finalize(pRtree->pWriteNode);
   924      sqlite3_finalize(pRtree->pDeleteNode);
   925      sqlite3_finalize(pRtree->pReadRowid);
   926      sqlite3_finalize(pRtree->pWriteRowid);
   927      sqlite3_finalize(pRtree->pDeleteRowid);
   928      sqlite3_finalize(pRtree->pReadParent);
   929      sqlite3_finalize(pRtree->pWriteParent);
   930      sqlite3_finalize(pRtree->pDeleteParent);
   931      sqlite3_free(pRtree);
   932    }
   933  }
   934  
   935  /* 
   936  ** Rtree virtual table module xDisconnect method.
   937  */
   938  static int rtreeDisconnect(sqlite3_vtab *pVtab){
   939    rtreeRelease((Rtree *)pVtab);
   940    return SQLITE_OK;
   941  }
   942  
   943  /* 
   944  ** Rtree virtual table module xDestroy method.
   945  */
   946  static int rtreeDestroy(sqlite3_vtab *pVtab){
   947    Rtree *pRtree = (Rtree *)pVtab;
   948    int rc;
   949    char *zCreate = sqlite3_mprintf(
   950      "DROP TABLE '%q'.'%q_node';"
   951      "DROP TABLE '%q'.'%q_rowid';"
   952      "DROP TABLE '%q'.'%q_parent';",
   953      pRtree->zDb, pRtree->zName, 
   954      pRtree->zDb, pRtree->zName,
   955      pRtree->zDb, pRtree->zName
   956    );
   957    if( !zCreate ){
   958      rc = SQLITE_NOMEM;
   959    }else{
   960      nodeBlobReset(pRtree);
   961      rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0);
   962      sqlite3_free(zCreate);
   963    }
   964    if( rc==SQLITE_OK ){
   965      rtreeRelease(pRtree);
   966    }
   967  
   968    return rc;
   969  }
   970  
   971  /* 
   972  ** Rtree virtual table module xOpen method.
   973  */
   974  static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
   975    int rc = SQLITE_NOMEM;
   976    Rtree *pRtree = (Rtree *)pVTab;
   977    RtreeCursor *pCsr;
   978  
   979    pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor));
   980    if( pCsr ){
   981      memset(pCsr, 0, sizeof(RtreeCursor));
   982      pCsr->base.pVtab = pVTab;
   983      rc = SQLITE_OK;
   984      pRtree->nCursor++;
   985    }
   986    *ppCursor = (sqlite3_vtab_cursor *)pCsr;
   987  
   988    return rc;
   989  }
   990  
   991  
   992  /*
   993  ** Free the RtreeCursor.aConstraint[] array and its contents.
   994  */
   995  static void freeCursorConstraints(RtreeCursor *pCsr){
   996    if( pCsr->aConstraint ){
   997      int i;                        /* Used to iterate through constraint array */
   998      for(i=0; i<pCsr->nConstraint; i++){
   999        sqlite3_rtree_query_info *pInfo = pCsr->aConstraint[i].pInfo;
  1000        if( pInfo ){
  1001          if( pInfo->xDelUser ) pInfo->xDelUser(pInfo->pUser);
  1002          sqlite3_free(pInfo);
  1003        }
  1004      }
  1005      sqlite3_free(pCsr->aConstraint);
  1006      pCsr->aConstraint = 0;
  1007    }
  1008  }
  1009  
  1010  /* 
  1011  ** Rtree virtual table module xClose method.
  1012  */
  1013  static int rtreeClose(sqlite3_vtab_cursor *cur){
  1014    Rtree *pRtree = (Rtree *)(cur->pVtab);
  1015    int ii;
  1016    RtreeCursor *pCsr = (RtreeCursor *)cur;
  1017    assert( pRtree->nCursor>0 );
  1018    freeCursorConstraints(pCsr);
  1019    sqlite3_free(pCsr->aPoint);
  1020    for(ii=0; ii<RTREE_CACHE_SZ; ii++) nodeRelease(pRtree, pCsr->aNode[ii]);
  1021    sqlite3_free(pCsr);
  1022    pRtree->nCursor--;
  1023    nodeBlobReset(pRtree);
  1024    return SQLITE_OK;
  1025  }
  1026  
  1027  /*
  1028  ** Rtree virtual table module xEof method.
  1029  **
  1030  ** Return non-zero if the cursor does not currently point to a valid 
  1031  ** record (i.e if the scan has finished), or zero otherwise.
  1032  */
  1033  static int rtreeEof(sqlite3_vtab_cursor *cur){
  1034    RtreeCursor *pCsr = (RtreeCursor *)cur;
  1035    return pCsr->atEOF;
  1036  }
  1037  
  1038  /*
  1039  ** Convert raw bits from the on-disk RTree record into a coordinate value.
  1040  ** The on-disk format is big-endian and needs to be converted for little-
  1041  ** endian platforms.  The on-disk record stores integer coordinates if
  1042  ** eInt is true and it stores 32-bit floating point records if eInt is
  1043  ** false.  a[] is the four bytes of the on-disk record to be decoded.
  1044  ** Store the results in "r".
  1045  **
  1046  ** There are five versions of this macro.  The last one is generic.  The
  1047  ** other four are various architectures-specific optimizations.
  1048  */
  1049  #if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
  1050  #define RTREE_DECODE_COORD(eInt, a, r) {                        \
  1051      RtreeCoord c;    /* Coordinate decoded */                   \
  1052      c.u = _byteswap_ulong(*(u32*)a);                            \
  1053      r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
  1054  }
  1055  #elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
  1056  #define RTREE_DECODE_COORD(eInt, a, r) {                        \
  1057      RtreeCoord c;    /* Coordinate decoded */                   \
  1058      c.u = __builtin_bswap32(*(u32*)a);                          \
  1059      r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
  1060  }
  1061  #elif SQLITE_BYTEORDER==1234
  1062  #define RTREE_DECODE_COORD(eInt, a, r) {                        \
  1063      RtreeCoord c;    /* Coordinate decoded */                   \
  1064      memcpy(&c.u,a,4);                                           \
  1065      c.u = ((c.u>>24)&0xff)|((c.u>>8)&0xff00)|                   \
  1066            ((c.u&0xff)<<24)|((c.u&0xff00)<<8);                   \
  1067      r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
  1068  }
  1069  #elif SQLITE_BYTEORDER==4321
  1070  #define RTREE_DECODE_COORD(eInt, a, r) {                        \
  1071      RtreeCoord c;    /* Coordinate decoded */                   \
  1072      memcpy(&c.u,a,4);                                           \
  1073      r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
  1074  }
  1075  #else
  1076  #define RTREE_DECODE_COORD(eInt, a, r) {                        \
  1077      RtreeCoord c;    /* Coordinate decoded */                   \
  1078      c.u = ((u32)a[0]<<24) + ((u32)a[1]<<16)                     \
  1079             +((u32)a[2]<<8) + a[3];                              \
  1080      r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
  1081  }
  1082  #endif
  1083  
  1084  /*
  1085  ** Check the RTree node or entry given by pCellData and p against the MATCH
  1086  ** constraint pConstraint.  
  1087  */
  1088  static int rtreeCallbackConstraint(
  1089    RtreeConstraint *pConstraint,  /* The constraint to test */
  1090    int eInt,                      /* True if RTree holding integer coordinates */
  1091    u8 *pCellData,                 /* Raw cell content */
  1092    RtreeSearchPoint *pSearch,     /* Container of this cell */
  1093    sqlite3_rtree_dbl *prScore,    /* OUT: score for the cell */
  1094    int *peWithin                  /* OUT: visibility of the cell */
  1095  ){
  1096    sqlite3_rtree_query_info *pInfo = pConstraint->pInfo; /* Callback info */
  1097    int nCoord = pInfo->nCoord;                           /* No. of coordinates */
  1098    int rc;                                             /* Callback return code */
  1099    RtreeCoord c;                                       /* Translator union */
  1100    sqlite3_rtree_dbl aCoord[RTREE_MAX_DIMENSIONS*2];   /* Decoded coordinates */
  1101  
  1102    assert( pConstraint->op==RTREE_MATCH || pConstraint->op==RTREE_QUERY );
  1103    assert( nCoord==2 || nCoord==4 || nCoord==6 || nCoord==8 || nCoord==10 );
  1104  
  1105    if( pConstraint->op==RTREE_QUERY && pSearch->iLevel==1 ){
  1106      pInfo->iRowid = readInt64(pCellData);
  1107    }
  1108    pCellData += 8;
  1109  #ifndef SQLITE_RTREE_INT_ONLY
  1110    if( eInt==0 ){
  1111      switch( nCoord ){
  1112        case 10:  readCoord(pCellData+36, &c); aCoord[9] = c.f;
  1113                  readCoord(pCellData+32, &c); aCoord[8] = c.f;
  1114        case 8:   readCoord(pCellData+28, &c); aCoord[7] = c.f;
  1115                  readCoord(pCellData+24, &c); aCoord[6] = c.f;
  1116        case 6:   readCoord(pCellData+20, &c); aCoord[5] = c.f;
  1117                  readCoord(pCellData+16, &c); aCoord[4] = c.f;
  1118        case 4:   readCoord(pCellData+12, &c); aCoord[3] = c.f;
  1119                  readCoord(pCellData+8,  &c); aCoord[2] = c.f;
  1120        default:  readCoord(pCellData+4,  &c); aCoord[1] = c.f;
  1121                  readCoord(pCellData,    &c); aCoord[0] = c.f;
  1122      }
  1123    }else
  1124  #endif
  1125    {
  1126      switch( nCoord ){
  1127        case 10:  readCoord(pCellData+36, &c); aCoord[9] = c.i;
  1128                  readCoord(pCellData+32, &c); aCoord[8] = c.i;
  1129        case 8:   readCoord(pCellData+28, &c); aCoord[7] = c.i;
  1130                  readCoord(pCellData+24, &c); aCoord[6] = c.i;
  1131        case 6:   readCoord(pCellData+20, &c); aCoord[5] = c.i;
  1132                  readCoord(pCellData+16, &c); aCoord[4] = c.i;
  1133        case 4:   readCoord(pCellData+12, &c); aCoord[3] = c.i;
  1134                  readCoord(pCellData+8,  &c); aCoord[2] = c.i;
  1135        default:  readCoord(pCellData+4,  &c); aCoord[1] = c.i;
  1136                  readCoord(pCellData,    &c); aCoord[0] = c.i;
  1137      }
  1138    }
  1139    if( pConstraint->op==RTREE_MATCH ){
  1140      int eWithin = 0;
  1141      rc = pConstraint->u.xGeom((sqlite3_rtree_geometry*)pInfo,
  1142                                nCoord, aCoord, &eWithin);
  1143      if( eWithin==0 ) *peWithin = NOT_WITHIN;
  1144      *prScore = RTREE_ZERO;
  1145    }else{
  1146      pInfo->aCoord = aCoord;
  1147      pInfo->iLevel = pSearch->iLevel - 1;
  1148      pInfo->rScore = pInfo->rParentScore = pSearch->rScore;
  1149      pInfo->eWithin = pInfo->eParentWithin = pSearch->eWithin;
  1150      rc = pConstraint->u.xQueryFunc(pInfo);
  1151      if( pInfo->eWithin<*peWithin ) *peWithin = pInfo->eWithin;
  1152      if( pInfo->rScore<*prScore || *prScore<RTREE_ZERO ){
  1153        *prScore = pInfo->rScore;
  1154      }
  1155    }
  1156    return rc;
  1157  }
  1158  
  1159  /* 
  1160  ** Check the internal RTree node given by pCellData against constraint p.
  1161  ** If this constraint cannot be satisfied by any child within the node,
  1162  ** set *peWithin to NOT_WITHIN.
  1163  */
  1164  static void rtreeNonleafConstraint(
  1165    RtreeConstraint *p,        /* The constraint to test */
  1166    int eInt,                  /* True if RTree holds integer coordinates */
  1167    u8 *pCellData,             /* Raw cell content as appears on disk */
  1168    int *peWithin              /* Adjust downward, as appropriate */
  1169  ){
  1170    sqlite3_rtree_dbl val;     /* Coordinate value convert to a double */
  1171  
  1172    /* p->iCoord might point to either a lower or upper bound coordinate
  1173    ** in a coordinate pair.  But make pCellData point to the lower bound.
  1174    */
  1175    pCellData += 8 + 4*(p->iCoord&0xfe);
  1176  
  1177    assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE 
  1178        || p->op==RTREE_GT || p->op==RTREE_EQ );
  1179    assert( ((((char*)pCellData) - (char*)0)&3)==0 );  /* 4-byte aligned */
  1180    switch( p->op ){
  1181      case RTREE_LE:
  1182      case RTREE_LT:
  1183      case RTREE_EQ:
  1184        RTREE_DECODE_COORD(eInt, pCellData, val);
  1185        /* val now holds the lower bound of the coordinate pair */
  1186        if( p->u.rValue>=val ) return;
  1187        if( p->op!=RTREE_EQ ) break;  /* RTREE_LE and RTREE_LT end here */
  1188        /* Fall through for the RTREE_EQ case */
  1189  
  1190      default: /* RTREE_GT or RTREE_GE,  or fallthrough of RTREE_EQ */
  1191        pCellData += 4;
  1192        RTREE_DECODE_COORD(eInt, pCellData, val);
  1193        /* val now holds the upper bound of the coordinate pair */
  1194        if( p->u.rValue<=val ) return;
  1195    }
  1196    *peWithin = NOT_WITHIN;
  1197  }
  1198  
  1199  /*
  1200  ** Check the leaf RTree cell given by pCellData against constraint p.
  1201  ** If this constraint is not satisfied, set *peWithin to NOT_WITHIN.
  1202  ** If the constraint is satisfied, leave *peWithin unchanged.
  1203  **
  1204  ** The constraint is of the form:  xN op $val
  1205  **
  1206  ** The op is given by p->op.  The xN is p->iCoord-th coordinate in
  1207  ** pCellData.  $val is given by p->u.rValue.
  1208  */
  1209  static void rtreeLeafConstraint(
  1210    RtreeConstraint *p,        /* The constraint to test */
  1211    int eInt,                  /* True if RTree holds integer coordinates */
  1212    u8 *pCellData,             /* Raw cell content as appears on disk */
  1213    int *peWithin              /* Adjust downward, as appropriate */
  1214  ){
  1215    RtreeDValue xN;      /* Coordinate value converted to a double */
  1216  
  1217    assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE 
  1218        || p->op==RTREE_GT || p->op==RTREE_EQ );
  1219    pCellData += 8 + p->iCoord*4;
  1220    assert( ((((char*)pCellData) - (char*)0)&3)==0 );  /* 4-byte aligned */
  1221    RTREE_DECODE_COORD(eInt, pCellData, xN);
  1222    switch( p->op ){
  1223      case RTREE_LE: if( xN <= p->u.rValue ) return;  break;
  1224      case RTREE_LT: if( xN <  p->u.rValue ) return;  break;
  1225      case RTREE_GE: if( xN >= p->u.rValue ) return;  break;
  1226      case RTREE_GT: if( xN >  p->u.rValue ) return;  break;
  1227      default:       if( xN == p->u.rValue ) return;  break;
  1228    }
  1229    *peWithin = NOT_WITHIN;
  1230  }
  1231  
  1232  /*
  1233  ** One of the cells in node pNode is guaranteed to have a 64-bit 
  1234  ** integer value equal to iRowid. Return the index of this cell.
  1235  */
  1236  static int nodeRowidIndex(
  1237    Rtree *pRtree, 
  1238    RtreeNode *pNode, 
  1239    i64 iRowid,
  1240    int *piIndex
  1241  ){
  1242    int ii;
  1243    int nCell = NCELL(pNode);
  1244    assert( nCell<200 );
  1245    for(ii=0; ii<nCell; ii++){
  1246      if( nodeGetRowid(pRtree, pNode, ii)==iRowid ){
  1247        *piIndex = ii;
  1248        return SQLITE_OK;
  1249      }
  1250    }
  1251    return SQLITE_CORRUPT_VTAB;
  1252  }
  1253  
  1254  /*
  1255  ** Return the index of the cell containing a pointer to node pNode
  1256  ** in its parent. If pNode is the root node, return -1.
  1257  */
  1258  static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode, int *piIndex){
  1259    RtreeNode *pParent = pNode->pParent;
  1260    if( pParent ){
  1261      return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex);
  1262    }
  1263    *piIndex = -1;
  1264    return SQLITE_OK;
  1265  }
  1266  
  1267  /*
  1268  ** Compare two search points.  Return negative, zero, or positive if the first
  1269  ** is less than, equal to, or greater than the second.
  1270  **
  1271  ** The rScore is the primary key.  Smaller rScore values come first.
  1272  ** If the rScore is a tie, then use iLevel as the tie breaker with smaller
  1273  ** iLevel values coming first.  In this way, if rScore is the same for all
  1274  ** SearchPoints, then iLevel becomes the deciding factor and the result
  1275  ** is a depth-first search, which is the desired default behavior.
  1276  */
  1277  static int rtreeSearchPointCompare(
  1278    const RtreeSearchPoint *pA,
  1279    const RtreeSearchPoint *pB
  1280  ){
  1281    if( pA->rScore<pB->rScore ) return -1;
  1282    if( pA->rScore>pB->rScore ) return +1;
  1283    if( pA->iLevel<pB->iLevel ) return -1;
  1284    if( pA->iLevel>pB->iLevel ) return +1;
  1285    return 0;
  1286  }
  1287  
  1288  /*
  1289  ** Interchange two search points in a cursor.
  1290  */
  1291  static void rtreeSearchPointSwap(RtreeCursor *p, int i, int j){
  1292    RtreeSearchPoint t = p->aPoint[i];
  1293    assert( i<j );
  1294    p->aPoint[i] = p->aPoint[j];
  1295    p->aPoint[j] = t;
  1296    i++; j++;
  1297    if( i<RTREE_CACHE_SZ ){
  1298      if( j>=RTREE_CACHE_SZ ){
  1299        nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]);
  1300        p->aNode[i] = 0;
  1301      }else{
  1302        RtreeNode *pTemp = p->aNode[i];
  1303        p->aNode[i] = p->aNode[j];
  1304        p->aNode[j] = pTemp;
  1305      }
  1306    }
  1307  }
  1308  
  1309  /*
  1310  ** Return the search point with the lowest current score.
  1311  */
  1312  static RtreeSearchPoint *rtreeSearchPointFirst(RtreeCursor *pCur){
  1313    return pCur->bPoint ? &pCur->sPoint : pCur->nPoint ? pCur->aPoint : 0;
  1314  }
  1315  
  1316  /*
  1317  ** Get the RtreeNode for the search point with the lowest score.
  1318  */
  1319  static RtreeNode *rtreeNodeOfFirstSearchPoint(RtreeCursor *pCur, int *pRC){
  1320    sqlite3_int64 id;
  1321    int ii = 1 - pCur->bPoint;
  1322    assert( ii==0 || ii==1 );
  1323    assert( pCur->bPoint || pCur->nPoint );
  1324    if( pCur->aNode[ii]==0 ){
  1325      assert( pRC!=0 );
  1326      id = ii ? pCur->aPoint[0].id : pCur->sPoint.id;
  1327      *pRC = nodeAcquire(RTREE_OF_CURSOR(pCur), id, 0, &pCur->aNode[ii]);
  1328    }
  1329    return pCur->aNode[ii];
  1330  }
  1331  
  1332  /*
  1333  ** Push a new element onto the priority queue
  1334  */
  1335  static RtreeSearchPoint *rtreeEnqueue(
  1336    RtreeCursor *pCur,    /* The cursor */
  1337    RtreeDValue rScore,   /* Score for the new search point */
  1338    u8 iLevel             /* Level for the new search point */
  1339  ){
  1340    int i, j;
  1341    RtreeSearchPoint *pNew;
  1342    if( pCur->nPoint>=pCur->nPointAlloc ){
  1343      int nNew = pCur->nPointAlloc*2 + 8;
  1344      pNew = sqlite3_realloc(pCur->aPoint, nNew*sizeof(pCur->aPoint[0]));
  1345      if( pNew==0 ) return 0;
  1346      pCur->aPoint = pNew;
  1347      pCur->nPointAlloc = nNew;
  1348    }
  1349    i = pCur->nPoint++;
  1350    pNew = pCur->aPoint + i;
  1351    pNew->rScore = rScore;
  1352    pNew->iLevel = iLevel;
  1353    assert( iLevel<=RTREE_MAX_DEPTH );
  1354    while( i>0 ){
  1355      RtreeSearchPoint *pParent;
  1356      j = (i-1)/2;
  1357      pParent = pCur->aPoint + j;
  1358      if( rtreeSearchPointCompare(pNew, pParent)>=0 ) break;
  1359      rtreeSearchPointSwap(pCur, j, i);
  1360      i = j;
  1361      pNew = pParent;
  1362    }
  1363    return pNew;
  1364  }
  1365  
  1366  /*
  1367  ** Allocate a new RtreeSearchPoint and return a pointer to it.  Return
  1368  ** NULL if malloc fails.
  1369  */
  1370  static RtreeSearchPoint *rtreeSearchPointNew(
  1371    RtreeCursor *pCur,    /* The cursor */
  1372    RtreeDValue rScore,   /* Score for the new search point */
  1373    u8 iLevel             /* Level for the new search point */
  1374  ){
  1375    RtreeSearchPoint *pNew, *pFirst;
  1376    pFirst = rtreeSearchPointFirst(pCur);
  1377    pCur->anQueue[iLevel]++;
  1378    if( pFirst==0
  1379     || pFirst->rScore>rScore 
  1380     || (pFirst->rScore==rScore && pFirst->iLevel>iLevel)
  1381    ){
  1382      if( pCur->bPoint ){
  1383        int ii;
  1384        pNew = rtreeEnqueue(pCur, rScore, iLevel);
  1385        if( pNew==0 ) return 0;
  1386        ii = (int)(pNew - pCur->aPoint) + 1;
  1387        if( ii<RTREE_CACHE_SZ ){
  1388          assert( pCur->aNode[ii]==0 );
  1389          pCur->aNode[ii] = pCur->aNode[0];
  1390         }else{
  1391          nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]);
  1392        }
  1393        pCur->aNode[0] = 0;
  1394        *pNew = pCur->sPoint;
  1395      }
  1396      pCur->sPoint.rScore = rScore;
  1397      pCur->sPoint.iLevel = iLevel;
  1398      pCur->bPoint = 1;
  1399      return &pCur->sPoint;
  1400    }else{
  1401      return rtreeEnqueue(pCur, rScore, iLevel);
  1402    }
  1403  }
  1404  
  1405  #if 0
  1406  /* Tracing routines for the RtreeSearchPoint queue */
  1407  static void tracePoint(RtreeSearchPoint *p, int idx, RtreeCursor *pCur){
  1408    if( idx<0 ){ printf(" s"); }else{ printf("%2d", idx); }
  1409    printf(" %d.%05lld.%02d %g %d",
  1410      p->iLevel, p->id, p->iCell, p->rScore, p->eWithin
  1411    );
  1412    idx++;
  1413    if( idx<RTREE_CACHE_SZ ){
  1414      printf(" %p\n", pCur->aNode[idx]);
  1415    }else{
  1416      printf("\n");
  1417    }
  1418  }
  1419  static void traceQueue(RtreeCursor *pCur, const char *zPrefix){
  1420    int ii;
  1421    printf("=== %9s ", zPrefix);
  1422    if( pCur->bPoint ){
  1423      tracePoint(&pCur->sPoint, -1, pCur);
  1424    }
  1425    for(ii=0; ii<pCur->nPoint; ii++){
  1426      if( ii>0 || pCur->bPoint ) printf("              ");
  1427      tracePoint(&pCur->aPoint[ii], ii, pCur);
  1428    }
  1429  }
  1430  # define RTREE_QUEUE_TRACE(A,B) traceQueue(A,B)
  1431  #else
  1432  # define RTREE_QUEUE_TRACE(A,B)   /* no-op */
  1433  #endif
  1434  
  1435  /* Remove the search point with the lowest current score.
  1436  */
  1437  static void rtreeSearchPointPop(RtreeCursor *p){
  1438    int i, j, k, n;
  1439    i = 1 - p->bPoint;
  1440    assert( i==0 || i==1 );
  1441    if( p->aNode[i] ){
  1442      nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]);
  1443      p->aNode[i] = 0;
  1444    }
  1445    if( p->bPoint ){
  1446      p->anQueue[p->sPoint.iLevel]--;
  1447      p->bPoint = 0;
  1448    }else if( p->nPoint ){
  1449      p->anQueue[p->aPoint[0].iLevel]--;
  1450      n = --p->nPoint;
  1451      p->aPoint[0] = p->aPoint[n];
  1452      if( n<RTREE_CACHE_SZ-1 ){
  1453        p->aNode[1] = p->aNode[n+1];
  1454        p->aNode[n+1] = 0;
  1455      }
  1456      i = 0;
  1457      while( (j = i*2+1)<n ){
  1458        k = j+1;
  1459        if( k<n && rtreeSearchPointCompare(&p->aPoint[k], &p->aPoint[j])<0 ){
  1460          if( rtreeSearchPointCompare(&p->aPoint[k], &p->aPoint[i])<0 ){
  1461            rtreeSearchPointSwap(p, i, k);
  1462            i = k;
  1463          }else{
  1464            break;
  1465          }
  1466        }else{
  1467          if( rtreeSearchPointCompare(&p->aPoint[j], &p->aPoint[i])<0 ){
  1468            rtreeSearchPointSwap(p, i, j);
  1469            i = j;
  1470          }else{
  1471            break;
  1472          }
  1473        }
  1474      }
  1475    }
  1476  }
  1477  
  1478  
  1479  /*
  1480  ** Continue the search on cursor pCur until the front of the queue
  1481  ** contains an entry suitable for returning as a result-set row,
  1482  ** or until the RtreeSearchPoint queue is empty, indicating that the
  1483  ** query has completed.
  1484  */
  1485  static int rtreeStepToLeaf(RtreeCursor *pCur){
  1486    RtreeSearchPoint *p;
  1487    Rtree *pRtree = RTREE_OF_CURSOR(pCur);
  1488    RtreeNode *pNode;
  1489    int eWithin;
  1490    int rc = SQLITE_OK;
  1491    int nCell;
  1492    int nConstraint = pCur->nConstraint;
  1493    int ii;
  1494    int eInt;
  1495    RtreeSearchPoint x;
  1496  
  1497    eInt = pRtree->eCoordType==RTREE_COORD_INT32;
  1498    while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){
  1499      pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc);
  1500      if( rc ) return rc;
  1501      nCell = NCELL(pNode);
  1502      assert( nCell<200 );
  1503      while( p->iCell<nCell ){
  1504        sqlite3_rtree_dbl rScore = (sqlite3_rtree_dbl)-1;
  1505        u8 *pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell);
  1506        eWithin = FULLY_WITHIN;
  1507        for(ii=0; ii<nConstraint; ii++){
  1508          RtreeConstraint *pConstraint = pCur->aConstraint + ii;
  1509          if( pConstraint->op>=RTREE_MATCH ){
  1510            rc = rtreeCallbackConstraint(pConstraint, eInt, pCellData, p,
  1511                                         &rScore, &eWithin);
  1512            if( rc ) return rc;
  1513          }else if( p->iLevel==1 ){
  1514            rtreeLeafConstraint(pConstraint, eInt, pCellData, &eWithin);
  1515          }else{
  1516            rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin);
  1517          }
  1518          if( eWithin==NOT_WITHIN ) break;
  1519        }
  1520        p->iCell++;
  1521        if( eWithin==NOT_WITHIN ) continue;
  1522        x.iLevel = p->iLevel - 1;
  1523        if( x.iLevel ){
  1524          x.id = readInt64(pCellData);
  1525          x.iCell = 0;
  1526        }else{
  1527          x.id = p->id;
  1528          x.iCell = p->iCell - 1;
  1529        }
  1530        if( p->iCell>=nCell ){
  1531          RTREE_QUEUE_TRACE(pCur, "POP-S:");
  1532          rtreeSearchPointPop(pCur);
  1533        }
  1534        if( rScore<RTREE_ZERO ) rScore = RTREE_ZERO;
  1535        p = rtreeSearchPointNew(pCur, rScore, x.iLevel);
  1536        if( p==0 ) return SQLITE_NOMEM;
  1537        p->eWithin = (u8)eWithin;
  1538        p->id = x.id;
  1539        p->iCell = x.iCell;
  1540        RTREE_QUEUE_TRACE(pCur, "PUSH-S:");
  1541        break;
  1542      }
  1543      if( p->iCell>=nCell ){
  1544        RTREE_QUEUE_TRACE(pCur, "POP-Se:");
  1545        rtreeSearchPointPop(pCur);
  1546      }
  1547    }
  1548    pCur->atEOF = p==0;
  1549    return SQLITE_OK;
  1550  }
  1551  
  1552  /* 
  1553  ** Rtree virtual table module xNext method.
  1554  */
  1555  static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){
  1556    RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
  1557    int rc = SQLITE_OK;
  1558  
  1559    /* Move to the next entry that matches the configured constraints. */
  1560    RTREE_QUEUE_TRACE(pCsr, "POP-Nx:");
  1561    rtreeSearchPointPop(pCsr);
  1562    rc = rtreeStepToLeaf(pCsr);
  1563    return rc;
  1564  }
  1565  
  1566  /* 
  1567  ** Rtree virtual table module xRowid method.
  1568  */
  1569  static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){
  1570    RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
  1571    RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr);
  1572    int rc = SQLITE_OK;
  1573    RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc);
  1574    if( rc==SQLITE_OK && p ){
  1575      *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell);
  1576    }
  1577    return rc;
  1578  }
  1579  
  1580  /* 
  1581  ** Rtree virtual table module xColumn method.
  1582  */
  1583  static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
  1584    Rtree *pRtree = (Rtree *)cur->pVtab;
  1585    RtreeCursor *pCsr = (RtreeCursor *)cur;
  1586    RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr);
  1587    RtreeCoord c;
  1588    int rc = SQLITE_OK;
  1589    RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc);
  1590  
  1591    if( rc ) return rc;
  1592    if( p==0 ) return SQLITE_OK;
  1593    if( i==0 ){
  1594      sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell));
  1595    }else{
  1596      nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c);
  1597  #ifndef SQLITE_RTREE_INT_ONLY
  1598      if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
  1599        sqlite3_result_double(ctx, c.f);
  1600      }else
  1601  #endif
  1602      {
  1603        assert( pRtree->eCoordType==RTREE_COORD_INT32 );
  1604        sqlite3_result_int(ctx, c.i);
  1605      }
  1606    }
  1607    return SQLITE_OK;
  1608  }
  1609  
  1610  /* 
  1611  ** Use nodeAcquire() to obtain the leaf node containing the record with 
  1612  ** rowid iRowid. If successful, set *ppLeaf to point to the node and
  1613  ** return SQLITE_OK. If there is no such record in the table, set
  1614  ** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf
  1615  ** to zero and return an SQLite error code.
  1616  */
  1617  static int findLeafNode(
  1618    Rtree *pRtree,              /* RTree to search */
  1619    i64 iRowid,                 /* The rowid searching for */
  1620    RtreeNode **ppLeaf,         /* Write the node here */
  1621    sqlite3_int64 *piNode       /* Write the node-id here */
  1622  ){
  1623    int rc;
  1624    *ppLeaf = 0;
  1625    sqlite3_bind_int64(pRtree->pReadRowid, 1, iRowid);
  1626    if( sqlite3_step(pRtree->pReadRowid)==SQLITE_ROW ){
  1627      i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0);
  1628      if( piNode ) *piNode = iNode;
  1629      rc = nodeAcquire(pRtree, iNode, 0, ppLeaf);
  1630      sqlite3_reset(pRtree->pReadRowid);
  1631    }else{
  1632      rc = sqlite3_reset(pRtree->pReadRowid);
  1633    }
  1634    return rc;
  1635  }
  1636  
  1637  /*
  1638  ** This function is called to configure the RtreeConstraint object passed
  1639  ** as the second argument for a MATCH constraint. The value passed as the
  1640  ** first argument to this function is the right-hand operand to the MATCH
  1641  ** operator.
  1642  */
  1643  static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){
  1644    RtreeMatchArg *pBlob, *pSrc;       /* BLOB returned by geometry function */
  1645    sqlite3_rtree_query_info *pInfo;   /* Callback information */
  1646  
  1647    pSrc = sqlite3_value_pointer(pValue, "RtreeMatchArg");
  1648    if( pSrc==0 ) return SQLITE_ERROR;
  1649    pInfo = (sqlite3_rtree_query_info*)
  1650                  sqlite3_malloc64( sizeof(*pInfo)+pSrc->iSize );
  1651    if( !pInfo ) return SQLITE_NOMEM;
  1652    memset(pInfo, 0, sizeof(*pInfo));
  1653    pBlob = (RtreeMatchArg*)&pInfo[1];
  1654    memcpy(pBlob, pSrc, pSrc->iSize);
  1655    pInfo->pContext = pBlob->cb.pContext;
  1656    pInfo->nParam = pBlob->nParam;
  1657    pInfo->aParam = pBlob->aParam;
  1658    pInfo->apSqlParam = pBlob->apSqlParam;
  1659  
  1660    if( pBlob->cb.xGeom ){
  1661      pCons->u.xGeom = pBlob->cb.xGeom;
  1662    }else{
  1663      pCons->op = RTREE_QUERY;
  1664      pCons->u.xQueryFunc = pBlob->cb.xQueryFunc;
  1665    }
  1666    pCons->pInfo = pInfo;
  1667    return SQLITE_OK;
  1668  }
  1669  
  1670  /* 
  1671  ** Rtree virtual table module xFilter method.
  1672  */
  1673  static int rtreeFilter(
  1674    sqlite3_vtab_cursor *pVtabCursor, 
  1675    int idxNum, const char *idxStr,
  1676    int argc, sqlite3_value **argv
  1677  ){
  1678    Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
  1679    RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
  1680    RtreeNode *pRoot = 0;
  1681    int ii;
  1682    int rc = SQLITE_OK;
  1683    int iCell = 0;
  1684  
  1685    rtreeReference(pRtree);
  1686  
  1687    /* Reset the cursor to the same state as rtreeOpen() leaves it in. */
  1688    freeCursorConstraints(pCsr);
  1689    sqlite3_free(pCsr->aPoint);
  1690    memset(pCsr, 0, sizeof(RtreeCursor));
  1691    pCsr->base.pVtab = (sqlite3_vtab*)pRtree;
  1692  
  1693    pCsr->iStrategy = idxNum;
  1694    if( idxNum==1 ){
  1695      /* Special case - lookup by rowid. */
  1696      RtreeNode *pLeaf;        /* Leaf on which the required cell resides */
  1697      RtreeSearchPoint *p;     /* Search point for the leaf */
  1698      i64 iRowid = sqlite3_value_int64(argv[0]);
  1699      i64 iNode = 0;
  1700      rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode);
  1701      if( rc==SQLITE_OK && pLeaf!=0 ){
  1702        p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0);
  1703        assert( p!=0 );  /* Always returns pCsr->sPoint */
  1704        pCsr->aNode[0] = pLeaf;
  1705        p->id = iNode;
  1706        p->eWithin = PARTLY_WITHIN;
  1707        rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell);
  1708        p->iCell = (u8)iCell;
  1709        RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:");
  1710      }else{
  1711        pCsr->atEOF = 1;
  1712      }
  1713    }else{
  1714      /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array 
  1715      ** with the configured constraints. 
  1716      */
  1717      rc = nodeAcquire(pRtree, 1, 0, &pRoot);
  1718      if( rc==SQLITE_OK && argc>0 ){
  1719        pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc);
  1720        pCsr->nConstraint = argc;
  1721        if( !pCsr->aConstraint ){
  1722          rc = SQLITE_NOMEM;
  1723        }else{
  1724          memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc);
  1725          memset(pCsr->anQueue, 0, sizeof(u32)*(pRtree->iDepth + 1));
  1726          assert( (idxStr==0 && argc==0)
  1727                  || (idxStr && (int)strlen(idxStr)==argc*2) );
  1728          for(ii=0; ii<argc; ii++){
  1729            RtreeConstraint *p = &pCsr->aConstraint[ii];
  1730            p->op = idxStr[ii*2];
  1731            p->iCoord = idxStr[ii*2+1]-'0';
  1732            if( p->op>=RTREE_MATCH ){
  1733              /* A MATCH operator. The right-hand-side must be a blob that
  1734              ** can be cast into an RtreeMatchArg object. One created using
  1735              ** an sqlite3_rtree_geometry_callback() SQL user function.
  1736              */
  1737              rc = deserializeGeometry(argv[ii], p);
  1738              if( rc!=SQLITE_OK ){
  1739                break;
  1740              }
  1741              p->pInfo->nCoord = pRtree->nDim2;
  1742              p->pInfo->anQueue = pCsr->anQueue;
  1743              p->pInfo->mxLevel = pRtree->iDepth + 1;
  1744            }else{
  1745  #ifdef SQLITE_RTREE_INT_ONLY
  1746              p->u.rValue = sqlite3_value_int64(argv[ii]);
  1747  #else
  1748              p->u.rValue = sqlite3_value_double(argv[ii]);
  1749  #endif
  1750            }
  1751          }
  1752        }
  1753      }
  1754      if( rc==SQLITE_OK ){
  1755        RtreeSearchPoint *pNew;
  1756        pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1));
  1757        if( pNew==0 ) return SQLITE_NOMEM;
  1758        pNew->id = 1;
  1759        pNew->iCell = 0;
  1760        pNew->eWithin = PARTLY_WITHIN;
  1761        assert( pCsr->bPoint==1 );
  1762        pCsr->aNode[0] = pRoot;
  1763        pRoot = 0;
  1764        RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:");
  1765        rc = rtreeStepToLeaf(pCsr);
  1766      }
  1767    }
  1768  
  1769    nodeRelease(pRtree, pRoot);
  1770    rtreeRelease(pRtree);
  1771    return rc;
  1772  }
  1773  
  1774  /*
  1775  ** Rtree virtual table module xBestIndex method. There are three
  1776  ** table scan strategies to choose from (in order from most to 
  1777  ** least desirable):
  1778  **
  1779  **   idxNum     idxStr        Strategy
  1780  **   ------------------------------------------------
  1781  **     1        Unused        Direct lookup by rowid.
  1782  **     2        See below     R-tree query or full-table scan.
  1783  **   ------------------------------------------------
  1784  **
  1785  ** If strategy 1 is used, then idxStr is not meaningful. If strategy
  1786  ** 2 is used, idxStr is formatted to contain 2 bytes for each 
  1787  ** constraint used. The first two bytes of idxStr correspond to 
  1788  ** the constraint in sqlite3_index_info.aConstraintUsage[] with
  1789  ** (argvIndex==1) etc.
  1790  **
  1791  ** The first of each pair of bytes in idxStr identifies the constraint
  1792  ** operator as follows:
  1793  **
  1794  **   Operator    Byte Value
  1795  **   ----------------------
  1796  **      =        0x41 ('A')
  1797  **     <=        0x42 ('B')
  1798  **      <        0x43 ('C')
  1799  **     >=        0x44 ('D')
  1800  **      >        0x45 ('E')
  1801  **   MATCH       0x46 ('F')
  1802  **   ----------------------
  1803  **
  1804  ** The second of each pair of bytes identifies the coordinate column
  1805  ** to which the constraint applies. The leftmost coordinate column
  1806  ** is 'a', the second from the left 'b' etc.
  1807  */
  1808  static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
  1809    Rtree *pRtree = (Rtree*)tab;
  1810    int rc = SQLITE_OK;
  1811    int ii;
  1812    int bMatch = 0;                 /* True if there exists a MATCH constraint */
  1813    i64 nRow;                       /* Estimated rows returned by this scan */
  1814  
  1815    int iIdx = 0;
  1816    char zIdxStr[RTREE_MAX_DIMENSIONS*8+1];
  1817    memset(zIdxStr, 0, sizeof(zIdxStr));
  1818  
  1819    /* Check if there exists a MATCH constraint - even an unusable one. If there
  1820    ** is, do not consider the lookup-by-rowid plan as using such a plan would
  1821    ** require the VDBE to evaluate the MATCH constraint, which is not currently
  1822    ** possible. */
  1823    for(ii=0; ii<pIdxInfo->nConstraint; ii++){
  1824      if( pIdxInfo->aConstraint[ii].op==SQLITE_INDEX_CONSTRAINT_MATCH ){
  1825        bMatch = 1;
  1826      }
  1827    }
  1828  
  1829    assert( pIdxInfo->idxStr==0 );
  1830    for(ii=0; ii<pIdxInfo->nConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){
  1831      struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
  1832  
  1833      if( bMatch==0 && p->usable 
  1834       && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ 
  1835      ){
  1836        /* We have an equality constraint on the rowid. Use strategy 1. */
  1837        int jj;
  1838        for(jj=0; jj<ii; jj++){
  1839          pIdxInfo->aConstraintUsage[jj].argvIndex = 0;
  1840          pIdxInfo->aConstraintUsage[jj].omit = 0;
  1841        }
  1842        pIdxInfo->idxNum = 1;
  1843        pIdxInfo->aConstraintUsage[ii].argvIndex = 1;
  1844        pIdxInfo->aConstraintUsage[jj].omit = 1;
  1845  
  1846        /* This strategy involves a two rowid lookups on an B-Tree structures
  1847        ** and then a linear search of an R-Tree node. This should be 
  1848        ** considered almost as quick as a direct rowid lookup (for which 
  1849        ** sqlite uses an internal cost of 0.0). It is expected to return
  1850        ** a single row.
  1851        */ 
  1852        pIdxInfo->estimatedCost = 30.0;
  1853        pIdxInfo->estimatedRows = 1;
  1854        return SQLITE_OK;
  1855      }
  1856  
  1857      if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){
  1858        u8 op;
  1859        switch( p->op ){
  1860          case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break;
  1861          case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break;
  1862          case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break;
  1863          case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break;
  1864          case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break;
  1865          default:
  1866            assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH );
  1867            op = RTREE_MATCH; 
  1868            break;
  1869        }
  1870        zIdxStr[iIdx++] = op;
  1871        zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0');
  1872        pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2);
  1873        pIdxInfo->aConstraintUsage[ii].omit = 1;
  1874      }
  1875    }
  1876  
  1877    pIdxInfo->idxNum = 2;
  1878    pIdxInfo->needToFreeIdxStr = 1;
  1879    if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){
  1880      return SQLITE_NOMEM;
  1881    }
  1882  
  1883    nRow = pRtree->nRowEst >> (iIdx/2);
  1884    pIdxInfo->estimatedCost = (double)6.0 * (double)nRow;
  1885    pIdxInfo->estimatedRows = nRow;
  1886  
  1887    return rc;
  1888  }
  1889  
  1890  /*
  1891  ** Return the N-dimensional volumn of the cell stored in *p.
  1892  */
  1893  static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){
  1894    RtreeDValue area = (RtreeDValue)1;
  1895    assert( pRtree->nDim>=1 && pRtree->nDim<=5 );
  1896  #ifndef SQLITE_RTREE_INT_ONLY
  1897    if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
  1898      switch( pRtree->nDim ){
  1899        case 5:  area  = p->aCoord[9].f - p->aCoord[8].f;
  1900        case 4:  area *= p->aCoord[7].f - p->aCoord[6].f;
  1901        case 3:  area *= p->aCoord[5].f - p->aCoord[4].f;
  1902        case 2:  area *= p->aCoord[3].f - p->aCoord[2].f;
  1903        default: area *= p->aCoord[1].f - p->aCoord[0].f;
  1904      }
  1905    }else
  1906  #endif
  1907    {
  1908      switch( pRtree->nDim ){
  1909        case 5:  area  = p->aCoord[9].i - p->aCoord[8].i;
  1910        case 4:  area *= p->aCoord[7].i - p->aCoord[6].i;
  1911        case 3:  area *= p->aCoord[5].i - p->aCoord[4].i;
  1912        case 2:  area *= p->aCoord[3].i - p->aCoord[2].i;
  1913        default: area *= p->aCoord[1].i - p->aCoord[0].i;
  1914      }
  1915    }
  1916    return area;
  1917  }
  1918  
  1919  /*
  1920  ** Return the margin length of cell p. The margin length is the sum
  1921  ** of the objects size in each dimension.
  1922  */
  1923  static RtreeDValue cellMargin(Rtree *pRtree, RtreeCell *p){
  1924    RtreeDValue margin = 0;
  1925    int ii = pRtree->nDim2 - 2;
  1926    do{
  1927      margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
  1928      ii -= 2;
  1929    }while( ii>=0 );
  1930    return margin;
  1931  }
  1932  
  1933  /*
  1934  ** Store the union of cells p1 and p2 in p1.
  1935  */
  1936  static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
  1937    int ii = 0;
  1938    if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
  1939      do{
  1940        p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f);
  1941        p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f);
  1942        ii += 2;
  1943      }while( ii<pRtree->nDim2 );
  1944    }else{
  1945      do{
  1946        p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i);
  1947        p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i);
  1948        ii += 2;
  1949      }while( ii<pRtree->nDim2 );
  1950    }
  1951  }
  1952  
  1953  /*
  1954  ** Return true if the area covered by p2 is a subset of the area covered
  1955  ** by p1. False otherwise.
  1956  */
  1957  static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
  1958    int ii;
  1959    int isInt = (pRtree->eCoordType==RTREE_COORD_INT32);
  1960    for(ii=0; ii<pRtree->nDim2; ii+=2){
  1961      RtreeCoord *a1 = &p1->aCoord[ii];
  1962      RtreeCoord *a2 = &p2->aCoord[ii];
  1963      if( (!isInt && (a2[0].f<a1[0].f || a2[1].f>a1[1].f)) 
  1964       || ( isInt && (a2[0].i<a1[0].i || a2[1].i>a1[1].i)) 
  1965      ){
  1966        return 0;
  1967      }
  1968    }
  1969    return 1;
  1970  }
  1971  
  1972  /*
  1973  ** Return the amount cell p would grow by if it were unioned with pCell.
  1974  */
  1975  static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){
  1976    RtreeDValue area;
  1977    RtreeCell cell;
  1978    memcpy(&cell, p, sizeof(RtreeCell));
  1979    area = cellArea(pRtree, &cell);
  1980    cellUnion(pRtree, &cell, pCell);
  1981    return (cellArea(pRtree, &cell)-area);
  1982  }
  1983  
  1984  static RtreeDValue cellOverlap(
  1985    Rtree *pRtree, 
  1986    RtreeCell *p, 
  1987    RtreeCell *aCell, 
  1988    int nCell
  1989  ){
  1990    int ii;
  1991    RtreeDValue overlap = RTREE_ZERO;
  1992    for(ii=0; ii<nCell; ii++){
  1993      int jj;
  1994      RtreeDValue o = (RtreeDValue)1;
  1995      for(jj=0; jj<pRtree->nDim2; jj+=2){
  1996        RtreeDValue x1, x2;
  1997        x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj]));
  1998        x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1]));
  1999        if( x2<x1 ){
  2000          o = (RtreeDValue)0;
  2001          break;
  2002        }else{
  2003          o = o * (x2-x1);
  2004        }
  2005      }
  2006      overlap += o;
  2007    }
  2008    return overlap;
  2009  }
  2010  
  2011  
  2012  /*
  2013  ** This function implements the ChooseLeaf algorithm from Gutman[84].
  2014  ** ChooseSubTree in r*tree terminology.
  2015  */
  2016  static int ChooseLeaf(
  2017    Rtree *pRtree,               /* Rtree table */
  2018    RtreeCell *pCell,            /* Cell to insert into rtree */
  2019    int iHeight,                 /* Height of sub-tree rooted at pCell */
  2020    RtreeNode **ppLeaf           /* OUT: Selected leaf page */
  2021  ){
  2022    int rc;
  2023    int ii;
  2024    RtreeNode *pNode;
  2025    rc = nodeAcquire(pRtree, 1, 0, &pNode);
  2026  
  2027    for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
  2028      int iCell;
  2029      sqlite3_int64 iBest = 0;
  2030  
  2031      RtreeDValue fMinGrowth = RTREE_ZERO;
  2032      RtreeDValue fMinArea = RTREE_ZERO;
  2033  
  2034      int nCell = NCELL(pNode);
  2035      RtreeCell cell;
  2036      RtreeNode *pChild;
  2037  
  2038      RtreeCell *aCell = 0;
  2039  
  2040      /* Select the child node which will be enlarged the least if pCell
  2041      ** is inserted into it. Resolve ties by choosing the entry with
  2042      ** the smallest area.
  2043      */
  2044      for(iCell=0; iCell<nCell; iCell++){
  2045        int bBest = 0;
  2046        RtreeDValue growth;
  2047        RtreeDValue area;
  2048        nodeGetCell(pRtree, pNode, iCell, &cell);
  2049        growth = cellGrowth(pRtree, &cell, pCell);
  2050        area = cellArea(pRtree, &cell);
  2051        if( iCell==0||growth<fMinGrowth||(growth==fMinGrowth && area<fMinArea) ){
  2052          bBest = 1;
  2053        }
  2054        if( bBest ){
  2055          fMinGrowth = growth;
  2056          fMinArea = area;
  2057          iBest = cell.iRowid;
  2058        }
  2059      }
  2060  
  2061      sqlite3_free(aCell);
  2062      rc = nodeAcquire(pRtree, iBest, pNode, &pChild);
  2063      nodeRelease(pRtree, pNode);
  2064      pNode = pChild;
  2065    }
  2066  
  2067    *ppLeaf = pNode;
  2068    return rc;
  2069  }
  2070  
  2071  /*
  2072  ** A cell with the same content as pCell has just been inserted into
  2073  ** the node pNode. This function updates the bounding box cells in
  2074  ** all ancestor elements.
  2075  */
  2076  static int AdjustTree(
  2077    Rtree *pRtree,                    /* Rtree table */
  2078    RtreeNode *pNode,                 /* Adjust ancestry of this node. */
  2079    RtreeCell *pCell                  /* This cell was just inserted */
  2080  ){
  2081    RtreeNode *p = pNode;
  2082    while( p->pParent ){
  2083      RtreeNode *pParent = p->pParent;
  2084      RtreeCell cell;
  2085      int iCell;
  2086  
  2087      if( nodeParentIndex(pRtree, p, &iCell) ){
  2088        return SQLITE_CORRUPT_VTAB;
  2089      }
  2090  
  2091      nodeGetCell(pRtree, pParent, iCell, &cell);
  2092      if( !cellContains(pRtree, &cell, pCell) ){
  2093        cellUnion(pRtree, &cell, pCell);
  2094        nodeOverwriteCell(pRtree, pParent, &cell, iCell);
  2095      }
  2096   
  2097      p = pParent;
  2098    }
  2099    return SQLITE_OK;
  2100  }
  2101  
  2102  /*
  2103  ** Write mapping (iRowid->iNode) to the <rtree>_rowid table.
  2104  */
  2105  static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){
  2106    sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid);
  2107    sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode);
  2108    sqlite3_step(pRtree->pWriteRowid);
  2109    return sqlite3_reset(pRtree->pWriteRowid);
  2110  }
  2111  
  2112  /*
  2113  ** Write mapping (iNode->iPar) to the <rtree>_parent table.
  2114  */
  2115  static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){
  2116    sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode);
  2117    sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar);
  2118    sqlite3_step(pRtree->pWriteParent);
  2119    return sqlite3_reset(pRtree->pWriteParent);
  2120  }
  2121  
  2122  static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int);
  2123  
  2124  
  2125  /*
  2126  ** Arguments aIdx, aDistance and aSpare all point to arrays of size
  2127  ** nIdx. The aIdx array contains the set of integers from 0 to 
  2128  ** (nIdx-1) in no particular order. This function sorts the values
  2129  ** in aIdx according to the indexed values in aDistance. For
  2130  ** example, assuming the inputs:
  2131  **
  2132  **   aIdx      = { 0,   1,   2,   3 }
  2133  **   aDistance = { 5.0, 2.0, 7.0, 6.0 }
  2134  **
  2135  ** this function sets the aIdx array to contain:
  2136  **
  2137  **   aIdx      = { 0,   1,   2,   3 }
  2138  **
  2139  ** The aSpare array is used as temporary working space by the
  2140  ** sorting algorithm.
  2141  */
  2142  static void SortByDistance(
  2143    int *aIdx, 
  2144    int nIdx, 
  2145    RtreeDValue *aDistance, 
  2146    int *aSpare
  2147  ){
  2148    if( nIdx>1 ){
  2149      int iLeft = 0;
  2150      int iRight = 0;
  2151  
  2152      int nLeft = nIdx/2;
  2153      int nRight = nIdx-nLeft;
  2154      int *aLeft = aIdx;
  2155      int *aRight = &aIdx[nLeft];
  2156  
  2157      SortByDistance(aLeft, nLeft, aDistance, aSpare);
  2158      SortByDistance(aRight, nRight, aDistance, aSpare);
  2159  
  2160      memcpy(aSpare, aLeft, sizeof(int)*nLeft);
  2161      aLeft = aSpare;
  2162  
  2163      while( iLeft<nLeft || iRight<nRight ){
  2164        if( iLeft==nLeft ){
  2165          aIdx[iLeft+iRight] = aRight[iRight];
  2166          iRight++;
  2167        }else if( iRight==nRight ){
  2168          aIdx[iLeft+iRight] = aLeft[iLeft];
  2169          iLeft++;
  2170        }else{
  2171          RtreeDValue fLeft = aDistance[aLeft[iLeft]];
  2172          RtreeDValue fRight = aDistance[aRight[iRight]];
  2173          if( fLeft<fRight ){
  2174            aIdx[iLeft+iRight] = aLeft[iLeft];
  2175            iLeft++;
  2176          }else{
  2177            aIdx[iLeft+iRight] = aRight[iRight];
  2178            iRight++;
  2179          }
  2180        }
  2181      }
  2182  
  2183  #if 0
  2184      /* Check that the sort worked */
  2185      {
  2186        int jj;
  2187        for(jj=1; jj<nIdx; jj++){
  2188          RtreeDValue left = aDistance[aIdx[jj-1]];
  2189          RtreeDValue right = aDistance[aIdx[jj]];
  2190          assert( left<=right );
  2191        }
  2192      }
  2193  #endif
  2194    }
  2195  }
  2196  
  2197  /*
  2198  ** Arguments aIdx, aCell and aSpare all point to arrays of size
  2199  ** nIdx. The aIdx array contains the set of integers from 0 to 
  2200  ** (nIdx-1) in no particular order. This function sorts the values
  2201  ** in aIdx according to dimension iDim of the cells in aCell. The
  2202  ** minimum value of dimension iDim is considered first, the
  2203  ** maximum used to break ties.
  2204  **
  2205  ** The aSpare array is used as temporary working space by the
  2206  ** sorting algorithm.
  2207  */
  2208  static void SortByDimension(
  2209    Rtree *pRtree,
  2210    int *aIdx, 
  2211    int nIdx, 
  2212    int iDim, 
  2213    RtreeCell *aCell, 
  2214    int *aSpare
  2215  ){
  2216    if( nIdx>1 ){
  2217  
  2218      int iLeft = 0;
  2219      int iRight = 0;
  2220  
  2221      int nLeft = nIdx/2;
  2222      int nRight = nIdx-nLeft;
  2223      int *aLeft = aIdx;
  2224      int *aRight = &aIdx[nLeft];
  2225  
  2226      SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare);
  2227      SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare);
  2228  
  2229      memcpy(aSpare, aLeft, sizeof(int)*nLeft);
  2230      aLeft = aSpare;
  2231      while( iLeft<nLeft || iRight<nRight ){
  2232        RtreeDValue xleft1 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2]);
  2233        RtreeDValue xleft2 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2+1]);
  2234        RtreeDValue xright1 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2]);
  2235        RtreeDValue xright2 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2+1]);
  2236        if( (iLeft!=nLeft) && ((iRight==nRight)
  2237         || (xleft1<xright1)
  2238         || (xleft1==xright1 && xleft2<xright2)
  2239        )){
  2240          aIdx[iLeft+iRight] = aLeft[iLeft];
  2241          iLeft++;
  2242        }else{
  2243          aIdx[iLeft+iRight] = aRight[iRight];
  2244          iRight++;
  2245        }
  2246      }
  2247  
  2248  #if 0
  2249      /* Check that the sort worked */
  2250      {
  2251        int jj;
  2252        for(jj=1; jj<nIdx; jj++){
  2253          RtreeDValue xleft1 = aCell[aIdx[jj-1]].aCoord[iDim*2];
  2254          RtreeDValue xleft2 = aCell[aIdx[jj-1]].aCoord[iDim*2+1];
  2255          RtreeDValue xright1 = aCell[aIdx[jj]].aCoord[iDim*2];
  2256          RtreeDValue xright2 = aCell[aIdx[jj]].aCoord[iDim*2+1];
  2257          assert( xleft1<=xright1 && (xleft1<xright1 || xleft2<=xright2) );
  2258        }
  2259      }
  2260  #endif
  2261    }
  2262  }
  2263  
  2264  /*
  2265  ** Implementation of the R*-tree variant of SplitNode from Beckman[1990].
  2266  */
  2267  static int splitNodeStartree(
  2268    Rtree *pRtree,
  2269    RtreeCell *aCell,
  2270    int nCell,
  2271    RtreeNode *pLeft,
  2272    RtreeNode *pRight,
  2273    RtreeCell *pBboxLeft,
  2274    RtreeCell *pBboxRight
  2275  ){
  2276    int **aaSorted;
  2277    int *aSpare;
  2278    int ii;
  2279  
  2280    int iBestDim = 0;
  2281    int iBestSplit = 0;
  2282    RtreeDValue fBestMargin = RTREE_ZERO;
  2283  
  2284    int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int));
  2285  
  2286    aaSorted = (int **)sqlite3_malloc(nByte);
  2287    if( !aaSorted ){
  2288      return SQLITE_NOMEM;
  2289    }
  2290  
  2291    aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell];
  2292    memset(aaSorted, 0, nByte);
  2293    for(ii=0; ii<pRtree->nDim; ii++){
  2294      int jj;
  2295      aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell];
  2296      for(jj=0; jj<nCell; jj++){
  2297        aaSorted[ii][jj] = jj;
  2298      }
  2299      SortByDimension(pRtree, aaSorted[ii], nCell, ii, aCell, aSpare);
  2300    }
  2301  
  2302    for(ii=0; ii<pRtree->nDim; ii++){
  2303      RtreeDValue margin = RTREE_ZERO;
  2304      RtreeDValue fBestOverlap = RTREE_ZERO;
  2305      RtreeDValue fBestArea = RTREE_ZERO;
  2306      int iBestLeft = 0;
  2307      int nLeft;
  2308  
  2309      for(
  2310        nLeft=RTREE_MINCELLS(pRtree); 
  2311        nLeft<=(nCell-RTREE_MINCELLS(pRtree)); 
  2312        nLeft++
  2313      ){
  2314        RtreeCell left;
  2315        RtreeCell right;
  2316        int kk;
  2317        RtreeDValue overlap;
  2318        RtreeDValue area;
  2319  
  2320        memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell));
  2321        memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell));
  2322        for(kk=1; kk<(nCell-1); kk++){
  2323          if( kk<nLeft ){
  2324            cellUnion(pRtree, &left, &aCell[aaSorted[ii][kk]]);
  2325          }else{
  2326            cellUnion(pRtree, &right, &aCell[aaSorted[ii][kk]]);
  2327          }
  2328        }
  2329        margin += cellMargin(pRtree, &left);
  2330        margin += cellMargin(pRtree, &right);
  2331        overlap = cellOverlap(pRtree, &left, &right, 1);
  2332        area = cellArea(pRtree, &left) + cellArea(pRtree, &right);
  2333        if( (nLeft==RTREE_MINCELLS(pRtree))
  2334         || (overlap<fBestOverlap)
  2335         || (overlap==fBestOverlap && area<fBestArea)
  2336        ){
  2337          iBestLeft = nLeft;
  2338          fBestOverlap = overlap;
  2339          fBestArea = area;
  2340        }
  2341      }
  2342  
  2343      if( ii==0 || margin<fBestMargin ){
  2344        iBestDim = ii;
  2345        fBestMargin = margin;
  2346        iBestSplit = iBestLeft;
  2347      }
  2348    }
  2349  
  2350    memcpy(pBboxLeft, &aCell[aaSorted[iBestDim][0]], sizeof(RtreeCell));
  2351    memcpy(pBboxRight, &aCell[aaSorted[iBestDim][iBestSplit]], sizeof(RtreeCell));
  2352    for(ii=0; ii<nCell; ii++){
  2353      RtreeNode *pTarget = (ii<iBestSplit)?pLeft:pRight;
  2354      RtreeCell *pBbox = (ii<iBestSplit)?pBboxLeft:pBboxRight;
  2355      RtreeCell *pCell = &aCell[aaSorted[iBestDim][ii]];
  2356      nodeInsertCell(pRtree, pTarget, pCell);
  2357      cellUnion(pRtree, pBbox, pCell);
  2358    }
  2359  
  2360    sqlite3_free(aaSorted);
  2361    return SQLITE_OK;
  2362  }
  2363  
  2364  
  2365  static int updateMapping(
  2366    Rtree *pRtree, 
  2367    i64 iRowid, 
  2368    RtreeNode *pNode, 
  2369    int iHeight
  2370  ){
  2371    int (*xSetMapping)(Rtree *, sqlite3_int64, sqlite3_int64);
  2372    xSetMapping = ((iHeight==0)?rowidWrite:parentWrite);
  2373    if( iHeight>0 ){
  2374      RtreeNode *pChild = nodeHashLookup(pRtree, iRowid);
  2375      if( pChild ){
  2376        nodeRelease(pRtree, pChild->pParent);
  2377        nodeReference(pNode);
  2378        pChild->pParent = pNode;
  2379      }
  2380    }
  2381    return xSetMapping(pRtree, iRowid, pNode->iNode);
  2382  }
  2383  
  2384  static int SplitNode(
  2385    Rtree *pRtree,
  2386    RtreeNode *pNode,
  2387    RtreeCell *pCell,
  2388    int iHeight
  2389  ){
  2390    int i;
  2391    int newCellIsRight = 0;
  2392  
  2393    int rc = SQLITE_OK;
  2394    int nCell = NCELL(pNode);
  2395    RtreeCell *aCell;
  2396    int *aiUsed;
  2397  
  2398    RtreeNode *pLeft = 0;
  2399    RtreeNode *pRight = 0;
  2400  
  2401    RtreeCell leftbbox;
  2402    RtreeCell rightbbox;
  2403  
  2404    /* Allocate an array and populate it with a copy of pCell and 
  2405    ** all cells from node pLeft. Then zero the original node.
  2406    */
  2407    aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1));
  2408    if( !aCell ){
  2409      rc = SQLITE_NOMEM;
  2410      goto splitnode_out;
  2411    }
  2412    aiUsed = (int *)&aCell[nCell+1];
  2413    memset(aiUsed, 0, sizeof(int)*(nCell+1));
  2414    for(i=0; i<nCell; i++){
  2415      nodeGetCell(pRtree, pNode, i, &aCell[i]);
  2416    }
  2417    nodeZero(pRtree, pNode);
  2418    memcpy(&aCell[nCell], pCell, sizeof(RtreeCell));
  2419    nCell++;
  2420  
  2421    if( pNode->iNode==1 ){
  2422      pRight = nodeNew(pRtree, pNode);
  2423      pLeft = nodeNew(pRtree, pNode);
  2424      pRtree->iDepth++;
  2425      pNode->isDirty = 1;
  2426      writeInt16(pNode->zData, pRtree->iDepth);
  2427    }else{
  2428      pLeft = pNode;
  2429      pRight = nodeNew(pRtree, pLeft->pParent);
  2430      nodeReference(pLeft);
  2431    }
  2432  
  2433    if( !pLeft || !pRight ){
  2434      rc = SQLITE_NOMEM;
  2435      goto splitnode_out;
  2436    }
  2437  
  2438    memset(pLeft->zData, 0, pRtree->iNodeSize);
  2439    memset(pRight->zData, 0, pRtree->iNodeSize);
  2440  
  2441    rc = splitNodeStartree(pRtree, aCell, nCell, pLeft, pRight,
  2442                           &leftbbox, &rightbbox);
  2443    if( rc!=SQLITE_OK ){
  2444      goto splitnode_out;
  2445    }
  2446  
  2447    /* Ensure both child nodes have node numbers assigned to them by calling
  2448    ** nodeWrite(). Node pRight always needs a node number, as it was created
  2449    ** by nodeNew() above. But node pLeft sometimes already has a node number.
  2450    ** In this case avoid the all to nodeWrite().
  2451    */
  2452    if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight))
  2453     || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft)))
  2454    ){
  2455      goto splitnode_out;
  2456    }
  2457  
  2458    rightbbox.iRowid = pRight->iNode;
  2459    leftbbox.iRowid = pLeft->iNode;
  2460  
  2461    if( pNode->iNode==1 ){
  2462      rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1);
  2463      if( rc!=SQLITE_OK ){
  2464        goto splitnode_out;
  2465      }
  2466    }else{
  2467      RtreeNode *pParent = pLeft->pParent;
  2468      int iCell;
  2469      rc = nodeParentIndex(pRtree, pLeft, &iCell);
  2470      if( rc==SQLITE_OK ){
  2471        nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell);
  2472        rc = AdjustTree(pRtree, pParent, &leftbbox);
  2473      }
  2474      if( rc!=SQLITE_OK ){
  2475        goto splitnode_out;
  2476      }
  2477    }
  2478    if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){
  2479      goto splitnode_out;
  2480    }
  2481  
  2482    for(i=0; i<NCELL(pRight); i++){
  2483      i64 iRowid = nodeGetRowid(pRtree, pRight, i);
  2484      rc = updateMapping(pRtree, iRowid, pRight, iHeight);
  2485      if( iRowid==pCell->iRowid ){
  2486        newCellIsRight = 1;
  2487      }
  2488      if( rc!=SQLITE_OK ){
  2489        goto splitnode_out;
  2490      }
  2491    }
  2492    if( pNode->iNode==1 ){
  2493      for(i=0; i<NCELL(pLeft); i++){
  2494        i64 iRowid = nodeGetRowid(pRtree, pLeft, i);
  2495        rc = updateMapping(pRtree, iRowid, pLeft, iHeight);
  2496        if( rc!=SQLITE_OK ){
  2497          goto splitnode_out;
  2498        }
  2499      }
  2500    }else if( newCellIsRight==0 ){
  2501      rc = updateMapping(pRtree, pCell->iRowid, pLeft, iHeight);
  2502    }
  2503  
  2504    if( rc==SQLITE_OK ){
  2505      rc = nodeRelease(pRtree, pRight);
  2506      pRight = 0;
  2507    }
  2508    if( rc==SQLITE_OK ){
  2509      rc = nodeRelease(pRtree, pLeft);
  2510      pLeft = 0;
  2511    }
  2512  
  2513  splitnode_out:
  2514    nodeRelease(pRtree, pRight);
  2515    nodeRelease(pRtree, pLeft);
  2516    sqlite3_free(aCell);
  2517    return rc;
  2518  }
  2519  
  2520  /*
  2521  ** If node pLeaf is not the root of the r-tree and its pParent pointer is 
  2522  ** still NULL, load all ancestor nodes of pLeaf into memory and populate
  2523  ** the pLeaf->pParent chain all the way up to the root node.
  2524  **
  2525  ** This operation is required when a row is deleted (or updated - an update
  2526  ** is implemented as a delete followed by an insert). SQLite provides the
  2527  ** rowid of the row to delete, which can be used to find the leaf on which
  2528  ** the entry resides (argument pLeaf). Once the leaf is located, this 
  2529  ** function is called to determine its ancestry.
  2530  */
  2531  static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){
  2532    int rc = SQLITE_OK;
  2533    RtreeNode *pChild = pLeaf;
  2534    while( rc==SQLITE_OK && pChild->iNode!=1 && pChild->pParent==0 ){
  2535      int rc2 = SQLITE_OK;          /* sqlite3_reset() return code */
  2536      sqlite3_bind_int64(pRtree->pReadParent, 1, pChild->iNode);
  2537      rc = sqlite3_step(pRtree->pReadParent);
  2538      if( rc==SQLITE_ROW ){
  2539        RtreeNode *pTest;           /* Used to test for reference loops */
  2540        i64 iNode;                  /* Node number of parent node */
  2541  
  2542        /* Before setting pChild->pParent, test that we are not creating a
  2543        ** loop of references (as we would if, say, pChild==pParent). We don't
  2544        ** want to do this as it leads to a memory leak when trying to delete
  2545        ** the referenced counted node structures.
  2546        */
  2547        iNode = sqlite3_column_int64(pRtree->pReadParent, 0);
  2548        for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent);
  2549        if( !pTest ){
  2550          rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent);
  2551        }
  2552      }
  2553      rc = sqlite3_reset(pRtree->pReadParent);
  2554      if( rc==SQLITE_OK ) rc = rc2;
  2555      if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB;
  2556      pChild = pChild->pParent;
  2557    }
  2558    return rc;
  2559  }
  2560  
  2561  static int deleteCell(Rtree *, RtreeNode *, int, int);
  2562  
  2563  static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){
  2564    int rc;
  2565    int rc2;
  2566    RtreeNode *pParent = 0;
  2567    int iCell;
  2568  
  2569    assert( pNode->nRef==1 );
  2570  
  2571    /* Remove the entry in the parent cell. */
  2572    rc = nodeParentIndex(pRtree, pNode, &iCell);
  2573    if( rc==SQLITE_OK ){
  2574      pParent = pNode->pParent;
  2575      pNode->pParent = 0;
  2576      rc = deleteCell(pRtree, pParent, iCell, iHeight+1);
  2577    }
  2578    rc2 = nodeRelease(pRtree, pParent);
  2579    if( rc==SQLITE_OK ){
  2580      rc = rc2;
  2581    }
  2582    if( rc!=SQLITE_OK ){
  2583      return rc;
  2584    }
  2585  
  2586    /* Remove the xxx_node entry. */
  2587    sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode);
  2588    sqlite3_step(pRtree->pDeleteNode);
  2589    if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){
  2590      return rc;
  2591    }
  2592  
  2593    /* Remove the xxx_parent entry. */
  2594    sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode);
  2595    sqlite3_step(pRtree->pDeleteParent);
  2596    if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){
  2597      return rc;
  2598    }
  2599    
  2600    /* Remove the node from the in-memory hash table and link it into
  2601    ** the Rtree.pDeleted list. Its contents will be re-inserted later on.
  2602    */
  2603    nodeHashDelete(pRtree, pNode);
  2604    pNode->iNode = iHeight;
  2605    pNode->pNext = pRtree->pDeleted;
  2606    pNode->nRef++;
  2607    pRtree->pDeleted = pNode;
  2608  
  2609    return SQLITE_OK;
  2610  }
  2611  
  2612  static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){
  2613    RtreeNode *pParent = pNode->pParent;
  2614    int rc = SQLITE_OK; 
  2615    if( pParent ){
  2616      int ii; 
  2617      int nCell = NCELL(pNode);
  2618      RtreeCell box;                            /* Bounding box for pNode */
  2619      nodeGetCell(pRtree, pNode, 0, &box);
  2620      for(ii=1; ii<nCell; ii++){
  2621        RtreeCell cell;
  2622        nodeGetCell(pRtree, pNode, ii, &cell);
  2623        cellUnion(pRtree, &box, &cell);
  2624      }
  2625      box.iRowid = pNode->iNode;
  2626      rc = nodeParentIndex(pRtree, pNode, &ii);
  2627      if( rc==SQLITE_OK ){
  2628        nodeOverwriteCell(pRtree, pParent, &box, ii);
  2629        rc = fixBoundingBox(pRtree, pParent);
  2630      }
  2631    }
  2632    return rc;
  2633  }
  2634  
  2635  /*
  2636  ** Delete the cell at index iCell of node pNode. After removing the
  2637  ** cell, adjust the r-tree data structure if required.
  2638  */
  2639  static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){
  2640    RtreeNode *pParent;
  2641    int rc;
  2642  
  2643    if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){
  2644      return rc;
  2645    }
  2646  
  2647    /* Remove the cell from the node. This call just moves bytes around
  2648    ** the in-memory node image, so it cannot fail.
  2649    */
  2650    nodeDeleteCell(pRtree, pNode, iCell);
  2651  
  2652    /* If the node is not the tree root and now has less than the minimum
  2653    ** number of cells, remove it from the tree. Otherwise, update the
  2654    ** cell in the parent node so that it tightly contains the updated
  2655    ** node.
  2656    */
  2657    pParent = pNode->pParent;
  2658    assert( pParent || pNode->iNode==1 );
  2659    if( pParent ){
  2660      if( NCELL(pNode)<RTREE_MINCELLS(pRtree) ){
  2661        rc = removeNode(pRtree, pNode, iHeight);
  2662      }else{
  2663        rc = fixBoundingBox(pRtree, pNode);
  2664      }
  2665    }
  2666  
  2667    return rc;
  2668  }
  2669  
  2670  static int Reinsert(
  2671    Rtree *pRtree, 
  2672    RtreeNode *pNode, 
  2673    RtreeCell *pCell, 
  2674    int iHeight
  2675  ){
  2676    int *aOrder;
  2677    int *aSpare;
  2678    RtreeCell *aCell;
  2679    RtreeDValue *aDistance;
  2680    int nCell;
  2681    RtreeDValue aCenterCoord[RTREE_MAX_DIMENSIONS];
  2682    int iDim;
  2683    int ii;
  2684    int rc = SQLITE_OK;
  2685    int n;
  2686  
  2687    memset(aCenterCoord, 0, sizeof(RtreeDValue)*RTREE_MAX_DIMENSIONS);
  2688  
  2689    nCell = NCELL(pNode)+1;
  2690    n = (nCell+1)&(~1);
  2691  
  2692    /* Allocate the buffers used by this operation. The allocation is
  2693    ** relinquished before this function returns.
  2694    */
  2695    aCell = (RtreeCell *)sqlite3_malloc(n * (
  2696      sizeof(RtreeCell)     +         /* aCell array */
  2697      sizeof(int)           +         /* aOrder array */
  2698      sizeof(int)           +         /* aSpare array */
  2699      sizeof(RtreeDValue)             /* aDistance array */
  2700    ));
  2701    if( !aCell ){
  2702      return SQLITE_NOMEM;
  2703    }
  2704    aOrder    = (int *)&aCell[n];
  2705    aSpare    = (int *)&aOrder[n];
  2706    aDistance = (RtreeDValue *)&aSpare[n];
  2707  
  2708    for(ii=0; ii<nCell; ii++){
  2709      if( ii==(nCell-1) ){
  2710        memcpy(&aCell[ii], pCell, sizeof(RtreeCell));
  2711      }else{
  2712        nodeGetCell(pRtree, pNode, ii, &aCell[ii]);
  2713      }
  2714      aOrder[ii] = ii;
  2715      for(iDim=0; iDim<pRtree->nDim; iDim++){
  2716        aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]);
  2717        aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]);
  2718      }
  2719    }
  2720    for(iDim=0; iDim<pRtree->nDim; iDim++){
  2721      aCenterCoord[iDim] = (aCenterCoord[iDim]/(nCell*(RtreeDValue)2));
  2722    }
  2723  
  2724    for(ii=0; ii<nCell; ii++){
  2725      aDistance[ii] = RTREE_ZERO;
  2726      for(iDim=0; iDim<pRtree->nDim; iDim++){
  2727        RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) - 
  2728                                 DCOORD(aCell[ii].aCoord[iDim*2]));
  2729        aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]);
  2730      }
  2731    }
  2732  
  2733    SortByDistance(aOrder, nCell, aDistance, aSpare);
  2734    nodeZero(pRtree, pNode);
  2735  
  2736    for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){
  2737      RtreeCell *p = &aCell[aOrder[ii]];
  2738      nodeInsertCell(pRtree, pNode, p);
  2739      if( p->iRowid==pCell->iRowid ){
  2740        if( iHeight==0 ){
  2741          rc = rowidWrite(pRtree, p->iRowid, pNode->iNode);
  2742        }else{
  2743          rc = parentWrite(pRtree, p->iRowid, pNode->iNode);
  2744        }
  2745      }
  2746    }
  2747    if( rc==SQLITE_OK ){
  2748      rc = fixBoundingBox(pRtree, pNode);
  2749    }
  2750    for(; rc==SQLITE_OK && ii<nCell; ii++){
  2751      /* Find a node to store this cell in. pNode->iNode currently contains
  2752      ** the height of the sub-tree headed by the cell.
  2753      */
  2754      RtreeNode *pInsert;
  2755      RtreeCell *p = &aCell[aOrder[ii]];
  2756      rc = ChooseLeaf(pRtree, p, iHeight, &pInsert);
  2757      if( rc==SQLITE_OK ){
  2758        int rc2;
  2759        rc = rtreeInsertCell(pRtree, pInsert, p, iHeight);
  2760        rc2 = nodeRelease(pRtree, pInsert);
  2761        if( rc==SQLITE_OK ){
  2762          rc = rc2;
  2763        }
  2764      }
  2765    }
  2766  
  2767    sqlite3_free(aCell);
  2768    return rc;
  2769  }
  2770  
  2771  /*
  2772  ** Insert cell pCell into node pNode. Node pNode is the head of a 
  2773  ** subtree iHeight high (leaf nodes have iHeight==0).
  2774  */
  2775  static int rtreeInsertCell(
  2776    Rtree *pRtree,
  2777    RtreeNode *pNode,
  2778    RtreeCell *pCell,
  2779    int iHeight
  2780  ){
  2781    int rc = SQLITE_OK;
  2782    if( iHeight>0 ){
  2783      RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid);
  2784      if( pChild ){
  2785        nodeRelease(pRtree, pChild->pParent);
  2786        nodeReference(pNode);
  2787        pChild->pParent = pNode;
  2788      }
  2789    }
  2790    if( nodeInsertCell(pRtree, pNode, pCell) ){
  2791      if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){
  2792        rc = SplitNode(pRtree, pNode, pCell, iHeight);
  2793      }else{
  2794        pRtree->iReinsertHeight = iHeight;
  2795        rc = Reinsert(pRtree, pNode, pCell, iHeight);
  2796      }
  2797    }else{
  2798      rc = AdjustTree(pRtree, pNode, pCell);
  2799      if( rc==SQLITE_OK ){
  2800        if( iHeight==0 ){
  2801          rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode);
  2802        }else{
  2803          rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode);
  2804        }
  2805      }
  2806    }
  2807    return rc;
  2808  }
  2809  
  2810  static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){
  2811    int ii;
  2812    int rc = SQLITE_OK;
  2813    int nCell = NCELL(pNode);
  2814  
  2815    for(ii=0; rc==SQLITE_OK && ii<nCell; ii++){
  2816      RtreeNode *pInsert;
  2817      RtreeCell cell;
  2818      nodeGetCell(pRtree, pNode, ii, &cell);
  2819  
  2820      /* Find a node to store this cell in. pNode->iNode currently contains
  2821      ** the height of the sub-tree headed by the cell.
  2822      */
  2823      rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert);
  2824      if( rc==SQLITE_OK ){
  2825        int rc2;
  2826        rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode);
  2827        rc2 = nodeRelease(pRtree, pInsert);
  2828        if( rc==SQLITE_OK ){
  2829          rc = rc2;
  2830        }
  2831      }
  2832    }
  2833    return rc;
  2834  }
  2835  
  2836  /*
  2837  ** Select a currently unused rowid for a new r-tree record.
  2838  */
  2839  static int newRowid(Rtree *pRtree, i64 *piRowid){
  2840    int rc;
  2841    sqlite3_bind_null(pRtree->pWriteRowid, 1);
  2842    sqlite3_bind_null(pRtree->pWriteRowid, 2);
  2843    sqlite3_step(pRtree->pWriteRowid);
  2844    rc = sqlite3_reset(pRtree->pWriteRowid);
  2845    *piRowid = sqlite3_last_insert_rowid(pRtree->db);
  2846    return rc;
  2847  }
  2848  
  2849  /*
  2850  ** Remove the entry with rowid=iDelete from the r-tree structure.
  2851  */
  2852  static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
  2853    int rc;                         /* Return code */
  2854    RtreeNode *pLeaf = 0;           /* Leaf node containing record iDelete */
  2855    int iCell;                      /* Index of iDelete cell in pLeaf */
  2856    RtreeNode *pRoot = 0;           /* Root node of rtree structure */
  2857  
  2858  
  2859    /* Obtain a reference to the root node to initialize Rtree.iDepth */
  2860    rc = nodeAcquire(pRtree, 1, 0, &pRoot);
  2861  
  2862    /* Obtain a reference to the leaf node that contains the entry 
  2863    ** about to be deleted. 
  2864    */
  2865    if( rc==SQLITE_OK ){
  2866      rc = findLeafNode(pRtree, iDelete, &pLeaf, 0);
  2867    }
  2868  
  2869    /* Delete the cell in question from the leaf node. */
  2870    if( rc==SQLITE_OK ){
  2871      int rc2;
  2872      rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell);
  2873      if( rc==SQLITE_OK ){
  2874        rc = deleteCell(pRtree, pLeaf, iCell, 0);
  2875      }
  2876      rc2 = nodeRelease(pRtree, pLeaf);
  2877      if( rc==SQLITE_OK ){
  2878        rc = rc2;
  2879      }
  2880    }
  2881  
  2882    /* Delete the corresponding entry in the <rtree>_rowid table. */
  2883    if( rc==SQLITE_OK ){
  2884      sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete);
  2885      sqlite3_step(pRtree->pDeleteRowid);
  2886      rc = sqlite3_reset(pRtree->pDeleteRowid);
  2887    }
  2888  
  2889    /* Check if the root node now has exactly one child. If so, remove
  2890    ** it, schedule the contents of the child for reinsertion and 
  2891    ** reduce the tree height by one.
  2892    **
  2893    ** This is equivalent to copying the contents of the child into
  2894    ** the root node (the operation that Gutman's paper says to perform 
  2895    ** in this scenario).
  2896    */
  2897    if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){
  2898      int rc2;
  2899      RtreeNode *pChild;
  2900      i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
  2901      rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
  2902      if( rc==SQLITE_OK ){
  2903        rc = removeNode(pRtree, pChild, pRtree->iDepth-1);
  2904      }
  2905      rc2 = nodeRelease(pRtree, pChild);
  2906      if( rc==SQLITE_OK ) rc = rc2;
  2907      if( rc==SQLITE_OK ){
  2908        pRtree->iDepth--;
  2909        writeInt16(pRoot->zData, pRtree->iDepth);
  2910        pRoot->isDirty = 1;
  2911      }
  2912    }
  2913  
  2914    /* Re-insert the contents of any underfull nodes removed from the tree. */
  2915    for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){
  2916      if( rc==SQLITE_OK ){
  2917        rc = reinsertNodeContent(pRtree, pLeaf);
  2918      }
  2919      pRtree->pDeleted = pLeaf->pNext;
  2920      sqlite3_free(pLeaf);
  2921    }
  2922  
  2923    /* Release the reference to the root node. */
  2924    if( rc==SQLITE_OK ){
  2925      rc = nodeRelease(pRtree, pRoot);
  2926    }else{
  2927      nodeRelease(pRtree, pRoot);
  2928    }
  2929  
  2930    return rc;
  2931  }
  2932  
  2933  /*
  2934  ** Rounding constants for float->double conversion.
  2935  */
  2936  #define RNDTOWARDS  (1.0 - 1.0/8388608.0)  /* Round towards zero */
  2937  #define RNDAWAY     (1.0 + 1.0/8388608.0)  /* Round away from zero */
  2938  
  2939  #if !defined(SQLITE_RTREE_INT_ONLY)
  2940  /*
  2941  ** Convert an sqlite3_value into an RtreeValue (presumably a float)
  2942  ** while taking care to round toward negative or positive, respectively.
  2943  */
  2944  static RtreeValue rtreeValueDown(sqlite3_value *v){
  2945    double d = sqlite3_value_double(v);
  2946    float f = (float)d;
  2947    if( f>d ){
  2948      f = (float)(d*(d<0 ? RNDAWAY : RNDTOWARDS));
  2949    }
  2950    return f;
  2951  }
  2952  static RtreeValue rtreeValueUp(sqlite3_value *v){
  2953    double d = sqlite3_value_double(v);
  2954    float f = (float)d;
  2955    if( f<d ){
  2956      f = (float)(d*(d<0 ? RNDTOWARDS : RNDAWAY));
  2957    }
  2958    return f;
  2959  }
  2960  #endif /* !defined(SQLITE_RTREE_INT_ONLY) */
  2961  
  2962  /*
  2963  ** A constraint has failed while inserting a row into an rtree table. 
  2964  ** Assuming no OOM error occurs, this function sets the error message 
  2965  ** (at pRtree->base.zErrMsg) to an appropriate value and returns
  2966  ** SQLITE_CONSTRAINT.
  2967  **
  2968  ** Parameter iCol is the index of the leftmost column involved in the
  2969  ** constraint failure. If it is 0, then the constraint that failed is
  2970  ** the unique constraint on the id column. Otherwise, it is the rtree
  2971  ** (c1<=c2) constraint on columns iCol and iCol+1 that has failed.
  2972  **
  2973  ** If an OOM occurs, SQLITE_NOMEM is returned instead of SQLITE_CONSTRAINT.
  2974  */
  2975  static int rtreeConstraintError(Rtree *pRtree, int iCol){
  2976    sqlite3_stmt *pStmt = 0;
  2977    char *zSql; 
  2978    int rc;
  2979  
  2980    assert( iCol==0 || iCol%2 );
  2981    zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", pRtree->zDb, pRtree->zName);
  2982    if( zSql ){
  2983      rc = sqlite3_prepare_v2(pRtree->db, zSql, -1, &pStmt, 0);
  2984    }else{
  2985      rc = SQLITE_NOMEM;
  2986    }
  2987    sqlite3_free(zSql);
  2988  
  2989    if( rc==SQLITE_OK ){
  2990      if( iCol==0 ){
  2991        const char *zCol = sqlite3_column_name(pStmt, 0);
  2992        pRtree->base.zErrMsg = sqlite3_mprintf(
  2993            "UNIQUE constraint failed: %s.%s", pRtree->zName, zCol
  2994        );
  2995      }else{
  2996        const char *zCol1 = sqlite3_column_name(pStmt, iCol);
  2997        const char *zCol2 = sqlite3_column_name(pStmt, iCol+1);
  2998        pRtree->base.zErrMsg = sqlite3_mprintf(
  2999            "rtree constraint failed: %s.(%s<=%s)", pRtree->zName, zCol1, zCol2
  3000        );
  3001      }
  3002    }
  3003  
  3004    sqlite3_finalize(pStmt);
  3005    return (rc==SQLITE_OK ? SQLITE_CONSTRAINT : rc);
  3006  }
  3007  
  3008  
  3009  
  3010  /*
  3011  ** The xUpdate method for rtree module virtual tables.
  3012  */
  3013  static int rtreeUpdate(
  3014    sqlite3_vtab *pVtab, 
  3015    int nData, 
  3016    sqlite3_value **azData, 
  3017    sqlite_int64 *pRowid
  3018  ){
  3019    Rtree *pRtree = (Rtree *)pVtab;
  3020    int rc = SQLITE_OK;
  3021    RtreeCell cell;                 /* New cell to insert if nData>1 */
  3022    int bHaveRowid = 0;             /* Set to 1 after new rowid is determined */
  3023  
  3024    rtreeReference(pRtree);
  3025    assert(nData>=1);
  3026  
  3027    cell.iRowid = 0;  /* Used only to suppress a compiler warning */
  3028  
  3029    /* Constraint handling. A write operation on an r-tree table may return
  3030    ** SQLITE_CONSTRAINT for two reasons:
  3031    **
  3032    **   1. A duplicate rowid value, or
  3033    **   2. The supplied data violates the "x2>=x1" constraint.
  3034    **
  3035    ** In the first case, if the conflict-handling mode is REPLACE, then
  3036    ** the conflicting row can be removed before proceeding. In the second
  3037    ** case, SQLITE_CONSTRAINT must be returned regardless of the
  3038    ** conflict-handling mode specified by the user.
  3039    */
  3040    if( nData>1 ){
  3041      int ii;
  3042  
  3043      /* Populate the cell.aCoord[] array. The first coordinate is azData[3].
  3044      **
  3045      ** NB: nData can only be less than nDim*2+3 if the rtree is mis-declared
  3046      ** with "column" that are interpreted as table constraints.
  3047      ** Example:  CREATE VIRTUAL TABLE bad USING rtree(x,y,CHECK(y>5));
  3048      ** This problem was discovered after years of use, so we silently ignore
  3049      ** these kinds of misdeclared tables to avoid breaking any legacy.
  3050      */
  3051      assert( nData<=(pRtree->nDim2 + 3) );
  3052  
  3053  #ifndef SQLITE_RTREE_INT_ONLY
  3054      if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
  3055        for(ii=0; ii<nData-4; ii+=2){
  3056          cell.aCoord[ii].f = rtreeValueDown(azData[ii+3]);
  3057          cell.aCoord[ii+1].f = rtreeValueUp(azData[ii+4]);
  3058          if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){
  3059            rc = rtreeConstraintError(pRtree, ii+1);
  3060            goto constraint;
  3061          }
  3062        }
  3063      }else
  3064  #endif
  3065      {
  3066        for(ii=0; ii<nData-4; ii+=2){
  3067          cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]);
  3068          cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]);
  3069          if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){
  3070            rc = rtreeConstraintError(pRtree, ii+1);
  3071            goto constraint;
  3072          }
  3073        }
  3074      }
  3075  
  3076      /* If a rowid value was supplied, check if it is already present in 
  3077      ** the table. If so, the constraint has failed. */
  3078      if( sqlite3_value_type(azData[2])!=SQLITE_NULL ){
  3079        cell.iRowid = sqlite3_value_int64(azData[2]);
  3080        if( sqlite3_value_type(azData[0])==SQLITE_NULL
  3081         || sqlite3_value_int64(azData[0])!=cell.iRowid
  3082        ){
  3083          int steprc;
  3084          sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
  3085          steprc = sqlite3_step(pRtree->pReadRowid);
  3086          rc = sqlite3_reset(pRtree->pReadRowid);
  3087          if( SQLITE_ROW==steprc ){
  3088            if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){
  3089              rc = rtreeDeleteRowid(pRtree, cell.iRowid);
  3090            }else{
  3091              rc = rtreeConstraintError(pRtree, 0);
  3092              goto constraint;
  3093            }
  3094          }
  3095        }
  3096        bHaveRowid = 1;
  3097      }
  3098    }
  3099  
  3100    /* If azData[0] is not an SQL NULL value, it is the rowid of a
  3101    ** record to delete from the r-tree table. The following block does
  3102    ** just that.
  3103    */
  3104    if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){
  3105      rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(azData[0]));
  3106    }
  3107  
  3108    /* If the azData[] array contains more than one element, elements
  3109    ** (azData[2]..azData[argc-1]) contain a new record to insert into
  3110    ** the r-tree structure.
  3111    */
  3112    if( rc==SQLITE_OK && nData>1 ){
  3113      /* Insert the new record into the r-tree */
  3114      RtreeNode *pLeaf = 0;
  3115  
  3116      /* Figure out the rowid of the new row. */
  3117      if( bHaveRowid==0 ){
  3118        rc = newRowid(pRtree, &cell.iRowid);
  3119      }
  3120      *pRowid = cell.iRowid;
  3121  
  3122      if( rc==SQLITE_OK ){
  3123        rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf);
  3124      }
  3125      if( rc==SQLITE_OK ){
  3126        int rc2;
  3127        pRtree->iReinsertHeight = -1;
  3128        rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0);
  3129        rc2 = nodeRelease(pRtree, pLeaf);
  3130        if( rc==SQLITE_OK ){
  3131          rc = rc2;
  3132        }
  3133      }
  3134    }
  3135  
  3136  constraint:
  3137    rtreeRelease(pRtree);
  3138    return rc;
  3139  }
  3140  
  3141  /*
  3142  ** Called when a transaction starts.
  3143  */
  3144  static int rtreeBeginTransaction(sqlite3_vtab *pVtab){
  3145    Rtree *pRtree = (Rtree *)pVtab;
  3146    assert( pRtree->inWrTrans==0 );
  3147    pRtree->inWrTrans++;
  3148    return SQLITE_OK;
  3149  }
  3150  
  3151  /*
  3152  ** Called when a transaction completes (either by COMMIT or ROLLBACK).
  3153  ** The sqlite3_blob object should be released at this point.
  3154  */
  3155  static int rtreeEndTransaction(sqlite3_vtab *pVtab){
  3156    Rtree *pRtree = (Rtree *)pVtab;
  3157    pRtree->inWrTrans = 0;
  3158    nodeBlobReset(pRtree);
  3159    return SQLITE_OK;
  3160  }
  3161  
  3162  /*
  3163  ** The xRename method for rtree module virtual tables.
  3164  */
  3165  static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){
  3166    Rtree *pRtree = (Rtree *)pVtab;
  3167    int rc = SQLITE_NOMEM;
  3168    char *zSql = sqlite3_mprintf(
  3169      "ALTER TABLE %Q.'%q_node'   RENAME TO \"%w_node\";"
  3170      "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";"
  3171      "ALTER TABLE %Q.'%q_rowid'  RENAME TO \"%w_rowid\";"
  3172      , pRtree->zDb, pRtree->zName, zNewName 
  3173      , pRtree->zDb, pRtree->zName, zNewName 
  3174      , pRtree->zDb, pRtree->zName, zNewName
  3175    );
  3176    if( zSql ){
  3177      nodeBlobReset(pRtree);
  3178      rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0);
  3179      sqlite3_free(zSql);
  3180    }
  3181    return rc;
  3182  }
  3183  
  3184  /*
  3185  ** The xSavepoint method.
  3186  **
  3187  ** This module does not need to do anything to support savepoints. However,
  3188  ** it uses this hook to close any open blob handle. This is done because a 
  3189  ** DROP TABLE command - which fortunately always opens a savepoint - cannot 
  3190  ** succeed if there are any open blob handles. i.e. if the blob handle were
  3191  ** not closed here, the following would fail:
  3192  **
  3193  **   BEGIN;
  3194  **     INSERT INTO rtree...
  3195  **     DROP TABLE <tablename>;    -- Would fail with SQLITE_LOCKED
  3196  **   COMMIT;
  3197  */
  3198  static int rtreeSavepoint(sqlite3_vtab *pVtab, int iSavepoint){
  3199    Rtree *pRtree = (Rtree *)pVtab;
  3200    int iwt = pRtree->inWrTrans;
  3201    UNUSED_PARAMETER(iSavepoint);
  3202    pRtree->inWrTrans = 0;
  3203    nodeBlobReset(pRtree);
  3204    pRtree->inWrTrans = iwt;
  3205    return SQLITE_OK;
  3206  }
  3207  
  3208  /*
  3209  ** This function populates the pRtree->nRowEst variable with an estimate
  3210  ** of the number of rows in the virtual table. If possible, this is based
  3211  ** on sqlite_stat1 data. Otherwise, use RTREE_DEFAULT_ROWEST.
  3212  */
  3213  static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){
  3214    const char *zFmt = "SELECT stat FROM %Q.sqlite_stat1 WHERE tbl = '%q_rowid'";
  3215    char *zSql;
  3216    sqlite3_stmt *p;
  3217    int rc;
  3218    i64 nRow = 0;
  3219  
  3220    rc = sqlite3_table_column_metadata(
  3221        db, pRtree->zDb, "sqlite_stat1",0,0,0,0,0,0
  3222    );
  3223    if( rc!=SQLITE_OK ){
  3224      pRtree->nRowEst = RTREE_DEFAULT_ROWEST;
  3225      return rc==SQLITE_ERROR ? SQLITE_OK : rc;
  3226    }
  3227    zSql = sqlite3_mprintf(zFmt, pRtree->zDb, pRtree->zName);
  3228    if( zSql==0 ){
  3229      rc = SQLITE_NOMEM;
  3230    }else{
  3231      rc = sqlite3_prepare_v2(db, zSql, -1, &p, 0);
  3232      if( rc==SQLITE_OK ){
  3233        if( sqlite3_step(p)==SQLITE_ROW ) nRow = sqlite3_column_int64(p, 0);
  3234        rc = sqlite3_finalize(p);
  3235      }else if( rc!=SQLITE_NOMEM ){
  3236        rc = SQLITE_OK;
  3237      }
  3238  
  3239      if( rc==SQLITE_OK ){
  3240        if( nRow==0 ){
  3241          pRtree->nRowEst = RTREE_DEFAULT_ROWEST;
  3242        }else{
  3243          pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST);
  3244        }
  3245      }
  3246      sqlite3_free(zSql);
  3247    }
  3248  
  3249    return rc;
  3250  }
  3251  
  3252  static sqlite3_module rtreeModule = {
  3253    2,                          /* iVersion */
  3254    rtreeCreate,                /* xCreate - create a table */
  3255    rtreeConnect,               /* xConnect - connect to an existing table */
  3256    rtreeBestIndex,             /* xBestIndex - Determine search strategy */
  3257    rtreeDisconnect,            /* xDisconnect - Disconnect from a table */
  3258    rtreeDestroy,               /* xDestroy - Drop a table */
  3259    rtreeOpen,                  /* xOpen - open a cursor */
  3260    rtreeClose,                 /* xClose - close a cursor */
  3261    rtreeFilter,                /* xFilter - configure scan constraints */
  3262    rtreeNext,                  /* xNext - advance a cursor */
  3263    rtreeEof,                   /* xEof */
  3264    rtreeColumn,                /* xColumn - read data */
  3265    rtreeRowid,                 /* xRowid - read data */
  3266    rtreeUpdate,                /* xUpdate - write data */
  3267    rtreeBeginTransaction,      /* xBegin - begin transaction */
  3268    rtreeEndTransaction,        /* xSync - sync transaction */
  3269    rtreeEndTransaction,        /* xCommit - commit transaction */
  3270    rtreeEndTransaction,        /* xRollback - rollback transaction */
  3271    0,                          /* xFindFunction - function overloading */
  3272    rtreeRename,                /* xRename - rename the table */
  3273    rtreeSavepoint,             /* xSavepoint */
  3274    0,                          /* xRelease */
  3275    0,                          /* xRollbackTo */
  3276  };
  3277  
  3278  static int rtreeSqlInit(
  3279    Rtree *pRtree, 
  3280    sqlite3 *db, 
  3281    const char *zDb, 
  3282    const char *zPrefix, 
  3283    int isCreate
  3284  ){
  3285    int rc = SQLITE_OK;
  3286  
  3287    #define N_STATEMENT 8
  3288    static const char *azSql[N_STATEMENT] = {
  3289      /* Write the xxx_node table */
  3290      "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
  3291      "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
  3292  
  3293      /* Read and write the xxx_rowid table */
  3294      "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
  3295      "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
  3296      "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
  3297  
  3298      /* Read and write the xxx_parent table */
  3299      "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
  3300      "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
  3301      "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
  3302    };
  3303    sqlite3_stmt **appStmt[N_STATEMENT];
  3304    int i;
  3305  
  3306    pRtree->db = db;
  3307  
  3308    if( isCreate ){
  3309      char *zCreate = sqlite3_mprintf(
  3310  "CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
  3311  "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
  3312  "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,"
  3313                                    " parentnode INTEGER);"
  3314  "INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
  3315        zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize
  3316      );
  3317      if( !zCreate ){
  3318        return SQLITE_NOMEM;
  3319      }
  3320      rc = sqlite3_exec(db, zCreate, 0, 0, 0);
  3321      sqlite3_free(zCreate);
  3322      if( rc!=SQLITE_OK ){
  3323        return rc;
  3324      }
  3325    }
  3326  
  3327    appStmt[0] = &pRtree->pWriteNode;
  3328    appStmt[1] = &pRtree->pDeleteNode;
  3329    appStmt[2] = &pRtree->pReadRowid;
  3330    appStmt[3] = &pRtree->pWriteRowid;
  3331    appStmt[4] = &pRtree->pDeleteRowid;
  3332    appStmt[5] = &pRtree->pReadParent;
  3333    appStmt[6] = &pRtree->pWriteParent;
  3334    appStmt[7] = &pRtree->pDeleteParent;
  3335  
  3336    rc = rtreeQueryStat1(db, pRtree);
  3337    for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
  3338      char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
  3339      if( zSql ){
  3340        rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT,
  3341                                appStmt[i], 0); 
  3342      }else{
  3343        rc = SQLITE_NOMEM;
  3344      }
  3345      sqlite3_free(zSql);
  3346    }
  3347  
  3348    return rc;
  3349  }
  3350  
  3351  /*
  3352  ** The second argument to this function contains the text of an SQL statement
  3353  ** that returns a single integer value. The statement is compiled and executed
  3354  ** using database connection db. If successful, the integer value returned
  3355  ** is written to *piVal and SQLITE_OK returned. Otherwise, an SQLite error
  3356  ** code is returned and the value of *piVal after returning is not defined.
  3357  */
  3358  static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){
  3359    int rc = SQLITE_NOMEM;
  3360    if( zSql ){
  3361      sqlite3_stmt *pStmt = 0;
  3362      rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
  3363      if( rc==SQLITE_OK ){
  3364        if( SQLITE_ROW==sqlite3_step(pStmt) ){
  3365          *piVal = sqlite3_column_int(pStmt, 0);
  3366        }
  3367        rc = sqlite3_finalize(pStmt);
  3368      }
  3369    }
  3370    return rc;
  3371  }
  3372  
  3373  /*
  3374  ** This function is called from within the xConnect() or xCreate() method to
  3375  ** determine the node-size used by the rtree table being created or connected
  3376  ** to. If successful, pRtree->iNodeSize is populated and SQLITE_OK returned.
  3377  ** Otherwise, an SQLite error code is returned.
  3378  **
  3379  ** If this function is being called as part of an xConnect(), then the rtree
  3380  ** table already exists. In this case the node-size is determined by inspecting
  3381  ** the root node of the tree.
  3382  **
  3383  ** Otherwise, for an xCreate(), use 64 bytes less than the database page-size. 
  3384  ** This ensures that each node is stored on a single database page. If the 
  3385  ** database page-size is so large that more than RTREE_MAXCELLS entries 
  3386  ** would fit in a single node, use a smaller node-size.
  3387  */
  3388  static int getNodeSize(
  3389    sqlite3 *db,                    /* Database handle */
  3390    Rtree *pRtree,                  /* Rtree handle */
  3391    int isCreate,                   /* True for xCreate, false for xConnect */
  3392    char **pzErr                    /* OUT: Error message, if any */
  3393  ){
  3394    int rc;
  3395    char *zSql;
  3396    if( isCreate ){
  3397      int iPageSize = 0;
  3398      zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb);
  3399      rc = getIntFromStmt(db, zSql, &iPageSize);
  3400      if( rc==SQLITE_OK ){
  3401        pRtree->iNodeSize = iPageSize-64;
  3402        if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)<pRtree->iNodeSize ){
  3403          pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS;
  3404        }
  3405      }else{
  3406        *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
  3407      }
  3408    }else{
  3409      zSql = sqlite3_mprintf(
  3410          "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1",
  3411          pRtree->zDb, pRtree->zName
  3412      );
  3413      rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize);
  3414      if( rc!=SQLITE_OK ){
  3415        *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
  3416      }else if( pRtree->iNodeSize<(512-64) ){
  3417        rc = SQLITE_CORRUPT_VTAB;
  3418        *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"",
  3419                                 pRtree->zName);
  3420      }
  3421    }
  3422  
  3423    sqlite3_free(zSql);
  3424    return rc;
  3425  }
  3426  
  3427  /* 
  3428  ** This function is the implementation of both the xConnect and xCreate
  3429  ** methods of the r-tree virtual table.
  3430  **
  3431  **   argv[0]   -> module name
  3432  **   argv[1]   -> database name
  3433  **   argv[2]   -> table name
  3434  **   argv[...] -> column names...
  3435  */
  3436  static int rtreeInit(
  3437    sqlite3 *db,                        /* Database connection */
  3438    void *pAux,                         /* One of the RTREE_COORD_* constants */
  3439    int argc, const char *const*argv,   /* Parameters to CREATE TABLE statement */
  3440    sqlite3_vtab **ppVtab,              /* OUT: New virtual table */
  3441    char **pzErr,                       /* OUT: Error message, if any */
  3442    int isCreate                        /* True for xCreate, false for xConnect */
  3443  ){
  3444    int rc = SQLITE_OK;
  3445    Rtree *pRtree;
  3446    int nDb;              /* Length of string argv[1] */
  3447    int nName;            /* Length of string argv[2] */
  3448    int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32);
  3449  
  3450    const char *aErrMsg[] = {
  3451      0,                                                    /* 0 */
  3452      "Wrong number of columns for an rtree table",         /* 1 */
  3453      "Too few columns for an rtree table",                 /* 2 */
  3454      "Too many columns for an rtree table"                 /* 3 */
  3455    };
  3456  
  3457    int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2;
  3458    if( aErrMsg[iErr] ){
  3459      *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
  3460      return SQLITE_ERROR;
  3461    }
  3462  
  3463    sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
  3464  
  3465    /* Allocate the sqlite3_vtab structure */
  3466    nDb = (int)strlen(argv[1]);
  3467    nName = (int)strlen(argv[2]);
  3468    pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2);
  3469    if( !pRtree ){
  3470      return SQLITE_NOMEM;
  3471    }
  3472    memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2);
  3473    pRtree->nBusy = 1;
  3474    pRtree->base.pModule = &rtreeModule;
  3475    pRtree->zDb = (char *)&pRtree[1];
  3476    pRtree->zName = &pRtree->zDb[nDb+1];
  3477    pRtree->nDim = (u8)((argc-4)/2);
  3478    pRtree->nDim2 = pRtree->nDim*2;
  3479    pRtree->nBytesPerCell = 8 + pRtree->nDim2*4;
  3480    pRtree->eCoordType = (u8)eCoordType;
  3481    memcpy(pRtree->zDb, argv[1], nDb);
  3482    memcpy(pRtree->zName, argv[2], nName);
  3483  
  3484    /* Figure out the node size to use. */
  3485    rc = getNodeSize(db, pRtree, isCreate, pzErr);
  3486  
  3487    /* Create/Connect to the underlying relational database schema. If
  3488    ** that is successful, call sqlite3_declare_vtab() to configure
  3489    ** the r-tree table schema.
  3490    */
  3491    if( rc==SQLITE_OK ){
  3492      if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){
  3493        *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
  3494      }else{
  3495        char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]);
  3496        char *zTmp;
  3497        int ii;
  3498        for(ii=4; zSql && ii<argc; ii++){
  3499          zTmp = zSql;
  3500          zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]);
  3501          sqlite3_free(zTmp);
  3502        }
  3503        if( zSql ){
  3504          zTmp = zSql;
  3505          zSql = sqlite3_mprintf("%s);", zTmp);
  3506          sqlite3_free(zTmp);
  3507        }
  3508        if( !zSql ){
  3509          rc = SQLITE_NOMEM;
  3510        }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
  3511          *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
  3512        }
  3513        sqlite3_free(zSql);
  3514      }
  3515    }
  3516  
  3517    if( rc==SQLITE_OK ){
  3518      *ppVtab = (sqlite3_vtab *)pRtree;
  3519    }else{
  3520      assert( *ppVtab==0 );
  3521      assert( pRtree->nBusy==1 );
  3522      rtreeRelease(pRtree);
  3523    }
  3524    return rc;
  3525  }
  3526  
  3527  
  3528  /*
  3529  ** Implementation of a scalar function that decodes r-tree nodes to
  3530  ** human readable strings. This can be used for debugging and analysis.
  3531  **
  3532  ** The scalar function takes two arguments: (1) the number of dimensions
  3533  ** to the rtree (between 1 and 5, inclusive) and (2) a blob of data containing
  3534  ** an r-tree node.  For a two-dimensional r-tree structure called "rt", to
  3535  ** deserialize all nodes, a statement like:
  3536  **
  3537  **   SELECT rtreenode(2, data) FROM rt_node;
  3538  **
  3539  ** The human readable string takes the form of a Tcl list with one
  3540  ** entry for each cell in the r-tree node. Each entry is itself a
  3541  ** list, containing the 8-byte rowid/pageno followed by the 
  3542  ** <num-dimension>*2 coordinates.
  3543  */
  3544  static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
  3545    char *zText = 0;
  3546    RtreeNode node;
  3547    Rtree tree;
  3548    int ii;
  3549  
  3550    UNUSED_PARAMETER(nArg);
  3551    memset(&node, 0, sizeof(RtreeNode));
  3552    memset(&tree, 0, sizeof(Rtree));
  3553    tree.nDim = (u8)sqlite3_value_int(apArg[0]);
  3554    tree.nDim2 = tree.nDim*2;
  3555    tree.nBytesPerCell = 8 + 8 * tree.nDim;
  3556    node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
  3557  
  3558    for(ii=0; ii<NCELL(&node); ii++){
  3559      char zCell[512];
  3560      int nCell = 0;
  3561      RtreeCell cell;
  3562      int jj;
  3563  
  3564      nodeGetCell(&tree, &node, ii, &cell);
  3565      sqlite3_snprintf(512-nCell,&zCell[nCell],"%lld", cell.iRowid);
  3566      nCell = (int)strlen(zCell);
  3567      for(jj=0; jj<tree.nDim2; jj++){
  3568  #ifndef SQLITE_RTREE_INT_ONLY
  3569        sqlite3_snprintf(512-nCell,&zCell[nCell], " %g",
  3570                         (double)cell.aCoord[jj].f);
  3571  #else
  3572        sqlite3_snprintf(512-nCell,&zCell[nCell], " %d",
  3573                         cell.aCoord[jj].i);
  3574  #endif
  3575        nCell = (int)strlen(zCell);
  3576      }
  3577  
  3578      if( zText ){
  3579        char *zTextNew = sqlite3_mprintf("%s {%s}", zText, zCell);
  3580        sqlite3_free(zText);
  3581        zText = zTextNew;
  3582      }else{
  3583        zText = sqlite3_mprintf("{%s}", zCell);
  3584      }
  3585    }
  3586    
  3587    sqlite3_result_text(ctx, zText, -1, sqlite3_free);
  3588  }
  3589  
  3590  /* This routine implements an SQL function that returns the "depth" parameter
  3591  ** from the front of a blob that is an r-tree node.  For example:
  3592  **
  3593  **     SELECT rtreedepth(data) FROM rt_node WHERE nodeno=1;
  3594  **
  3595  ** The depth value is 0 for all nodes other than the root node, and the root
  3596  ** node always has nodeno=1, so the example above is the primary use for this
  3597  ** routine.  This routine is intended for testing and analysis only.
  3598  */
  3599  static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
  3600    UNUSED_PARAMETER(nArg);
  3601    if( sqlite3_value_type(apArg[0])!=SQLITE_BLOB 
  3602     || sqlite3_value_bytes(apArg[0])<2
  3603    ){
  3604      sqlite3_result_error(ctx, "Invalid argument to rtreedepth()", -1); 
  3605    }else{
  3606      u8 *zBlob = (u8 *)sqlite3_value_blob(apArg[0]);
  3607      sqlite3_result_int(ctx, readInt16(zBlob));
  3608    }
  3609  }
  3610  
  3611  /*
  3612  ** Register the r-tree module with database handle db. This creates the
  3613  ** virtual table module "rtree" and the debugging/analysis scalar 
  3614  ** function "rtreenode".
  3615  */
  3616  int sqlite3RtreeInit(sqlite3 *db){
  3617    const int utf8 = SQLITE_UTF8;
  3618    int rc;
  3619  
  3620    rc = sqlite3_create_function(db, "rtreenode", 2, utf8, 0, rtreenode, 0, 0);
  3621    if( rc==SQLITE_OK ){
  3622      rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0);
  3623    }
  3624    if( rc==SQLITE_OK ){
  3625  #ifdef SQLITE_RTREE_INT_ONLY
  3626      void *c = (void *)RTREE_COORD_INT32;
  3627  #else
  3628      void *c = (void *)RTREE_COORD_REAL32;
  3629  #endif
  3630      rc = sqlite3_create_module_v2(db, "rtree", &rtreeModule, c, 0);
  3631    }
  3632    if( rc==SQLITE_OK ){
  3633      void *c = (void *)RTREE_COORD_INT32;
  3634      rc = sqlite3_create_module_v2(db, "rtree_i32", &rtreeModule, c, 0);
  3635    }
  3636  
  3637    return rc;
  3638  }
  3639  
  3640  /*
  3641  ** This routine deletes the RtreeGeomCallback object that was attached
  3642  ** one of the SQL functions create by sqlite3_rtree_geometry_callback()
  3643  ** or sqlite3_rtree_query_callback().  In other words, this routine is the
  3644  ** destructor for an RtreeGeomCallback objecct.  This routine is called when
  3645  ** the corresponding SQL function is deleted.
  3646  */
  3647  static void rtreeFreeCallback(void *p){
  3648    RtreeGeomCallback *pInfo = (RtreeGeomCallback*)p;
  3649    if( pInfo->xDestructor ) pInfo->xDestructor(pInfo->pContext);
  3650    sqlite3_free(p);
  3651  }
  3652  
  3653  /*
  3654  ** This routine frees the BLOB that is returned by geomCallback().
  3655  */
  3656  static void rtreeMatchArgFree(void *pArg){
  3657    int i;
  3658    RtreeMatchArg *p = (RtreeMatchArg*)pArg;
  3659    for(i=0; i<p->nParam; i++){
  3660      sqlite3_value_free(p->apSqlParam[i]);
  3661    }
  3662    sqlite3_free(p);
  3663  }
  3664  
  3665  /*
  3666  ** Each call to sqlite3_rtree_geometry_callback() or
  3667  ** sqlite3_rtree_query_callback() creates an ordinary SQLite
  3668  ** scalar function that is implemented by this routine.
  3669  **
  3670  ** All this function does is construct an RtreeMatchArg object that
  3671  ** contains the geometry-checking callback routines and a list of
  3672  ** parameters to this function, then return that RtreeMatchArg object
  3673  ** as a BLOB.
  3674  **
  3675  ** The R-Tree MATCH operator will read the returned BLOB, deserialize
  3676  ** the RtreeMatchArg object, and use the RtreeMatchArg object to figure
  3677  ** out which elements of the R-Tree should be returned by the query.
  3678  */
  3679  static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){
  3680    RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx);
  3681    RtreeMatchArg *pBlob;
  3682    int nBlob;
  3683    int memErr = 0;
  3684  
  3685    nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue)
  3686             + nArg*sizeof(sqlite3_value*);
  3687    pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob);
  3688    if( !pBlob ){
  3689      sqlite3_result_error_nomem(ctx);
  3690    }else{
  3691      int i;
  3692      pBlob->iSize = nBlob;
  3693      pBlob->cb = pGeomCtx[0];
  3694      pBlob->apSqlParam = (sqlite3_value**)&pBlob->aParam[nArg];
  3695      pBlob->nParam = nArg;
  3696      for(i=0; i<nArg; i++){
  3697        pBlob->apSqlParam[i] = sqlite3_value_dup(aArg[i]);
  3698        if( pBlob->apSqlParam[i]==0 ) memErr = 1;
  3699  #ifdef SQLITE_RTREE_INT_ONLY
  3700        pBlob->aParam[i] = sqlite3_value_int64(aArg[i]);
  3701  #else
  3702        pBlob->aParam[i] = sqlite3_value_double(aArg[i]);
  3703  #endif
  3704      }
  3705      if( memErr ){
  3706        sqlite3_result_error_nomem(ctx);
  3707        rtreeMatchArgFree(pBlob);
  3708      }else{
  3709        sqlite3_result_pointer(ctx, pBlob, "RtreeMatchArg", rtreeMatchArgFree);
  3710      }
  3711    }
  3712  }
  3713  
  3714  /*
  3715  ** Register a new geometry function for use with the r-tree MATCH operator.
  3716  */
  3717  int sqlite3_rtree_geometry_callback(
  3718    sqlite3 *db,                  /* Register SQL function on this connection */
  3719    const char *zGeom,            /* Name of the new SQL function */
  3720    int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*), /* Callback */
  3721    void *pContext                /* Extra data associated with the callback */
  3722  ){
  3723    RtreeGeomCallback *pGeomCtx;      /* Context object for new user-function */
  3724  
  3725    /* Allocate and populate the context object. */
  3726    pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback));
  3727    if( !pGeomCtx ) return SQLITE_NOMEM;
  3728    pGeomCtx->xGeom = xGeom;
  3729    pGeomCtx->xQueryFunc = 0;
  3730    pGeomCtx->xDestructor = 0;
  3731    pGeomCtx->pContext = pContext;
  3732    return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, 
  3733        (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback
  3734    );
  3735  }
  3736  
  3737  /*
  3738  ** Register a new 2nd-generation geometry function for use with the
  3739  ** r-tree MATCH operator.
  3740  */
  3741  int sqlite3_rtree_query_callback(
  3742    sqlite3 *db,                 /* Register SQL function on this connection */
  3743    const char *zQueryFunc,      /* Name of new SQL function */
  3744    int (*xQueryFunc)(sqlite3_rtree_query_info*), /* Callback */
  3745    void *pContext,              /* Extra data passed into the callback */
  3746    void (*xDestructor)(void*)   /* Destructor for the extra data */
  3747  ){
  3748    RtreeGeomCallback *pGeomCtx;      /* Context object for new user-function */
  3749  
  3750    /* Allocate and populate the context object. */
  3751    pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback));
  3752    if( !pGeomCtx ) return SQLITE_NOMEM;
  3753    pGeomCtx->xGeom = 0;
  3754    pGeomCtx->xQueryFunc = xQueryFunc;
  3755    pGeomCtx->xDestructor = xDestructor;
  3756    pGeomCtx->pContext = pContext;
  3757    return sqlite3_create_function_v2(db, zQueryFunc, -1, SQLITE_ANY, 
  3758        (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback
  3759    );
  3760  }
  3761  
  3762  #if !SQLITE_CORE
  3763  #ifdef _WIN32
  3764  __declspec(dllexport)
  3765  #endif
  3766  int sqlite3_rtree_init(
  3767    sqlite3 *db,
  3768    char **pzErrMsg,
  3769    const sqlite3_api_routines *pApi
  3770  ){
  3771    SQLITE_EXTENSION_INIT2(pApi)
  3772    return sqlite3RtreeInit(db);
  3773  }
  3774  #endif
  3775  
  3776  #endif