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 |