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