1 2 This directory contains an SQLite extension that implements a virtual 3 table type that allows users to create, query and manipulate r-tree[1] 4 data structures inside of SQLite databases. Users create, populate 5 and query r-tree structures using ordinary SQL statements. 6 7 1. SQL Interface 8 9 1.1 Table Creation 10 1.2 Data Manipulation 11 1.3 Data Querying 12 1.4 Introspection and Analysis 13 14 2. Compilation and Deployment 15 16 3. References 17 18 19 1. SQL INTERFACE 20 21 1.1 Table Creation. 22 23 All r-tree virtual tables have an odd number of columns between 24 3 and 11. Unlike regular SQLite tables, r-tree tables are strongly 25 typed. 26 27 The leftmost column is always the pimary key and contains 64-bit 28 integer values. Each subsequent column contains a 32-bit real 29 value. For each pair of real values, the first (leftmost) must be 30 less than or equal to the second. R-tree tables may be 31 constructed using the following syntax: 32 33 CREATE VIRTUAL TABLE <name> USING rtree(<column-names>) 34 35 For example: 36 37 CREATE VIRTUAL TABLE boxes USING rtree(boxno, xmin, xmax, ymin, ymax); 38 INSERT INTO boxes VALUES(1, 1.0, 3.0, 2.0, 4.0); 39 40 Constructing a virtual r-tree table <name> creates the following three 41 real tables in the database to store the data structure: 42 43 <name>_node 44 <name>_rowid 45 <name>_parent 46 47 Dropping or modifying the contents of these tables directly will 48 corrupt the r-tree structure. To delete an r-tree from a database, 49 use a regular DROP TABLE statement: 50 51 DROP TABLE <name>; 52 53 Dropping the main r-tree table automatically drops the automatically 54 created tables. 55 56 1.2 Data Manipulation (INSERT, UPDATE, DELETE). 57 58 The usual INSERT, UPDATE or DELETE syntax is used to manipulate data 59 stored in an r-tree table. Please note the following: 60 61 * Inserting a NULL value into the primary key column has the 62 same effect as inserting a NULL into an INTEGER PRIMARY KEY 63 column of a regular table. The system automatically assigns 64 an unused integer key value to the new record. Usually, this 65 is one greater than the largest primary key value currently 66 present in the table. 67 68 * Attempting to insert a duplicate primary key value fails with 69 an SQLITE_CONSTRAINT error. 70 71 * Attempting to insert or modify a record such that the value 72 stored in the (N*2)th column is greater than that stored in 73 the (N*2+1)th column fails with an SQLITE_CONSTRAINT error. 74 75 * When a record is inserted, values are always converted to 76 the required type (64-bit integer or 32-bit real) as if they 77 were part of an SQL CAST expression. Non-numeric strings are 78 converted to zero. 79 80 1.3 Queries. 81 82 R-tree tables may be queried using all of the same SQL syntax supported 83 by regular tables. However, some query patterns are more efficient 84 than others. 85 86 R-trees support fast lookup by primary key value (O(logN), like 87 regular tables). 88 89 Any combination of equality and range (<, <=, >, >=) constraints 90 on spatial data columns may be used to optimize other queries. This 91 is the key advantage to using r-tree tables instead of creating 92 indices on regular tables. 93 94 1.4 Introspection and Analysis. 95 96 TODO: Describe rtreenode() and rtreedepth() functions. 97 98 99 2. COMPILATION AND USAGE 100 101 The easiest way to compile and use the RTREE extension is to build 102 and use it as a dynamically loadable SQLite extension. To do this 103 using gcc on *nix: 104 105 gcc -shared rtree.c -o libSqliteRtree.so 106 107 You may need to add "-I" flags so that gcc can find sqlite3ext.h 108 and sqlite3.h. The resulting shared lib, libSqliteRtree.so, may be 109 loaded into sqlite in the same way as any other dynamicly loadable 110 extension. 111 112 113 3. REFERENCES 114 115 [1] Atonin Guttman, "R-trees - A Dynamic Index Structure For Spatial 116 Searching", University of California Berkeley, 1984. 117 118 [2] Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider, Bernhard Seeger, 119 "The R*-tree: An Efficient and Robust Access Method for Points and 120 Rectangles", Universitaet Bremen, 1990. 121