2008-05-26 20:41:54 +02:00
|
|
|
|
|
|
|
This directory contains an SQLite extension that implements a virtual
|
|
|
|
table type that allows users to create, query and manipulate r-tree[1]
|
|
|
|
data structures inside of SQLite databases. Users create, populate
|
|
|
|
and query r-tree structures using ordinary SQL statements.
|
|
|
|
|
|
|
|
1. SQL Interface
|
|
|
|
|
|
|
|
1.1 Table Creation
|
|
|
|
1.2 Data Manipulation
|
|
|
|
1.3 Data Querying
|
|
|
|
1.4 Introspection and Analysis
|
|
|
|
|
|
|
|
2. Compilation and Deployment
|
|
|
|
|
|
|
|
3. References
|
|
|
|
|
|
|
|
|
|
|
|
1. SQL INTERFACE
|
|
|
|
|
|
|
|
1.1 Table Creation.
|
|
|
|
|
|
|
|
All r-tree virtual tables have an odd number of columns between
|
|
|
|
3 and 11. Unlike regular SQLite tables, r-tree tables are strongly
|
|
|
|
typed.
|
|
|
|
|
|
|
|
The leftmost column is always the pimary key and contains 64-bit
|
|
|
|
integer values. Each subsequent column contains a 32-bit real
|
|
|
|
value. For each pair of real values, the first (leftmost) must be
|
2008-06-04 17:09:16 +02:00
|
|
|
less than or equal to the second. R-tree tables may be
|
2008-05-26 20:41:54 +02:00
|
|
|
constructed using the following syntax:
|
|
|
|
|
|
|
|
CREATE VIRTUAL TABLE <name> USING rtree(<column-names>)
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
CREATE VIRTUAL TABLE boxes USING rtree(boxno, xmin, xmax, ymin, ymax);
|
2008-06-04 16:20:09 +02:00
|
|
|
INSERT INTO boxes VALUES(1, 1.0, 3.0, 2.0, 4.0);
|
2008-05-26 20:41:54 +02:00
|
|
|
|
|
|
|
Constructing a virtual r-tree table <name> creates the following three
|
|
|
|
real tables in the database to store the data structure:
|
|
|
|
|
|
|
|
<name>_node
|
|
|
|
<name>_rowid
|
|
|
|
<name>_parent
|
|
|
|
|
|
|
|
Dropping or modifying the contents of these tables directly will
|
|
|
|
corrupt the r-tree structure. To delete an r-tree from a database,
|
|
|
|
use a regular DROP TABLE statement:
|
|
|
|
|
|
|
|
DROP TABLE <name>;
|
|
|
|
|
|
|
|
Dropping the main r-tree table automatically drops the automatically
|
|
|
|
created tables.
|
|
|
|
|
|
|
|
1.2 Data Manipulation (INSERT, UPDATE, DELETE).
|
|
|
|
|
|
|
|
The usual INSERT, UPDATE or DELETE syntax is used to manipulate data
|
|
|
|
stored in an r-tree table. Please note the following:
|
|
|
|
|
|
|
|
* Inserting a NULL value into the primary key column has the
|
|
|
|
same effect as inserting a NULL into an INTEGER PRIMARY KEY
|
|
|
|
column of a regular table. The system automatically assigns
|
|
|
|
an unused integer key value to the new record. Usually, this
|
|
|
|
is one greater than the largest primary key value currently
|
|
|
|
present in the table.
|
|
|
|
|
|
|
|
* Attempting to insert a duplicate primary key value fails with
|
|
|
|
an SQLITE_CONSTRAINT error.
|
|
|
|
|
|
|
|
* Attempting to insert or modify a record such that the value
|
|
|
|
stored in the (N*2)th column is greater than that stored in
|
|
|
|
the (N*2+1)th column fails with an SQLITE_CONSTRAINT error.
|
|
|
|
|
|
|
|
* When a record is inserted, values are always converted to
|
|
|
|
the required type (64-bit integer or 32-bit real) as if they
|
|
|
|
were part of an SQL CAST expression. Non-numeric strings are
|
|
|
|
converted to zero.
|
|
|
|
|
|
|
|
1.3 Queries.
|
|
|
|
|
|
|
|
R-tree tables may be queried using all of the same SQL syntax supported
|
2008-05-26 22:19:25 +02:00
|
|
|
by regular tables. However, some query patterns are more efficient
|
2008-05-26 20:41:54 +02:00
|
|
|
than others.
|
|
|
|
|
|
|
|
R-trees support fast lookup by primary key value (O(logN), like
|
|
|
|
regular tables).
|
|
|
|
|
|
|
|
Any combination of equality and range (<, <=, >, >=) constraints
|
|
|
|
on spatial data columns may be used to optimize other queries. This
|
|
|
|
is the key advantage to using r-tree tables instead of creating
|
|
|
|
indices on regular tables.
|
|
|
|
|
|
|
|
1.4 Introspection and Analysis.
|
|
|
|
|
|
|
|
TODO: Describe rtreenode() and rtreedepth() functions.
|
|
|
|
|
|
|
|
|
|
|
|
2. COMPILATION AND USAGE
|
|
|
|
|
2008-05-26 22:19:25 +02:00
|
|
|
The easiest way to compile and use the RTREE extension is to build
|
2008-05-26 20:41:54 +02:00
|
|
|
and use it as a dynamically loadable SQLite extension. To do this
|
|
|
|
using gcc on *nix:
|
|
|
|
|
|
|
|
gcc -shared rtree.c -o libSqliteRtree.so
|
|
|
|
|
|
|
|
You may need to add "-I" flags so that gcc can find sqlite3ext.h
|
2008-05-26 22:19:25 +02:00
|
|
|
and sqlite3.h. The resulting shared lib, libSqliteRtree.so, may be
|
2008-05-26 20:41:54 +02:00
|
|
|
loaded into sqlite in the same way as any other dynamicly loadable
|
|
|
|
extension.
|
|
|
|
|
|
|
|
|
|
|
|
3. REFERENCES
|
|
|
|
|
|
|
|
[1] Atonin Guttman, "R-trees - A Dynamic Index Structure For Spatial
|
|
|
|
Searching", University of California Berkeley, 1984.
|
|
|
|
|
|
|
|
[2] Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider, Bernhard Seeger,
|
|
|
|
"The R*-tree: An Efficient and Robust Access Method for Points and
|
|
|
|
Rectangles", Universitaet Bremen, 1990.
|