Extensions

SQL is the prime language of interaction with MonetDB. However, it is continuously being extended with small and major code fragments that extend the functionality described in the SQL 2003 standard. It includes completely wrapped libraries, e.g. geos, or address non-core SQL.

BEWARE, as mentioned in the Mar2011 release notes, work on the Pathfinder compiler, which forms the basis of MonetDB XQuery, continues at The University of Tübingen.

GeoSpatial

Spatial support

MonetDB/SQL comes with an interface to the Simple Feature Specification of OpenGIS which opens the route to develop GIS applications

The MonetDB/SQL/GIS module supports all objects and functions specified in the OGC "Simple Features for SQL" specification. Spatial objects can, however, for the time being only expressed in the Well-Known Text (WKT) format. WKT includes information about the type of the object and the object's coordinates.

Installation

The GIS functionality is packaged as a separate MonetDB module called geom. To benefit from the geometry functionality you first have to download and install GEOS. It is a well-known and sound library to built upon. The next step is to (re-)build MonetDB with the --enable-geom configure argument.  This will build the necessary extension modules and activate them upon the first start of the server.  Note that databases created before you configured with support for geom will lack geom functions in SQL.  You best start on a new database.

Get Going

The spatial extension of MonetDB requires the user to simply use geom data types from SQL.

Example The script below creates and populates a 'forest' table and a 'buildings' table followed by a spatial query in this fictive landscape.

CREATE TABLE forests(id INT,name TEXT,shape MULTIPOLYGON);
CREATE TABLE buildings(id INT,name TEXT,location POINT,outline POLYGON);

INSERT INTO forests VALUES(109, 'Green Forest',
'MULTIPOLYGON( ((28 26,28 0,84 0,84 42,28 26), (52 18,66 23,73 9,48 6,52 18)), ((59 18,67 18,67 13,59 13,59 18)))');

INSERT INTO buildings VALUES(113, '123 Main Street',
	'POINT( 52 30 )',
	'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )');
INSERT INTO buildings VALUES(114, '215 Main Street',
	'POINT( 64 33 )',
	'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )');

SELECT forests.name,buildings.name
FROM forests,buildings
WHERE forests.name = 'Green Forest' and
    Overlaps(forests.shape, buildings.outline) = true;

Acceleration Spatial Operations

There are no special accelerators to speed up access to Spatial Objects yet. However, we can use the Minimum Bounding Rectangle (mbr) datatype to accelerate operations considerably. This requires a small query rewrite. In the example above the performance of the query can be improved in the following manner:

ALTER TABLE forests ADD bbox mbr;
UPDATE forests SET bbox = mbr(shape);
ALTER TABLE buildings ADD bbox mbr;
UPDATE buildings SET bbox = mbr(outline);

SELECT forests.name,buildings.name
FROM forests,buildings
WHERE forests.name = 'Green Forest' AND
    mbroverlaps(forests.bbox,buildings.bbox) = TRUE AND
    Overlaps(forests.shape, buildings.outline) = TRUE;

In this way the mbr operation acts as a filter. Upon request, and availabilty of resources, we will develop MAL optimizers to automate this process.

 

Bulk loading (currently not included)

The MonetDB distribution includes the program 'shp2monetdb' to convert a shapefile into SQL insert statements. This is a port from the shp2pgsql program that is shipped with PostGIS.

The functionality of the functionality has been tested with OpenJUMP, an open-source Geographic Information System.

Limitations

This is the first implementation of OpenGIS functionality in MonetDB. Many issues require our attention, but priority will be derived from concrete external requests and availability of manpower. The shortlist of open issues is:

 

Spatial data types

Spatial Types

MonetDB supports the OpenGIS types: Point, Curve, LineString, Surface, Polygon, MultiPoint, MultiCurve, MultiLineString, MultiSurface, MultiPolygon, Geometry and GeomCollection.

One non-OpenGIS type for fast access is used. This type 'mbr' is used for storing a 2D box. Functions to create these boxes are specified in following sections.

SQL functions on spatial objects

