| OLD | NEW |
| (Empty) |
| 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. | |
| OLD | NEW |