123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 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
- less than or equal to the second. R-tree tables may be
- 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);
- INSERT INTO boxes VALUES(1, 1.0, 3.0, 2.0, 4.0);
- 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
- by regular tables. However, some query patterns are more efficient
- 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
- The easiest way to compile and use the RTREE extension is to build
- 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
- and sqlite3.h. The resulting shared lib, libSqliteRtree.so, may be
- 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.
|