The following functions return the minimum bounded rectangle (or boolean) of a given geometry:

CREATE FUNCTION mbr (p Point) RETURNS mbr
CREATE FUNCTION mbr (c Curve) RETURNS mbr
CREATE FUNCTION mbr (l LineString) RETURNS mbr
CREATE FUNCTION mbr (s Surface) RETURNS mbr
CREATE FUNCTION mbr (p Polygon) RETURNS mbr
CREATE FUNCTION mbr (m multipoint) RETURNS mbr
CREATE FUNCTION mbr (m multicurve) RETURNS mbr
CREATE FUNCTION mbr (m multilinestring) RETURNS mbr
CREATE FUNCTION mbr (m multisurface) RETURNS mbr
CREATE FUNCTION mbr (m multipolygon) RETURNS mbr
CREATE FUNCTION mbr (g Geometry) RETURNS mbr
CREATE FUNCTION mbr (g GeomCollection) RETURNS mbr
CREATE FUNCTION mbroverlaps(a mbr, b mbr) RETURNS BOOLEAN

Conversion from and to Well-known Text

Convert a Well-Known-Text string to a spatial object. The SRID parameter is a reference to the Spatial Reference System in which the coordinates are expressed.

CREATE FUNCTION GeomFromText(wkt string, srid SMALLINT) RETURNS Geometry
CREATE FUNCTION PointFromText(wkt string, srid SMALLINT) RETURNS Point
CREATE FUNCTION LineFromText(wkt string, srid SMALLINT) RETURNS LineString
CREATE FUNCTION PolyFromText(wkt string, srid SMALLINT) RETURNS Polygon
CREATE FUNCTION MPointFromText(wkt string, srid SMALLINT) RETURNS MultiPoint
CREATE FUNCTION MLineFromText(wkt string, srid SMALLINT) RETURNS MultiLineString
CREATE FUNCTION MPolyFromText(wkt string, srid SMALLINT) RETURNS MultiPolygon
CREATE FUNCTION GeomCollectionFromText(wkt string, srid SMALLINT) RETURNS MultiPolygon
-- alias
CREATE FUNCTION PolygonFromText(wkt string, srid SMALLINT) RETURNS Polygon
 
CREATE FUNCTION AsText(p Point) RETURNS STRING
CREATE FUNCTION AsText(c Curve) RETURNS STRING
CREATE FUNCTION AsText(l LineString) RETURNS STRING
CREATE FUNCTION AsText(s Surface) RETURNS STRING
CREATE FUNCTION AsText(p Polygon) RETURNS STRING
CREATE FUNCTION AsText(p MultiPoint) RETURNS STRING
CREATE FUNCTION AsText(c MultiCurve) RETURNS STRING
CREATE FUNCTION AsText(l MultiLineString) RETURNS STRING
CREATE FUNCTION AsText(s MultiSurface) RETURNS STRING
CREATE FUNCTION AsText(p MultiPolygon) RETURNS STRING
CREATE FUNCTION AsText(g Geometry) RETURNS STRING

Analysis functions on Geometry

The following functions perform analysis operations on geometries:

CREATE FUNCTION Area(g Geometry) RETURNS FLOAT
CREATE FUNCTION Length(g Geometry) RETURNS FLOAT
CREATE FUNCTION Distance(a Geometry, b Geometry) RETURNS FLOAT
CREATE FUNCTION Buffer(a Geometry, distance FLOAT) RETURNS Geometry
CREATE FUNCTION ConvexHull(a Geometry) RETURNS Geometry
CREATE FUNCTION Intersection(a Geometry, b Geometry) RETURNS Geometry
CREATE FUNCTION "Union"(a Geometry, b Geometry) RETURNS Geometry
CREATE FUNCTION Difference(a Geometry, b Geometry) RETURNS Geometry
CREATE FUNCTION SymDifference(a Geometry, b Geometry) RETURNS Geometry
 
