4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
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.
11 *************************************************************************
12 ** This file contains code for implementations of the r-tree and r*-tree
13 ** algorithms packaged as an SQLite virtual table module.
17 ** Database Format of R-Tree Tables
18 ** --------------------------------
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
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)
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
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:
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.
45 ** 2. The next 2 bytes contain the number of entries currently
46 ** stored in the node.
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
55 #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE)
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:
65 /* Either, both or none of the following may be set to activate
66 ** r*tree variant algorithms.
68 #define VARIANT_RSTARTREE_CHOOSESUBTREE 0
69 #define VARIANT_RSTARTREE_REINSERT 1
72 ** Exactly one of the following must be set to 1.
74 #define VARIANT_GUTTMAN_QUADRATIC_SPLIT 0
75 #define VARIANT_GUTTMAN_LINEAR_SPLIT 0
76 #define VARIANT_RSTARTREE_SPLIT 1
78 #define VARIANT_GUTTMAN_SPLIT \
79 (VARIANT_GUTTMAN_LINEAR_SPLIT||VARIANT_GUTTMAN_QUADRATIC_SPLIT)
81 #if VARIANT_GUTTMAN_QUADRATIC_SPLIT
82 #define PickNext QuadraticPickNext
83 #define PickSeeds QuadraticPickSeeds
84 #define AssignCells splitNodeGuttman
86 #if VARIANT_GUTTMAN_LINEAR_SPLIT
87 #define PickNext LinearPickNext
88 #define PickSeeds LinearPickSeeds
89 #define AssignCells splitNodeGuttman
91 #if VARIANT_RSTARTREE_SPLIT
92 #define AssignCells splitNodeStartree
95 #if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
100 #include "sqlite3ext.h"
101 SQLITE_EXTENSION_INIT1
109 #ifndef SQLITE_AMALGAMATION
110 #include "sqlite3rtree.h"
111 typedef sqlite3_int64 i64
;
112 typedef unsigned char u8
;
113 typedef unsigned int u32
;
116 /* The following macro is used to suppress compiler warnings.
118 #ifndef UNUSED_PARAMETER
119 # define UNUSED_PARAMETER(x) (void)(x)
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
;
131 /* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */
132 #define RTREE_MAX_DIMENSIONS 5
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
141 ** An rtree virtual-table object.
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 */
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).
161 int iReinsertHeight
; /* Height of sub-trees Reinsert() has run on */
163 /* Statements to read/write/delete a record from xxx_node */
164 sqlite3_stmt
*pReadNode
;
165 sqlite3_stmt
*pWriteNode
;
166 sqlite3_stmt
*pDeleteNode
;
168 /* Statements to read/write/delete a record from xxx_rowid */
169 sqlite3_stmt
*pReadRowid
;
170 sqlite3_stmt
*pWriteRowid
;
171 sqlite3_stmt
*pDeleteRowid
;
173 /* Statements to read/write/delete a record from xxx_parent */
174 sqlite3_stmt
*pReadParent
;
175 sqlite3_stmt
*pWriteParent
;
176 sqlite3_stmt
*pDeleteParent
;
181 /* Possible values for eCoordType: */
182 #define RTREE_COORD_REAL32 0
183 #define RTREE_COORD_INT32 1
186 ** If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will
187 ** only deal with integer coordinates. No floating point operations
190 #ifdef SQLITE_RTREE_INT_ONLY
191 typedef sqlite3_int64 RtreeDValue
; /* High accuracy coordinate */
192 typedef int RtreeValue
; /* Low accuracy coordinate */
194 typedef double RtreeDValue
; /* High accuracy coordinate */
195 typedef float RtreeValue
; /* Low accuracy coordinate */
199 ** The minimum number of cells allowed for a node is a third of the
200 ** maximum. In Gutman's notation:
204 ** If an R*-tree "Reinsert" operation is required, the same number of
205 ** cells are removed from the overfull node and reinserted into the tree.
207 #define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3)
208 #define RTREE_REINSERT(p) RTREE_MINCELLS(p)
209 #define RTREE_MAXCELLS 51
212 ** The smallest possible node-size is (512-64)==448 bytes. And the largest
213 ** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates).
214 ** Therefore all non-root nodes must contain at least 3 entries. Since
215 ** 2^40 is greater than 2^64, an r-tree structure always has a depth of
218 #define RTREE_MAX_DEPTH 40
221 ** An rtree cursor object.
224 sqlite3_vtab_cursor base
;
225 RtreeNode
*pNode
; /* Node cursor is currently pointing at */
226 int iCell
; /* Index of current cell in pNode */
227 int iStrategy
; /* Copy of idxNum search parameter */
228 int nConstraint
; /* Number of entries in aConstraint */
229 RtreeConstraint
*aConstraint
; /* Search constraints. */
238 ** The argument is an RtreeCoord. Return the value stored within the RtreeCoord
239 ** formatted as a RtreeDValue (double or int64). This macro assumes that local
240 ** variable pRtree points to the Rtree structure associated with the
243 #ifdef SQLITE_RTREE_INT_ONLY
244 # define DCOORD(coord) ((RtreeDValue)coord.i)
246 # define DCOORD(coord) ( \
247 (pRtree->eCoordType==RTREE_COORD_REAL32) ? \
248 ((double)coord.f) : \
254 ** A search constraint.
256 struct RtreeConstraint
{
257 int iCoord
; /* Index of constrained coordinate */
258 int op
; /* Constraining operation */
259 RtreeDValue rValue
; /* Constraint value. */
260 int (*xGeom
)(sqlite3_rtree_geometry
*, int, RtreeDValue
*, int*);
261 sqlite3_rtree_geometry
*pGeom
; /* Constraint callback argument for a MATCH */
264 /* Possible values for RtreeConstraint.op */
265 #define RTREE_EQ 0x41
266 #define RTREE_LE 0x42
267 #define RTREE_LT 0x43
268 #define RTREE_GE 0x44
269 #define RTREE_GT 0x45
270 #define RTREE_MATCH 0x46
273 ** An rtree structure node.
276 RtreeNode
*pParent
; /* Parent node */
281 RtreeNode
*pNext
; /* Next node in this hash chain */
283 #define NCELL(pNode) readInt16(&(pNode)->zData[2])
286 ** Structure to store a deserialized rtree record.
290 RtreeCoord aCoord
[RTREE_MAX_DIMENSIONS
*2];
295 ** Value for the first field of every RtreeMatchArg object. The MATCH
296 ** operator tests that the first field of a blob operand matches this
297 ** value to avoid operating on invalid blobs (which could cause a segfault).
299 #define RTREE_GEOMETRY_MAGIC 0x891245AB
302 ** An instance of this structure must be supplied as a blob argument to
303 ** the right-hand-side of an SQL MATCH operator used to constrain an
306 struct RtreeMatchArg
{
307 u32 magic
; /* Always RTREE_GEOMETRY_MAGIC */
308 int (*xGeom
)(sqlite3_rtree_geometry
*, int, RtreeDValue
*, int *);
311 RtreeDValue aParam
[1];
315 ** When a geometry callback is created (see sqlite3_rtree_geometry_callback),
316 ** a single instance of the following structure is allocated. It is used
317 ** as the context for the user-function created by by s_r_g_c(). The object
318 ** is eventually deleted by the destructor mechanism provided by
319 ** sqlite3_create_function_v2() (which is called by s_r_g_c() to create
320 ** the geometry callback function).
322 struct RtreeGeomCallback
{
323 int (*xGeom
)(sqlite3_rtree_geometry
*, int, RtreeDValue
*, int*);
328 # define MAX(x,y) ((x) < (y) ? (y) : (x))
331 # define MIN(x,y) ((x) > (y) ? (y) : (x))
335 ** Functions to deserialize a 16 bit integer, 32 bit real number and
336 ** 64 bit integer. The deserialized value is returned.
338 static int readInt16(u8
*p
){
339 return (p
[0]<<8) + p
[1];
341 static void readCoord(u8
*p
, RtreeCoord
*pCoord
){
343 (((u32
)p
[0]) << 24) +
344 (((u32
)p
[1]) << 16) +
350 static i64
readInt64(u8
*p
){
352 (((i64
)p
[0]) << 56) +
353 (((i64
)p
[1]) << 48) +
354 (((i64
)p
[2]) << 40) +
355 (((i64
)p
[3]) << 32) +
356 (((i64
)p
[4]) << 24) +
357 (((i64
)p
[5]) << 16) +
364 ** Functions to serialize a 16 bit integer, 32 bit real number and
365 ** 64 bit integer. The value returned is the number of bytes written
366 ** to the argument buffer (always 2, 4 and 8 respectively).
368 static int writeInt16(u8
*p
, int i
){
373 static int writeCoord(u8
*p
, RtreeCoord
*pCoord
){
375 assert( sizeof(RtreeCoord
)==4 );
376 assert( sizeof(u32
)==4 );
384 static int writeInt64(u8
*p
, i64 i
){
397 ** Increment the reference count of node p.
399 static void nodeReference(RtreeNode
*p
){
406 ** Clear the content of node p (set all bytes to 0x00).
408 static void nodeZero(Rtree
*pRtree
, RtreeNode
*p
){
409 memset(&p
->zData
[2], 0, pRtree
->iNodeSize
-2);
414 ** Given a node number iNode, return the corresponding key to use
415 ** in the Rtree.aHash table.
417 static int nodeHash(i64 iNode
){
419 (iNode
>>56) ^ (iNode
>>48) ^ (iNode
>>40) ^ (iNode
>>32) ^
420 (iNode
>>24) ^ (iNode
>>16) ^ (iNode
>> 8) ^ (iNode
>> 0)
425 ** Search the node hash table for node iNode. If found, return a pointer
426 ** to it. Otherwise, return 0.
428 static RtreeNode
*nodeHashLookup(Rtree
*pRtree
, i64 iNode
){
430 for(p
=pRtree
->aHash
[nodeHash(iNode
)]; p
&& p
->iNode
!=iNode
; p
=p
->pNext
);
435 ** Add node pNode to the node hash table.
437 static void nodeHashInsert(Rtree
*pRtree
, RtreeNode
*pNode
){
439 assert( pNode
->pNext
==0 );
440 iHash
= nodeHash(pNode
->iNode
);
441 pNode
->pNext
= pRtree
->aHash
[iHash
];
442 pRtree
->aHash
[iHash
] = pNode
;
446 ** Remove node pNode from the node hash table.
448 static void nodeHashDelete(Rtree
*pRtree
, RtreeNode
*pNode
){
450 if( pNode
->iNode
!=0 ){
451 pp
= &pRtree
->aHash
[nodeHash(pNode
->iNode
)];
452 for( ; (*pp
)!=pNode
; pp
= &(*pp
)->pNext
){ assert(*pp
); }
459 ** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0),
460 ** indicating that node has not yet been assigned a node number. It is
461 ** assigned a node number when nodeWrite() is called to write the
462 ** node contents out to the database.
464 static RtreeNode
*nodeNew(Rtree
*pRtree
, RtreeNode
*pParent
){
466 pNode
= (RtreeNode
*)sqlite3_malloc(sizeof(RtreeNode
) + pRtree
->iNodeSize
);
468 memset(pNode
, 0, sizeof(RtreeNode
) + pRtree
->iNodeSize
);
469 pNode
->zData
= (u8
*)&pNode
[1];
471 pNode
->pParent
= pParent
;
473 nodeReference(pParent
);
479 ** Obtain a reference to an r-tree node.
483 Rtree
*pRtree
, /* R-tree structure */
484 i64 iNode
, /* Node number to load */
485 RtreeNode
*pParent
, /* Either the parent node or NULL */
486 RtreeNode
**ppNode
/* OUT: Acquired node */
492 /* Check if the requested node is already in the hash table. If so,
493 ** increase its reference count and return it.
495 if( (pNode
= nodeHashLookup(pRtree
, iNode
)) ){
496 assert( !pParent
|| !pNode
->pParent
|| pNode
->pParent
==pParent
);
497 if( pParent
&& !pNode
->pParent
){
498 nodeReference(pParent
);
499 pNode
->pParent
= pParent
;
506 sqlite3_bind_int64(pRtree
->pReadNode
, 1, iNode
);
507 rc
= sqlite3_step(pRtree
->pReadNode
);
508 if( rc
==SQLITE_ROW
){
509 const u8
*zBlob
= sqlite3_column_blob(pRtree
->pReadNode
, 0);
510 if( pRtree
->iNodeSize
==sqlite3_column_bytes(pRtree
->pReadNode
, 0) ){
511 pNode
= (RtreeNode
*)sqlite3_malloc(sizeof(RtreeNode
)+pRtree
->iNodeSize
);
515 pNode
->pParent
= pParent
;
516 pNode
->zData
= (u8
*)&pNode
[1];
518 pNode
->iNode
= iNode
;
521 memcpy(pNode
->zData
, zBlob
, pRtree
->iNodeSize
);
522 nodeReference(pParent
);
526 rc
= sqlite3_reset(pRtree
->pReadNode
);
527 if( rc
==SQLITE_OK
) rc
= rc2
;
529 /* If the root node was just loaded, set pRtree->iDepth to the height
530 ** of the r-tree structure. A height of zero means all data is stored on
531 ** the root node. A height of one means the children of the root node
532 ** are the leaves, and so on. If the depth as specified on the root node
533 ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
535 if( pNode
&& iNode
==1 ){
536 pRtree
->iDepth
= readInt16(pNode
->zData
);
537 if( pRtree
->iDepth
>RTREE_MAX_DEPTH
){
538 rc
= SQLITE_CORRUPT_VTAB
;
542 /* If no error has occurred so far, check if the "number of entries"
543 ** field on the node is too large. If so, set the return code to
544 ** SQLITE_CORRUPT_VTAB.
546 if( pNode
&& rc
==SQLITE_OK
){
547 if( NCELL(pNode
)>((pRtree
->iNodeSize
-4)/pRtree
->nBytesPerCell
) ){
548 rc
= SQLITE_CORRUPT_VTAB
;
554 nodeHashInsert(pRtree
, pNode
);
556 rc
= SQLITE_CORRUPT_VTAB
;
568 ** Overwrite cell iCell of node pNode with the contents of pCell.
570 static void nodeOverwriteCell(
577 u8
*p
= &pNode
->zData
[4 + pRtree
->nBytesPerCell
*iCell
];
578 p
+= writeInt64(p
, pCell
->iRowid
);
579 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
++){
580 p
+= writeCoord(p
, &pCell
->aCoord
[ii
]);
586 ** Remove cell the cell with index iCell from node pNode.
588 static void nodeDeleteCell(Rtree
*pRtree
, RtreeNode
*pNode
, int iCell
){
589 u8
*pDst
= &pNode
->zData
[4 + pRtree
->nBytesPerCell
*iCell
];
590 u8
*pSrc
= &pDst
[pRtree
->nBytesPerCell
];
591 int nByte
= (NCELL(pNode
) - iCell
- 1) * pRtree
->nBytesPerCell
;
592 memmove(pDst
, pSrc
, nByte
);
593 writeInt16(&pNode
->zData
[2], NCELL(pNode
)-1);
598 ** Insert the contents of cell pCell into node pNode. If the insert
599 ** is successful, return SQLITE_OK.
601 ** If there is not enough free space in pNode, return SQLITE_FULL.
609 int nCell
; /* Current number of cells in pNode */
610 int nMaxCell
; /* Maximum number of cells for pNode */
612 nMaxCell
= (pRtree
->iNodeSize
-4)/pRtree
->nBytesPerCell
;
613 nCell
= NCELL(pNode
);
615 assert( nCell
<=nMaxCell
);
616 if( nCell
<nMaxCell
){
617 nodeOverwriteCell(pRtree
, pNode
, pCell
, nCell
);
618 writeInt16(&pNode
->zData
[2], nCell
+1);
622 return (nCell
==nMaxCell
);
626 ** If the node is dirty, write it out to the database.
629 nodeWrite(Rtree
*pRtree
, RtreeNode
*pNode
){
631 if( pNode
->isDirty
){
632 sqlite3_stmt
*p
= pRtree
->pWriteNode
;
634 sqlite3_bind_int64(p
, 1, pNode
->iNode
);
636 sqlite3_bind_null(p
, 1);
638 sqlite3_bind_blob(p
, 2, pNode
->zData
, pRtree
->iNodeSize
, SQLITE_STATIC
);
641 rc
= sqlite3_reset(p
);
642 if( pNode
->iNode
==0 && rc
==SQLITE_OK
){
643 pNode
->iNode
= sqlite3_last_insert_rowid(pRtree
->db
);
644 nodeHashInsert(pRtree
, pNode
);
651 ** Release a reference to a node. If the node is dirty and the reference
652 ** count drops to zero, the node data is written to the database.
655 nodeRelease(Rtree
*pRtree
, RtreeNode
*pNode
){
658 assert( pNode
->nRef
>0 );
660 if( pNode
->nRef
==0 ){
661 if( pNode
->iNode
==1 ){
664 if( pNode
->pParent
){
665 rc
= nodeRelease(pRtree
, pNode
->pParent
);
668 rc
= nodeWrite(pRtree
, pNode
);
670 nodeHashDelete(pRtree
, pNode
);
678 ** Return the 64-bit integer value associated with cell iCell of
679 ** node pNode. If pNode is a leaf node, this is a rowid. If it is
680 ** an internal node, then the 64-bit integer is a child page number.
682 static i64
nodeGetRowid(
687 assert( iCell
<NCELL(pNode
) );
688 return readInt64(&pNode
->zData
[4 + pRtree
->nBytesPerCell
*iCell
]);
692 ** Return coordinate iCoord from cell iCell in node pNode.
694 static void nodeGetCoord(
699 RtreeCoord
*pCoord
/* Space to write result to */
701 readCoord(&pNode
->zData
[12 + pRtree
->nBytesPerCell
*iCell
+ 4*iCoord
], pCoord
);
705 ** Deserialize cell iCell of node pNode. Populate the structure pointed
706 ** to by pCell with the results.
708 static void nodeGetCell(
715 pCell
->iRowid
= nodeGetRowid(pRtree
, pNode
, iCell
);
716 for(ii
=0; ii
<pRtree
->nDim
*2; ii
++){
717 nodeGetCoord(pRtree
, pNode
, iCell
, ii
, &pCell
->aCoord
[ii
]);
722 /* Forward declaration for the function that does the work of
723 ** the virtual table module xCreate() and xConnect() methods.
725 static int rtreeInit(
726 sqlite3
*, void *, int, const char *const*, sqlite3_vtab
**, char **, int
730 ** Rtree virtual table module xCreate method.
732 static int rtreeCreate(
735 int argc
, const char *const*argv
,
736 sqlite3_vtab
**ppVtab
,
739 return rtreeInit(db
, pAux
, argc
, argv
, ppVtab
, pzErr
, 1);
743 ** Rtree virtual table module xConnect method.
745 static int rtreeConnect(
748 int argc
, const char *const*argv
,
749 sqlite3_vtab
**ppVtab
,
752 return rtreeInit(db
, pAux
, argc
, argv
, ppVtab
, pzErr
, 0);
756 ** Increment the r-tree reference count.
758 static void rtreeReference(Rtree
*pRtree
){
763 ** Decrement the r-tree reference count. When the reference count reaches
764 ** zero the structure is deleted.
766 static void rtreeRelease(Rtree
*pRtree
){
768 if( pRtree
->nBusy
==0 ){
769 sqlite3_finalize(pRtree
->pReadNode
);
770 sqlite3_finalize(pRtree
->pWriteNode
);
771 sqlite3_finalize(pRtree
->pDeleteNode
);
772 sqlite3_finalize(pRtree
->pReadRowid
);
773 sqlite3_finalize(pRtree
->pWriteRowid
);
774 sqlite3_finalize(pRtree
->pDeleteRowid
);
775 sqlite3_finalize(pRtree
->pReadParent
);
776 sqlite3_finalize(pRtree
->pWriteParent
);
777 sqlite3_finalize(pRtree
->pDeleteParent
);
778 sqlite3_free(pRtree
);
783 ** Rtree virtual table module xDisconnect method.
785 static int rtreeDisconnect(sqlite3_vtab
*pVtab
){
786 rtreeRelease((Rtree
*)pVtab
);
791 ** Rtree virtual table module xDestroy method.
793 static int rtreeDestroy(sqlite3_vtab
*pVtab
){
794 Rtree
*pRtree
= (Rtree
*)pVtab
;
796 char *zCreate
= sqlite3_mprintf(
797 "DROP TABLE '%q'.'%q_node';"
798 "DROP TABLE '%q'.'%q_rowid';"
799 "DROP TABLE '%q'.'%q_parent';",
800 pRtree
->zDb
, pRtree
->zName
,
801 pRtree
->zDb
, pRtree
->zName
,
802 pRtree
->zDb
, pRtree
->zName
807 rc
= sqlite3_exec(pRtree
->db
, zCreate
, 0, 0, 0);
808 sqlite3_free(zCreate
);
811 rtreeRelease(pRtree
);
818 ** Rtree virtual table module xOpen method.
820 static int rtreeOpen(sqlite3_vtab
*pVTab
, sqlite3_vtab_cursor
**ppCursor
){
821 int rc
= SQLITE_NOMEM
;
824 pCsr
= (RtreeCursor
*)sqlite3_malloc(sizeof(RtreeCursor
));
826 memset(pCsr
, 0, sizeof(RtreeCursor
));
827 pCsr
->base
.pVtab
= pVTab
;
830 *ppCursor
= (sqlite3_vtab_cursor
*)pCsr
;
837 ** Free the RtreeCursor.aConstraint[] array and its contents.
839 static void freeCursorConstraints(RtreeCursor
*pCsr
){
840 if( pCsr
->aConstraint
){
841 int i
; /* Used to iterate through constraint array */
842 for(i
=0; i
<pCsr
->nConstraint
; i
++){
843 sqlite3_rtree_geometry
*pGeom
= pCsr
->aConstraint
[i
].pGeom
;
845 if( pGeom
->xDelUser
) pGeom
->xDelUser(pGeom
->pUser
);
849 sqlite3_free(pCsr
->aConstraint
);
850 pCsr
->aConstraint
= 0;
855 ** Rtree virtual table module xClose method.
857 static int rtreeClose(sqlite3_vtab_cursor
*cur
){
858 Rtree
*pRtree
= (Rtree
*)(cur
->pVtab
);
860 RtreeCursor
*pCsr
= (RtreeCursor
*)cur
;
861 freeCursorConstraints(pCsr
);
862 rc
= nodeRelease(pRtree
, pCsr
->pNode
);
868 ** Rtree virtual table module xEof method.
870 ** Return non-zero if the cursor does not currently point to a valid
871 ** record (i.e if the scan has finished), or zero otherwise.
873 static int rtreeEof(sqlite3_vtab_cursor
*cur
){
874 RtreeCursor
*pCsr
= (RtreeCursor
*)cur
;
875 return (pCsr
->pNode
==0);
879 ** The r-tree constraint passed as the second argument to this function is
880 ** guaranteed to be a MATCH constraint.
882 static int testRtreeGeom(
883 Rtree
*pRtree
, /* R-Tree object */
884 RtreeConstraint
*pConstraint
, /* MATCH constraint to test */
885 RtreeCell
*pCell
, /* Cell to test */
886 int *pbRes
/* OUT: Test result */
889 RtreeDValue aCoord
[RTREE_MAX_DIMENSIONS
*2];
890 int nCoord
= pRtree
->nDim
*2;
892 assert( pConstraint
->op
==RTREE_MATCH
);
893 assert( pConstraint
->pGeom
);
895 for(i
=0; i
<nCoord
; i
++){
896 aCoord
[i
] = DCOORD(pCell
->aCoord
[i
]);
898 return pConstraint
->xGeom(pConstraint
->pGeom
, nCoord
, aCoord
, pbRes
);
902 ** Cursor pCursor currently points to a cell in a non-leaf page.
903 ** Set *pbEof to true if the sub-tree headed by the cell is filtered
904 ** (excluded) by the constraints in the pCursor->aConstraint[]
905 ** array, or false otherwise.
907 ** Return SQLITE_OK if successful or an SQLite error code if an error
908 ** occurs within a geometry callback.
910 static int testRtreeCell(Rtree
*pRtree
, RtreeCursor
*pCursor
, int *pbEof
){
916 nodeGetCell(pRtree
, pCursor
->pNode
, pCursor
->iCell
, &cell
);
917 for(ii
=0; bRes
==0 && ii
<pCursor
->nConstraint
; ii
++){
918 RtreeConstraint
*p
= &pCursor
->aConstraint
[ii
];
919 RtreeDValue cell_min
= DCOORD(cell
.aCoord
[(p
->iCoord
>>1)*2]);
920 RtreeDValue cell_max
= DCOORD(cell
.aCoord
[(p
->iCoord
>>1)*2+1]);
922 assert(p
->op
==RTREE_LE
|| p
->op
==RTREE_LT
|| p
->op
==RTREE_GE
923 || p
->op
==RTREE_GT
|| p
->op
==RTREE_EQ
|| p
->op
==RTREE_MATCH
927 case RTREE_LE
: case RTREE_LT
:
928 bRes
= p
->rValue
<cell_min
;
931 case RTREE_GE
: case RTREE_GT
:
932 bRes
= p
->rValue
>cell_max
;
936 bRes
= (p
->rValue
>cell_max
|| p
->rValue
<cell_min
);
940 assert( p
->op
==RTREE_MATCH
);
941 rc
= testRtreeGeom(pRtree
, p
, &cell
, &bRes
);
953 ** Test if the cell that cursor pCursor currently points to
954 ** would be filtered (excluded) by the constraints in the
955 ** pCursor->aConstraint[] array. If so, set *pbEof to true before
956 ** returning. If the cell is not filtered (excluded) by the constraints,
957 ** set pbEof to zero.
959 ** Return SQLITE_OK if successful or an SQLite error code if an error
960 ** occurs within a geometry callback.
962 ** This function assumes that the cell is part of a leaf node.
964 static int testRtreeEntry(Rtree
*pRtree
, RtreeCursor
*pCursor
, int *pbEof
){
969 nodeGetCell(pRtree
, pCursor
->pNode
, pCursor
->iCell
, &cell
);
970 for(ii
=0; ii
<pCursor
->nConstraint
; ii
++){
971 RtreeConstraint
*p
= &pCursor
->aConstraint
[ii
];
972 RtreeDValue coord
= DCOORD(cell
.aCoord
[p
->iCoord
]);
974 assert(p
->op
==RTREE_LE
|| p
->op
==RTREE_LT
|| p
->op
==RTREE_GE
975 || p
->op
==RTREE_GT
|| p
->op
==RTREE_EQ
|| p
->op
==RTREE_MATCH
978 case RTREE_LE
: res
= (coord
<=p
->rValue
); break;
979 case RTREE_LT
: res
= (coord
<p
->rValue
); break;
980 case RTREE_GE
: res
= (coord
>=p
->rValue
); break;
981 case RTREE_GT
: res
= (coord
>p
->rValue
); break;
982 case RTREE_EQ
: res
= (coord
==p
->rValue
); break;
985 assert( p
->op
==RTREE_MATCH
);
986 rc
= testRtreeGeom(pRtree
, p
, &cell
, &res
);
1004 ** Cursor pCursor currently points at a node that heads a sub-tree of
1005 ** height iHeight (if iHeight==0, then the node is a leaf). Descend
1006 ** to point to the left-most cell of the sub-tree that matches the
1007 ** configured constraints.
1009 static int descendToCell(
1011 RtreeCursor
*pCursor
,
1013 int *pEof
/* OUT: Set to true if cannot descend */
1019 sqlite3_int64 iRowid
;
1021 RtreeNode
*pSavedNode
= pCursor
->pNode
;
1022 int iSavedCell
= pCursor
->iCell
;
1024 assert( iHeight
>=0 );
1027 rc
= testRtreeEntry(pRtree
, pCursor
, &isEof
);
1029 rc
= testRtreeCell(pRtree
, pCursor
, &isEof
);
1031 if( rc
!=SQLITE_OK
|| isEof
|| iHeight
==0 ){
1032 goto descend_to_cell_out
;
1035 iRowid
= nodeGetRowid(pRtree
, pCursor
->pNode
, pCursor
->iCell
);
1036 rc
= nodeAcquire(pRtree
, iRowid
, pCursor
->pNode
, &pChild
);
1037 if( rc
!=SQLITE_OK
){
1038 goto descend_to_cell_out
;
1041 nodeRelease(pRtree
, pCursor
->pNode
);
1042 pCursor
->pNode
= pChild
;
1044 for(ii
=0; isEof
&& ii
<NCELL(pChild
); ii
++){
1045 pCursor
->iCell
= ii
;
1046 rc
= descendToCell(pRtree
, pCursor
, iHeight
-1, &isEof
);
1047 if( rc
!=SQLITE_OK
){
1048 goto descend_to_cell_out
;
1053 assert( pCursor
->pNode
==pChild
);
1054 nodeReference(pSavedNode
);
1055 nodeRelease(pRtree
, pChild
);
1056 pCursor
->pNode
= pSavedNode
;
1057 pCursor
->iCell
= iSavedCell
;
1060 descend_to_cell_out
:
1066 ** One of the cells in node pNode is guaranteed to have a 64-bit
1067 ** integer value equal to iRowid. Return the index of this cell.
1069 static int nodeRowidIndex(
1076 int nCell
= NCELL(pNode
);
1077 for(ii
=0; ii
<nCell
; ii
++){
1078 if( nodeGetRowid(pRtree
, pNode
, ii
)==iRowid
){
1083 return SQLITE_CORRUPT_VTAB
;
1087 ** Return the index of the cell containing a pointer to node pNode
1088 ** in its parent. If pNode is the root node, return -1.
1090 static int nodeParentIndex(Rtree
*pRtree
, RtreeNode
*pNode
, int *piIndex
){
1091 RtreeNode
*pParent
= pNode
->pParent
;
1093 return nodeRowidIndex(pRtree
, pParent
, pNode
->iNode
, piIndex
);
1100 ** Rtree virtual table module xNext method.
1102 static int rtreeNext(sqlite3_vtab_cursor
*pVtabCursor
){
1103 Rtree
*pRtree
= (Rtree
*)(pVtabCursor
->pVtab
);
1104 RtreeCursor
*pCsr
= (RtreeCursor
*)pVtabCursor
;
1107 /* RtreeCursor.pNode must not be NULL. If is is NULL, then this cursor is
1108 ** already at EOF. It is against the rules to call the xNext() method of
1109 ** a cursor that has already reached EOF.
1111 assert( pCsr
->pNode
);
1113 if( pCsr
->iStrategy
==1 ){
1114 /* This "scan" is a direct lookup by rowid. There is no next entry. */
1115 nodeRelease(pRtree
, pCsr
->pNode
);
1118 /* Move to the next entry that matches the configured constraints. */
1120 while( pCsr
->pNode
){
1121 RtreeNode
*pNode
= pCsr
->pNode
;
1122 int nCell
= NCELL(pNode
);
1123 for(pCsr
->iCell
++; pCsr
->iCell
<nCell
; pCsr
->iCell
++){
1125 rc
= descendToCell(pRtree
, pCsr
, iHeight
, &isEof
);
1126 if( rc
!=SQLITE_OK
|| !isEof
){
1130 pCsr
->pNode
= pNode
->pParent
;
1131 rc
= nodeParentIndex(pRtree
, pNode
, &pCsr
->iCell
);
1132 if( rc
!=SQLITE_OK
){
1135 nodeReference(pCsr
->pNode
);
1136 nodeRelease(pRtree
, pNode
);
1145 ** Rtree virtual table module xRowid method.
1147 static int rtreeRowid(sqlite3_vtab_cursor
*pVtabCursor
, sqlite_int64
*pRowid
){
1148 Rtree
*pRtree
= (Rtree
*)pVtabCursor
->pVtab
;
1149 RtreeCursor
*pCsr
= (RtreeCursor
*)pVtabCursor
;
1151 assert(pCsr
->pNode
);
1152 *pRowid
= nodeGetRowid(pRtree
, pCsr
->pNode
, pCsr
->iCell
);
1158 ** Rtree virtual table module xColumn method.
1160 static int rtreeColumn(sqlite3_vtab_cursor
*cur
, sqlite3_context
*ctx
, int i
){
1161 Rtree
*pRtree
= (Rtree
*)cur
->pVtab
;
1162 RtreeCursor
*pCsr
= (RtreeCursor
*)cur
;
1165 i64 iRowid
= nodeGetRowid(pRtree
, pCsr
->pNode
, pCsr
->iCell
);
1166 sqlite3_result_int64(ctx
, iRowid
);
1169 nodeGetCoord(pRtree
, pCsr
->pNode
, pCsr
->iCell
, i
-1, &c
);
1170 #ifndef SQLITE_RTREE_INT_ONLY
1171 if( pRtree
->eCoordType
==RTREE_COORD_REAL32
){
1172 sqlite3_result_double(ctx
, c
.f
);
1176 assert( pRtree
->eCoordType
==RTREE_COORD_INT32
);
1177 sqlite3_result_int(ctx
, c
.i
);
1185 ** Use nodeAcquire() to obtain the leaf node containing the record with
1186 ** rowid iRowid. If successful, set *ppLeaf to point to the node and
1187 ** return SQLITE_OK. If there is no such record in the table, set
1188 ** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf
1189 ** to zero and return an SQLite error code.
1191 static int findLeafNode(Rtree
*pRtree
, i64 iRowid
, RtreeNode
**ppLeaf
){
1194 sqlite3_bind_int64(pRtree
->pReadRowid
, 1, iRowid
);
1195 if( sqlite3_step(pRtree
->pReadRowid
)==SQLITE_ROW
){
1196 i64 iNode
= sqlite3_column_int64(pRtree
->pReadRowid
, 0);
1197 rc
= nodeAcquire(pRtree
, iNode
, 0, ppLeaf
);
1198 sqlite3_reset(pRtree
->pReadRowid
);
1200 rc
= sqlite3_reset(pRtree
->pReadRowid
);
1206 ** This function is called to configure the RtreeConstraint object passed
1207 ** as the second argument for a MATCH constraint. The value passed as the
1208 ** first argument to this function is the right-hand operand to the MATCH
1211 static int deserializeGeometry(sqlite3_value
*pValue
, RtreeConstraint
*pCons
){
1213 sqlite3_rtree_geometry
*pGeom
;
1216 /* Check that value is actually a blob. */
1217 if( sqlite3_value_type(pValue
)!=SQLITE_BLOB
) return SQLITE_ERROR
;
1219 /* Check that the blob is roughly the right size. */
1220 nBlob
= sqlite3_value_bytes(pValue
);
1221 if( nBlob
<(int)sizeof(RtreeMatchArg
)
1222 || ((nBlob
-sizeof(RtreeMatchArg
))%sizeof(RtreeDValue
))!=0
1224 return SQLITE_ERROR
;
1227 pGeom
= (sqlite3_rtree_geometry
*)sqlite3_malloc(
1228 sizeof(sqlite3_rtree_geometry
) + nBlob
1230 if( !pGeom
) return SQLITE_NOMEM
;
1231 memset(pGeom
, 0, sizeof(sqlite3_rtree_geometry
));
1232 p
= (RtreeMatchArg
*)&pGeom
[1];
1234 memcpy(p
, sqlite3_value_blob(pValue
), nBlob
);
1235 if( p
->magic
!=RTREE_GEOMETRY_MAGIC
1236 || nBlob
!=(int)(sizeof(RtreeMatchArg
) + (p
->nParam
-1)*sizeof(RtreeDValue
))
1238 sqlite3_free(pGeom
);
1239 return SQLITE_ERROR
;
1242 pGeom
->pContext
= p
->pContext
;
1243 pGeom
->nParam
= p
->nParam
;
1244 pGeom
->aParam
= p
->aParam
;
1246 pCons
->xGeom
= p
->xGeom
;
1247 pCons
->pGeom
= pGeom
;
1252 ** Rtree virtual table module xFilter method.
1254 static int rtreeFilter(
1255 sqlite3_vtab_cursor
*pVtabCursor
,
1256 int idxNum
, const char *idxStr
,
1257 int argc
, sqlite3_value
**argv
1259 Rtree
*pRtree
= (Rtree
*)pVtabCursor
->pVtab
;
1260 RtreeCursor
*pCsr
= (RtreeCursor
*)pVtabCursor
;
1262 RtreeNode
*pRoot
= 0;
1266 rtreeReference(pRtree
);
1268 freeCursorConstraints(pCsr
);
1269 pCsr
->iStrategy
= idxNum
;
1272 /* Special case - lookup by rowid. */
1273 RtreeNode
*pLeaf
; /* Leaf on which the required cell resides */
1274 i64 iRowid
= sqlite3_value_int64(argv
[0]);
1275 rc
= findLeafNode(pRtree
, iRowid
, &pLeaf
);
1276 pCsr
->pNode
= pLeaf
;
1278 assert( rc
==SQLITE_OK
);
1279 rc
= nodeRowidIndex(pRtree
, pLeaf
, iRowid
, &pCsr
->iCell
);
1282 /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array
1283 ** with the configured constraints.
1286 pCsr
->aConstraint
= sqlite3_malloc(sizeof(RtreeConstraint
)*argc
);
1287 pCsr
->nConstraint
= argc
;
1288 if( !pCsr
->aConstraint
){
1291 memset(pCsr
->aConstraint
, 0, sizeof(RtreeConstraint
)*argc
);
1292 assert( (idxStr
==0 && argc
==0)
1293 || (idxStr
&& (int)strlen(idxStr
)==argc
*2) );
1294 for(ii
=0; ii
<argc
; ii
++){
1295 RtreeConstraint
*p
= &pCsr
->aConstraint
[ii
];
1296 p
->op
= idxStr
[ii
*2];
1297 p
->iCoord
= idxStr
[ii
*2+1]-'a';
1298 if( p
->op
==RTREE_MATCH
){
1299 /* A MATCH operator. The right-hand-side must be a blob that
1300 ** can be cast into an RtreeMatchArg object. One created using
1301 ** an sqlite3_rtree_geometry_callback() SQL user function.
1303 rc
= deserializeGeometry(argv
[ii
], p
);
1304 if( rc
!=SQLITE_OK
){
1308 #ifdef SQLITE_RTREE_INT_ONLY
1309 p
->rValue
= sqlite3_value_int64(argv
[ii
]);
1311 p
->rValue
= sqlite3_value_double(argv
[ii
]);
1318 if( rc
==SQLITE_OK
){
1320 rc
= nodeAcquire(pRtree
, 1, 0, &pRoot
);
1322 if( rc
==SQLITE_OK
){
1324 int nCell
= NCELL(pRoot
);
1325 pCsr
->pNode
= pRoot
;
1326 for(pCsr
->iCell
=0; rc
==SQLITE_OK
&& pCsr
->iCell
<nCell
; pCsr
->iCell
++){
1327 assert( pCsr
->pNode
==pRoot
);
1328 rc
= descendToCell(pRtree
, pCsr
, pRtree
->iDepth
, &isEof
);
1333 if( rc
==SQLITE_OK
&& isEof
){
1334 assert( pCsr
->pNode
==pRoot
);
1335 nodeRelease(pRtree
, pRoot
);
1338 assert( rc
!=SQLITE_OK
|| !pCsr
->pNode
|| pCsr
->iCell
<NCELL(pCsr
->pNode
) );
1342 rtreeRelease(pRtree
);
1347 ** Rtree virtual table module xBestIndex method. There are three
1348 ** table scan strategies to choose from (in order from most to
1349 ** least desirable):
1351 ** idxNum idxStr Strategy
1352 ** ------------------------------------------------
1353 ** 1 Unused Direct lookup by rowid.
1354 ** 2 See below R-tree query or full-table scan.
1355 ** ------------------------------------------------
1357 ** If strategy 1 is used, then idxStr is not meaningful. If strategy
1358 ** 2 is used, idxStr is formatted to contain 2 bytes for each
1359 ** constraint used. The first two bytes of idxStr correspond to
1360 ** the constraint in sqlite3_index_info.aConstraintUsage[] with
1361 ** (argvIndex==1) etc.
1363 ** The first of each pair of bytes in idxStr identifies the constraint
1364 ** operator as follows:
1366 ** Operator Byte Value
1367 ** ----------------------
1374 ** ----------------------
1376 ** The second of each pair of bytes identifies the coordinate column
1377 ** to which the constraint applies. The leftmost coordinate column
1378 ** is 'a', the second from the left 'b' etc.
1380 static int rtreeBestIndex(sqlite3_vtab
*tab
, sqlite3_index_info
*pIdxInfo
){
1385 char zIdxStr
[RTREE_MAX_DIMENSIONS
*8+1];
1386 memset(zIdxStr
, 0, sizeof(zIdxStr
));
1387 UNUSED_PARAMETER(tab
);
1389 assert( pIdxInfo
->idxStr
==0 );
1390 for(ii
=0; ii
<pIdxInfo
->nConstraint
&& iIdx
<(int)(sizeof(zIdxStr
)-1); ii
++){
1391 struct sqlite3_index_constraint
*p
= &pIdxInfo
->aConstraint
[ii
];
1393 if( p
->usable
&& p
->iColumn
==0 && p
->op
==SQLITE_INDEX_CONSTRAINT_EQ
){
1394 /* We have an equality constraint on the rowid. Use strategy 1. */
1396 for(jj
=0; jj
<ii
; jj
++){
1397 pIdxInfo
->aConstraintUsage
[jj
].argvIndex
= 0;
1398 pIdxInfo
->aConstraintUsage
[jj
].omit
= 0;
1400 pIdxInfo
->idxNum
= 1;
1401 pIdxInfo
->aConstraintUsage
[ii
].argvIndex
= 1;
1402 pIdxInfo
->aConstraintUsage
[jj
].omit
= 1;
1404 /* This strategy involves a two rowid lookups on an B-Tree structures
1405 ** and then a linear search of an R-Tree node. This should be
1406 ** considered almost as quick as a direct rowid lookup (for which
1407 ** sqlite uses an internal cost of 0.0).
1409 pIdxInfo
->estimatedCost
= 10.0;
1413 if( p
->usable
&& (p
->iColumn
>0 || p
->op
==SQLITE_INDEX_CONSTRAINT_MATCH
) ){
1416 case SQLITE_INDEX_CONSTRAINT_EQ
: op
= RTREE_EQ
; break;
1417 case SQLITE_INDEX_CONSTRAINT_GT
: op
= RTREE_GT
; break;
1418 case SQLITE_INDEX_CONSTRAINT_LE
: op
= RTREE_LE
; break;
1419 case SQLITE_INDEX_CONSTRAINT_LT
: op
= RTREE_LT
; break;
1420 case SQLITE_INDEX_CONSTRAINT_GE
: op
= RTREE_GE
; break;
1422 assert( p
->op
==SQLITE_INDEX_CONSTRAINT_MATCH
);
1426 zIdxStr
[iIdx
++] = op
;
1427 zIdxStr
[iIdx
++] = p
->iColumn
- 1 + 'a';
1428 pIdxInfo
->aConstraintUsage
[ii
].argvIndex
= (iIdx
/2);
1429 pIdxInfo
->aConstraintUsage
[ii
].omit
= 1;
1433 pIdxInfo
->idxNum
= 2;
1434 pIdxInfo
->needToFreeIdxStr
= 1;
1435 if( iIdx
>0 && 0==(pIdxInfo
->idxStr
= sqlite3_mprintf("%s", zIdxStr
)) ){
1436 return SQLITE_NOMEM
;
1439 pIdxInfo
->estimatedCost
= (2000000.0 / (double)(iIdx
+ 1));
1444 ** Return the N-dimensional volumn of the cell stored in *p.
1446 static RtreeDValue
cellArea(Rtree
*pRtree
, RtreeCell
*p
){
1447 RtreeDValue area
= (RtreeDValue
)1;
1449 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
+=2){
1450 area
= (area
* (DCOORD(p
->aCoord
[ii
+1]) - DCOORD(p
->aCoord
[ii
])));
1456 ** Return the margin length of cell p. The margin length is the sum
1457 ** of the objects size in each dimension.
1459 static RtreeDValue
cellMargin(Rtree
*pRtree
, RtreeCell
*p
){
1460 RtreeDValue margin
= (RtreeDValue
)0;
1462 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
+=2){
1463 margin
+= (DCOORD(p
->aCoord
[ii
+1]) - DCOORD(p
->aCoord
[ii
]));
1469 ** Store the union of cells p1 and p2 in p1.
1471 static void cellUnion(Rtree
*pRtree
, RtreeCell
*p1
, RtreeCell
*p2
){
1473 if( pRtree
->eCoordType
==RTREE_COORD_REAL32
){
1474 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
+=2){
1475 p1
->aCoord
[ii
].f
= MIN(p1
->aCoord
[ii
].f
, p2
->aCoord
[ii
].f
);
1476 p1
->aCoord
[ii
+1].f
= MAX(p1
->aCoord
[ii
+1].f
, p2
->aCoord
[ii
+1].f
);
1479 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
+=2){
1480 p1
->aCoord
[ii
].i
= MIN(p1
->aCoord
[ii
].i
, p2
->aCoord
[ii
].i
);
1481 p1
->aCoord
[ii
+1].i
= MAX(p1
->aCoord
[ii
+1].i
, p2
->aCoord
[ii
+1].i
);
1487 ** Return true if the area covered by p2 is a subset of the area covered
1488 ** by p1. False otherwise.
1490 static int cellContains(Rtree
*pRtree
, RtreeCell
*p1
, RtreeCell
*p2
){
1492 int isInt
= (pRtree
->eCoordType
==RTREE_COORD_INT32
);
1493 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
+=2){
1494 RtreeCoord
*a1
= &p1
->aCoord
[ii
];
1495 RtreeCoord
*a2
= &p2
->aCoord
[ii
];
1496 if( (!isInt
&& (a2
[0].f
<a1
[0].f
|| a2
[1].f
>a1
[1].f
))
1497 || ( isInt
&& (a2
[0].i
<a1
[0].i
|| a2
[1].i
>a1
[1].i
))
1506 ** Return the amount cell p would grow by if it were unioned with pCell.
1508 static RtreeDValue
cellGrowth(Rtree
*pRtree
, RtreeCell
*p
, RtreeCell
*pCell
){
1511 memcpy(&cell
, p
, sizeof(RtreeCell
));
1512 area
= cellArea(pRtree
, &cell
);
1513 cellUnion(pRtree
, &cell
, pCell
);
1514 return (cellArea(pRtree
, &cell
)-area
);
1517 #if VARIANT_RSTARTREE_CHOOSESUBTREE || VARIANT_RSTARTREE_SPLIT
1518 static RtreeDValue
cellOverlap(
1526 RtreeDValue overlap
= 0.0;
1527 for(ii
=0; ii
<nCell
; ii
++){
1528 #if VARIANT_RSTARTREE_CHOOSESUBTREE
1531 assert( iExclude
==-1 );
1532 UNUSED_PARAMETER(iExclude
);
1536 RtreeDValue o
= (RtreeDValue
)1;
1537 for(jj
=0; jj
<(pRtree
->nDim
*2); jj
+=2){
1540 x1
= MAX(DCOORD(p
->aCoord
[jj
]), DCOORD(aCell
[ii
].aCoord
[jj
]));
1541 x2
= MIN(DCOORD(p
->aCoord
[jj
+1]), DCOORD(aCell
[ii
].aCoord
[jj
+1]));
1557 #if VARIANT_RSTARTREE_CHOOSESUBTREE
1558 static RtreeDValue
cellOverlapEnlargement(
1566 RtreeDValue before
, after
;
1567 before
= cellOverlap(pRtree
, p
, aCell
, nCell
, iExclude
);
1568 cellUnion(pRtree
, p
, pInsert
);
1569 after
= cellOverlap(pRtree
, p
, aCell
, nCell
, iExclude
);
1570 return (after
-before
);
1576 ** This function implements the ChooseLeaf algorithm from Gutman[84].
1577 ** ChooseSubTree in r*tree terminology.
1579 static int ChooseLeaf(
1580 Rtree
*pRtree
, /* Rtree table */
1581 RtreeCell
*pCell
, /* Cell to insert into rtree */
1582 int iHeight
, /* Height of sub-tree rooted at pCell */
1583 RtreeNode
**ppLeaf
/* OUT: Selected leaf page */
1588 rc
= nodeAcquire(pRtree
, 1, 0, &pNode
);
1590 for(ii
=0; rc
==SQLITE_OK
&& ii
<(pRtree
->iDepth
-iHeight
); ii
++){
1592 sqlite3_int64 iBest
= 0;
1594 RtreeDValue fMinGrowth
= 0.0;
1595 RtreeDValue fMinArea
= 0.0;
1596 #if VARIANT_RSTARTREE_CHOOSESUBTREE
1597 RtreeDValue fMinOverlap
= 0.0;
1598 RtreeDValue overlap
;
1601 int nCell
= NCELL(pNode
);
1605 RtreeCell
*aCell
= 0;
1607 #if VARIANT_RSTARTREE_CHOOSESUBTREE
1608 if( ii
==(pRtree
->iDepth
-1) ){
1610 aCell
= sqlite3_malloc(sizeof(RtreeCell
)*nCell
);
1613 nodeRelease(pRtree
, pNode
);
1617 for(jj
=0; jj
<nCell
; jj
++){
1618 nodeGetCell(pRtree
, pNode
, jj
, &aCell
[jj
]);
1623 /* Select the child node which will be enlarged the least if pCell
1624 ** is inserted into it. Resolve ties by choosing the entry with
1625 ** the smallest area.
1627 for(iCell
=0; iCell
<nCell
; iCell
++){
1631 nodeGetCell(pRtree
, pNode
, iCell
, &cell
);
1632 growth
= cellGrowth(pRtree
, &cell
, pCell
);
1633 area
= cellArea(pRtree
, &cell
);
1635 #if VARIANT_RSTARTREE_CHOOSESUBTREE
1636 if( ii
==(pRtree
->iDepth
-1) ){
1637 overlap
= cellOverlapEnlargement(pRtree
,&cell
,pCell
,aCell
,nCell
,iCell
);
1642 || (overlap
<fMinOverlap
)
1643 || (overlap
==fMinOverlap
&& growth
<fMinGrowth
)
1644 || (overlap
==fMinOverlap
&& growth
==fMinGrowth
&& area
<fMinArea
)
1647 fMinOverlap
= overlap
;
1650 if( iCell
==0||growth
<fMinGrowth
||(growth
==fMinGrowth
&& area
<fMinArea
) ){
1655 fMinGrowth
= growth
;
1657 iBest
= cell
.iRowid
;
1661 sqlite3_free(aCell
);
1662 rc
= nodeAcquire(pRtree
, iBest
, pNode
, &pChild
);
1663 nodeRelease(pRtree
, pNode
);
1672 ** A cell with the same content as pCell has just been inserted into
1673 ** the node pNode. This function updates the bounding box cells in
1674 ** all ancestor elements.
1676 static int AdjustTree(
1677 Rtree
*pRtree
, /* Rtree table */
1678 RtreeNode
*pNode
, /* Adjust ancestry of this node. */
1679 RtreeCell
*pCell
/* This cell was just inserted */
1681 RtreeNode
*p
= pNode
;
1682 while( p
->pParent
){
1683 RtreeNode
*pParent
= p
->pParent
;
1687 if( nodeParentIndex(pRtree
, p
, &iCell
) ){
1688 return SQLITE_CORRUPT_VTAB
;
1691 nodeGetCell(pRtree
, pParent
, iCell
, &cell
);
1692 if( !cellContains(pRtree
, &cell
, pCell
) ){
1693 cellUnion(pRtree
, &cell
, pCell
);
1694 nodeOverwriteCell(pRtree
, pParent
, &cell
, iCell
);
1703 ** Write mapping (iRowid->iNode) to the <rtree>_rowid table.
1705 static int rowidWrite(Rtree
*pRtree
, sqlite3_int64 iRowid
, sqlite3_int64 iNode
){
1706 sqlite3_bind_int64(pRtree
->pWriteRowid
, 1, iRowid
);
1707 sqlite3_bind_int64(pRtree
->pWriteRowid
, 2, iNode
);
1708 sqlite3_step(pRtree
->pWriteRowid
);
1709 return sqlite3_reset(pRtree
->pWriteRowid
);
1713 ** Write mapping (iNode->iPar) to the <rtree>_parent table.
1715 static int parentWrite(Rtree
*pRtree
, sqlite3_int64 iNode
, sqlite3_int64 iPar
){
1716 sqlite3_bind_int64(pRtree
->pWriteParent
, 1, iNode
);
1717 sqlite3_bind_int64(pRtree
->pWriteParent
, 2, iPar
);
1718 sqlite3_step(pRtree
->pWriteParent
);
1719 return sqlite3_reset(pRtree
->pWriteParent
);
1722 static int rtreeInsertCell(Rtree
*, RtreeNode
*, RtreeCell
*, int);
1724 #if VARIANT_GUTTMAN_LINEAR_SPLIT
1726 ** Implementation of the linear variant of the PickNext() function from
1729 static RtreeCell
*LinearPickNext(
1733 RtreeCell
*pLeftBox
,
1734 RtreeCell
*pRightBox
,
1738 for(ii
=0; aiUsed
[ii
]; ii
++);
1744 ** Implementation of the linear variant of the PickSeeds() function from
1747 static void LinearPickSeeds(
1757 RtreeDValue maxNormalInnerWidth
= (RtreeDValue
)0;
1759 /* Pick two "seed" cells from the array of cells. The algorithm used
1760 ** here is the LinearPickSeeds algorithm from Gutman[1984]. The
1761 ** indices of the two seed cells in the array are stored in local
1762 ** variables iLeftSeek and iRightSeed.
1764 for(i
=0; i
<pRtree
->nDim
; i
++){
1765 RtreeDValue x1
= DCOORD(aCell
[0].aCoord
[i
*2]);
1766 RtreeDValue x2
= DCOORD(aCell
[0].aCoord
[i
*2+1]);
1767 RtreeDValue x3
= x1
;
1768 RtreeDValue x4
= x2
;
1774 for(jj
=1; jj
<nCell
; jj
++){
1775 RtreeDValue left
= DCOORD(aCell
[jj
].aCoord
[i
*2]);
1776 RtreeDValue right
= DCOORD(aCell
[jj
].aCoord
[i
*2+1]);
1778 if( left
<x1
) x1
= left
;
1779 if( right
>x4
) x4
= right
;
1791 RtreeDValue normalwidth
= (x3
- x2
) / (x4
- x1
);
1792 if( normalwidth
>maxNormalInnerWidth
){
1793 iLeftSeed
= iCellLeft
;
1794 iRightSeed
= iCellRight
;
1799 *piLeftSeed
= iLeftSeed
;
1800 *piRightSeed
= iRightSeed
;
1802 #endif /* VARIANT_GUTTMAN_LINEAR_SPLIT */
1804 #if VARIANT_GUTTMAN_QUADRATIC_SPLIT
1806 ** Implementation of the quadratic variant of the PickNext() function from
1809 static RtreeCell
*QuadraticPickNext(
1813 RtreeCell
*pLeftBox
,
1814 RtreeCell
*pRightBox
,
1817 #define FABS(a) ((a)<0.0?-1.0*(a):(a))
1822 for(ii
=0; ii
<nCell
; ii
++){
1823 if( aiUsed
[ii
]==0 ){
1824 RtreeDValue left
= cellGrowth(pRtree
, pLeftBox
, &aCell
[ii
]);
1825 RtreeDValue right
= cellGrowth(pRtree
, pLeftBox
, &aCell
[ii
]);
1826 RtreeDValue diff
= FABS(right
-left
);
1827 if( iSelect
<0 || diff
>fDiff
){
1833 aiUsed
[iSelect
] = 1;
1834 return &aCell
[iSelect
];
1838 ** Implementation of the quadratic variant of the PickSeeds() function from
1841 static void QuadraticPickSeeds(
1853 RtreeDValue fWaste
= 0.0;
1855 for(ii
=0; ii
<nCell
; ii
++){
1856 for(jj
=ii
+1; jj
<nCell
; jj
++){
1857 RtreeDValue right
= cellArea(pRtree
, &aCell
[jj
]);
1858 RtreeDValue growth
= cellGrowth(pRtree
, &aCell
[ii
], &aCell
[jj
]);
1859 RtreeDValue waste
= growth
- right
;
1869 *piLeftSeed
= iLeftSeed
;
1870 *piRightSeed
= iRightSeed
;
1872 #endif /* VARIANT_GUTTMAN_QUADRATIC_SPLIT */
1875 ** Arguments aIdx, aDistance and aSpare all point to arrays of size
1876 ** nIdx. The aIdx array contains the set of integers from 0 to
1877 ** (nIdx-1) in no particular order. This function sorts the values
1878 ** in aIdx according to the indexed values in aDistance. For
1879 ** example, assuming the inputs:
1881 ** aIdx = { 0, 1, 2, 3 }
1882 ** aDistance = { 5.0, 2.0, 7.0, 6.0 }
1884 ** this function sets the aIdx array to contain:
1886 ** aIdx = { 0, 1, 2, 3 }
1888 ** The aSpare array is used as temporary working space by the
1889 ** sorting algorithm.
1891 static void SortByDistance(
1894 RtreeDValue
*aDistance
,
1902 int nRight
= nIdx
-nLeft
;
1904 int *aRight
= &aIdx
[nLeft
];
1906 SortByDistance(aLeft
, nLeft
, aDistance
, aSpare
);
1907 SortByDistance(aRight
, nRight
, aDistance
, aSpare
);
1909 memcpy(aSpare
, aLeft
, sizeof(int)*nLeft
);
1912 while( iLeft
<nLeft
|| iRight
<nRight
){
1914 aIdx
[iLeft
+iRight
] = aRight
[iRight
];
1916 }else if( iRight
==nRight
){
1917 aIdx
[iLeft
+iRight
] = aLeft
[iLeft
];
1920 RtreeDValue fLeft
= aDistance
[aLeft
[iLeft
]];
1921 RtreeDValue fRight
= aDistance
[aRight
[iRight
]];
1923 aIdx
[iLeft
+iRight
] = aLeft
[iLeft
];
1926 aIdx
[iLeft
+iRight
] = aRight
[iRight
];
1933 /* Check that the sort worked */
1936 for(jj
=1; jj
<nIdx
; jj
++){
1937 RtreeDValue left
= aDistance
[aIdx
[jj
-1]];
1938 RtreeDValue right
= aDistance
[aIdx
[jj
]];
1939 assert( left
<=right
);
1947 ** Arguments aIdx, aCell and aSpare all point to arrays of size
1948 ** nIdx. The aIdx array contains the set of integers from 0 to
1949 ** (nIdx-1) in no particular order. This function sorts the values
1950 ** in aIdx according to dimension iDim of the cells in aCell. The
1951 ** minimum value of dimension iDim is considered first, the
1952 ** maximum used to break ties.
1954 ** The aSpare array is used as temporary working space by the
1955 ** sorting algorithm.
1957 static void SortByDimension(
1971 int nRight
= nIdx
-nLeft
;
1973 int *aRight
= &aIdx
[nLeft
];
1975 SortByDimension(pRtree
, aLeft
, nLeft
, iDim
, aCell
, aSpare
);
1976 SortByDimension(pRtree
, aRight
, nRight
, iDim
, aCell
, aSpare
);
1978 memcpy(aSpare
, aLeft
, sizeof(int)*nLeft
);
1980 while( iLeft
<nLeft
|| iRight
<nRight
){
1981 RtreeDValue xleft1
= DCOORD(aCell
[aLeft
[iLeft
]].aCoord
[iDim
*2]);
1982 RtreeDValue xleft2
= DCOORD(aCell
[aLeft
[iLeft
]].aCoord
[iDim
*2+1]);
1983 RtreeDValue xright1
= DCOORD(aCell
[aRight
[iRight
]].aCoord
[iDim
*2]);
1984 RtreeDValue xright2
= DCOORD(aCell
[aRight
[iRight
]].aCoord
[iDim
*2+1]);
1985 if( (iLeft
!=nLeft
) && ((iRight
==nRight
)
1987 || (xleft1
==xright1
&& xleft2
<xright2
)
1989 aIdx
[iLeft
+iRight
] = aLeft
[iLeft
];
1992 aIdx
[iLeft
+iRight
] = aRight
[iRight
];
1998 /* Check that the sort worked */
2001 for(jj
=1; jj
<nIdx
; jj
++){
2002 RtreeDValue xleft1
= aCell
[aIdx
[jj
-1]].aCoord
[iDim
*2];
2003 RtreeDValue xleft2
= aCell
[aIdx
[jj
-1]].aCoord
[iDim
*2+1];
2004 RtreeDValue xright1
= aCell
[aIdx
[jj
]].aCoord
[iDim
*2];
2005 RtreeDValue xright2
= aCell
[aIdx
[jj
]].aCoord
[iDim
*2+1];
2006 assert( xleft1
<=xright1
&& (xleft1
<xright1
|| xleft2
<=xright2
) );
2013 #if VARIANT_RSTARTREE_SPLIT
2015 ** Implementation of the R*-tree variant of SplitNode from Beckman[1990].
2017 static int splitNodeStartree(
2023 RtreeCell
*pBboxLeft
,
2024 RtreeCell
*pBboxRight
2032 RtreeDValue fBestMargin
= 0.0;
2034 int nByte
= (pRtree
->nDim
+1)*(sizeof(int*)+nCell
*sizeof(int));
2036 aaSorted
= (int **)sqlite3_malloc(nByte
);
2038 return SQLITE_NOMEM
;
2041 aSpare
= &((int *)&aaSorted
[pRtree
->nDim
])[pRtree
->nDim
*nCell
];
2042 memset(aaSorted
, 0, nByte
);
2043 for(ii
=0; ii
<pRtree
->nDim
; ii
++){
2045 aaSorted
[ii
] = &((int *)&aaSorted
[pRtree
->nDim
])[ii
*nCell
];
2046 for(jj
=0; jj
<nCell
; jj
++){
2047 aaSorted
[ii
][jj
] = jj
;
2049 SortByDimension(pRtree
, aaSorted
[ii
], nCell
, ii
, aCell
, aSpare
);
2052 for(ii
=0; ii
<pRtree
->nDim
; ii
++){
2053 RtreeDValue margin
= 0.0;
2054 RtreeDValue fBestOverlap
= 0.0;
2055 RtreeDValue fBestArea
= 0.0;
2060 nLeft
=RTREE_MINCELLS(pRtree
);
2061 nLeft
<=(nCell
-RTREE_MINCELLS(pRtree
));
2067 RtreeDValue overlap
;
2070 memcpy(&left
, &aCell
[aaSorted
[ii
][0]], sizeof(RtreeCell
));
2071 memcpy(&right
, &aCell
[aaSorted
[ii
][nCell
-1]], sizeof(RtreeCell
));
2072 for(kk
=1; kk
<(nCell
-1); kk
++){
2074 cellUnion(pRtree
, &left
, &aCell
[aaSorted
[ii
][kk
]]);
2076 cellUnion(pRtree
, &right
, &aCell
[aaSorted
[ii
][kk
]]);
2079 margin
+= cellMargin(pRtree
, &left
);
2080 margin
+= cellMargin(pRtree
, &right
);
2081 overlap
= cellOverlap(pRtree
, &left
, &right
, 1, -1);
2082 area
= cellArea(pRtree
, &left
) + cellArea(pRtree
, &right
);
2083 if( (nLeft
==RTREE_MINCELLS(pRtree
))
2084 || (overlap
<fBestOverlap
)
2085 || (overlap
==fBestOverlap
&& area
<fBestArea
)
2088 fBestOverlap
= overlap
;
2093 if( ii
==0 || margin
<fBestMargin
){
2095 fBestMargin
= margin
;
2096 iBestSplit
= iBestLeft
;
2100 memcpy(pBboxLeft
, &aCell
[aaSorted
[iBestDim
][0]], sizeof(RtreeCell
));
2101 memcpy(pBboxRight
, &aCell
[aaSorted
[iBestDim
][iBestSplit
]], sizeof(RtreeCell
));
2102 for(ii
=0; ii
<nCell
; ii
++){
2103 RtreeNode
*pTarget
= (ii
<iBestSplit
)?pLeft
:pRight
;
2104 RtreeCell
*pBbox
= (ii
<iBestSplit
)?pBboxLeft
:pBboxRight
;
2105 RtreeCell
*pCell
= &aCell
[aaSorted
[iBestDim
][ii
]];
2106 nodeInsertCell(pRtree
, pTarget
, pCell
);
2107 cellUnion(pRtree
, pBbox
, pCell
);
2110 sqlite3_free(aaSorted
);
2115 #if VARIANT_GUTTMAN_SPLIT
2117 ** Implementation of the regular R-tree SplitNode from Guttman[1984].
2119 static int splitNodeGuttman(
2125 RtreeCell
*pBboxLeft
,
2126 RtreeCell
*pBboxRight
2133 aiUsed
= sqlite3_malloc(sizeof(int)*nCell
);
2135 return SQLITE_NOMEM
;
2137 memset(aiUsed
, 0, sizeof(int)*nCell
);
2139 PickSeeds(pRtree
, aCell
, nCell
, &iLeftSeed
, &iRightSeed
);
2141 memcpy(pBboxLeft
, &aCell
[iLeftSeed
], sizeof(RtreeCell
));
2142 memcpy(pBboxRight
, &aCell
[iRightSeed
], sizeof(RtreeCell
));
2143 nodeInsertCell(pRtree
, pLeft
, &aCell
[iLeftSeed
]);
2144 nodeInsertCell(pRtree
, pRight
, &aCell
[iRightSeed
]);
2145 aiUsed
[iLeftSeed
] = 1;
2146 aiUsed
[iRightSeed
] = 1;
2148 for(i
=nCell
-2; i
>0; i
--){
2150 pNext
= PickNext(pRtree
, aCell
, nCell
, pBboxLeft
, pBboxRight
, aiUsed
);
2152 cellGrowth(pRtree
, pBboxLeft
, pNext
) -
2153 cellGrowth(pRtree
, pBboxRight
, pNext
)
2155 if( (RTREE_MINCELLS(pRtree
)-NCELL(pRight
)==i
)
2156 || (diff
>0.0 && (RTREE_MINCELLS(pRtree
)-NCELL(pLeft
)!=i
))
2158 nodeInsertCell(pRtree
, pRight
, pNext
);
2159 cellUnion(pRtree
, pBboxRight
, pNext
);
2161 nodeInsertCell(pRtree
, pLeft
, pNext
);
2162 cellUnion(pRtree
, pBboxLeft
, pNext
);
2166 sqlite3_free(aiUsed
);
2171 static int updateMapping(
2177 int (*xSetMapping
)(Rtree
*, sqlite3_int64
, sqlite3_int64
);
2178 xSetMapping
= ((iHeight
==0)?rowidWrite
:parentWrite
);
2180 RtreeNode
*pChild
= nodeHashLookup(pRtree
, iRowid
);
2182 nodeRelease(pRtree
, pChild
->pParent
);
2183 nodeReference(pNode
);
2184 pChild
->pParent
= pNode
;
2187 return xSetMapping(pRtree
, iRowid
, pNode
->iNode
);
2190 static int SplitNode(
2197 int newCellIsRight
= 0;
2200 int nCell
= NCELL(pNode
);
2204 RtreeNode
*pLeft
= 0;
2205 RtreeNode
*pRight
= 0;
2208 RtreeCell rightbbox
;
2210 /* Allocate an array and populate it with a copy of pCell and
2211 ** all cells from node pLeft. Then zero the original node.
2213 aCell
= sqlite3_malloc((sizeof(RtreeCell
)+sizeof(int))*(nCell
+1));
2218 aiUsed
= (int *)&aCell
[nCell
+1];
2219 memset(aiUsed
, 0, sizeof(int)*(nCell
+1));
2220 for(i
=0; i
<nCell
; i
++){
2221 nodeGetCell(pRtree
, pNode
, i
, &aCell
[i
]);
2223 nodeZero(pRtree
, pNode
);
2224 memcpy(&aCell
[nCell
], pCell
, sizeof(RtreeCell
));
2227 if( pNode
->iNode
==1 ){
2228 pRight
= nodeNew(pRtree
, pNode
);
2229 pLeft
= nodeNew(pRtree
, pNode
);
2232 writeInt16(pNode
->zData
, pRtree
->iDepth
);
2235 pRight
= nodeNew(pRtree
, pLeft
->pParent
);
2236 nodeReference(pLeft
);
2239 if( !pLeft
|| !pRight
){
2244 memset(pLeft
->zData
, 0, pRtree
->iNodeSize
);
2245 memset(pRight
->zData
, 0, pRtree
->iNodeSize
);
2247 rc
= AssignCells(pRtree
, aCell
, nCell
, pLeft
, pRight
, &leftbbox
, &rightbbox
);
2248 if( rc
!=SQLITE_OK
){
2252 /* Ensure both child nodes have node numbers assigned to them by calling
2253 ** nodeWrite(). Node pRight always needs a node number, as it was created
2254 ** by nodeNew() above. But node pLeft sometimes already has a node number.
2255 ** In this case avoid the all to nodeWrite().
2257 if( SQLITE_OK
!=(rc
= nodeWrite(pRtree
, pRight
))
2258 || (0==pLeft
->iNode
&& SQLITE_OK
!=(rc
= nodeWrite(pRtree
, pLeft
)))
2263 rightbbox
.iRowid
= pRight
->iNode
;
2264 leftbbox
.iRowid
= pLeft
->iNode
;
2266 if( pNode
->iNode
==1 ){
2267 rc
= rtreeInsertCell(pRtree
, pLeft
->pParent
, &leftbbox
, iHeight
+1);
2268 if( rc
!=SQLITE_OK
){
2272 RtreeNode
*pParent
= pLeft
->pParent
;
2274 rc
= nodeParentIndex(pRtree
, pLeft
, &iCell
);
2275 if( rc
==SQLITE_OK
){
2276 nodeOverwriteCell(pRtree
, pParent
, &leftbbox
, iCell
);
2277 rc
= AdjustTree(pRtree
, pParent
, &leftbbox
);
2279 if( rc
!=SQLITE_OK
){
2283 if( (rc
= rtreeInsertCell(pRtree
, pRight
->pParent
, &rightbbox
, iHeight
+1)) ){
2287 for(i
=0; i
<NCELL(pRight
); i
++){
2288 i64 iRowid
= nodeGetRowid(pRtree
, pRight
, i
);
2289 rc
= updateMapping(pRtree
, iRowid
, pRight
, iHeight
);
2290 if( iRowid
==pCell
->iRowid
){
2293 if( rc
!=SQLITE_OK
){
2297 if( pNode
->iNode
==1 ){
2298 for(i
=0; i
<NCELL(pLeft
); i
++){
2299 i64 iRowid
= nodeGetRowid(pRtree
, pLeft
, i
);
2300 rc
= updateMapping(pRtree
, iRowid
, pLeft
, iHeight
);
2301 if( rc
!=SQLITE_OK
){
2305 }else if( newCellIsRight
==0 ){
2306 rc
= updateMapping(pRtree
, pCell
->iRowid
, pLeft
, iHeight
);
2309 if( rc
==SQLITE_OK
){
2310 rc
= nodeRelease(pRtree
, pRight
);
2313 if( rc
==SQLITE_OK
){
2314 rc
= nodeRelease(pRtree
, pLeft
);
2319 nodeRelease(pRtree
, pRight
);
2320 nodeRelease(pRtree
, pLeft
);
2321 sqlite3_free(aCell
);
2326 ** If node pLeaf is not the root of the r-tree and its pParent pointer is
2327 ** still NULL, load all ancestor nodes of pLeaf into memory and populate
2328 ** the pLeaf->pParent chain all the way up to the root node.
2330 ** This operation is required when a row is deleted (or updated - an update
2331 ** is implemented as a delete followed by an insert). SQLite provides the
2332 ** rowid of the row to delete, which can be used to find the leaf on which
2333 ** the entry resides (argument pLeaf). Once the leaf is located, this
2334 ** function is called to determine its ancestry.
2336 static int fixLeafParent(Rtree
*pRtree
, RtreeNode
*pLeaf
){
2338 RtreeNode
*pChild
= pLeaf
;
2339 while( rc
==SQLITE_OK
&& pChild
->iNode
!=1 && pChild
->pParent
==0 ){
2340 int rc2
= SQLITE_OK
; /* sqlite3_reset() return code */
2341 sqlite3_bind_int64(pRtree
->pReadParent
, 1, pChild
->iNode
);
2342 rc
= sqlite3_step(pRtree
->pReadParent
);
2343 if( rc
==SQLITE_ROW
){
2344 RtreeNode
*pTest
; /* Used to test for reference loops */
2345 i64 iNode
; /* Node number of parent node */
2347 /* Before setting pChild->pParent, test that we are not creating a
2348 ** loop of references (as we would if, say, pChild==pParent). We don't
2349 ** want to do this as it leads to a memory leak when trying to delete
2350 ** the referenced counted node structures.
2352 iNode
= sqlite3_column_int64(pRtree
->pReadParent
, 0);
2353 for(pTest
=pLeaf
; pTest
&& pTest
->iNode
!=iNode
; pTest
=pTest
->pParent
);
2355 rc2
= nodeAcquire(pRtree
, iNode
, 0, &pChild
->pParent
);
2358 rc
= sqlite3_reset(pRtree
->pReadParent
);
2359 if( rc
==SQLITE_OK
) rc
= rc2
;
2360 if( rc
==SQLITE_OK
&& !pChild
->pParent
) rc
= SQLITE_CORRUPT_VTAB
;
2361 pChild
= pChild
->pParent
;
2366 static int deleteCell(Rtree
*, RtreeNode
*, int, int);
2368 static int removeNode(Rtree
*pRtree
, RtreeNode
*pNode
, int iHeight
){
2371 RtreeNode
*pParent
= 0;
2374 assert( pNode
->nRef
==1 );
2376 /* Remove the entry in the parent cell. */
2377 rc
= nodeParentIndex(pRtree
, pNode
, &iCell
);
2378 if( rc
==SQLITE_OK
){
2379 pParent
= pNode
->pParent
;
2381 rc
= deleteCell(pRtree
, pParent
, iCell
, iHeight
+1);
2383 rc2
= nodeRelease(pRtree
, pParent
);
2384 if( rc
==SQLITE_OK
){
2387 if( rc
!=SQLITE_OK
){
2391 /* Remove the xxx_node entry. */
2392 sqlite3_bind_int64(pRtree
->pDeleteNode
, 1, pNode
->iNode
);
2393 sqlite3_step(pRtree
->pDeleteNode
);
2394 if( SQLITE_OK
!=(rc
= sqlite3_reset(pRtree
->pDeleteNode
)) ){
2398 /* Remove the xxx_parent entry. */
2399 sqlite3_bind_int64(pRtree
->pDeleteParent
, 1, pNode
->iNode
);
2400 sqlite3_step(pRtree
->pDeleteParent
);
2401 if( SQLITE_OK
!=(rc
= sqlite3_reset(pRtree
->pDeleteParent
)) ){
2405 /* Remove the node from the in-memory hash table and link it into
2406 ** the Rtree.pDeleted list. Its contents will be re-inserted later on.
2408 nodeHashDelete(pRtree
, pNode
);
2409 pNode
->iNode
= iHeight
;
2410 pNode
->pNext
= pRtree
->pDeleted
;
2412 pRtree
->pDeleted
= pNode
;
2417 static int fixBoundingBox(Rtree
*pRtree
, RtreeNode
*pNode
){
2418 RtreeNode
*pParent
= pNode
->pParent
;
2422 int nCell
= NCELL(pNode
);
2423 RtreeCell box
; /* Bounding box for pNode */
2424 nodeGetCell(pRtree
, pNode
, 0, &box
);
2425 for(ii
=1; ii
<nCell
; ii
++){
2427 nodeGetCell(pRtree
, pNode
, ii
, &cell
);
2428 cellUnion(pRtree
, &box
, &cell
);
2430 box
.iRowid
= pNode
->iNode
;
2431 rc
= nodeParentIndex(pRtree
, pNode
, &ii
);
2432 if( rc
==SQLITE_OK
){
2433 nodeOverwriteCell(pRtree
, pParent
, &box
, ii
);
2434 rc
= fixBoundingBox(pRtree
, pParent
);
2441 ** Delete the cell at index iCell of node pNode. After removing the
2442 ** cell, adjust the r-tree data structure if required.
2444 static int deleteCell(Rtree
*pRtree
, RtreeNode
*pNode
, int iCell
, int iHeight
){
2448 if( SQLITE_OK
!=(rc
= fixLeafParent(pRtree
, pNode
)) ){
2452 /* Remove the cell from the node. This call just moves bytes around
2453 ** the in-memory node image, so it cannot fail.
2455 nodeDeleteCell(pRtree
, pNode
, iCell
);
2457 /* If the node is not the tree root and now has less than the minimum
2458 ** number of cells, remove it from the tree. Otherwise, update the
2459 ** cell in the parent node so that it tightly contains the updated
2462 pParent
= pNode
->pParent
;
2463 assert( pParent
|| pNode
->iNode
==1 );
2465 if( NCELL(pNode
)<RTREE_MINCELLS(pRtree
) ){
2466 rc
= removeNode(pRtree
, pNode
, iHeight
);
2468 rc
= fixBoundingBox(pRtree
, pNode
);
2475 static int Reinsert(
2484 RtreeDValue
*aDistance
;
2486 RtreeDValue aCenterCoord
[RTREE_MAX_DIMENSIONS
];
2492 memset(aCenterCoord
, 0, sizeof(RtreeDValue
)*RTREE_MAX_DIMENSIONS
);
2494 nCell
= NCELL(pNode
)+1;
2497 /* Allocate the buffers used by this operation. The allocation is
2498 ** relinquished before this function returns.
2500 aCell
= (RtreeCell
*)sqlite3_malloc(n
* (
2501 sizeof(RtreeCell
) + /* aCell array */
2502 sizeof(int) + /* aOrder array */
2503 sizeof(int) + /* aSpare array */
2504 sizeof(RtreeDValue
) /* aDistance array */
2507 return SQLITE_NOMEM
;
2509 aOrder
= (int *)&aCell
[n
];
2510 aSpare
= (int *)&aOrder
[n
];
2511 aDistance
= (RtreeDValue
*)&aSpare
[n
];
2513 for(ii
=0; ii
<nCell
; ii
++){
2514 if( ii
==(nCell
-1) ){
2515 memcpy(&aCell
[ii
], pCell
, sizeof(RtreeCell
));
2517 nodeGetCell(pRtree
, pNode
, ii
, &aCell
[ii
]);
2520 for(iDim
=0; iDim
<pRtree
->nDim
; iDim
++){
2521 aCenterCoord
[iDim
] += DCOORD(aCell
[ii
].aCoord
[iDim
*2]);
2522 aCenterCoord
[iDim
] += DCOORD(aCell
[ii
].aCoord
[iDim
*2+1]);
2525 for(iDim
=0; iDim
<pRtree
->nDim
; iDim
++){
2526 aCenterCoord
[iDim
] = (aCenterCoord
[iDim
]/(nCell
*(RtreeDValue
)2));
2529 for(ii
=0; ii
<nCell
; ii
++){
2530 aDistance
[ii
] = 0.0;
2531 for(iDim
=0; iDim
<pRtree
->nDim
; iDim
++){
2532 RtreeDValue coord
= (DCOORD(aCell
[ii
].aCoord
[iDim
*2+1]) -
2533 DCOORD(aCell
[ii
].aCoord
[iDim
*2]));
2534 aDistance
[ii
] += (coord
-aCenterCoord
[iDim
])*(coord
-aCenterCoord
[iDim
]);
2538 SortByDistance(aOrder
, nCell
, aDistance
, aSpare
);
2539 nodeZero(pRtree
, pNode
);
2541 for(ii
=0; rc
==SQLITE_OK
&& ii
<(nCell
-(RTREE_MINCELLS(pRtree
)+1)); ii
++){
2542 RtreeCell
*p
= &aCell
[aOrder
[ii
]];
2543 nodeInsertCell(pRtree
, pNode
, p
);
2544 if( p
->iRowid
==pCell
->iRowid
){
2546 rc
= rowidWrite(pRtree
, p
->iRowid
, pNode
->iNode
);
2548 rc
= parentWrite(pRtree
, p
->iRowid
, pNode
->iNode
);
2552 if( rc
==SQLITE_OK
){
2553 rc
= fixBoundingBox(pRtree
, pNode
);
2555 for(; rc
==SQLITE_OK
&& ii
<nCell
; ii
++){
2556 /* Find a node to store this cell in. pNode->iNode currently contains
2557 ** the height of the sub-tree headed by the cell.
2560 RtreeCell
*p
= &aCell
[aOrder
[ii
]];
2561 rc
= ChooseLeaf(pRtree
, p
, iHeight
, &pInsert
);
2562 if( rc
==SQLITE_OK
){
2564 rc
= rtreeInsertCell(pRtree
, pInsert
, p
, iHeight
);
2565 rc2
= nodeRelease(pRtree
, pInsert
);
2566 if( rc
==SQLITE_OK
){
2572 sqlite3_free(aCell
);
2577 ** Insert cell pCell into node pNode. Node pNode is the head of a
2578 ** subtree iHeight high (leaf nodes have iHeight==0).
2580 static int rtreeInsertCell(
2588 RtreeNode
*pChild
= nodeHashLookup(pRtree
, pCell
->iRowid
);
2590 nodeRelease(pRtree
, pChild
->pParent
);
2591 nodeReference(pNode
);
2592 pChild
->pParent
= pNode
;
2595 if( nodeInsertCell(pRtree
, pNode
, pCell
) ){
2596 #if VARIANT_RSTARTREE_REINSERT
2597 if( iHeight
<=pRtree
->iReinsertHeight
|| pNode
->iNode
==1){
2598 rc
= SplitNode(pRtree
, pNode
, pCell
, iHeight
);
2600 pRtree
->iReinsertHeight
= iHeight
;
2601 rc
= Reinsert(pRtree
, pNode
, pCell
, iHeight
);
2604 rc
= SplitNode(pRtree
, pNode
, pCell
, iHeight
);
2607 rc
= AdjustTree(pRtree
, pNode
, pCell
);
2608 if( rc
==SQLITE_OK
){
2610 rc
= rowidWrite(pRtree
, pCell
->iRowid
, pNode
->iNode
);
2612 rc
= parentWrite(pRtree
, pCell
->iRowid
, pNode
->iNode
);
2619 static int reinsertNodeContent(Rtree
*pRtree
, RtreeNode
*pNode
){
2622 int nCell
= NCELL(pNode
);
2624 for(ii
=0; rc
==SQLITE_OK
&& ii
<nCell
; ii
++){
2627 nodeGetCell(pRtree
, pNode
, ii
, &cell
);
2629 /* Find a node to store this cell in. pNode->iNode currently contains
2630 ** the height of the sub-tree headed by the cell.
2632 rc
= ChooseLeaf(pRtree
, &cell
, (int)pNode
->iNode
, &pInsert
);
2633 if( rc
==SQLITE_OK
){
2635 rc
= rtreeInsertCell(pRtree
, pInsert
, &cell
, (int)pNode
->iNode
);
2636 rc2
= nodeRelease(pRtree
, pInsert
);
2637 if( rc
==SQLITE_OK
){
2646 ** Select a currently unused rowid for a new r-tree record.
2648 static int newRowid(Rtree
*pRtree
, i64
*piRowid
){
2650 sqlite3_bind_null(pRtree
->pWriteRowid
, 1);
2651 sqlite3_bind_null(pRtree
->pWriteRowid
, 2);
2652 sqlite3_step(pRtree
->pWriteRowid
);
2653 rc
= sqlite3_reset(pRtree
->pWriteRowid
);
2654 *piRowid
= sqlite3_last_insert_rowid(pRtree
->db
);
2659 ** Remove the entry with rowid=iDelete from the r-tree structure.
2661 static int rtreeDeleteRowid(Rtree
*pRtree
, sqlite3_int64 iDelete
){
2662 int rc
; /* Return code */
2663 RtreeNode
*pLeaf
; /* Leaf node containing record iDelete */
2664 int iCell
; /* Index of iDelete cell in pLeaf */
2665 RtreeNode
*pRoot
; /* Root node of rtree structure */
2668 /* Obtain a reference to the root node to initialise Rtree.iDepth */
2669 rc
= nodeAcquire(pRtree
, 1, 0, &pRoot
);
2671 /* Obtain a reference to the leaf node that contains the entry
2672 ** about to be deleted.
2674 if( rc
==SQLITE_OK
){
2675 rc
= findLeafNode(pRtree
, iDelete
, &pLeaf
);
2678 /* Delete the cell in question from the leaf node. */
2679 if( rc
==SQLITE_OK
){
2681 rc
= nodeRowidIndex(pRtree
, pLeaf
, iDelete
, &iCell
);
2682 if( rc
==SQLITE_OK
){
2683 rc
= deleteCell(pRtree
, pLeaf
, iCell
, 0);
2685 rc2
= nodeRelease(pRtree
, pLeaf
);
2686 if( rc
==SQLITE_OK
){
2691 /* Delete the corresponding entry in the <rtree>_rowid table. */
2692 if( rc
==SQLITE_OK
){
2693 sqlite3_bind_int64(pRtree
->pDeleteRowid
, 1, iDelete
);
2694 sqlite3_step(pRtree
->pDeleteRowid
);
2695 rc
= sqlite3_reset(pRtree
->pDeleteRowid
);
2698 /* Check if the root node now has exactly one child. If so, remove
2699 ** it, schedule the contents of the child for reinsertion and
2700 ** reduce the tree height by one.
2702 ** This is equivalent to copying the contents of the child into
2703 ** the root node (the operation that Gutman's paper says to perform
2704 ** in this scenario).
2706 if( rc
==SQLITE_OK
&& pRtree
->iDepth
>0 && NCELL(pRoot
)==1 ){
2709 i64 iChild
= nodeGetRowid(pRtree
, pRoot
, 0);
2710 rc
= nodeAcquire(pRtree
, iChild
, pRoot
, &pChild
);
2711 if( rc
==SQLITE_OK
){
2712 rc
= removeNode(pRtree
, pChild
, pRtree
->iDepth
-1);
2714 rc2
= nodeRelease(pRtree
, pChild
);
2715 if( rc
==SQLITE_OK
) rc
= rc2
;
2716 if( rc
==SQLITE_OK
){
2718 writeInt16(pRoot
->zData
, pRtree
->iDepth
);
2723 /* Re-insert the contents of any underfull nodes removed from the tree. */
2724 for(pLeaf
=pRtree
->pDeleted
; pLeaf
; pLeaf
=pRtree
->pDeleted
){
2725 if( rc
==SQLITE_OK
){
2726 rc
= reinsertNodeContent(pRtree
, pLeaf
);
2728 pRtree
->pDeleted
= pLeaf
->pNext
;
2729 sqlite3_free(pLeaf
);
2732 /* Release the reference to the root node. */
2733 if( rc
==SQLITE_OK
){
2734 rc
= nodeRelease(pRtree
, pRoot
);
2736 nodeRelease(pRtree
, pRoot
);
2743 ** Rounding constants for float->double conversion.
2745 #define RNDTOWARDS (1.0 - 1.0/8388608.0) /* Round towards zero */
2746 #define RNDAWAY (1.0 + 1.0/8388608.0) /* Round away from zero */
2748 #if !defined(SQLITE_RTREE_INT_ONLY)
2750 ** Convert an sqlite3_value into an RtreeValue (presumably a float)
2751 ** while taking care to round toward negative or positive, respectively.
2753 static RtreeValue
rtreeValueDown(sqlite3_value
*v
){
2754 double d
= sqlite3_value_double(v
);
2757 f
= (float)(d
*(d
<0 ? RNDAWAY
: RNDTOWARDS
));
2761 static RtreeValue
rtreeValueUp(sqlite3_value
*v
){
2762 double d
= sqlite3_value_double(v
);
2765 f
= (float)(d
*(d
<0 ? RNDTOWARDS
: RNDAWAY
));
2769 #endif /* !defined(SQLITE_RTREE_INT_ONLY) */
2773 ** The xUpdate method for rtree module virtual tables.
2775 static int rtreeUpdate(
2776 sqlite3_vtab
*pVtab
,
2778 sqlite3_value
**azData
,
2779 sqlite_int64
*pRowid
2781 Rtree
*pRtree
= (Rtree
*)pVtab
;
2783 RtreeCell cell
; /* New cell to insert if nData>1 */
2784 int bHaveRowid
= 0; /* Set to 1 after new rowid is determined */
2786 rtreeReference(pRtree
);
2789 /* Constraint handling. A write operation on an r-tree table may return
2790 ** SQLITE_CONSTRAINT for two reasons:
2792 ** 1. A duplicate rowid value, or
2793 ** 2. The supplied data violates the "x2>=x1" constraint.
2795 ** In the first case, if the conflict-handling mode is REPLACE, then
2796 ** the conflicting row can be removed before proceeding. In the second
2797 ** case, SQLITE_CONSTRAINT must be returned regardless of the
2798 ** conflict-handling mode specified by the user.
2803 /* Populate the cell.aCoord[] array. The first coordinate is azData[3]. */
2804 assert( nData
==(pRtree
->nDim
*2 + 3) );
2805 #ifndef SQLITE_RTREE_INT_ONLY
2806 if( pRtree
->eCoordType
==RTREE_COORD_REAL32
){
2807 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
+=2){
2808 cell
.aCoord
[ii
].f
= rtreeValueDown(azData
[ii
+3]);
2809 cell
.aCoord
[ii
+1].f
= rtreeValueUp(azData
[ii
+4]);
2810 if( cell
.aCoord
[ii
].f
>cell
.aCoord
[ii
+1].f
){
2811 rc
= SQLITE_CONSTRAINT
;
2818 for(ii
=0; ii
<(pRtree
->nDim
*2); ii
+=2){
2819 cell
.aCoord
[ii
].i
= sqlite3_value_int(azData
[ii
+3]);
2820 cell
.aCoord
[ii
+1].i
= sqlite3_value_int(azData
[ii
+4]);
2821 if( cell
.aCoord
[ii
].i
>cell
.aCoord
[ii
+1].i
){
2822 rc
= SQLITE_CONSTRAINT
;
2828 /* If a rowid value was supplied, check if it is already present in
2829 ** the table. If so, the constraint has failed. */
2830 if( sqlite3_value_type(azData
[2])!=SQLITE_NULL
){
2831 cell
.iRowid
= sqlite3_value_int64(azData
[2]);
2832 if( sqlite3_value_type(azData
[0])==SQLITE_NULL
2833 || sqlite3_value_int64(azData
[0])!=cell
.iRowid
2836 sqlite3_bind_int64(pRtree
->pReadRowid
, 1, cell
.iRowid
);
2837 steprc
= sqlite3_step(pRtree
->pReadRowid
);
2838 rc
= sqlite3_reset(pRtree
->pReadRowid
);
2839 if( SQLITE_ROW
==steprc
){
2840 if( sqlite3_vtab_on_conflict(pRtree
->db
)==SQLITE_REPLACE
){
2841 rc
= rtreeDeleteRowid(pRtree
, cell
.iRowid
);
2843 rc
= SQLITE_CONSTRAINT
;
2852 /* If azData[0] is not an SQL NULL value, it is the rowid of a
2853 ** record to delete from the r-tree table. The following block does
2856 if( sqlite3_value_type(azData
[0])!=SQLITE_NULL
){
2857 rc
= rtreeDeleteRowid(pRtree
, sqlite3_value_int64(azData
[0]));
2860 /* If the azData[] array contains more than one element, elements
2861 ** (azData[2]..azData[argc-1]) contain a new record to insert into
2862 ** the r-tree structure.
2864 if( rc
==SQLITE_OK
&& nData
>1 ){
2865 /* Insert the new record into the r-tree */
2868 /* Figure out the rowid of the new row. */
2869 if( bHaveRowid
==0 ){
2870 rc
= newRowid(pRtree
, &cell
.iRowid
);
2872 *pRowid
= cell
.iRowid
;
2874 if( rc
==SQLITE_OK
){
2875 rc
= ChooseLeaf(pRtree
, &cell
, 0, &pLeaf
);
2877 if( rc
==SQLITE_OK
){
2879 pRtree
->iReinsertHeight
= -1;
2880 rc
= rtreeInsertCell(pRtree
, pLeaf
, &cell
, 0);
2881 rc2
= nodeRelease(pRtree
, pLeaf
);
2882 if( rc
==SQLITE_OK
){
2889 rtreeRelease(pRtree
);
2894 ** The xRename method for rtree module virtual tables.
2896 static int rtreeRename(sqlite3_vtab
*pVtab
, const char *zNewName
){
2897 Rtree
*pRtree
= (Rtree
*)pVtab
;
2898 int rc
= SQLITE_NOMEM
;
2899 char *zSql
= sqlite3_mprintf(
2900 "ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";"
2901 "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";"
2902 "ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";"
2903 , pRtree
->zDb
, pRtree
->zName
, zNewName
2904 , pRtree
->zDb
, pRtree
->zName
, zNewName
2905 , pRtree
->zDb
, pRtree
->zName
, zNewName
2908 rc
= sqlite3_exec(pRtree
->db
, zSql
, 0, 0, 0);
2914 static sqlite3_module rtreeModule
= {
2916 rtreeCreate
, /* xCreate - create a table */
2917 rtreeConnect
, /* xConnect - connect to an existing table */
2918 rtreeBestIndex
, /* xBestIndex - Determine search strategy */
2919 rtreeDisconnect
, /* xDisconnect - Disconnect from a table */
2920 rtreeDestroy
, /* xDestroy - Drop a table */
2921 rtreeOpen
, /* xOpen - open a cursor */
2922 rtreeClose
, /* xClose - close a cursor */
2923 rtreeFilter
, /* xFilter - configure scan constraints */
2924 rtreeNext
, /* xNext - advance a cursor */
2925 rtreeEof
, /* xEof */
2926 rtreeColumn
, /* xColumn - read data */
2927 rtreeRowid
, /* xRowid - read data */
2928 rtreeUpdate
, /* xUpdate - write data */
2929 0, /* xBegin - begin transaction */
2930 0, /* xSync - sync transaction */
2931 0, /* xCommit - commit transaction */
2932 0, /* xRollback - rollback transaction */
2933 0, /* xFindFunction - function overloading */
2934 rtreeRename
, /* xRename - rename the table */
2940 static int rtreeSqlInit(
2944 const char *zPrefix
,
2949 #define N_STATEMENT 9
2950 static const char *azSql
[N_STATEMENT
] = {
2951 /* Read and write the xxx_node table */
2952 "SELECT data FROM '%q'.'%q_node' WHERE nodeno = :1",
2953 "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
2954 "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
2956 /* Read and write the xxx_rowid table */
2957 "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
2958 "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
2959 "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
2961 /* Read and write the xxx_parent table */
2962 "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
2963 "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
2964 "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
2966 sqlite3_stmt
**appStmt
[N_STATEMENT
];
2972 char *zCreate
= sqlite3_mprintf(
2973 "CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
2974 "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
2975 "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER);"
2976 "INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
2977 zDb
, zPrefix
, zDb
, zPrefix
, zDb
, zPrefix
, zDb
, zPrefix
, pRtree
->iNodeSize
2980 return SQLITE_NOMEM
;
2982 rc
= sqlite3_exec(db
, zCreate
, 0, 0, 0);
2983 sqlite3_free(zCreate
);
2984 if( rc
!=SQLITE_OK
){
2989 appStmt
[0] = &pRtree
->pReadNode
;
2990 appStmt
[1] = &pRtree
->pWriteNode
;
2991 appStmt
[2] = &pRtree
->pDeleteNode
;
2992 appStmt
[3] = &pRtree
->pReadRowid
;
2993 appStmt
[4] = &pRtree
->pWriteRowid
;
2994 appStmt
[5] = &pRtree
->pDeleteRowid
;
2995 appStmt
[6] = &pRtree
->pReadParent
;
2996 appStmt
[7] = &pRtree
->pWriteParent
;
2997 appStmt
[8] = &pRtree
->pDeleteParent
;
2999 for(i
=0; i
<N_STATEMENT
&& rc
==SQLITE_OK
; i
++){
3000 char *zSql
= sqlite3_mprintf(azSql
[i
], zDb
, zPrefix
);
3002 rc
= sqlite3_prepare_v2(db
, zSql
, -1, appStmt
[i
], 0);
3013 ** The second argument to this function contains the text of an SQL statement
3014 ** that returns a single integer value. The statement is compiled and executed
3015 ** using database connection db. If successful, the integer value returned
3016 ** is written to *piVal and SQLITE_OK returned. Otherwise, an SQLite error
3017 ** code is returned and the value of *piVal after returning is not defined.
3019 static int getIntFromStmt(sqlite3
*db
, const char *zSql
, int *piVal
){
3020 int rc
= SQLITE_NOMEM
;
3022 sqlite3_stmt
*pStmt
= 0;
3023 rc
= sqlite3_prepare_v2(db
, zSql
, -1, &pStmt
, 0);
3024 if( rc
==SQLITE_OK
){
3025 if( SQLITE_ROW
==sqlite3_step(pStmt
) ){
3026 *piVal
= sqlite3_column_int(pStmt
, 0);
3028 rc
= sqlite3_finalize(pStmt
);
3035 ** This function is called from within the xConnect() or xCreate() method to
3036 ** determine the node-size used by the rtree table being created or connected
3037 ** to. If successful, pRtree->iNodeSize is populated and SQLITE_OK returned.
3038 ** Otherwise, an SQLite error code is returned.
3040 ** If this function is being called as part of an xConnect(), then the rtree
3041 ** table already exists. In this case the node-size is determined by inspecting
3042 ** the root node of the tree.
3044 ** Otherwise, for an xCreate(), use 64 bytes less than the database page-size.
3045 ** This ensures that each node is stored on a single database page. If the
3046 ** database page-size is so large that more than RTREE_MAXCELLS entries
3047 ** would fit in a single node, use a smaller node-size.
3049 static int getNodeSize(
3050 sqlite3
*db
, /* Database handle */
3051 Rtree
*pRtree
, /* Rtree handle */
3052 int isCreate
/* True for xCreate, false for xConnect */
3058 zSql
= sqlite3_mprintf("PRAGMA %Q.page_size", pRtree
->zDb
);
3059 rc
= getIntFromStmt(db
, zSql
, &iPageSize
);
3060 if( rc
==SQLITE_OK
){
3061 pRtree
->iNodeSize
= iPageSize
-64;
3062 if( (4+pRtree
->nBytesPerCell
*RTREE_MAXCELLS
)<pRtree
->iNodeSize
){
3063 pRtree
->iNodeSize
= 4+pRtree
->nBytesPerCell
*RTREE_MAXCELLS
;
3067 zSql
= sqlite3_mprintf(
3068 "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1",
3069 pRtree
->zDb
, pRtree
->zName
3071 rc
= getIntFromStmt(db
, zSql
, &pRtree
->iNodeSize
);
3079 ** This function is the implementation of both the xConnect and xCreate
3080 ** methods of the r-tree virtual table.
3082 ** argv[0] -> module name
3083 ** argv[1] -> database name
3084 ** argv[2] -> table name
3085 ** argv[...] -> column names...
3087 static int rtreeInit(
3088 sqlite3
*db
, /* Database connection */
3089 void *pAux
, /* One of the RTREE_COORD_* constants */
3090 int argc
, const char *const*argv
, /* Parameters to CREATE TABLE statement */
3091 sqlite3_vtab
**ppVtab
, /* OUT: New virtual table */
3092 char **pzErr
, /* OUT: Error message, if any */
3093 int isCreate
/* True for xCreate, false for xConnect */
3097 int nDb
; /* Length of string argv[1] */
3098 int nName
; /* Length of string argv[2] */
3099 int eCoordType
= (pAux
? RTREE_COORD_INT32
: RTREE_COORD_REAL32
);
3101 const char *aErrMsg
[] = {
3103 "Wrong number of columns for an rtree table", /* 1 */
3104 "Too few columns for an rtree table", /* 2 */
3105 "Too many columns for an rtree table" /* 3 */
3108 int iErr
= (argc
<6) ? 2 : argc
>(RTREE_MAX_DIMENSIONS
*2+4) ? 3 : argc
%2;
3109 if( aErrMsg
[iErr
] ){
3110 *pzErr
= sqlite3_mprintf("%s", aErrMsg
[iErr
]);
3111 return SQLITE_ERROR
;
3114 sqlite3_vtab_config(db
, SQLITE_VTAB_CONSTRAINT_SUPPORT
, 1);
3116 /* Allocate the sqlite3_vtab structure */
3117 nDb
= (int)strlen(argv
[1]);
3118 nName
= (int)strlen(argv
[2]);
3119 pRtree
= (Rtree
*)sqlite3_malloc(sizeof(Rtree
)+nDb
+nName
+2);
3121 return SQLITE_NOMEM
;
3123 memset(pRtree
, 0, sizeof(Rtree
)+nDb
+nName
+2);
3125 pRtree
->base
.pModule
= &rtreeModule
;
3126 pRtree
->zDb
= (char *)&pRtree
[1];
3127 pRtree
->zName
= &pRtree
->zDb
[nDb
+1];
3128 pRtree
->nDim
= (argc
-4)/2;
3129 pRtree
->nBytesPerCell
= 8 + pRtree
->nDim
*4*2;
3130 pRtree
->eCoordType
= eCoordType
;
3131 memcpy(pRtree
->zDb
, argv
[1], nDb
);
3132 memcpy(pRtree
->zName
, argv
[2], nName
);
3134 /* Figure out the node size to use. */
3135 rc
= getNodeSize(db
, pRtree
, isCreate
);
3137 /* Create/Connect to the underlying relational database schema. If
3138 ** that is successful, call sqlite3_declare_vtab() to configure
3139 ** the r-tree table schema.
3141 if( rc
==SQLITE_OK
){
3142 if( (rc
= rtreeSqlInit(pRtree
, db
, argv
[1], argv
[2], isCreate
)) ){
3143 *pzErr
= sqlite3_mprintf("%s", sqlite3_errmsg(db
));
3145 char *zSql
= sqlite3_mprintf("CREATE TABLE x(%s", argv
[3]);
3148 for(ii
=4; zSql
&& ii
<argc
; ii
++){
3150 zSql
= sqlite3_mprintf("%s, %s", zTmp
, argv
[ii
]);
3155 zSql
= sqlite3_mprintf("%s);", zTmp
);
3160 }else if( SQLITE_OK
!=(rc
= sqlite3_declare_vtab(db
, zSql
)) ){
3161 *pzErr
= sqlite3_mprintf("%s", sqlite3_errmsg(db
));
3167 if( rc
==SQLITE_OK
){
3168 *ppVtab
= (sqlite3_vtab
*)pRtree
;
3170 rtreeRelease(pRtree
);
3177 ** Implementation of a scalar function that decodes r-tree nodes to
3178 ** human readable strings. This can be used for debugging and analysis.
3180 ** The scalar function takes two arguments, a blob of data containing
3181 ** an r-tree node, and the number of dimensions the r-tree indexes.
3182 ** For a two-dimensional r-tree structure called "rt", to deserialize
3183 ** all nodes, a statement like:
3185 ** SELECT rtreenode(2, data) FROM rt_node;
3187 ** The human readable string takes the form of a Tcl list with one
3188 ** entry for each cell in the r-tree node. Each entry is itself a
3189 ** list, containing the 8-byte rowid/pageno followed by the
3190 ** <num-dimension>*2 coordinates.
3192 static void rtreenode(sqlite3_context
*ctx
, int nArg
, sqlite3_value
**apArg
){
3198 UNUSED_PARAMETER(nArg
);
3199 memset(&node
, 0, sizeof(RtreeNode
));
3200 memset(&tree
, 0, sizeof(Rtree
));
3201 tree
.nDim
= sqlite3_value_int(apArg
[0]);
3202 tree
.nBytesPerCell
= 8 + 8 * tree
.nDim
;
3203 node
.zData
= (u8
*)sqlite3_value_blob(apArg
[1]);
3205 for(ii
=0; ii
<NCELL(&node
); ii
++){
3211 nodeGetCell(&tree
, &node
, ii
, &cell
);
3212 sqlite3_snprintf(512-nCell
,&zCell
[nCell
],"%lld", cell
.iRowid
);
3213 nCell
= (int)strlen(zCell
);
3214 for(jj
=0; jj
<tree
.nDim
*2; jj
++){
3215 #ifndef SQLITE_RTREE_INT_ONLY
3216 sqlite3_snprintf(512-nCell
,&zCell
[nCell
], " %f",
3217 (double)cell
.aCoord
[jj
].f
);
3219 sqlite3_snprintf(512-nCell
,&zCell
[nCell
], " %d",
3222 nCell
= (int)strlen(zCell
);
3226 char *zTextNew
= sqlite3_mprintf("%s {%s}", zText
, zCell
);
3227 sqlite3_free(zText
);
3230 zText
= sqlite3_mprintf("{%s}", zCell
);
3234 sqlite3_result_text(ctx
, zText
, -1, sqlite3_free
);
3237 static void rtreedepth(sqlite3_context
*ctx
, int nArg
, sqlite3_value
**apArg
){
3238 UNUSED_PARAMETER(nArg
);
3239 if( sqlite3_value_type(apArg
[0])!=SQLITE_BLOB
3240 || sqlite3_value_bytes(apArg
[0])<2
3242 sqlite3_result_error(ctx
, "Invalid argument to rtreedepth()", -1);
3244 u8
*zBlob
= (u8
*)sqlite3_value_blob(apArg
[0]);
3245 sqlite3_result_int(ctx
, readInt16(zBlob
));
3250 ** Register the r-tree module with database handle db. This creates the
3251 ** virtual table module "rtree" and the debugging/analysis scalar
3252 ** function "rtreenode".
3254 int sqlite3RtreeInit(sqlite3
*db
){
3255 const int utf8
= SQLITE_UTF8
;
3258 rc
= sqlite3_create_function(db
, "rtreenode", 2, utf8
, 0, rtreenode
, 0, 0);
3259 if( rc
==SQLITE_OK
){
3260 rc
= sqlite3_create_function(db
, "rtreedepth", 1, utf8
, 0,rtreedepth
, 0, 0);
3262 if( rc
==SQLITE_OK
){
3263 #ifdef SQLITE_RTREE_INT_ONLY
3264 void *c
= (void *)RTREE_COORD_INT32
;
3266 void *c
= (void *)RTREE_COORD_REAL32
;
3268 rc
= sqlite3_create_module_v2(db
, "rtree", &rtreeModule
, c
, 0);
3270 if( rc
==SQLITE_OK
){
3271 void *c
= (void *)RTREE_COORD_INT32
;
3272 rc
= sqlite3_create_module_v2(db
, "rtree_i32", &rtreeModule
, c
, 0);
3279 ** A version of sqlite3_free() that can be used as a callback. This is used
3280 ** in two places - as the destructor for the blob value returned by the
3281 ** invocation of a geometry function, and as the destructor for the geometry
3282 ** functions themselves.
3284 static void doSqlite3Free(void *p
){
3289 ** Each call to sqlite3_rtree_geometry_callback() creates an ordinary SQLite
3290 ** scalar user function. This C function is the callback used for all such
3291 ** registered SQL functions.
3293 ** The scalar user functions return a blob that is interpreted by r-tree
3294 ** table MATCH operators.
3296 static void geomCallback(sqlite3_context
*ctx
, int nArg
, sqlite3_value
**aArg
){
3297 RtreeGeomCallback
*pGeomCtx
= (RtreeGeomCallback
*)sqlite3_user_data(ctx
);
3298 RtreeMatchArg
*pBlob
;
3301 nBlob
= sizeof(RtreeMatchArg
) + (nArg
-1)*sizeof(RtreeDValue
);
3302 pBlob
= (RtreeMatchArg
*)sqlite3_malloc(nBlob
);
3304 sqlite3_result_error_nomem(ctx
);
3307 pBlob
->magic
= RTREE_GEOMETRY_MAGIC
;
3308 pBlob
->xGeom
= pGeomCtx
->xGeom
;
3309 pBlob
->pContext
= pGeomCtx
->pContext
;
3310 pBlob
->nParam
= nArg
;
3311 for(i
=0; i
<nArg
; i
++){
3312 #ifdef SQLITE_RTREE_INT_ONLY
3313 pBlob
->aParam
[i
] = sqlite3_value_int64(aArg
[i
]);
3315 pBlob
->aParam
[i
] = sqlite3_value_double(aArg
[i
]);
3318 sqlite3_result_blob(ctx
, pBlob
, nBlob
, doSqlite3Free
);
3323 ** Register a new geometry function for use with the r-tree MATCH operator.
3325 int sqlite3_rtree_geometry_callback(
3328 int (*xGeom
)(sqlite3_rtree_geometry
*, int, RtreeDValue
*, int *),
3331 RtreeGeomCallback
*pGeomCtx
; /* Context object for new user-function */
3333 /* Allocate and populate the context object. */
3334 pGeomCtx
= (RtreeGeomCallback
*)sqlite3_malloc(sizeof(RtreeGeomCallback
));
3335 if( !pGeomCtx
) return SQLITE_NOMEM
;
3336 pGeomCtx
->xGeom
= xGeom
;
3337 pGeomCtx
->pContext
= pContext
;
3339 /* Create the new user-function. Register a destructor function to delete
3340 ** the context object when it is no longer required. */
3341 return sqlite3_create_function_v2(db
, zGeom
, -1, SQLITE_ANY
,
3342 (void *)pGeomCtx
, geomCallback
, 0, 0, doSqlite3Free
3347 int sqlite3_extension_init(
3350 const sqlite3_api_routines
*pApi
3352 SQLITE_EXTENSION_INIT2(pApi
)
3353 return sqlite3RtreeInit(db
);