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