CREATE FUNCTION Dimension(g Geometry) RETURNS integer
CREATE FUNCTION GeometryTypeId(g Geometry) RETURNS integer
CREATE FUNCTION SRID(g Geometry) RETURNS integer
CREATE FUNCTION Envelope(g Geometry) RETURNS Geometry
CREATE FUNCTION IsEmpty(g Geometry) RETURNS BOOLEAN
CREATE FUNCTION IsSimple(g Geometry) RETURNS BOOLEAN
CREATE FUNCTION Boundary(g Geometry) RETURNS Geometry
 
CREATE FUNCTION Equals(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION Disjoint(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION "Intersect"(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION Touches(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION Crosses(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION Within(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION Contains(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION Overlaps(a Geometry, b Geometry) RETURNS BOOLEAN
CREATE FUNCTION Relate(a Geometry, b Geometry, pattern STRING) RETURNS BOOLEAN
SQL functions on Point
CREATE FUNCTION X(g Geometry) RETURNS double
CREATE FUNCTION Y(g Geometry) RETURNS double
 
CREATE FUNCTION Point(x double,y double) RETURNS Point
 
SQL functions on Curve
CREATE FUNCTION IsRing(l LineString) RETURNS BOOLEAN
CREATE FUNCTION StartPoint(l LineString) RETURNS Point -- not yet implemented
CREATE FUNCTION EndPoint(l LineString) RETURNS Point -- not yet implemented
 
SQL functions on LineString
CREATE FUNCTION NumPoints(l LineString) RETURNS integer -- not yet implemented
CREATE FUNCTION PointN(l LineString,i integer) RETURNS Point -- not yet implemented
 
SQL functions on Surface
CREATE FUNCTION PointOnSurface(s Surface) RETURNS Point -- not yet implemented
CREATE FUNCTION Centroid(s Surface) RETURNS Point -- not yet implemented
 
SQL functions on Polygon
CREATE FUNCTION ExteriorRing(s Surface) RETURNS LineString -- not yet implemented
CREATE FUNCTION NumInteriorRing(s Surface) RETURNS integer -- not yet implemented
CREATE FUNCTION InteriorRingN(s Surface,n integer) RETURNS LineString -- not yet implemented
 
SQL functions on GeomCollection
-- Unimplemented Documentation
CREATE FUNCTION NumGeometries(GeomCollection c) RETURNS integer -- not yet implemented
CREATE FUNCTION GeometryN(GeomCollection c,n integer) RETURNS Geometry -- not yet implemented

XML support

The SQL/XML standard defines the mechanisms to produce XML formatted results from relational queries and to import relational data from XML documents. The SQL/XML 2003 definition and its enhancements in SQL/XML 2005 are the frame of reference.

The implementation in MonetDB/SQL is initially geared at providing the basic functionality for publishing XML and simple querying. A more complete and optimized implementation of XQuery is already available with MonetDB/XQuery. However, data between the two systems is not shared. They are managed by a different server implementation.

SQL/XML introduces a new datatype xml. It can be used as a column type in table, view definitions, parameters, and variables. The datatype tells the system that values are properly structured XML objects.

The SQL/XML implementation uses the string type as the carrier for XML values and relies on the widely available library libxml2 for additional functionality. It is a poor man's approach compared to MonetDB/XQuery.

XML Import

XML data can be inserted into a database column using any of the available APIs. A single document is added to a XML column using the blob operation file().

     insert into dossier(id,doc) values(20070831, file("/tmp/letter"));

Often an XML document contains a heterogenous collection of objects, which should be broken into pieces before they are stored in the database. There are many ways to shred a document and often an application specific front-end application is needed. However, MonetDB SQL/XML provides a few simple operations to cope with the majority of situations.

     copy into database from '/tmp/jacktheripper.xml';
     copy into victim(name,hair) from '/tmp/jacktheripper.xml'
     	delimiter 'victim(name,hair)'

The first statements reads the XML document and breaks it into a series of relational tables with foreign key references. It results in a structured object representation. A XML view named after the top level element is automatically defined to rebuild the original document.

The second example performs a top-down parse of the XML document. Within every victim element it extracts the sub-trees named name and hair. This scheme is equivalent to using XPath expressions victim[//name,//hair].

XML Publishing

The XML publishing functions are designed to construct XML values from data stored in the database. They can be used anywhere a string value is allowed.

 

     XML_value_expression : XML_primary
     XML_primary : value expression primary
         | XML_value_function
     
     XML_value function : XML_comment
         | XML_concatenation
         | XML_element
         | XML_forest
         | XML_parse
         | XML_serialize
         | XML_PI
     
     XML_comment : XMLCOMMENT '(' <string_value_expression> ')'
     
     XML_concatenation : XMLCONCAT '(' XML_value_expression
         { ',' XML_value_expression }... ')'
     
     XML_element : XMLELEMENT '(' NAME identifier
         [ ',' XML_namespace_declaration ] [ ',' XML_attributes ]
         [ { ',' XML_element_content }... [ OPTION XML_content_option]
         [ XML_returning_clause ] ')'
     XML_attributes : XMLATTRIBUTES '(' XML_attribute_list ')'
     XML_attribute_list : XML_attribute [ { ',' XML_attribute }... ]
     XML_attribute : value_expression [ AS identifier ]
     XML_content_option : NULL ON NULL
         | EMPTY ON NULL
         | ABSENT ON NULL
         | NIL ON NULL
     	| NIL ON NO CONTENT
     XML_element_content : value_expression
     XML_returning_clause :
         RETURNING { CONTENT | SEQUENCE }
     
     XML_forest : XMLFOREST '(' [ XML_namespace_declaration> ',' ]
         forest_element list ')'
     forest_element list : forest_element [ { ',' forest_element }... ]
     forest_element : forest_element_value [ AS identifier ]
     forest_element value : value_expression
     
     XML_aggregate : XMLAGG '(' XML_value_expression
         [ ORDER BY sort_specification_list ]
         [ XML_returning_clause ] ')'
     
     XML_PI : XMLPI '(' NAME identifier
         [ ',' string_value_expression ] ')'
     
     XML_parse : XMLPARSE '(' document_or_content_string_value_expression
     [ XML_whitespace_option ] ')'
     XML_whitespace_option : { PRESERVE | STRIP } WHITESPACE
     
     XML_serialize:
     XMLSERIALIZE '(' {DOCUMENT | CONTENT} value AS data_type
         [ VERSION string_literal ]
         [ ENCODING SQL_language_identifier]
         [ [INCLUDING | EXCLUDING] XMLDECLARATIONS] ')'
     
     XML_document predicate : XML_value_expression IS [ NOT ] DOCUMENT

 

The XML table construct provides a mechanism to extract a table from an XML document using simple path expression to the elements of interest.

 

     
     XML_iterate : XMLITERATE '(' XML_value_expression ')'
     
     XML_table : XMLTABLE '('
         [ XML_namespace_declaration ',' ]
         XML_table_row_pattern
         [ XML_table_argument_list ]
         COLUMNS XML_table_column_definitions ')'
     
     XML_table_row_pattern :
         character_string_literal
     
     XML_table_argument_list :
         PASSING XML_table_argument_passing_mechanism
     
     XML_query_argument
         [ { ',' XML_query_argument }... ]
     
     XML_table_argument_passing mechanism : XML_passing_mechanism
     
     XML_table_column_definitions :
     	XML_table_column_definition
     	[ { ',' XML_table_column_definition }... ]
     
     XML_table_column_definition_:
         XML_table_ordinality_column_definition
         | XML_table_regular_column_definition
     
     XML_table_ordinality_column_definition :
     	column_name FOR ORDINALITY
     
     XML_table_regular_column_definition :
        column_name_data_type [ XML_passing_mechanism ]
        [ default_clause ]
        [ PATH XML_table_column_pattern ]
     
     XML_table_column_pattern : character_string_literal

 

Declare one or more XML namespaces and the encoding to use for binary strings.

     XML_lexically_scoped_options :
         XML_lexically_scoped _option [ ',' XML_lexically_scoped_option ]
     XML_lexically_ scoped_option : XML_namespace_declaration
         | XML_binary_encoding
     XML_namespace_declaration :
         XMLNAMESPACES '(' XML_namespace_declaration item
         [ { ',' XML_namespace_declaration_item }... ] ')'
     XML_namespace_declaration_item :
         XML_regular_namespace_declaration_item
         | XML_default_namespace_declaration_item
     XML_namespace_prefix :
         identifier
     XML_namespace_URI :
         character_string_literal
     XML_regular_namespace_declaration_item :
         XML_namespace URI AS XML_namespace_prefix
     XML_default_namespace_declaration_item :
         DEFAULT XML_namespace_URI
         | NO DEFAULT
     XML_binary_encoding :
         XMLBINARY [ USING ] { BASE64 | HEX }

XPath and XQuery

The SQL/XML module aims to support XQuery through a well-defined (and narrow) interface. It relies on linkage of the libxml2 library to explore the rich world of XPath processing.

XML Schema

Indicate a registered XML Schema, and (optionally) an XML namespace of that registered XML Schema, and (optionally) a global element declaration schema component of that registered XML Schema.

 

     XML_valid_according_to_clause:
         ACCORDING_TO_XMLSCHEMA_XML_valid_according_to_what
         [_XML_valid_element_clause_]
     XML_valid_according_to_what:
         XML_valid_according_to_URI
         |_XML_valid_according_to_identifier
     XML_valid_according_to_URI:
         URI_XML_valid_target_namespace_URI_[_<XML_valid_schema_location>_]
         |_NO_NAMESPACE_[_XML_valid_schema_location_]
     XML_valid_target_namespace_URI: XML_URI
     XML_URI: character_string_literal
     XML_valid_schema_location:
         LOCATION_XML_valid_schema_location_URI
     XML_valid_schema_location_URI: XML_URI
     XML_valid_according_to_identifier:
         ID_registered_XML_Schema_name
     XML_valid_element_clause:
         XML_valid_element_name_specification
         |_XML_valid_element_namespace_specification
         [_XML_valid_element_name_specification_]
     XML_valid_element_name_specification:
         ELEMENT_XML_valid_element_name
     XML_valid_element_namespace_specification:
         NO NAMESPACE
         | NAMESPACE <XML valid element namespace URI>

 

     

 

XML_character_string_serialization: XMLSERIALIZE '(' [ document_or_content ] XML_value_expression_AS_data_type [ XML_serialize_version ] [ XML_declaration_option ] ')' XML_declaration_option: INCLUDING XMLDECLARATION |_EXCLUDING XMLDECLARATION document_or_content: DOCUMENT | CONTENT XML_serialize_version: VERSION character_string_literal blob_value_function: |_XML_binary_string_serialization XML_binary_string_serialization: XMLSERIALIZE'(' [_document_or_content ] XML_value_expression_AS_data_type [ ENCODING_XML_encoding_specification ] [ XML_serialize_version ] [ XML_declaration_option ] right_paren XML_encoding_specification: XML_encoding_name XML_encoding_name: SQL_language_identifier

 

Global variables are used to control choices.

     SET XML OPTION { DOCUMENT | CONTENT };

XQuery (obsolete)

MonetDB database system with XQuery front-end

Have you ever tried to work with XML documents? If so, you probably have noticed that these documents are not easy to handle. To query these documents a query-language has been created: XQuery and the XQuery Update Facility (XQUF). What SQL is for relational databases, is XQuery/XQUF for XML-databases. However, existing prototype implementations are often too slow to be used beyond toy examples.

MonetDB/XQuery provides XML database functionality comprising quite complete support for the XQuery language, including modules, transaction-safe XQUF updates, user-defined functions, and a query cache (using XQuery modules). The system has very high performance and is scalable to large XML collections.

March 2011: MonetDB/XQuery project is frozen. Due to lack of development and manpower to port the software to MonetDB version 5, we had to freeze the code base. The content of the XQuery website is, as are the prime distribution packages. We do not fix any bugs or problems with MonetDB/XQuery.