wkbZ = 0x80000000
This proposal suggest the use of an M-presence flag (wkbM) to
-allow for XY, XYM, XYZ and XYZM geometryes, and SRID-presence
+allow for XY, XYM, XYZ and XYZM geometries, and SRID-presence
flag to allow for embedded SRID:
wkbM = 0x40000000
<refentry id="Postgis_Enable_History">
<refnamediv>
<refname>Postgis_Enable_History</refname>
- <refpurpose>Registers a table geometrty column in the history_information table for tracking and also adds in side line history table and insert, update, delete rules on the table.</refpurpose>
+ <refpurpose>Registers a table geometry column in the history_information table for tracking and also adds in side line history table and insert, update, delete rules on the table.</refpurpose>
</refnamediv>
<refsynopsisdiv>
</refsection>
<refsection>
- <title>Casting Behavor</title>
+ <title>Casting Behavior</title>
<para>This section lists the automatic as well as explicit casts allowed for this data type</para>
<informaltable rowsep="1" frame="all">
<tgroup cols="2">
</refnamediv>
<refsection>
<title>Description</title>
- <para>An array of 1 or more topoelemetns ( a bidimensional array of integers: '{{id,type}, {id,type}, ...}'). So an array of 1 or more arrays each having 2 integers generally used to return an array of sets of element id and element type of a topology relation.</para>
+ <para>An array of 1 or more topoelements ( a bidimensional array of integers: '{{id,type}, {id,type}, ...}'). So an array of 1 or more arrays each having 2 integers generally used to return an array of sets of element id and element type of a topology relation.</para>
</refsection>
<refsection>
<title>Examples</title>
-------
{{1,2},{3,4}}
---using the arraya agg function packaged with topology --
+--using the array agg function packaged with topology --
SELECT topology.TopoElementArray_Agg(ARRAY[e,t]) As tea
FROM generate_series(1,3) As e CROSS JOIN generate_series(1,4) As t;
tea
<refsection>
<title>Examples</title>
<programlisting>-- Note for this example we created our new table in the ma_topo schema
--- though we could have created it in a different schema -- in shich case topology_name and schema_name would be different
+-- though we could have created it in a different schema -- in which case topology_name and schema_name would be different
CREATE SCHEMA ma;
CREATE TABLE ma.parcels(gid serial, parcel_id varchar(20) PRIMARY KEY, address text);
SELECT topology.AddTopoGeometryColumn('ma_topo', 'ma', 'parcels', 'topo', 'POLYGON');</programlisting>
<para>Creates a new schema with name <varname>topology_name</varname> consisting of tables (<varname>edge_data</varname>,<varname>face</varname>,<varname>node</varname>, <varname>relation</varname>
and registers this new topology in the topology.topology table. It returns the id of the topology in the topology table. The srid is the spatial reference identified as
- defined in spatial_ref_sys table for that topology. Toplogies must be uniquely named. The tolerance is measured in the units of the spatial reference system. If the tolerance is not specified defaults to 0.</para>
+ defined in spatial_ref_sys table for that topology. Topologies must be uniquely named. The tolerance is measured in the units of the spatial reference system. If the tolerance is not specified defaults to 0.</para>
<para>This is similar to the SQL/MM <xref linkend="ST_InitTopoGeo" /> but a bit more functional.</para>
<refsection>
<title>Description</title>
- <para>This is an SQL-MM equvalent of CreateTopology but lacks the spatial reference and tolerance options of CreateTopology and outputs a text description of creation instead of topology id.</para>
+ <para>This is an SQL-MM equivalent of CreateTopology but lacks the spatial reference and tolerance options of CreateTopology and outputs a text description of creation instead of topology id.</para>
<!-- use this format if new function -->
<para>Availability: 1.?</para>
<title>Description</title>
<para>Adds a point node to the node table in the specified topology schema. The <xref linkend="AddEdge" /> function automatically adds start and end points of an edge when called so not necessary to explicitly add nodes of an edge.
- When adding a new node it checks for the existance of any edge crossing the given point, raising an exception if found.</para>
+ When adding a new node it checks for the existence of any edge crossing the given point, raising an exception if found.</para>
<note><para>If the <varname>apoint</varname> geometry already exists as a node, the node is not added but the existing nodeid is returned.</para></note>
<!-- use this format if new function -->
<refsection>
<title>Description</title>
- <para>Creates a topo geometry object for layer denoted by layer_id and registers it in the relations table in tho <varname>toponame</varname> schema.</para>
+ <para>Creates a topogeometry object for layer denoted by layer_id and registers it in the relations table in tho <varname>toponame</varname> schema.</para>
<para>tg_type is an integer: 1:[multi]point, 2:[multi]line, 3:[multi]poly, 4:collection. layer_id is the layer id in the topology.layer table.</para>
<!-- use this format if new function -->
<refsection>
<title>Description</title>
- <para>Adds a collection of geometries to a given topology and returns a message detailing success. If collection contains anything butn points and linestrings an error is thrown. Will also
+ <para>Adds a collection of geometries to a given topology and returns a message detailing success. If collection contains anything but points and linestrings an error is thrown. Will also
throw an error if there are already edges and nodes in the topology or coincident nodes etc. Support for polygons not yet implemented.</para>
<para>Useful for populating an empty topology.</para>
<caution>
<para>
- This paramater is currently broken, as the package will only
+ This parameter is currently broken, as the package will only
install into the PostgreSQL installation directory. Visit
<ulink url="http://trac.osgeo.org/postgis/ticket/160">
http://trac.osgeo.org/postgis/ticket/160
<para>
This script will generate the <command>configure</command> script that
- in turn is used to customize the intallation of PostGIS.
+ in turn is used to customize the installation of PostGIS.
</para>
<para>
<code>PATH</code> and <code>PGPORT</code> environment variables when
performing the checks - it does <emphasis>not</emphasis> use the
PostgreSQL version that may have been specified using the
- configuration paramter <command>--with-pgconfig</command>. So make
+ configuration parameter <command>--with-pgconfig</command>. So make
sure to modify your PATH to match the detected PostgreSQL installation
during configuration or be prepared to deal with the impending
headaches. Visit
</caution>
<para>
- If successful, the output of the test should be similiar to the
+ If successful, the output of the test should be similar to the
following:
</para>
<para>If a table <varname>oid</varname> is provided, this function
tries to determine the srid, dimension, and geometry type of all
- geometry columns in the table, adding contraints as necessary. If
+ geometry columns in the table, adding constraints as necessary. If
successful, an appropriate row is inserted into the geometry_columns
table, otherwise, the exception is caught and an error notice is raised
describing the problem.</para>
<refsection>
<title>Examples</title>
<programlisting>
- -- This compares the difference betwee fully within and distanct within as well a
- -- as well as the distance full within for the 2D footprint of the line/point vs. the 3d fully within
+ -- This compares the difference between fully within and distance within as well
+ -- as the distance fully within for the 2D footprint of the line/point vs. the 3d fully within
SELECT ST_3DDFullyWithin(geom_a, geom_b, 10) as D3DFullyWithin10, ST_3DDWithin(geom_a, geom_b, 10) as D3DWithin10,
ST_DFullyWithin(geom_a, geom_b, 20) as D2DFullyWithin20,
ST_3DDFullyWithin(geom_a, geom_b, 20) as D3DFullyWithin20 from
of one another.</para>
<para>For Geometries: The distance is specified in units defined by the
spatial reference system of the geometries. For this function to make
- sense, the source geometries must both be of the same coorindate projection,
+ sense, the source geometries must both be of the same coordinate projection,
having the same SRID.</para>
<para>For geography units are in meters and measurement is
for ST_Length_Spheroid. </para>
<note><para>Will return 0 for anything that is not a MULTILINESTRING or LINESTRING</para></note>
- <note><para>This functionis just an alias for ST_Length_Spheroid. </para></note>
+ <note><para>This function is just an alias for ST_Length_Spheroid. </para></note>
<para>&Z_support;</para>
</refsection>
<title>Description</title>
<para>Returns the Well-Known Binary representation of the geometry. There are 2 variants of the function. The first
- variant takes no endian encoding paramater and defaults to little endian. The second variant takes a second argument
+ variant takes no endian encoding parameter and defaults to little endian. The second variant takes a second argument
denoting the encoding - using little-endian ('NDR') or big-endian ('XDR') encoding.</para>
<para>This is useful in binary cursors to pull data out of the
database without converting it to a string representation.</para>
<refsection>
<title>Description</title>
<para>Returns the Well-Known Binary representation of the geometry with SRID metadata. There are 2 variants of the function. The first
- variant takes no endian encoding paramater and defaults to little endian. The second variant takes a second argument
+ variant takes no endian encoding parameter and defaults to little endian. The second variant takes a second argument
denoting the encoding - using little-endian ('NDR') or big-endian ('XDR') encoding.</para>
<para>This is useful in binary cursors to pull data out of the
database without converting it to a string representation.</para>
<para>The target_percent is the target percent of area of convex hull the PostGIS solution will try to approach before giving up or exiting.
One can think of the concave hull as the geometry you get by vacuum sealing a set of geometries. The
- targe_percent of 1 will give you the same answer as the convex hull. A target_percent
+ target_percent of 1 will give you the same answer as the convex hull. A target_percent
between 0 and 0.99 will give you something that should have a smaller area than the convex ull. This is different from a convex hull which is more like wrapping a rubber band around the set of geometries.</para>
<para>It is usually used with MULTI and Geometry Collections.
it may fail with invalid geometries.</para></note>
<note><para>Note - The smaller you make the target percent, the longer it takes to process the concave hull and more likely to run into topological exceptions. Also the more
- floating points and number of points you acrue. First try a 0.99 which does a first hop, is usually very fast, sometimes as fast as computing the convex hull, and usually gives much better than 99% of shrink since it almost always overshoots. Second hope of 0.98 it slower, others get slower usually quadratically.
+ floating points and number of points you accrue. First try a 0.99 which does a first hop, is usually very fast, sometimes as fast as computing the convex hull, and usually gives much better than 99% of shrink since it almost always overshoots. Second hope of 0.98 it slower, others get slower usually quadratically.
To reduce precision and float points, use <xref linkend="ST_SimplifyPreserveTopology" /> or <xref linkend="ST_SnapToGrid" /> after ST_ConcaveHull. ST_SnapToGrid is a bit faster, but
could result in invalid geometries where as ST_SimplifyPreserveTopology almost always preserves the validity of the geometry.</para></note>
<refsection>
<title>Description</title>
- <para> Output type can be a MULTI* , single geometry, or Geometry Collection. Comes in 2 variants. Variant 1 unions 2 geometries resulting in a new geomety with no intersecting regions.
+ <para> Output type can be a MULTI* , single geometry, or Geometry Collection. Comes in 2 variants. Variant 1 unions 2 geometries resulting in a new geometry with no intersecting regions.
Variant 2 is an aggregate function that takes a set of geometries and unions
them into a single ST_Geometry resulting in no intersecting regions.</para>
</sect1>
<sect1 id="RasterBand_Accessors">
- <title>Raster Band Accessors and Contructors</title>
+ <title>Raster Band Accessors and Constructors</title>
<refentry id="RT_ST_AddBand">
<refnamediv>
<refname>ST_AddBand</refname>
<refsection>
<title>Description</title>
- <para>Returns a raster with a new band added in given position (band number), of given type, of given intial value, and of given nodata value. If no index is specified, the band is added to the end. Pixel type is a string representation
- of one of the pixel types specified in <xref linkend="RT_ST_BandPixelType" />. If an existing index is specfied all subsequent bands >= that index are incremented by 1.
+ <para>Returns a raster with a new band added in given position (band number), of given type, of given initial value, and of given nodata value. If no index is specified, the band is added to the end. Pixel type is a string representation
+ of one of the pixel types specified in <xref linkend="RT_ST_BandPixelType" />. If an existing index is specified all subsequent bands >= that index are incremented by 1.
If an initial value greater than the max of the pixel type is specified, then the initial value is set to the highest value allowed by the pixel type. </para>
</refsection>
<refsection>
<title>Description</title>
- <para>Returns modified raster resulting from setting the specified pixel value to new value for the designed band given the row column location or a goemetric point location.
+ <para>Returns modified raster resulting from setting the specified pixel value to new value for the designed band given the row column location or a geometric point location.
If no band is specified, then band 1 is assumed.
</para>
<note><para>Setting by geometry currently only works for points.</para></note>
<refentry id="RT_ST_SetGeoReference">
<refnamediv>
<refname>ST_SetGeoReference</refname>
- <refpurpose>Set Georefence 6 georeference parameters in a single call. Numbers should be separated by white space. Accepts inputs in GDAL or ESRI format. Default is GDAL.</refpurpose>
+ <refpurpose>Set Georeference 6 georeference parameters in a single call. Numbers should be separated by white space. Accepts inputs in GDAL or ESRI format. Default is GDAL.</refpurpose>
</refnamediv>
<refsynopsisdiv>
<refsection>
<title>Description</title>
- <para>Set Georefence 6 georeference parameters in a single call. Accepts inputs in 'GDAL' or 'ESRI' format. Default is GDAL. If 6 coordinates are not provided will return null.</para>
+ <para>Set Georeference 6 georeference parameters in a single call. Accepts inputs in 'GDAL' or 'ESRI' format. Default is GDAL. If 6 coordinates are not provided will return null.</para>
<para>Difference between format representations is as follows:</para>
<para><varname>GDAL</varname>:
<programlisting>scalex skewy skewx scaley upperleftx upperlefty</programlisting></para>
<title>Description</title>
<para>Returns the Binary representation of the raster. There are 2 variants of the function. The first
- variant takes no endian encoding paramater and defaults to little endian. The second variant takes a second argument
+ variant takes no endian encoding parameter and defaults to little endian. The second variant takes a second argument
denoting the encoding - using little-endian ('NDR') or big-endian ('XDR') encoding.</para>
<para>This is useful in binary cursors to pull data out of the
database without converting it to a string representation.</para>
rasters, this gives more or less the same answer as ST_Envelope
so only useful for irregularly shaped or skewed rasters.</para>
- <note><para>ST_Envelope floors the coordinates and hence add a little buffer around the raster so the answer is subtley
+ <note><para>ST_Envelope floors the coordinates and hence add a little buffer around the raster so the answer is subtly
different from ST_ConvexHull which does not floor.</para>
</note>
</refsection>
<refsection>
<title>Description</title>
- <para>Returns the polygon representation of the extent of the raster in spatial coordinate units defiend by srid. It is a float8 minimum bounding box represented as a polygon. </para>
+ <para>Returns the polygon representation of the extent of the raster in spatial coordinate units defined by srid. It is a float8 minimum bounding box represented as a polygon. </para>
<para>The polygon is defined by the corner points of the bounding box
((<varname>MINX</varname>, <varname>MINY</varname>),
(<varname>MINX</varname>, <varname>MAXY</varname>),
</refsection>
<refsection>
- <title>Casting Behavor</title>
+ <title>Casting Behavior</title>
<para>This section lists the automatic as well as explicit casts allowed for this data type</para>
<informaltable rowsep="1" frame="all">
<tgroup cols="2">
</refsection>
<refsection>
- <title>Casting Behavor</title>
+ <title>Casting Behavior</title>
<para>This section lists the automatic as well as explicit casts allowed for this data type</para>
<informaltable rowsep="1" frame="all">
<tgroup cols="2">
</refsection>
<refsection>
- <title>Casting Behavor</title>
+ <title>Casting Behavior</title>
<para>This section lists the automatic as well as explicit casts allowed for this data type</para>
<informaltable rowsep="1" frame="all">
<tgroup cols="2">
<title>Description</title>
<para>geomval is a compound data type consisting of a geometry object referenced by the .geom field
and val, a double precision value that represents the pixel value at a particular geometric location in a raster band.
- It is used by the ST_DumpAsPolygon and Raster intersectoin family of functions as an output type to explode a raster band into
+ It is used by the ST_DumpAsPolygon and Raster intersection family of functions as an output type to explode a raster band into
geometry polygons.</para>
</refsection>
<refsection>
</refsection>
<refsection>
- <title>Casting Behavor</title>
+ <title>Casting Behavior</title>
<para>This section lists the automatic as well as explicit casts allowed for this data type</para>
<informaltable rowsep="1" frame="all">
<tgroup cols="2">
</refsection>
<refsection>
- <title>Casting Behavor</title>
+ <title>Casting Behavior</title>
<para>This section lists the automatic as well as explicit casts allowed for this data type</para>
<informaltable rowsep="1" frame="all">
<tgroup cols="2">
-<?xml version="1.0" encoding="UTF-8"?>\r
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">\r
-<!-- ********************************************************************\r
- * $Id$\r
- ********************************************************************\r
- Copyright 2008-2010, Regina Obe\r
- License: BSD\r
- Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the functions we have documented\r
- using a garden variety of geometries. Its intent is to flag major crashes.\r
- ******************************************************************** -->\r
- <xsl:output method="text" />\r
- <xsl:variable name='testversion'>2.0.0</xsl:variable>\r
- <xsl:variable name='fnexclude14'>AddGeometryColumn DropGeometryColumn DropGeometryTable</xsl:variable>\r
- <xsl:variable name='fnexclude'>AddGeometryColumn DropGeometryColumn DropGeometryTable</xsl:variable>\r
- <!--This is just a place holder to state functions not supported in 1.3 or tested separately -->\r
-\r
- <xsl:variable name='var_srid'>3395</xsl:variable>\r
- <xsl:variable name='var_position'>1</xsl:variable>\r
- <xsl:variable name='var_integer1'>3</xsl:variable>\r
- <xsl:variable name='var_integer2'>5</xsl:variable>\r
- <xsl:variable name='var_float1'>0.5</xsl:variable>\r
- <xsl:variable name='var_float2'>0.75</xsl:variable>\r
- <xsl:variable name='var_distance'>100</xsl:variable>\r
- <xsl:variable name='var_version1'>1</xsl:variable>\r
- <xsl:variable name='var_version2'>2</xsl:variable>\r
- <xsl:variable name='var_gj_version'>1</xsl:variable> <!-- GeoJSON version -->\r
- <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>\r
- <xsl:variable name='var_text'>'monkey'</xsl:variable>\r
- <xsl:variable name='var_varchar'>'test'</xsl:variable>\r
- <xsl:variable name='var_spheroid'>'SPHEROID["GRS_1980",6378137,298.257222101]'</xsl:variable>\r
- <xsl:variable name='var_matrix'>'FF1FF0102'</xsl:variable>\r
- <xsl:variable name='var_boolean'>false</xsl:variable>\r
- <xsl:variable name='var_logtable'>postgis_garden_log</xsl:variable>\r
- <xsl:variable name='var_logupdatesql'>UPDATE <xsl:value-of select="$var_logtable" /> SET log_end = clock_timestamp() \r
- FROM (SELECT logid FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC limit 1) As foo\r
- WHERE <xsl:value-of select="$var_logtable" />.logid = foo.logid AND <xsl:value-of select="$var_logtable" />.log_end IS NULL;</xsl:variable>\r
- \r
- <!-- for queries that result data, we first log the sql in our log table and then use query_to_xml to output it as xml for easy storage \r
- with this approach our run statement is always exactly the same -->\r
- <xsl:variable name='var_logresultsasxml'>INSERT INTO <xsl:value-of select="$var_logtable" />_output(logid, log_output)\r
- SELECT logid, query_to_xml(log_sql, false,false,'') As log_output\r
- FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC LIMIT 1;</xsl:variable>\r
- <pgis:gardens>\r
- <pgis:gset ID='POINT' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,2) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 5) j\r
- ORDER BY i,j\r
- )</pgis:gset>\r
- <pgis:gset ID='LINESTRING' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) As j\r
- WHERE NOT(i = j)\r
- ORDER BY i, i*j)</pgis:gset>\r
- <pgis:gset ID='POLYGON' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, i*j, j)</pgis:gset>\r
- <pgis:gset ID='POINTM' GeometryType='POINTM'>(SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(50,70, 20) AS j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, i*j*m)</pgis:gset>\r
- <pgis:gset ID='LINESTRINGM' GeometryType='LINESTRINGM'>(SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- WHERE NOT(i = j)\r
- ORDER BY i, j, m, i*j*m)</pgis:gset>\r
-<!-- <pgis:gset ID='PolygonMSet' GeometryType='POLYGONM'>(SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePointM(i+m,j,m),4326),ST_SetSRID(ST_MakePointM(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePointM(i,j,m),4326)),ST_SetSRID(ST_MakePointM(i+m,j,m),4326))) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, m, i*j*m\r
- )</pgis:gset>-->\r
- <pgis:gset ID='POLYGONM' GeometryType='POLYGONM'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2503 1,-71.132 42.2502 3,-71.1323 42.2504 -2,-71.1322 42.2505 1,-71.1319 42.2503 0))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2512 0,-71.1318 42.2511 20,-71.1317 42.2511 -20,-71.1317 42.251 5,-71.1317 42.2509 4,-71.132 42.2511 6,-71.1319 42.2512 30))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
- <pgis:gset ID='POINTZ' GeometryType='POINTZ'>(SELECT ST_SetSRID(ST_MakePoint(i,j,k),4326) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 20) j\r
- CROSS JOIN generate_series(1,2) k\r
- ORDER BY i,i*j, j*k, i + j + k)</pgis:gset>\r
- <pgis:gset ID='LINESTRINGZ' GeometryType='LINESTRINGZ'>(SELECT ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 20) j\r
- CROSS JOIN generate_series(1,2) k\r
- ORDER BY i, j, i+j+k, k, i*j*k)</pgis:gset>\r
-<!-- <pgis:gset ID='PolygonSet3D' GeometryType='POLYGONZ'>(SELECT ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, i+j+m, m, i*j*m)</pgis:gset>--> \r
- <pgis:gset ID='POLYGONZ' GeometryType='POLYGONZ'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1,-71.0767 42.3872 1,-71.0767 42.3863 1,-71.0771 42.3866 1))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2,-71.0773 42.3863 1.75,-71.0773 42.3859 1.75,-71.0775 42.386 2))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
- <pgis:gset ID='POLYGONZM' GeometryType='POLYGONZM'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1 2,-71.0767 42.3872 1 2.3,-71.0767 42.3863 1 2.3,-71.0771 42.3866 1 2))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2 1.5,-71.0773 42.3863 1.75 1.5,-71.0773 42.3859 1.75 1.5,-71.0775 42.386 2 1.5))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
- <pgis:gset ID='POLYHEDRALSURFACE' GeometryType='POLYHEDRALSURFACE'>(SELECT ST_Translate(the_geom,-72.2, 41.755) As the_geom\r
- FROM (VALUES ( ST_GeomFromEWKT(\r
-'SRID=4326;PolyhedralSurface( \r
-((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), \r
-((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), \r
-((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) \r
-)') ) ,\r
-( ST_GeomFromEWKT(\r
-'SRID=4326;PolyhedralSurface( \r
-((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), \r
-((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)) )') ) )\r
-As foo(the_geom) ) </pgis:gset>\r
-\r
- <pgis:gset ID='TRIANGLE' GeometryType='TRIANGLE'>(SELECT ST_GeomFromEWKT(\r
-'SRID=4326;TRIANGLE ((\r
- -71.0821 42.3036, \r
- -71.0821 42.3936, \r
- -71.0901 42.3036, \r
- -71.0821 42.3036\r
- ))') As the_geom) </pgis:gset>\r
- \r
- <pgis:gset ID='TIN' GeometryType='TIN'>(SELECT ST_GeomFromEWKT(\r
-'SRID=4326;TIN (((\r
- -71.0821 42.3036 0, \r
- -71.0821 42.3036 1, \r
- -71.0821 42.3436 0, \r
- -71.0821 42.3036 0\r
- )), ((\r
- -71.0821 42.3036 0, \r
- -71.0821 42.3436 0, \r
- -71.0831 42.3436 0, \r
- -71.0821 42.3036 0\r
- ))\r
- )') As the_geom) </pgis:gset>\r
-\r
-<!-- <pgis:gset ID='GCSet3D' GeometryType='GEOMETRYCOLLECTIONZ' SkipUnary='1'>(SELECT ST_Collect(ST_Collect(ST_SetSRID(ST_MakePoint(i,j,m),4326),ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326))) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- )</pgis:gset>-->\r
- <pgis:gset ID='GEOMETRYCOLLECTIONZ' GeometryType='GEOMETRYCOLLECTIONZ' SkipUnary='1'>(SELECT ST_Collect(geom) As the_geom\r
- FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.0821 42.3036 2,-71.0822 42.3036 2,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 1,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1))') )\r
- ) As g(geom) CROSS JOIN generate_series(1,3) As i\r
- GROUP BY i\r
- )</pgis:gset>\r
- \r
- <pgis:gset ID='GEOMETRYCOLLECTIONM' GeometryType='GEOMETRYCOLLECTIONM' SkipUnary='1'>(SELECT ST_Collect(geom) As the_geom\r
- FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((-71.0821 42.3036 2,-71.0822 42.3036 3,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 2,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1))') )\r
- ) As g(geom) CROSS JOIN generate_series(1,3) As i\r
- GROUP BY i\r
- )</pgis:gset>\r
-\r
-<!-- MULTIs start here -->\r
- <pgis:gset ID='MULTIPOINT' GeometryType='MULTIPOINT'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom\r
- FROM generate_series(-10,50,15) As i\r
- CROSS JOIN generate_series(40,70, 15) j\r
- ) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTILINESTRING' GeometryType='MULTILINESTRING'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 15) As j\r
- WHERE NOT(i = j)) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTIPOLYGON' GeometryType='MULTIPOLYGON'>(SELECT ST_Multi(ST_Union(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05))) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 25) As j)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTIPOINTZ' GeometryType='MULTIPOINTZ'>(SELECT ST_Collect(ST_SetSRID(ST_MakePoint(i,j,k),4326)) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 25) j\r
- CROSS JOIN generate_series(1,3) k\r
- )</pgis:gset>\r
-\r
- <pgis:gset ID='MULTILINESTRINGZ' GeometryType='MULTILINESTRINGZ'>(SELECT ST_Multi(ST_Union(ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326))) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 25) j\r
- CROSS JOIN generate_series(1,2) k\r
- )</pgis:gset>\r
-\r
-<!-- <pgis:gset ID='MultiPolySet3D' GeometryType='MULTIPOLYGONZ'>(SELECT ST_Multi(ST_Union(s.the_geom)) As the_geom\r
- FROM (SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePoint(i+m,j,m),4326),ST_SetSRID(ST_MakePoint(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePoint(i,j,m),4326)),ST_SetSRID(ST_MakePoint(i+m,j,m),4326))) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(50,70, 25) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ) As s)</pgis:gset>-->\r
- <pgis:gset ID='MULTIPOLYGONZ' GeometryType='MULTIPOLYGONZ'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.0821 42.3036 2,-71.0822 42.3036 2,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 1,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1)))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
-\r
- <pgis:gset ID='MULTIPOINTM' GeometryType='MULTIPOINTM'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326) As the_geom\r
- FROM generate_series(-71,50,15) As i\r
- CROSS JOIN generate_series(42,70, 25) AS j\r
- CROSS JOIN generate_series(1,2) As m\r
- ) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTILINESTRINGM' GeometryType='MULTILINESTRINGM'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom\r
- FROM generate_series(-71,50,15) As i\r
- CROSS JOIN generate_series(50,70, 25) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- WHERE NOT(i = j)) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTIPOLYGONM' GeometryType='MULTIPOLYGONM'>(\r
- SELECT ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 2,10 0 1,10 10 -2,0 10 -5,0 0 -5),(5 5 6,7 5 6,7 7 6,5 7 10,5 5 -2)))') As the_geom\r
- )</pgis:gset>\r
- \r
- <!-- replacing crasher with a more harmless curve polygon and circular string -->\r
- <pgis:gset ID='CURVEPOLYGON' GeometryType='CURVEPOLYGON'>(SELECT ST_GeomFromEWKT('SRID=4326;CURVEPOLYGON(CIRCULARSTRING(-71.0821 42.3036, -71.4821 42.3036, -71.7821 42.7036, -71.0821 42.7036, -71.0821 42.3036),(-71.1821 42.4036, -71.3821 42.6036, -71.3821 42.4036, -71.1821 42.4036) ) ') As the_geom)</pgis:gset>\r
- \r
- <pgis:gset ID='CURVEPOLYGON2' GeometryType='CURVEPOLYGON'>(SELECT ST_LineToCurve(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j)) As the_geom \r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, j, i*j)\r
- </pgis:gset>\r
-\r
- <pgis:gset ID='CIRCULARSTRING' GeometryType='CIRCULARSTRING'>(SELECT ST_GeomFromEWKT('SRID=4326;CIRCULARSTRING(-71.0821 42.3036,-71.4821 42.3036,-71.7821 42.7036,-71.0821 42.7036,-71.0821 42.3036)') As the_geom)</pgis:gset>\r
- <pgis:gset ID='MULTISURFACE' GeometryType='MULTISURFACE'>(SELECT ST_GeomFromEWKT('SRID=4326;MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(-71.0821 42.3036, -71.4821 42.3036, -71.7821 42.7036, -71.0821 42.7036, -71.0821 42.3036),(-71.1821 42.4036, -71.3821 42.6036, -71.3821 42.4036, -71.1821 42.4036) ))') As the_geom)</pgis:gset>\r
- <!--These are special case geometries -->\r
- <pgis:gset ID="Typed Empty Geometries" GeometryType="GEOMETRY" createtable="false">(SELECT ST_GeomFromText('POINT EMPTY',4326) As the_geom\r
- UNION ALL SELECT ST_GeomFromText('MULTIPOINT EMPTY',4326) As the_geom\r
- UNION ALL SELECT ST_GeomFromText('MULTIPOLYGON EMPTY',4326) As the_geom\r
- UNION ALL SELECT ST_GeomFromText('LINESTRING EMPTY',4326) As the_geom\r
- UNION ALL SELECT ST_GeomFromText('MULTILINESTRING EMPTY',4326) As the_geom\r
- )\r
- </pgis:gset>\r
- \r
- \r
- <pgis:gset ID="Empty Geometry Collection" GeometryType="GEOMETRY" createtable="false">\r
- (SELECT ST_GeomFromText('GEOMETRYCOLLECTION EMPTY',4326) As the_geom )\r
- </pgis:gset>\r
- \r
- <pgis:gset ID="Single NULL" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom)</pgis:gset>\r
- <pgis:gset ID="Multiple NULLs" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom FROM generate_series(1,4) As foo)</pgis:gset>\r
-\r
-\r
- <!-- TODO: Finish off MULTI list -->\r
- </pgis:gardens>\r
- <!--This is just a placeholder to hold geometries that will crash server when hitting against some functions\r
- We'll fix these crashers in 1.4 -->\r
- <pgis:gset ID='CurvePolySet' GeometryType='CURVEPOLYGON'>(SELECT ST_LineToCurve(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j)) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, j, i*j)</pgis:gset>\r
- <pgis:gset ID='CircularStringSet' GeometryType='CIRCULARSTRING'>(SELECT ST_LineToCurve(ST_Boundary(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j))) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, j, i*j)</pgis:gset>\r
- \r
- <pgis:gset ID="Collection of Empties" GeometryType="GEOMETRY" createtable="false">(SELECT ST_Collect(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY',4326), ST_GeomFromText('POLYGON EMPTY',4326)) As the_geom\r
- UNION ALL SELECT ST_COLLECT(ST_GeomFromText('POLYGON EMPTY',4326),ST_GeomFromText('TRIANGLE EMPTY',4326)) As the_geom\r
- UNION ALL SELECT ST_Collect(ST_GeomFromText('POINT EMPTY',4326), ST_GeomFromText('MULTIPOINT EMPTY',4326)) As the_geom\r
- )</pgis:gset>\r
- <pgis:gset ID="POLYGON EMPTY" GeometryType="POLYGON" createtable="false">(SELECT ST_GeomFromText('POLYGON EMPTY',4326) As the_geom)</pgis:gset>\r
- \r
-\r
- <pgis:gardencrashers>\r
-\r
-\r
- </pgis:gardencrashers>\r
-\r
- <!-- We deal only with the reference chapter -->\r
- <xsl:template match="/">\r
-<!-- Create logging tables -->\r
-DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />;\r
-CREATE TABLE <xsl:value-of select="$var_logtable" />(logid serial PRIMARY KEY, log_label text, spatial_class text, func text, g1 text, g2 text, log_start timestamp, log_end timestamp, log_sql text);\r
-DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />_output;\r
-CREATE TABLE <xsl:value-of select="$var_logtable" />_output(logid integer PRIMARY KEY, log_output xml);\r
-\r
- <xsl:apply-templates select="/book/chapter[@id='reference']" />\r
- </xsl:template>\r
-\r
- <xsl:template match='chapter'>\r
-<!--Start Test table creation, insert, analyze crash test, drop -->\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset[not(contains(@createtable,'false'))]">\r
- <xsl:variable name='log_label'>table Test <xsl:value-of select="@GeometryType" /></xsl:variable>\r
-SELECT '<xsl:value-of select="$log_label" />: Start Testing';\r
-<xsl:variable name='var_sql'>CREATE TABLE pgis_garden (gid serial);\r
- SELECT AddGeometryColumn('pgis_garden','the_geom',ST_SRID(the_geom),GeometryType(the_geom),ST_CoordDim(the_geom))\r
- FROM (<xsl:value-of select="." />) As foo limit 1;\r
- SELECT AddGeometryColumn('pgis_garden','the_geom_multi',ST_SRID(the_geom),GeometryType(ST_Multi(the_geom)),ST_CoordDim(the_geom))\r
- FROM (<xsl:value-of select="." />) As foo limit 1;</xsl:variable>\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
-VALUES('<xsl:value-of select="$log_label" /> AddGeometryColumn','AddGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');\r
-BEGIN;\r
- <xsl:value-of select="$var_sql" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-\r
-SELECT '<xsl:value-of select="$log_label" /> Geometry index: Start Testing <xsl:value-of select="@ID" />';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geometry','CREATE gist index geometry', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- CREATE INDEX idx_pgis_geom_gist ON pgis_garden USING gist(the_geom);\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> geometry index: End Testing <xsl:value-of select="@ID" />';\r
-\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
-VALUES('<xsl:value-of select="$log_label" /> insert data Geometry','insert data', '<xsl:value-of select="@ID" />', clock_timestamp(), '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">INSERT INTO pgis_garden(the_geom, the_geom_multi)\r
- SELECT the_geom, ST_Multi(the_geom)\r
- FROM (<xsl:value-of select="." />) As foo;</xsl:with-param></xsl:call-template>');\r
-\r
-BEGIN;\r
- INSERT INTO pgis_garden(the_geom, the_geom_multi)\r
- SELECT the_geom, ST_Multi(the_geom)\r
- FROM (<xsl:value-of select="." />) As foo;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT; \r
-\r
-\r
-SELECT '<xsl:value-of select="$log_label" /> Geometry index overlaps: Start Testing <xsl:value-of select="@ID" />';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) VALUES('<xsl:value-of select="$log_label" /> gist index Geometry overlaps test','Gist index overlap', '<xsl:value-of select="@ID" />', clock_timestamp(),\r
- 'SELECT count(*) As result FROM pgis_garden As foo1 INNER JOIN pgis_garden As foo2 ON foo1.the_geom && foo2.the_geom');\r
-BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-\r
-SELECT '<xsl:value-of select="$log_label" /> geometry index overlaps: End Testing <xsl:value-of select="@ID" />';\r
- \r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> UpdateGeometrySRID','UpdateGeometrySRID', '<xsl:value-of select="@GeometryType" />', clock_timestamp());\r
-BEGIN;\r
- SELECT UpdateGeometrySRID('pgis_garden', 'the_geom', 4269);\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geometry','vacuum analyze Geometry', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-VACUUM ANALYZE pgis_garden;\r
-<xsl:value-of select="$var_logupdatesql" />\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> DropGeometryColumn','DropGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp());\r
-\r
-BEGIN;\r
- SELECT DropGeometryColumn ('pgis_garden','the_geom');\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> DropGeometryTable','DropGeometryTable', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-\r
-BEGIN;\r
- SELECT DropGeometryTable ('pgis_garden');\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" />: End Testing <xsl:value-of select="@ID" />';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
-SELECT '<xsl:value-of select="$log_label" /> Geography: Start Testing <xsl:value-of select="@ID" />';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> Create Table / Add data - Geography','CREATE TABLE geography', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- CREATE TABLE pgis_geoggarden (gid serial PRIMARY KEY, the_geog geography(<xsl:value-of select="@GeometryType" />, 4326));\r
- INSERT INTO pgis_geoggarden(the_geog)\r
- SELECT the_geom\r
- FROM (<xsl:value-of select="." />) As foo;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing <xsl:value-of select="@ID" />';\r
-\r
-SELECT '<xsl:value-of select="$log_label" /> Geography index: Start Testing <xsl:value-of select="@ID" />';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geography','CREATE gist index geography', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- CREATE INDEX idx_pgis_geoggarden_geog_gist ON pgis_geoggarden USING gist(the_geog);\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> Geography index: End Testing <xsl:value-of select="@ID" />';\r
-\r
-\r
-<!-- vacuum analyze can't be put in a commit so we can't completely tell if it completes if it doesn't crash -->\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geography','analyze geography table', '<xsl:value-of select="@ID" />', clock_timestamp(),\r
- 'VACUUM ANALYZE pgis_geoggarden;');\r
-VACUUM ANALYZE pgis_geoggarden;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> drop Geography table','drop geography table', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- SELECT 'BEFORE DROP' As look_at, * FROM geography_columns;\r
- DROP TABLE pgis_geoggarden;\r
- SELECT 'AFTER DROP' As look_at, * FROM geography_columns;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
- </xsl:for-each>\r
-<!--End Test table creation, insert, drop -->\r
-\r
-<!--Start test on operators -->\r
- <xsl:for-each select="sect1[contains(@id,'Operator') and not(contains($fnexclude,funcdef/function))]/refentry">\r
- <xsl:sort select="@id"/>\r
- <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">\r
- <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>\r
- <xsl:variable name='fndef'><xsl:value-of select="." /></xsl:variable>\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <!--Store first garden sql geometry from -->\r
- <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>\r
- <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>\r
- <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>\r
- <xsl:variable name='log_label'><xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="$geom1id" /> against other types</xsl:variable>\r
- SELECT '<xsl:value-of select="$log_label" />: Start Testing ';\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <xsl:choose>\r
- <xsl:when test="contains($fndef, 'geography')">\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Geography <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeog1, ST_AsEWKT(foo2.the_geom) as ewktgeog2, geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom) As geog1_op_geog2\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- WHERE (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = true OR\r
- (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = false;</xsl:with-param>\r
-</xsl:call-template>');\r
-\r
- SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:when>\r
- <xsl:otherwise>\r
- SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Geometry <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeom1, ST_AsEWKT(foo2.the_geom) as ewktgeom2, foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom As geom1_op_geom2\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- WHERE (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = true OR\r
- (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = false;</xsl:with-param></xsl:call-template>');\r
-\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- </xsl:for-each>\r
- SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@GeometryType" /> against other types';\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
-<!--End test on operators -->\r
-<!-- Start regular function checks excluding operators -->\r
- <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">\r
- <xsl:sort select="@id"/>\r
-\r
- <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">\r
-<!--Create dummy paramaters to be used later -->\r
- <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>\r
- <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>\r
- <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>\r
- <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>\r
- <xsl:variable name='numparamgeogs'><xsl:value-of select="count(paramdef/type[contains(text(),'geography')] )" /></xsl:variable>\r
- <xsl:variable name='log_label'><xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)</xsl:variable>\r
-\r
- <xsl:variable name="geoftype">\r
- <!--Conditionally instantiate a value to be assigned to the variable -->\r
- <xsl:choose>\r
- <xsl:when test="$numparamgeoms > '0'">\r
- <xsl:value-of select="'Geometry'"/>\r
- </xsl:when>\r
- <xsl:when test="$numparamgeogs > '0'">\r
- <xsl:value-of select="'Geography'"/>\r
- </xsl:when>\r
- <xsl:otherwise>\r
- <xsl:value-of select="'Other'"/>\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- </xsl:variable>\r
- <!-- For each function prototype generate a test sql statement -->\r
- <xsl:choose>\r
-<!--Test functions that take no arguments and take no geometries/geographies -->\r
- <xsl:when test="($numparamgeoms = '0' and $numparamgeogs = '0') and not(contains($fnexclude,funcdef/function))">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" />','<xsl:value-of select="$fnname" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />) As output;</xsl:with-param></xsl:call-template>');\r
- \r
-BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" /> \r
-COMMIT;\r
-SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';\r
- </xsl:when>\r
-<!--Start Test aggregate and unary functions for both geometry and geography -->\r
-<!-- put functions that take only one geometry/geography no need to cross with another geom collection, these are unary geom, aggregates, and so forth -->\r
- <xsl:when test="($numparamgeoms = '1' or $numparamgeogs = '1') and not(contains($fnexclude,funcdef/function))" >\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing';\r
-\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text>','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result\r
- FROM (<xsl:value-of select="." />) As foo1\r
- LIMIT 3;</xsl:with-param></xsl:call-template>');\r
-BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" /> \r
-COMMIT; \r
- SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing'; \r
- </xsl:for-each>\r
- </xsl:when>\r
-\r
-<!--Functions more than 1 args not already covered this will cross every geometry type with every other -->\r
- <xsl:when test="not(contains($fnexclude,funcdef/function))">\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <!--Store first garden sql geometry from -->\r
- <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>\r
- <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>\r
- <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>\r
-SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" /> against other types';\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <xsl:choose>\r
- <xsl:when test="($numparamgeogs > '0' or $numparamgeoms > '0')">\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text> <xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />','<xsl:value-of select="$geom1id" />', '<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result, ST_AsText(foo1.the_geom) As ref1_geom, ST_AsText(foo2.the_geom) As ref2_geom\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- LIMIT 2;</xsl:with-param></xsl:call-template>');\r
-\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:when>\r
- <xsl:otherwise>\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Other <xsl:text> </xsl:text><xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@DI" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)</xsl:with-param></xsl:call-template>');\r
-\r
- SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- \r
- SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
- </xsl:for-each>\r
-SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@GeometryType" /> against other types';\r
- </xsl:for-each>\r
- </xsl:when>\r
- </xsl:choose>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- <!-- flag primary grouping the functions belong in -->\r
- UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geography' WHERE (log_label ILIKE '%geography%' or log_sql ILIKE '%geography%') AND spatial_class IS NULL;\r
- UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geometry' WHERE log_label ILIKE '%geometry%' or log_label ILIKE '%other%' AND spatial_class IS NULL;\r
-\r
- </xsl:template>\r
-\r
- <!--macro to replace func args with dummy var args -->\r
- <xsl:template name="replaceparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="contains(parameter, 'matrix') or contains(parameter, 'Matrix')">\r
- <xsl:value-of select="$var_matrix" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'distance')">\r
- <xsl:value-of select="$var_distance" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'srid')">\r
- <xsl:value-of select="$var_srid" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'position')">\r
- <xsl:value-of select="$var_position" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'NDR')">\r
- '<xsl:value-of select="$var_NDRXDR" />'\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'gj_version')">\r
- <xsl:value-of select="$var_gj_version" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'version') and position() = 2">\r
- <xsl:value-of select="$var_version1" />\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter, 'version'))">\r
- <xsl:value-of select="$var_version2" />\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter,'geomgml'))">\r
- <xsl:text>ST_AsGML(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter,'geomkml'))">\r
- <xsl:text>ST_AsKML(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">\r
- <xsl:text>foo1.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">\r
- <xsl:text>geography(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">\r
- <xsl:text>foo2.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="type = 'geography' or type = 'geography '">\r
- <xsl:text>geography(foo2.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">\r
- ARRAY[foo1.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]')">\r
- ARRAY[foo2.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKT')">\r
- <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'WKT')">\r
- <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKB')">\r
- <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'bytea')">\r
- <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'float') or contains(type, 'double')">\r
- <xsl:value-of select="$var_float1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'spheroid')">\r
- <xsl:value-of select="$var_spheroid" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer') and position() = 2">\r
- <xsl:value-of select="$var_integer1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer')">\r
- <xsl:value-of select="$var_integer2" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'text')">\r
- <xsl:value-of select="$var_text" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'varchar')">\r
- <xsl:value-of select="$var_varchar" />\r
- </xsl:when>\r
- <xsl:when test="contains(type,'timestamp') or type = 'date'">\r
- <xsl:text>'2009-01-01'</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'boolean')">\r
- <xsl:value-of select="$var_boolean" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
-\r
- <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->\r
- <xsl:template name="listparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="count(parameter) > 0">\r
- <xsl:value-of select="parameter" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
- \r
- <!-- copied from http://www.thedumbterminal.co.uk/php/knowledgebase/?action=view&id=94 -->\r
- <xsl:template name="escapesinglequotes">\r
- <xsl:param name="arg1"/>\r
- <xsl:variable name="apostrophe">'</xsl:variable>\r
- <xsl:choose>\r
- <!-- this string has at least on single quote -->\r
- <xsl:when test="contains($arg1, $apostrophe)">\r
- <xsl:if test="string-length(normalize-space(substring-before($arg1, $apostrophe))) > 0"><xsl:value-of select="substring-before($arg1, $apostrophe)" disable-output-escaping="yes"/>''</xsl:if>\r
- <xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1"><xsl:value-of select="substring-after($arg1, $apostrophe)" disable-output-escaping="yes"/></xsl:with-param>\r
- </xsl:call-template>\r
- </xsl:when>\r
- <!-- no quotes found in string, just print it -->\r
- <xsl:when test="string-length(normalize-space($arg1)) > 0"><xsl:value-of select="normalize-space($arg1)"/></xsl:when>\r
- </xsl:choose>\r
- </xsl:template>\r
-\r
-</xsl:stylesheet>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">
+<!-- ********************************************************************
+ * $Id$
+ ********************************************************************
+ Copyright 2008-2010, Regina Obe
+ License: BSD
+ Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the functions we have documented
+ using a garden variety of geometries. Its intent is to flag major crashes.
+ ******************************************************************** -->
+ <xsl:output method="text" />
+ <xsl:variable name='testversion'>2.0.0</xsl:variable>
+ <xsl:variable name='fnexclude14'>AddGeometryColumn DropGeometryColumn DropGeometryTable</xsl:variable>
+ <xsl:variable name='fnexclude'>AddGeometryColumn DropGeometryColumn DropGeometryTable</xsl:variable>
+ <!--This is just a place holder to state functions not supported in 1.3 or tested separately -->
+
+ <xsl:variable name='var_srid'>3395</xsl:variable>
+ <xsl:variable name='var_position'>1</xsl:variable>
+ <xsl:variable name='var_integer1'>3</xsl:variable>
+ <xsl:variable name='var_integer2'>5</xsl:variable>
+ <xsl:variable name='var_float1'>0.5</xsl:variable>
+ <xsl:variable name='var_float2'>0.75</xsl:variable>
+ <xsl:variable name='var_distance'>100</xsl:variable>
+ <xsl:variable name='var_version1'>1</xsl:variable>
+ <xsl:variable name='var_version2'>2</xsl:variable>
+ <xsl:variable name='var_gj_version'>1</xsl:variable> <!-- GeoJSON version -->
+ <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>
+ <xsl:variable name='var_text'>'monkey'</xsl:variable>
+ <xsl:variable name='var_varchar'>'test'</xsl:variable>
+ <xsl:variable name='var_spheroid'>'SPHEROID["GRS_1980",6378137,298.257222101]'</xsl:variable>
+ <xsl:variable name='var_matrix'>'FF1FF0102'</xsl:variable>
+ <xsl:variable name='var_boolean'>false</xsl:variable>
+ <xsl:variable name='var_logtable'>postgis_garden_log</xsl:variable>
+ <xsl:variable name='var_logupdatesql'>UPDATE <xsl:value-of select="$var_logtable" /> SET log_end = clock_timestamp()
+ FROM (SELECT logid FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC limit 1) As foo
+ WHERE <xsl:value-of select="$var_logtable" />.logid = foo.logid AND <xsl:value-of select="$var_logtable" />.log_end IS NULL;</xsl:variable>
+
+ <!-- for queries that result data, we first log the sql in our log table and then use query_to_xml to output it as xml for easy storage
+ with this approach our run statement is always exactly the same -->
+ <xsl:variable name='var_logresultsasxml'>INSERT INTO <xsl:value-of select="$var_logtable" />_output(logid, log_output)
+ SELECT logid, query_to_xml(log_sql, false,false,'') As log_output
+ FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC LIMIT 1;</xsl:variable>
+ <pgis:gardens>
+ <pgis:gset ID='POINT' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,2) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 5) j
+ ORDER BY i,j
+ )</pgis:gset>
+ <pgis:gset ID='LINESTRING' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) As j
+ WHERE NOT(i = j)
+ ORDER BY i, i*j)</pgis:gset>
+ <pgis:gset ID='POLYGON' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, i*j, j)</pgis:gset>
+ <pgis:gset ID='POINTM' GeometryType='POINTM'>(SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(50,70, 20) AS j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, i*j*m)</pgis:gset>
+ <pgis:gset ID='LINESTRINGM' GeometryType='LINESTRINGM'>(SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ WHERE NOT(i = j)
+ ORDER BY i, j, m, i*j*m)</pgis:gset>
+<!-- <pgis:gset ID='PolygonMSet' GeometryType='POLYGONM'>(SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePointM(i+m,j,m),4326),ST_SetSRID(ST_MakePointM(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePointM(i,j,m),4326)),ST_SetSRID(ST_MakePointM(i+m,j,m),4326))) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, m, i*j*m
+ )</pgis:gset>-->
+ <pgis:gset ID='POLYGONM' GeometryType='POLYGONM'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2503 1,-71.132 42.2502 3,-71.1323 42.2504 -2,-71.1322 42.2505 1,-71.1319 42.2503 0))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2512 0,-71.1318 42.2511 20,-71.1317 42.2511 -20,-71.1317 42.251 5,-71.1317 42.2509 4,-71.132 42.2511 6,-71.1319 42.2512 30))') )
+ ) As g(geom))</pgis:gset>
+
+ <pgis:gset ID='POINTZ' GeometryType='POINTZ'>(SELECT ST_SetSRID(ST_MakePoint(i,j,k),4326) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 20) j
+ CROSS JOIN generate_series(1,2) k
+ ORDER BY i,i*j, j*k, i + j + k)</pgis:gset>
+ <pgis:gset ID='LINESTRINGZ' GeometryType='LINESTRINGZ'>(SELECT ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 20) j
+ CROSS JOIN generate_series(1,2) k
+ ORDER BY i, j, i+j+k, k, i*j*k)</pgis:gset>
+<!-- <pgis:gset ID='PolygonSet3D' GeometryType='POLYGONZ'>(SELECT ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, i+j+m, m, i*j*m)</pgis:gset>-->
+ <pgis:gset ID='POLYGONZ' GeometryType='POLYGONZ'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1,-71.0767 42.3872 1,-71.0767 42.3863 1,-71.0771 42.3866 1))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2,-71.0773 42.3863 1.75,-71.0773 42.3859 1.75,-71.0775 42.386 2))') )
+ ) As g(geom))</pgis:gset>
+
+ <pgis:gset ID='POLYGONZM' GeometryType='POLYGONZM'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1 2,-71.0767 42.3872 1 2.3,-71.0767 42.3863 1 2.3,-71.0771 42.3866 1 2))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2 1.5,-71.0773 42.3863 1.75 1.5,-71.0773 42.3859 1.75 1.5,-71.0775 42.386 2 1.5))') )
+ ) As g(geom))</pgis:gset>
+
+ <pgis:gset ID='POLYHEDRALSURFACE' GeometryType='POLYHEDRALSURFACE'>(SELECT ST_Translate(the_geom,-72.2, 41.755) As the_geom
+ FROM (VALUES ( ST_GeomFromEWKT(
+'SRID=4326;PolyhedralSurface(
+((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
+((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
+((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1))
+)') ) ,
+( ST_GeomFromEWKT(
+'SRID=4326;PolyhedralSurface(
+((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
+((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)) )') ) )
+As foo(the_geom) ) </pgis:gset>
+
+ <pgis:gset ID='TRIANGLE' GeometryType='TRIANGLE'>(SELECT ST_GeomFromEWKT(
+'SRID=4326;TRIANGLE ((
+ -71.0821 42.3036,
+ -71.0821 42.3936,
+ -71.0901 42.3036,
+ -71.0821 42.3036
+ ))') As the_geom) </pgis:gset>
+
+ <pgis:gset ID='TIN' GeometryType='TIN'>(SELECT ST_GeomFromEWKT(
+'SRID=4326;TIN (((
+ -71.0821 42.3036 0,
+ -71.0821 42.3036 1,
+ -71.0821 42.3436 0,
+ -71.0821 42.3036 0
+ )), ((
+ -71.0821 42.3036 0,
+ -71.0821 42.3436 0,
+ -71.0831 42.3436 0,
+ -71.0821 42.3036 0
+ ))
+ )') As the_geom) </pgis:gset>
+
+<!-- <pgis:gset ID='GCSet3D' GeometryType='GEOMETRYCOLLECTIONZ' SkipUnary='1'>(SELECT ST_Collect(ST_Collect(ST_SetSRID(ST_MakePoint(i,j,m),4326),ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326))) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ )</pgis:gset>-->
+ <pgis:gset ID='GEOMETRYCOLLECTIONZ' GeometryType='GEOMETRYCOLLECTIONZ' SkipUnary='1'>(SELECT ST_Collect(geom) As the_geom
+ FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.0821 42.3036 2,-71.0822 42.3036 2,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 1,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1))') )
+ ) As g(geom) CROSS JOIN generate_series(1,3) As i
+ GROUP BY i
+ )</pgis:gset>
+
+ <pgis:gset ID='GEOMETRYCOLLECTIONM' GeometryType='GEOMETRYCOLLECTIONM' SkipUnary='1'>(SELECT ST_Collect(geom) As the_geom
+ FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((-71.0821 42.3036 2,-71.0822 42.3036 3,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 2,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1))') )
+ ) As g(geom) CROSS JOIN generate_series(1,3) As i
+ GROUP BY i
+ )</pgis:gset>
+
+<!-- MULTIs start here -->
+ <pgis:gset ID='MULTIPOINT' GeometryType='MULTIPOINT'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom
+ FROM generate_series(-10,50,15) As i
+ CROSS JOIN generate_series(40,70, 15) j
+ ) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTILINESTRING' GeometryType='MULTILINESTRING'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 15) As j
+ WHERE NOT(i = j)) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTIPOLYGON' GeometryType='MULTIPOLYGON'>(SELECT ST_Multi(ST_Union(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05))) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 25) As j)</pgis:gset>
+
+ <pgis:gset ID='MULTIPOINTZ' GeometryType='MULTIPOINTZ'>(SELECT ST_Collect(ST_SetSRID(ST_MakePoint(i,j,k),4326)) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 25) j
+ CROSS JOIN generate_series(1,3) k
+ )</pgis:gset>
+
+ <pgis:gset ID='MULTILINESTRINGZ' GeometryType='MULTILINESTRINGZ'>(SELECT ST_Multi(ST_Union(ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326))) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 25) j
+ CROSS JOIN generate_series(1,2) k
+ )</pgis:gset>
+
+<!-- <pgis:gset ID='MultiPolySet3D' GeometryType='MULTIPOLYGONZ'>(SELECT ST_Multi(ST_Union(s.the_geom)) As the_geom
+ FROM (SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePoint(i+m,j,m),4326),ST_SetSRID(ST_MakePoint(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePoint(i,j,m),4326)),ST_SetSRID(ST_MakePoint(i+m,j,m),4326))) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(50,70, 25) As j
+ CROSS JOIN generate_series(1,2) As m
+ ) As s)</pgis:gset>-->
+ <pgis:gset ID='MULTIPOLYGONZ' GeometryType='MULTIPOLYGONZ'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.0821 42.3036 2,-71.0822 42.3036 2,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),
+ ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 1,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1)))') )
+ ) As g(geom))</pgis:gset>
+
+
+ <pgis:gset ID='MULTIPOINTM' GeometryType='MULTIPOINTM'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326) As the_geom
+ FROM generate_series(-71,50,15) As i
+ CROSS JOIN generate_series(42,70, 25) AS j
+ CROSS JOIN generate_series(1,2) As m
+ ) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTILINESTRINGM' GeometryType='MULTILINESTRINGM'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom
+ FROM generate_series(-71,50,15) As i
+ CROSS JOIN generate_series(50,70, 25) As j
+ CROSS JOIN generate_series(1,2) As m
+ WHERE NOT(i = j)) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTIPOLYGONM' GeometryType='MULTIPOLYGONM'>(
+ SELECT ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 2,10 0 1,10 10 -2,0 10 -5,0 0 -5),(5 5 6,7 5 6,7 7 6,5 7 10,5 5 -2)))') As the_geom
+ )</pgis:gset>
+
+ <!-- replacing crasher with a more harmless curve polygon and circular string -->
+ <pgis:gset ID='CURVEPOLYGON' GeometryType='CURVEPOLYGON'>(SELECT ST_GeomFromEWKT('SRID=4326;CURVEPOLYGON(CIRCULARSTRING(-71.0821 42.3036, -71.4821 42.3036, -71.7821 42.7036, -71.0821 42.7036, -71.0821 42.3036),(-71.1821 42.4036, -71.3821 42.6036, -71.3821 42.4036, -71.1821 42.4036) ) ') As the_geom)</pgis:gset>
+
+ <pgis:gset ID='CURVEPOLYGON2' GeometryType='CURVEPOLYGON'>(SELECT ST_LineToCurve(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j)) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, j, i*j)
+ </pgis:gset>
+
+ <pgis:gset ID='CIRCULARSTRING' GeometryType='CIRCULARSTRING'>(SELECT ST_GeomFromEWKT('SRID=4326;CIRCULARSTRING(-71.0821 42.3036,-71.4821 42.3036,-71.7821 42.7036,-71.0821 42.7036,-71.0821 42.3036)') As the_geom)</pgis:gset>
+ <pgis:gset ID='MULTISURFACE' GeometryType='MULTISURFACE'>(SELECT ST_GeomFromEWKT('SRID=4326;MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(-71.0821 42.3036, -71.4821 42.3036, -71.7821 42.7036, -71.0821 42.7036, -71.0821 42.3036),(-71.1821 42.4036, -71.3821 42.6036, -71.3821 42.4036, -71.1821 42.4036) ))') As the_geom)</pgis:gset>
+ <!--These are special case geometries -->
+ <pgis:gset ID="Typed Empty Geometries" GeometryType="GEOMETRY" createtable="false">(SELECT ST_GeomFromText('POINT EMPTY',4326) As the_geom
+ UNION ALL SELECT ST_GeomFromText('MULTIPOINT EMPTY',4326) As the_geom
+ UNION ALL SELECT ST_GeomFromText('MULTIPOLYGON EMPTY',4326) As the_geom
+ UNION ALL SELECT ST_GeomFromText('LINESTRING EMPTY',4326) As the_geom
+ UNION ALL SELECT ST_GeomFromText('MULTILINESTRING EMPTY',4326) As the_geom
+ )
+ </pgis:gset>
+
+
+ <pgis:gset ID="Empty Geometry Collection" GeometryType="GEOMETRY" createtable="false">
+ (SELECT ST_GeomFromText('GEOMETRYCOLLECTION EMPTY',4326) As the_geom )
+ </pgis:gset>
+
+ <pgis:gset ID="Single NULL" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom)</pgis:gset>
+ <pgis:gset ID="Multiple NULLs" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom FROM generate_series(1,4) As foo)</pgis:gset>
+
+
+ <!-- TODO: Finish off MULTI list -->
+ </pgis:gardens>
+ <!--This is just a placeholder to hold geometries that will crash server when hitting against some functions
+ We'll fix these crashers in 1.4 -->
+ <pgis:gset ID='CurvePolySet' GeometryType='CURVEPOLYGON'>(SELECT ST_LineToCurve(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j)) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, j, i*j)</pgis:gset>
+ <pgis:gset ID='CircularStringSet' GeometryType='CIRCULARSTRING'>(SELECT ST_LineToCurve(ST_Boundary(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j))) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, j, i*j)</pgis:gset>
+
+ <pgis:gset ID="Collection of Empties" GeometryType="GEOMETRY" createtable="false">(SELECT ST_Collect(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY',4326), ST_GeomFromText('POLYGON EMPTY',4326)) As the_geom
+ UNION ALL SELECT ST_COLLECT(ST_GeomFromText('POLYGON EMPTY',4326),ST_GeomFromText('TRIANGLE EMPTY',4326)) As the_geom
+ UNION ALL SELECT ST_Collect(ST_GeomFromText('POINT EMPTY',4326), ST_GeomFromText('MULTIPOINT EMPTY',4326)) As the_geom
+ )</pgis:gset>
+ <pgis:gset ID="POLYGON EMPTY" GeometryType="POLYGON" createtable="false">(SELECT ST_GeomFromText('POLYGON EMPTY',4326) As the_geom)</pgis:gset>
+
+
+ <pgis:gardencrashers>
+
+
+ </pgis:gardencrashers>
+
+ <!-- We deal only with the reference chapter -->
+ <xsl:template match="/">
+<!-- Create logging tables -->
+DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />;
+CREATE TABLE <xsl:value-of select="$var_logtable" />(logid serial PRIMARY KEY, log_label text, spatial_class text, func text, g1 text, g2 text, log_start timestamp, log_end timestamp, log_sql text);
+DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />_output;
+CREATE TABLE <xsl:value-of select="$var_logtable" />_output(logid integer PRIMARY KEY, log_output xml);
+
+ <xsl:apply-templates select="/book/chapter[@id='reference']" />
+ </xsl:template>
+
+ <xsl:template match='chapter'>
+<!--Start Test table creation, insert, analyze crash test, drop -->
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset[not(contains(@createtable,'false'))]">
+ <xsl:variable name='log_label'>table Test <xsl:value-of select="@GeometryType" /></xsl:variable>
+SELECT '<xsl:value-of select="$log_label" />: Start Testing';
+<xsl:variable name='var_sql'>CREATE TABLE pgis_garden (gid serial);
+ SELECT AddGeometryColumn('pgis_garden','the_geom',ST_SRID(the_geom),GeometryType(the_geom),ST_CoordDim(the_geom))
+ FROM (<xsl:value-of select="." />) As foo limit 1;
+ SELECT AddGeometryColumn('pgis_garden','the_geom_multi',ST_SRID(the_geom),GeometryType(ST_Multi(the_geom)),ST_CoordDim(the_geom))
+ FROM (<xsl:value-of select="." />) As foo limit 1;</xsl:variable>
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+VALUES('<xsl:value-of select="$log_label" /> AddGeometryColumn','AddGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');
+BEGIN;
+ <xsl:value-of select="$var_sql" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+
+SELECT '<xsl:value-of select="$log_label" /> Geometry index: Start Testing <xsl:value-of select="@ID" />';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geometry','CREATE gist index geometry', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ CREATE INDEX idx_pgis_geom_gist ON pgis_garden USING gist(the_geom);
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> geometry index: End Testing <xsl:value-of select="@ID" />';
+
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+VALUES('<xsl:value-of select="$log_label" /> insert data Geometry','insert data', '<xsl:value-of select="@ID" />', clock_timestamp(), '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">INSERT INTO pgis_garden(the_geom, the_geom_multi)
+ SELECT the_geom, ST_Multi(the_geom)
+ FROM (<xsl:value-of select="." />) As foo;</xsl:with-param></xsl:call-template>');
+
+BEGIN;
+ INSERT INTO pgis_garden(the_geom, the_geom_multi)
+ SELECT the_geom, ST_Multi(the_geom)
+ FROM (<xsl:value-of select="." />) As foo;
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+
+
+SELECT '<xsl:value-of select="$log_label" /> Geometry index overlaps: Start Testing <xsl:value-of select="@ID" />';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) VALUES('<xsl:value-of select="$log_label" /> gist index Geometry overlaps test','Gist index overlap', '<xsl:value-of select="@ID" />', clock_timestamp(),
+ 'SELECT count(*) As result FROM pgis_garden As foo1 INNER JOIN pgis_garden As foo2 ON foo1.the_geom && foo2.the_geom');
+BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+
+SELECT '<xsl:value-of select="$log_label" /> geometry index overlaps: End Testing <xsl:value-of select="@ID" />';
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> UpdateGeometrySRID','UpdateGeometrySRID', '<xsl:value-of select="@GeometryType" />', clock_timestamp());
+BEGIN;
+ SELECT UpdateGeometrySRID('pgis_garden', 'the_geom', 4269);
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geometry','vacuum analyze Geometry', '<xsl:value-of select="@ID" />', clock_timestamp());
+VACUUM ANALYZE pgis_garden;
+<xsl:value-of select="$var_logupdatesql" />
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> DropGeometryColumn','DropGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp());
+
+BEGIN;
+ SELECT DropGeometryColumn ('pgis_garden','the_geom');
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> DropGeometryTable','DropGeometryTable', '<xsl:value-of select="@ID" />', clock_timestamp());
+
+BEGIN;
+ SELECT DropGeometryTable ('pgis_garden');
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" />: End Testing <xsl:value-of select="@ID" />';
+ <xsl:text>
+
+ </xsl:text>
+SELECT '<xsl:value-of select="$log_label" /> Geography: Start Testing <xsl:value-of select="@ID" />';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> Create Table / Add data - Geography','CREATE TABLE geography', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ CREATE TABLE pgis_geoggarden (gid serial PRIMARY KEY, the_geog geography(<xsl:value-of select="@GeometryType" />, 4326));
+ INSERT INTO pgis_geoggarden(the_geog)
+ SELECT the_geom
+ FROM (<xsl:value-of select="." />) As foo;
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing <xsl:value-of select="@ID" />';
+
+SELECT '<xsl:value-of select="$log_label" /> Geography index: Start Testing <xsl:value-of select="@ID" />';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geography','CREATE gist index geography', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ CREATE INDEX idx_pgis_geoggarden_geog_gist ON pgis_geoggarden USING gist(the_geog);
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> Geography index: End Testing <xsl:value-of select="@ID" />';
+
+
+<!-- vacuum analyze can't be put in a commit so we can't completely tell if it completes if it doesn't crash -->
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geography','analyze geography table', '<xsl:value-of select="@ID" />', clock_timestamp(),
+ 'VACUUM ANALYZE pgis_geoggarden;');
+VACUUM ANALYZE pgis_geoggarden;
+ <xsl:value-of select="$var_logupdatesql" />
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> drop Geography table','drop geography table', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ SELECT 'BEFORE DROP' As look_at, * FROM geography_columns;
+ DROP TABLE pgis_geoggarden;
+ SELECT 'AFTER DROP' As look_at, * FROM geography_columns;
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+<!--End Test table creation, insert, drop -->
+
+<!--Start test on operators -->
+ <xsl:for-each select="sect1[contains(@id,'Operator') and not(contains($fnexclude,funcdef/function))]/refentry">
+ <xsl:sort select="@id"/>
+ <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">
+ <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>
+ <xsl:variable name='fndef'><xsl:value-of select="." /></xsl:variable>
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <!--Store first garden sql geometry from -->
+ <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>
+ <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>
+ <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>
+ <xsl:variable name='log_label'><xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="$geom1id" /> against other types</xsl:variable>
+ SELECT '<xsl:value-of select="$log_label" />: Start Testing ';
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <xsl:choose>
+ <xsl:when test="contains($fndef, 'geography')">
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Geography <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeog1, ST_AsEWKT(foo2.the_geom) as ewktgeog2, geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom) As geog1_op_geog2
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ WHERE (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = true OR
+ (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = false;</xsl:with-param>
+</xsl:call-template>');
+
+ SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:when>
+ <xsl:otherwise>
+ SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Geometry <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeom1, ST_AsEWKT(foo2.the_geom) as ewktgeom2, foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom As geom1_op_geom2
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ WHERE (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = true OR
+ (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = false;</xsl:with-param></xsl:call-template>');
+
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@GeometryType" /> against other types';
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+<!--End test on operators -->
+<!-- Start regular function checks excluding operators -->
+ <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">
+ <xsl:sort select="@id"/>
+
+ <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">
+<!--Create dummy parameters to be used later -->
+ <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>
+ <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>
+ <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>
+ <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>
+ <xsl:variable name='numparamgeogs'><xsl:value-of select="count(paramdef/type[contains(text(),'geography')] )" /></xsl:variable>
+ <xsl:variable name='log_label'><xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)</xsl:variable>
+
+ <xsl:variable name="geoftype">
+ <!--Conditionally instantiate a value to be assigned to the variable -->
+ <xsl:choose>
+ <xsl:when test="$numparamgeoms > '0'">
+ <xsl:value-of select="'Geometry'"/>
+ </xsl:when>
+ <xsl:when test="$numparamgeogs > '0'">
+ <xsl:value-of select="'Geography'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'Other'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- For each function prototype generate a test sql statement -->
+ <xsl:choose>
+<!--Test functions that take no arguments and take no geometries/geographies -->
+ <xsl:when test="($numparamgeoms = '0' and $numparamgeogs = '0') and not(contains($fnexclude,funcdef/function))">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" />','<xsl:value-of select="$fnname" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />) As output;</xsl:with-param></xsl:call-template>');
+
+BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';
+ </xsl:when>
+<!--Start Test aggregate and unary functions for both geometry and geography -->
+<!-- put functions that take only one geometry/geography no need to cross with another geom collection, these are unary geom, aggregates, and so forth -->
+ <xsl:when test="($numparamgeoms = '1' or $numparamgeogs = '1') and not(contains($fnexclude,funcdef/function))" >
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing';
+
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text>','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result
+ FROM (<xsl:value-of select="." />) As foo1
+ LIMIT 3;</xsl:with-param></xsl:call-template>');
+BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+ SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing';
+ </xsl:for-each>
+ </xsl:when>
+
+<!--Functions more than 1 args not already covered this will cross every geometry type with every other -->
+ <xsl:when test="not(contains($fnexclude,funcdef/function))">
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <!--Store first garden sql geometry from -->
+ <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>
+ <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>
+ <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>
+SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" /> against other types';
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <xsl:choose>
+ <xsl:when test="($numparamgeogs > '0' or $numparamgeoms > '0')">
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text> <xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />','<xsl:value-of select="$geom1id" />', '<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result, ST_AsText(foo1.the_geom) As ref1_geom, ST_AsText(foo2.the_geom) As ref2_geom
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ LIMIT 2;</xsl:with-param></xsl:call-template>');
+
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:when>
+ <xsl:otherwise>
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Other <xsl:text> </xsl:text><xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@DI" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)</xsl:with-param></xsl:call-template>');
+
+ SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:otherwise>
+ </xsl:choose>
+
+ SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@GeometryType" /> against other types';
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ <!-- flag primary grouping the functions belong in -->
+ UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geography' WHERE (log_label ILIKE '%geography%' or log_sql ILIKE '%geography%') AND spatial_class IS NULL;
+ UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geometry' WHERE log_label ILIKE '%geometry%' or log_label ILIKE '%other%' AND spatial_class IS NULL;
+
+ </xsl:template>
+
+ <!--macro to replace func args with dummy var args -->
+ <xsl:template name="replaceparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="contains(parameter, 'matrix') or contains(parameter, 'Matrix')">
+ <xsl:value-of select="$var_matrix" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'distance')">
+ <xsl:value-of select="$var_distance" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'srid')">
+ <xsl:value-of select="$var_srid" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'position')">
+ <xsl:value-of select="$var_position" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'NDR')">
+ '<xsl:value-of select="$var_NDRXDR" />'
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'gj_version')">
+ <xsl:value-of select="$var_gj_version" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'version') and position() = 2">
+ <xsl:value-of select="$var_version1" />
+ </xsl:when>
+ <xsl:when test="(contains(parameter, 'version'))">
+ <xsl:value-of select="$var_version2" />
+ </xsl:when>
+ <xsl:when test="(contains(parameter,'geomgml'))">
+ <xsl:text>ST_AsGML(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="(contains(parameter,'geomkml'))">
+ <xsl:text>ST_AsKML(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">
+ <xsl:text>foo1.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">
+ <xsl:text>geography(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">
+ <xsl:text>foo2.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="type = 'geography' or type = 'geography '">
+ <xsl:text>geography(foo2.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">
+ ARRAY[foo1.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]')">
+ ARRAY[foo2.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKT')">
+ <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'WKT')">
+ <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKB')">
+ <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'bytea')">
+ <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'float') or contains(type, 'double')">
+ <xsl:value-of select="$var_float1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'spheroid')">
+ <xsl:value-of select="$var_spheroid" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer') and position() = 2">
+ <xsl:value-of select="$var_integer1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer')">
+ <xsl:value-of select="$var_integer2" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'text')">
+ <xsl:value-of select="$var_text" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'varchar')">
+ <xsl:value-of select="$var_varchar" />
+ </xsl:when>
+ <xsl:when test="contains(type,'timestamp') or type = 'date'">
+ <xsl:text>'2009-01-01'</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'boolean')">
+ <xsl:value-of select="$var_boolean" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->
+ <xsl:template name="listparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="count(parameter) > 0">
+ <xsl:value-of select="parameter" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- copied from http://www.thedumbterminal.co.uk/php/knowledgebase/?action=view&id=94 -->
+ <xsl:template name="escapesinglequotes">
+ <xsl:param name="arg1"/>
+ <xsl:variable name="apostrophe">'</xsl:variable>
+ <xsl:choose>
+ <!-- this string has at least on single quote -->
+ <xsl:when test="contains($arg1, $apostrophe)">
+ <xsl:if test="string-length(normalize-space(substring-before($arg1, $apostrophe))) > 0"><xsl:value-of select="substring-before($arg1, $apostrophe)" disable-output-escaping="yes"/>''</xsl:if>
+ <xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1"><xsl:value-of select="substring-after($arg1, $apostrophe)" disable-output-escaping="yes"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- no quotes found in string, just print it -->
+ <xsl:when test="string-length(normalize-space($arg1)) > 0"><xsl:value-of select="normalize-space($arg1)"/></xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
-<?xml version="1.0" encoding="utf-8"?>\r
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">\r
-<!-- ********************************************************************\r
- * $Id$\r
- ********************************************************************\r
- Copyright 2009, Regina Obe\r
- License: BSD\r
- Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the functions we have documented\r
- using a garden variety of geometries. Its intent is to flag major crashes. This version is similar to the full but designed to\r
- test more geometries but only against one function. Useful for intro of new functions or comparing major changes from function of one version of PostGIS to the other\r
- ******************************************************************** -->\r
- <xsl:output method="text" />\r
- <xsl:variable name='testversion'>1.5.0</xsl:variable>\r
- <xsl:variable name="fninclude"><xsl:value-of select="$inputfninclude"/></xsl:variable>\r
- <xsl:variable name='var_srid'>3395</xsl:variable>\r
- <xsl:variable name='var_position'>1</xsl:variable>\r
- <xsl:variable name='var_integer1'>3</xsl:variable>\r
- <xsl:variable name='var_integer2'>5</xsl:variable>\r
- <xsl:variable name='var_float1'>0.5</xsl:variable>\r
- <xsl:variable name='var_float2'>0.75</xsl:variable>\r
- <xsl:variable name='var_distance'>100</xsl:variable>\r
- <xsl:variable name='var_version1'>1</xsl:variable>\r
- <xsl:variable name='var_version2'>2</xsl:variable>\r
- <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>\r
- <xsl:variable name='var_text'>'monkey'</xsl:variable>\r
- <xsl:variable name='var_varchar'>'test'</xsl:variable>\r
- <xsl:variable name='var_spheroid'>'SPHEROID["GRS_1980",6378137,298.257222101]'</xsl:variable>\r
- <xsl:variable name='var_matrix'>'FF1FF0102'</xsl:variable>\r
- <xsl:variable name='var_boolean'>false</xsl:variable>\r
- <pgis:gardens>\r
- <pgis:gset ID='PointSet' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) j\r
- ORDER BY i,j\r
- )</pgis:gset>\r
- <pgis:gset ID='LineSet' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) As j\r
- WHERE NOT(i = j)\r
- ORDER BY i, i*j)</pgis:gset>\r
- <pgis:gset ID='PolySet' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, i*j, j)</pgis:gset>\r
- <pgis:gset ID='PointMSet' GeometryType='POINTM'>(SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 20) AS j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, i*j*m)</pgis:gset>\r
- <pgis:gset ID='LineMSet' GeometryType='LINESTRINGM'>(SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- WHERE NOT(i = j)\r
- ORDER BY i, j, m, i*j*m)</pgis:gset>\r
- <pgis:gset ID='PolygonMSet' GeometryType='POLYGONM'>(SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePointM(i+m,j,m),4326),ST_SetSRID(ST_MakePointM(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePointM(i,j,m),4326)),ST_SetSRID(ST_MakePointM(i+m,j,m),4326))) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, m, i*j*m\r
- )</pgis:gset>\r
- <pgis:gset ID='PointSet3D' GeometryType='POINTZ'>(SELECT ST_SetSRID(ST_MakePoint(i,j,k),4326) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 20) j\r
- CROSS JOIN generate_series(1,2) k\r
- ORDER BY i,i*j, j*k, i + j + k)</pgis:gset>\r
- <pgis:gset ID='LineSet3D' GeometryType='LINESTRINGZ'>(SELECT ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 20) j\r
- CROSS JOIN generate_series(1,2) k\r
- ORDER BY i, j, i+j+k, k, i*j*k)</pgis:gset>\r
- <pgis:gset ID='PolygonSet3D' GeometryType='POLYGONZ'>(SELECT ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, i+j+m, m, i*j*m)</pgis:gset>\r
- \r
- <pgis:gset ID='PolyhedralSurface' GeometryType='PolyhedralSurface'>(SELECT ST_GeomFromEWKT(\r
-'SRID=0;PolyhedralSurface( \r
-((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), \r
-((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), \r
-((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) \r
-)') )</pgis:gset>\r
-\r
- <pgis:gset ID='GCSet3D' GeometryType='GEOMETRYCOLLECTIONZ' SkipUnary='1'>(SELECT ST_Collect(ST_Collect(ST_SetSRID(ST_MakePoint(i,j,m),4326),ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326))) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- )</pgis:gset>\r
-\r
-<!-- MULTIs start here -->\r
- <pgis:gset ID='MultiPointSet' GeometryType='MULTIPOINT'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) j\r
- ) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MultiLineSet' GeometryType='MULTILINESTRING'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) As j\r
- WHERE NOT(i = j)) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MultiPolySet' GeometryType='MULTIPOLYGON'>(SELECT ST_Multi(ST_Union(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05))) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 25) As j)</pgis:gset>\r
-\r
- <pgis:gset ID='MultiPointSet3D' GeometryType='MULTIPOINTZ'>(SELECT ST_Collect(ST_SetSRID(ST_MakePoint(i,j,k),4326)) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 25) j\r
- CROSS JOIN generate_series(1,3) k\r
- )</pgis:gset>\r
-\r
- <pgis:gset ID='MultiLineSet3D' GeometryType='MULTILINESTRINGZ'>(SELECT ST_Multi(ST_Union(ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326))) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 25) j\r
- CROSS JOIN generate_series(1,2) k\r
- )</pgis:gset>\r
-\r
- <pgis:gset ID='MultiPolySet3D' GeometryType='MULTIPOLYGONZ'>(SELECT ST_Multi(ST_Union(s.the_geom)) As the_geom\r
- FROM (SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePoint(i+m,j,m),4326),ST_SetSRID(ST_MakePoint(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePoint(i,j,m),4326)),ST_SetSRID(ST_MakePoint(i+m,j,m),4326))) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 25) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MultiPointMSet' GeometryType='MULTIPOINTM'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 25) AS j\r
- CROSS JOIN generate_series(1,2) As m\r
- ) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MultiLineMSet' GeometryType='MULTILINESTRINGM'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom\r
- FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(50,70, 25) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- WHERE NOT(i = j)) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MultiPolygonMSet' GeometryType='MULTIPOLYGONM'>(\r
- SELECT ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 2,10 0 1,10 10 -2,0 10 -5,0 0 -5),(5 5 6,7 5 6,7 7 6,5 7 10,5 5 -2)))') As the_geom\r
- )</pgis:gset>\r
-\r
- <!--These are special case geometries -->\r
- <pgis:gset ID="Empty" GeometryType="GEOMETRY" createtable="false">(SELECT ST_GeomFromText('GEOMETRYCOLLECTION EMPTY',4326) As the_geom\r
- UNION ALL SELECT ST_GeomFromText('POLYGON EMPTY',4326) As the_geom\r
- )\r
- </pgis:gset>\r
- \r
- <pgis:gset ID="SingleNULL" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom)</pgis:gset>\r
- <pgis:gset ID="MultipleNULLs" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom FROM generate_series(1,4) As foo)</pgis:gset>\r
-\r
-\r
- <!-- TODO: Finish off MULTI list -->\r
- </pgis:gardens>\r
- <!--This is just a placeholder to hold geometries that will crash server when hitting against some functions\r
- We'll fix these crashers in 1.4 -->\r
- <pgis:gardencrashers>\r
- <pgis:gset ID='CurvePolySet' GeometryType='CURVEPOLYGON'>(SELECT ST_LineToCurve(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j)) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, j, i*j)</pgis:gset>\r
- <pgis:gset ID='CircularStringSet' GeometryType='CIRCULARSTRING'>(SELECT ST_LineToCurve(ST_Boundary(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j))) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, j, i*j)</pgis:gset>\r
- \r
- </pgis:gardencrashers>\r
-\r
- <!-- We deal only with the reference chapter -->\r
- <xsl:template match="/">\r
- <xsl:apply-templates select="/book/chapter[@id='reference']" />\r
- </xsl:template>\r
-\r
- <xsl:template match='chapter'>\r
-<!-- Start regular function checks excluding operators -->\r
- <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">\r
- <xsl:sort select="@id"/>\r
-\r
- <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">\r
-<!--Create dummy paramaters to be used later -->\r
- <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>\r
- <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>\r
- <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>\r
- <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>\r
- <xsl:variable name='numparamgeogs'><xsl:value-of select="count(paramdef/type[contains(text(),'geography')] )" /></xsl:variable>\r
- <!-- For each function prototype generate a test sql statement -->\r
- <xsl:choose>\r
-<!--Test functions that take no arguments or take no geometries -->\r
- <xsl:when test="$numparamgeoms = '0' and contains($fninclude,funcdef/function)">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';BEGIN;\r
-SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />);\r
-COMMIT;\r
-SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';\r
- </xsl:when>\r
-<!--Start Test aggregate and unary functions -->\r
-<!-- put functions that take only one geometry no need to cross with another geom collection, these are unary geom, aggregates, and so forth -->\r
- <xsl:when test="$numparamgeoms = '1' and contains($fninclude,funcdef/function)" >\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <xsl:choose>\r
- <xsl:when test="contains(paramdef, 'geometry ')">\r
- \r
- SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';\r
- BEGIN; <!-- If output is geometry show ewkt rep -->\r
- SELECT ST_AsEWKT(<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />))\r
- </xsl:when>\r
- <xsl:when test="contains(paramdef, 'geography ')">\r
- SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';\r
- BEGIN; <!-- If output is geometry show astext rep -->\r
- SELECT ST_AsText(<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />))\r
- </xsl:when>\r
- <xsl:otherwise>\r
- SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';\r
- BEGIN; <!-- If output is geometry show ewkt rep -->\r
- SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- FROM (<xsl:value-of select="." />) As foo1\r
- LIMIT 3;\r
- COMMIT;\r
- SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@GeometryType" />';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
- </xsl:for-each>\r
- </xsl:when>\r
-\r
-<!--Functions more than 1 args not already covered this will cross every geometry type with every other -->\r
- <xsl:when test="contains($fninclude,funcdef/function)">\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <!--Store first garden sql geometry from -->\r
- <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>\r
- <xsl:variable name='geom1type'><xsl:value-of select="@ID"/></xsl:variable>\r
-SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" /> against other types';\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <xsl:choose>\r
- <xsl:when test="$numparamgeogs > '0'">\r
- SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';\r
- BEGIN; <!-- If output is geography show wkt rep -->\r
- SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsText(foo1.the_geom) As ref1_geom, ST_AsText(foo2.the_geom) As ref2_geom\r
- </xsl:when>\r
- <xsl:when test="$numparamgeoms > '0'">\r
- SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';\r
- BEGIN; <!-- If output is geometry show ewkt rep -->\r
- SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsEWKT(foo1.the_geom) As ref1_geom, ST_AsEWKT(foo2.the_geom) As ref2_geom\r
- </xsl:when>\r
- <xsl:otherwise>\r
- SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';\r
- BEGIN; <!-- If output is geography show wkt rep -->\r
- SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- LIMIT 2;\r
- COMMIT;\r
- SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
- </xsl:for-each>\r
-SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@GeometryType" /> against other types';\r
- </xsl:for-each>\r
- </xsl:when>\r
- </xsl:choose>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
-\r
- <!--macro to replace func args with dummy var args -->\r
- <xsl:template name="replaceparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="contains(parameter, 'matrix') or contains(parameter, 'Matrix')">\r
- <xsl:value-of select="$var_matrix" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'distance')">\r
- <xsl:value-of select="$var_distance" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'srid')">\r
- <xsl:value-of select="$var_srid" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'position')">\r
- <xsl:value-of select="$var_position" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'NDR')">\r
- '<xsl:value-of select="$var_NDRXDR" />'\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'version') and position() = 2">\r
- <xsl:value-of select="$var_version1" />\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter, 'version'))">\r
- <xsl:value-of select="$var_version2" />\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter,'geomgml'))">\r
- <xsl:text>ST_AsGML(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">\r
- <xsl:text>foo1.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">\r
- <xsl:text>geography(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">\r
- <xsl:text>foo2.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="type = 'geography' or type = 'geography '">\r
- <xsl:text>geography(foo2.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">\r
- ARRAY[foo1.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]')">\r
- ARRAY[foo2.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKT')">\r
- <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'WKT')">\r
- <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKB')">\r
- <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'bytea')">\r
- <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'float') or contains(type, 'double')">\r
- <xsl:value-of select="$var_float1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'spheroid')">\r
- <xsl:value-of select="$var_spheroid" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer') and position() = 2">\r
- <xsl:value-of select="$var_integer1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer')">\r
- <xsl:value-of select="$var_integer2" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'text')">\r
- <xsl:value-of select="$var_text" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'varchar')">\r
- <xsl:value-of select="$var_varchar" />\r
- </xsl:when>\r
- <xsl:when test="contains(type,'timestamp') or type = 'date'">\r
- <xsl:text>'2009-01-01'</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'boolean')">\r
- <xsl:value-of select="$var_boolean" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
-\r
- <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->\r
- <xsl:template name="listparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="count(parameter) > 0">\r
- <xsl:value-of select="parameter" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
-</xsl:stylesheet>\r
+<?xml version="1.0" encoding="utf-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">
+<!-- ********************************************************************
+ * $Id$
+ ********************************************************************
+ Copyright 2009, Regina Obe
+ License: BSD
+ Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the functions we have documented
+ using a garden variety of geometries. Its intent is to flag major crashes. This version is similar to the full but designed to
+ test more geometries but only against one function. Useful for intro of new functions or comparing major changes from function of one version of PostGIS to the other
+ ******************************************************************** -->
+ <xsl:output method="text" />
+ <xsl:variable name='testversion'>1.5.0</xsl:variable>
+ <xsl:variable name="fninclude"><xsl:value-of select="$inputfninclude"/></xsl:variable>
+ <xsl:variable name='var_srid'>3395</xsl:variable>
+ <xsl:variable name='var_position'>1</xsl:variable>
+ <xsl:variable name='var_integer1'>3</xsl:variable>
+ <xsl:variable name='var_integer2'>5</xsl:variable>
+ <xsl:variable name='var_float1'>0.5</xsl:variable>
+ <xsl:variable name='var_float2'>0.75</xsl:variable>
+ <xsl:variable name='var_distance'>100</xsl:variable>
+ <xsl:variable name='var_version1'>1</xsl:variable>
+ <xsl:variable name='var_version2'>2</xsl:variable>
+ <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>
+ <xsl:variable name='var_text'>'monkey'</xsl:variable>
+ <xsl:variable name='var_varchar'>'test'</xsl:variable>
+ <xsl:variable name='var_spheroid'>'SPHEROID["GRS_1980",6378137,298.257222101]'</xsl:variable>
+ <xsl:variable name='var_matrix'>'FF1FF0102'</xsl:variable>
+ <xsl:variable name='var_boolean'>false</xsl:variable>
+ <pgis:gardens>
+ <pgis:gset ID='PointSet' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) j
+ ORDER BY i,j
+ )</pgis:gset>
+ <pgis:gset ID='LineSet' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) As j
+ WHERE NOT(i = j)
+ ORDER BY i, i*j)</pgis:gset>
+ <pgis:gset ID='PolySet' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, i*j, j)</pgis:gset>
+ <pgis:gset ID='PointMSet' GeometryType='POINTM'>(SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 20) AS j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, i*j*m)</pgis:gset>
+ <pgis:gset ID='LineMSet' GeometryType='LINESTRINGM'>(SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ WHERE NOT(i = j)
+ ORDER BY i, j, m, i*j*m)</pgis:gset>
+ <pgis:gset ID='PolygonMSet' GeometryType='POLYGONM'>(SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePointM(i+m,j,m),4326),ST_SetSRID(ST_MakePointM(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePointM(i,j,m),4326)),ST_SetSRID(ST_MakePointM(i+m,j,m),4326))) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, m, i*j*m
+ )</pgis:gset>
+ <pgis:gset ID='PointSet3D' GeometryType='POINTZ'>(SELECT ST_SetSRID(ST_MakePoint(i,j,k),4326) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 20) j
+ CROSS JOIN generate_series(1,2) k
+ ORDER BY i,i*j, j*k, i + j + k)</pgis:gset>
+ <pgis:gset ID='LineSet3D' GeometryType='LINESTRINGZ'>(SELECT ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 20) j
+ CROSS JOIN generate_series(1,2) k
+ ORDER BY i, j, i+j+k, k, i*j*k)</pgis:gset>
+ <pgis:gset ID='PolygonSet3D' GeometryType='POLYGONZ'>(SELECT ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, i+j+m, m, i*j*m)</pgis:gset>
+
+ <pgis:gset ID='PolyhedralSurface' GeometryType='PolyhedralSurface'>(SELECT ST_GeomFromEWKT(
+'SRID=0;PolyhedralSurface(
+((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
+((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
+((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1))
+)') )</pgis:gset>
+
+ <pgis:gset ID='GCSet3D' GeometryType='GEOMETRYCOLLECTIONZ' SkipUnary='1'>(SELECT ST_Collect(ST_Collect(ST_SetSRID(ST_MakePoint(i,j,m),4326),ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326))) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ )</pgis:gset>
+
+<!-- MULTIs start here -->
+ <pgis:gset ID='MultiPointSet' GeometryType='MULTIPOINT'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) j
+ ) As s)</pgis:gset>
+
+ <pgis:gset ID='MultiLineSet' GeometryType='MULTILINESTRING'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) As j
+ WHERE NOT(i = j)) As s)</pgis:gset>
+
+ <pgis:gset ID='MultiPolySet' GeometryType='MULTIPOLYGON'>(SELECT ST_Multi(ST_Union(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05))) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 25) As j)</pgis:gset>
+
+ <pgis:gset ID='MultiPointSet3D' GeometryType='MULTIPOINTZ'>(SELECT ST_Collect(ST_SetSRID(ST_MakePoint(i,j,k),4326)) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 25) j
+ CROSS JOIN generate_series(1,3) k
+ )</pgis:gset>
+
+ <pgis:gset ID='MultiLineSet3D' GeometryType='MULTILINESTRINGZ'>(SELECT ST_Multi(ST_Union(ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326))) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 25) j
+ CROSS JOIN generate_series(1,2) k
+ )</pgis:gset>
+
+ <pgis:gset ID='MultiPolySet3D' GeometryType='MULTIPOLYGONZ'>(SELECT ST_Multi(ST_Union(s.the_geom)) As the_geom
+ FROM (SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePoint(i+m,j,m),4326),ST_SetSRID(ST_MakePoint(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePoint(i,j,m),4326)),ST_SetSRID(ST_MakePoint(i+m,j,m),4326))) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 25) As j
+ CROSS JOIN generate_series(1,2) As m
+ ) As s)</pgis:gset>
+
+ <pgis:gset ID='MultiPointMSet' GeometryType='MULTIPOINTM'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 25) AS j
+ CROSS JOIN generate_series(1,2) As m
+ ) As s)</pgis:gset>
+
+ <pgis:gset ID='MultiLineMSet' GeometryType='MULTILINESTRINGM'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom
+ FROM (SELECT a*1.01234567890 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(50,70, 25) As j
+ CROSS JOIN generate_series(1,2) As m
+ WHERE NOT(i = j)) As s)</pgis:gset>
+
+ <pgis:gset ID='MultiPolygonMSet' GeometryType='MULTIPOLYGONM'>(
+ SELECT ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 2,10 0 1,10 10 -2,0 10 -5,0 0 -5),(5 5 6,7 5 6,7 7 6,5 7 10,5 5 -2)))') As the_geom
+ )</pgis:gset>
+
+ <!--These are special case geometries -->
+ <pgis:gset ID="Empty" GeometryType="GEOMETRY" createtable="false">(SELECT ST_GeomFromText('GEOMETRYCOLLECTION EMPTY',4326) As the_geom
+ UNION ALL SELECT ST_GeomFromText('POLYGON EMPTY',4326) As the_geom
+ )
+ </pgis:gset>
+
+ <pgis:gset ID="SingleNULL" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom)</pgis:gset>
+ <pgis:gset ID="MultipleNULLs" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom FROM generate_series(1,4) As foo)</pgis:gset>
+
+
+ <!-- TODO: Finish off MULTI list -->
+ </pgis:gardens>
+ <!--This is just a placeholder to hold geometries that will crash server when hitting against some functions
+ We'll fix these crashers in 1.4 -->
+ <pgis:gardencrashers>
+ <pgis:gset ID='CurvePolySet' GeometryType='CURVEPOLYGON'>(SELECT ST_LineToCurve(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j)) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, j, i*j)</pgis:gset>
+ <pgis:gset ID='CircularStringSet' GeometryType='CIRCULARSTRING'>(SELECT ST_LineToCurve(ST_Boundary(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j))) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, j, i*j)</pgis:gset>
+
+ </pgis:gardencrashers>
+
+ <!-- We deal only with the reference chapter -->
+ <xsl:template match="/">
+ <xsl:apply-templates select="/book/chapter[@id='reference']" />
+ </xsl:template>
+
+ <xsl:template match='chapter'>
+<!-- Start regular function checks excluding operators -->
+ <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">
+ <xsl:sort select="@id"/>
+
+ <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">
+<!--Create dummy parameters to be used later -->
+ <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>
+ <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>
+ <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>
+ <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>
+ <xsl:variable name='numparamgeogs'><xsl:value-of select="count(paramdef/type[contains(text(),'geography')] )" /></xsl:variable>
+ <!-- For each function prototype generate a test sql statement -->
+ <xsl:choose>
+<!--Test functions that take no arguments or take no geometries -->
+ <xsl:when test="$numparamgeoms = '0' and contains($fninclude,funcdef/function)">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';BEGIN;
+SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />);
+COMMIT;
+SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';
+ </xsl:when>
+<!--Start Test aggregate and unary functions -->
+<!-- put functions that take only one geometry no need to cross with another geom collection, these are unary geom, aggregates, and so forth -->
+ <xsl:when test="$numparamgeoms = '1' and contains($fninclude,funcdef/function)" >
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <xsl:choose>
+ <xsl:when test="contains(paramdef, 'geometry ')">
+
+ SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';
+ BEGIN; <!-- If output is geometry show ewkt rep -->
+ SELECT ST_AsEWKT(<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />))
+ </xsl:when>
+ <xsl:when test="contains(paramdef, 'geography ')">
+ SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';
+ BEGIN; <!-- If output is geometry show astext rep -->
+ SELECT ST_AsText(<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />))
+ </xsl:when>
+ <xsl:otherwise>
+ SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';
+ BEGIN; <!-- If output is geometry show ewkt rep -->
+ SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)
+ </xsl:otherwise>
+ </xsl:choose>
+ FROM (<xsl:value-of select="." />) As foo1
+ LIMIT 3;
+ COMMIT;
+ SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@GeometryType" />';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+ </xsl:when>
+
+<!--Functions more than 1 args not already covered this will cross every geometry type with every other -->
+ <xsl:when test="contains($fninclude,funcdef/function)">
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <!--Store first garden sql geometry from -->
+ <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>
+ <xsl:variable name='geom1type'><xsl:value-of select="@ID"/></xsl:variable>
+SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" /> against other types';
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <xsl:choose>
+ <xsl:when test="$numparamgeogs > '0'">
+ SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';
+ BEGIN; <!-- If output is geography show wkt rep -->
+ SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsText(foo1.the_geom) As ref1_geom, ST_AsText(foo2.the_geom) As ref2_geom
+ </xsl:when>
+ <xsl:when test="$numparamgeoms > '0'">
+ SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';
+ BEGIN; <!-- If output is geometry show ewkt rep -->
+ SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsEWKT(foo1.the_geom) As ref1_geom, ST_AsEWKT(foo2.the_geom) As ref2_geom
+ </xsl:when>
+ <xsl:otherwise>
+ SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';
+ BEGIN; <!-- If output is geography show wkt rep -->
+ SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)
+ </xsl:otherwise>
+ </xsl:choose>
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ LIMIT 2;
+ COMMIT;
+ SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryType" />';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@GeometryType" /> against other types';
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!--macro to replace func args with dummy var args -->
+ <xsl:template name="replaceparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="contains(parameter, 'matrix') or contains(parameter, 'Matrix')">
+ <xsl:value-of select="$var_matrix" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'distance')">
+ <xsl:value-of select="$var_distance" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'srid')">
+ <xsl:value-of select="$var_srid" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'position')">
+ <xsl:value-of select="$var_position" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'NDR')">
+ '<xsl:value-of select="$var_NDRXDR" />'
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'version') and position() = 2">
+ <xsl:value-of select="$var_version1" />
+ </xsl:when>
+ <xsl:when test="(contains(parameter, 'version'))">
+ <xsl:value-of select="$var_version2" />
+ </xsl:when>
+ <xsl:when test="(contains(parameter,'geomgml'))">
+ <xsl:text>ST_AsGML(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">
+ <xsl:text>foo1.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">
+ <xsl:text>geography(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">
+ <xsl:text>foo2.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="type = 'geography' or type = 'geography '">
+ <xsl:text>geography(foo2.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">
+ ARRAY[foo1.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]')">
+ ARRAY[foo2.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKT')">
+ <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'WKT')">
+ <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKB')">
+ <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'bytea')">
+ <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'float') or contains(type, 'double')">
+ <xsl:value-of select="$var_float1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'spheroid')">
+ <xsl:value-of select="$var_spheroid" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer') and position() = 2">
+ <xsl:value-of select="$var_integer1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer')">
+ <xsl:value-of select="$var_integer2" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'text')">
+ <xsl:value-of select="$var_text" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'varchar')">
+ <xsl:value-of select="$var_varchar" />
+ </xsl:when>
+ <xsl:when test="contains(type,'timestamp') or type = 'date'">
+ <xsl:text>'2009-01-01'</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'boolean')">
+ <xsl:value-of select="$var_boolean" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->
+ <xsl:template name="listparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="count(parameter) > 0">
+ <xsl:value-of select="parameter" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+</xsl:stylesheet>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">\r
-<!-- ********************************************************************\r
- * $Id$\r
- ********************************************************************\r
- Copyright 2010, Regina Obe\r
- License: BSD\r
- Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the raster related functions we have documented\r
- using a garden variety of rasters. Its intent is to flag major crashes.\r
- ******************************************************************** -->\r
- <xsl:output method="text" />\r
- <xsl:variable name='testversion'>2.0.0</xsl:variable>\r
- <xsl:variable name='fnexclude'>AddRasterColumn DropRasterColumn DropRasterTable</xsl:variable>\r
- <!--This is just a place holder to state functions not supported in 1.3 or tested separately -->\r
-\r
- <xsl:variable name='var_format'>'GDAL'</xsl:variable>\r
- <xsl:variable name='var_srid'>3395</xsl:variable>\r
- <xsl:variable name='var_band'>1</xsl:variable>\r
- <xsl:variable name='var_integer1'>1</xsl:variable>\r
- <xsl:variable name='var_integer2'>2</xsl:variable>\r
- <xsl:variable name='var_float1'>1.5</xsl:variable>\r
- <xsl:variable name='var_float2'>1.75</xsl:variable>\r
- <xsl:variable name='var_distance'>100</xsl:variable>\r
- <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>\r
- <xsl:variable name='var_text'>'monkey'</xsl:variable>\r
- <xsl:variable name='var_varchar'>'test'</xsl:variable>\r
- <xsl:variable name='var_pixeltype'>'1BB'</xsl:variable>\r
- <xsl:variable name='var_pixeltypenoq'>8BUI</xsl:variable>\r
- <xsl:variable name='var_pixelvalue'>0</xsl:variable>\r
- <xsl:variable name='var_boolean'>false</xsl:variable>\r
- <xsl:variable name='var_logtable'>raster_garden_log</xsl:variable>\r
- <xsl:variable name='var_pixeltypes'>{8BUI,1BB}</xsl:variable>\r
- <xsl:variable name='var_pixelvalues'>{255,0}</xsl:variable>\r
- <xsl:variable name='var_pt'>ST_Centroid(rast1.rast::geometry)</xsl:variable>\r
- <xsl:variable name='var_georefcoords'>'2 0 0 3 0.5 0.5'</xsl:variable>\r
- <xsl:variable name='var_logupdatesql'>UPDATE <xsl:value-of select="$var_logtable" /> SET log_end = clock_timestamp() \r
- FROM (SELECT logid FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC limit 1) As foo\r
- WHERE <xsl:value-of select="$var_logtable" />.logid = foo.logid AND <xsl:value-of select="$var_logtable" />.log_end IS NULL;</xsl:variable>\r
- \r
- <xsl:variable name='var_logresultsasxml'>INSERT INTO <xsl:value-of select="$var_logtable" />_output(logid, log_output)\r
- SELECT logid, query_to_xml(log_sql, false,false,'') As log_output\r
- FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC LIMIT 1;</xsl:variable>\r
- \r
- <pgis:gardens>\r
- <pgis:gset ID='PointSet' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) j\r
- ORDER BY i,j\r
- )</pgis:gset>\r
- <pgis:gset ID='LineSet' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) As j\r
- WHERE NOT(i = j)\r
- ORDER BY i, i*j)</pgis:gset>\r
- <pgis:gset ID='PolySet' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, i*j, j)</pgis:gset>\r
-\r
- <pgis:gset ID="SingleNULL" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom)</pgis:gset>\r
- <pgis:gset ID="MultipleNULLs" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom FROM generate_series(1,4) As foo)</pgis:gset>\r
- </pgis:gardens>\r
- <!--changed all to no skew so they pass the world tests -->\r
- <pgis:pixeltypes>\r
- <pgis:pixeltype ID="1BB" PixType="1BB" createtable="true" nodata="0">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '1BB'), i, (i+1),0),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="2BUI" PixType="2BUI" createtable="true" nodata="2">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '2BUI'), i, (i+1),1),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="4BUI" PixType="4BUI" createtable="true" nodata="15">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '4BUI'), i, (i+1),14),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="8BSI" PixType="8BSI" createtable="true" nodata="-56">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '8BSI'), i, (i+1),-50),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="8BUI" PixType="8BUI" createtable="true" nodata="255">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '8BUI'), i, (i+1),150),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="16BSI" PixType="16BSI" createtable="true" nodata="0">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '16BSI'), i, (i+1),-6000),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="16BUI" PixType="16BUI" createtable="true" nodata="65535">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '16BUI'), i, (i+1),64567),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="32BSI" PixType="32BSI" createtable="true" nodata="-4294967295">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '32BSI'), i, (i+1),-429496),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="32BUI" PixType="32BUI" createtable="true" nodata="4294967295">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '32BUI'), i, (i+1),42949),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="32BF" PixType="32BF" createtable="true" nodata="-4294.967295">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '32BF'), i, (i+1),-4294),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- <pgis:pixeltype ID="64BF" PixType="64BF" createtable="true" nodata="429496.7295">\r
- (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '64BF'), i, (i+1),42949.12345),4326) As rast\r
- FROM generate_series(1,10) As i)\r
- </pgis:pixeltype>\r
- </pgis:pixeltypes>\r
- <!-- We deal only with the reference chapter -->\r
- <xsl:template match="/">\r
-<!-- Create logging table -->\r
-<!-- Create logging tables -->\r
-DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />;\r
-CREATE TABLE <xsl:value-of select="$var_logtable" />(logid serial PRIMARY KEY, log_label text, spatial_class text DEFAULT 'raster', func text, g1 text, g2 text, log_start timestamp, log_end timestamp, log_sql text);\r
-DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />_output;\r
-CREATE TABLE <xsl:value-of select="$var_logtable" />_output(logid integer PRIMARY KEY, log_output xml);\r
- <xsl:apply-templates select="/book/chapter[@id='RT_reference']" />\r
- </xsl:template>\r
- <xsl:template match='chapter'>\r
-<!-- define a table we call pgis_rgarden_mega that will contain a raster column with a band for all types of pixels we support -->\r
-DROP TABLE IF EXISTS pgis_rgarden_mega;\r
-CREATE TABLE pgis_rgarden_mega(rid serial PRIMARY KEY, rast raster);\r
-<!--Start Test table creation -->\r
- <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype[not(contains(@createtable,'false'))]">\r
- <xsl:variable name='log_label'>create table Test <xsl:value-of select="@PixType" /></xsl:variable>\r
-SELECT '<xsl:value-of select="$log_label" />: Start Testing';\r
-<xsl:variable name='var_sql'>CREATE TABLE pgis_rgarden_<xsl:value-of select="@ID" />(rid serial PRIMARY KEY);\r
- SELECT AddRasterColumn('public', lower('pgis_rgarden_<xsl:value-of select="@ID" />'), 'rast',4326, '{<xsl:value-of select="@PixType" />}',false, true, '{<xsl:value-of select="@nodata" />}', 0.25,-0.25,200,300, null);\r
- SELECT AddRasterColumn('public', lower('pgis_rgarden_<xsl:value-of select="@ID" />'),'r_rasttothrow', 4326, '{<xsl:value-of select="@PixType" />,<xsl:value-of select="$var_pixeltypenoq" />}',false, true, '{<xsl:value-of select="@nodata" />, <xsl:value-of select="$var_pixelvalue" />}', 0.25,-0.25,200,300, null);</xsl:variable>\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start,log_sql) \r
-VALUES('<xsl:value-of select="$log_label" /> AddRasterColumn','AddRasterColumn', '<xsl:value-of select="@PixType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');\r
-BEGIN;\r
- <xsl:value-of select="$var_sql" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;<xsl:text> \r
-</xsl:text>\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start,log_sql) \r
-VALUES('<xsl:value-of select="$log_label" /> insert data raster','insert data', '<xsl:value-of select="@PixType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1">INSERT INTO pgis_rgarden_mega(rast)\r
- SELECT rast\r
- FROM (<xsl:value-of select="." />) As foo;</xsl:with-param></xsl:call-template>');\r
-BEGIN;\r
- INSERT INTO pgis_rgarden_mega(rast)\r
- SELECT rast\r
- FROM (<xsl:value-of select="." />) As foo;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT; \r
- </xsl:for-each>\r
-<!--End Test table creation -->\r
-\r
-<!--Start Test table drop -->\r
- <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype[not(contains(@createtable,'false'))]">\r
- <xsl:variable name='log_label'>drop table Test <xsl:value-of select="@PixType" /></xsl:variable>\r
- <xsl:variable name='var_sql'>SELECT DropRasterTable('public', lower('pgis_rgarden_<xsl:value-of select="@ID" />'));</xsl:variable>\r
-SELECT '<xsl:value-of select="$log_label" />: Start Testing';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
-VALUES('<xsl:value-of select="$log_label" /> DropRasterTable','DropRasterTable', '<xsl:value-of select="@PixType" />', clock_timestamp(),\r
-'<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');\r
-BEGIN;\r
- <xsl:value-of select="$var_sql" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;<xsl:text> \r
-</xsl:text>\r
- </xsl:for-each>\r
-<!--End Test table drop -->\r
-\r
-<!--Start test on operators -->\r
- <xsl:for-each select="sect1[contains(@id,'RT_Operator')]/refentry">\r
- <xsl:sort select="@id"/>\r
- <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">\r
- <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>\r
- <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>\r
- <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">\r
- <!--Store first garden sql raster from -->\r
- <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>\r
- <xsl:variable name='pix1type'><xsl:value-of select="@PixType"/></xsl:variable>\r
- <xsl:variable name='log_label'><xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" /> against other types</xsl:variable>\r
- SELECT '<xsl:value-of select="$log_label" />: Start Testing ';\r
- <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">\r
- <xsl:choose>\r
- <xsl:when test="contains($fndef, 'geometry')">\r
- SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryTypeype" />';\r
- <xsl:variable name='var_sql'>SELECT foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2;</xsl:variable>\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start,log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Geometry <xsl:value-of select="$geom1type" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1type" />','<xsl:value-of select="@GeometryType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');\r
-\r
- BEGIN;\r
- <!-- log query result to output table -->\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:when>\r
- <xsl:otherwise>\r
- <xsl:variable name='var_sql'>SELECT rast1.rast <xsl:value-of select="$fnname" /> rast2.rast\r
- FROM (<xsl:value-of select="$from1" />) As rast1 CROSS JOIN (<xsl:value-of select="." />) As rast2;</xsl:variable>\r
- SELECT 'Raster <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@PixType" />';\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Raster <xsl:value-of select="$pix1type" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$pix1type" />','<xsl:value-of select="@PixType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');\r
-\r
- BEGIN;\r
- <!-- log query result to output table -->\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- </xsl:for-each>\r
- SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@PixType" /> against other types';\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
-<!--End test on operators -->\r
-\r
-<!-- Start regular function checks excluding operators -->\r
- <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">\r
- <xsl:sort select="@id"/>\r
-\r
- <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">\r
-<!--Create dummy paramaters to be used later -->\r
- <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>\r
- <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>\r
- <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>\r
- <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>\r
- <xsl:variable name='numparamrasts'><xsl:value-of select="count(paramdef/type[contains(text(),'raster')] )" /></xsl:variable>\r
- <xsl:variable name='log_label'><xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)</xsl:variable>\r
-\r
- <xsl:variable name="geoftype">\r
- <!--Conditionally instantiate a value to be assigned to the variable -->\r
- <xsl:choose>\r
- <xsl:when test="contains(paramdef, 'geometry ')">\r
- <xsl:value-of select="Geometry"/>\r
- </xsl:when>\r
- <xsl:when test="contains(paramdef, 'geography ')">\r
- <xsl:value-of select="Geography"/>\r
- </xsl:when>\r
- <xsl:when test="contains(paramdef, 'raster ')">\r
- <xsl:value-of select="Raster"/>\r
- </xsl:when>\r
- <xsl:otherwise>\r
- <xsl:value-of select="Other"/>\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- </xsl:variable>\r
-\r
- <!-- For each function prototype generate a test sql statement -->\r
- <xsl:choose>\r
-<!--Test functions that take no arguments or take no geometries -->\r
- <xsl:when test="$numparamrasts = '0' and not(contains($fnexclude,funcdef/function))">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';\r
- <xsl:variable name='var_sql'>SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />);</xsl:variable>\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" />','<xsl:value-of select="$fnname" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');\r
- \r
- BEGIN;\r
- <!-- log query result to output table -->\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <!-- log completion -->\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
-SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';\r
- </xsl:when>\r
-<!--Start Test aggregate and unary functions -->\r
-<!-- put functions that take only one raster no need to cross with another raster collection, these are unary raster, aggregates, and so forth -->\r
- <xsl:when test="$numparamrasts = '1' and $numparamgeoms = '0' and not(contains($fnexclude,funcdef/function))" >\r
- <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">\r
- SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@PixType" />';\r
- <xsl:choose>\r
- <xsl:when test="contains(paramdef, 'raster ')">\r
- <!-- If output is raster show ewkt convexhull rep -->\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@PixType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1">SELECT ST_AsEWKT(ST_ConvexHull(<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />))) FROM (<xsl:value-of select="." />) As rast1 LIMIT 3;</xsl:with-param></xsl:call-template>'\r
- );\r
- </xsl:when>\r
- <xsl:otherwise>\r
- SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';\r
- <!-- If output is geometry show ewkt rep -->\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@PixType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) FROM (<xsl:value-of select="." />) As rast1 LIMIT 3;</xsl:with-param></xsl:call-template>'\r
- );\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- \r
- BEGIN;\r
- <!-- log query result to output table -->\r
- <xsl:value-of select="$var_logresultsasxml" /> \r
- <!-- log completion -->\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@PixType" />';\r
- <xsl:text>\r
- \r
- </xsl:text>\r
- </xsl:for-each>\r
- </xsl:when>\r
-\r
-<!--Functions more than 1 args not already covered this will cross every raster pixel type with every other -->\r
- <xsl:when test="not(contains($fnexclude,funcdef/function))">\r
- <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">\r
-<!-- log to results table -->\r
- SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@PixType" />';\r
-\r
- <!--Store first garden sql geometry from -->\r
- <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>\r
- <xsl:variable name='pix1type'><xsl:value-of select="@PixType"/></xsl:variable>\r
- \r
- SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" /> against other types';\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- \r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$pix1type" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text>','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$pix1type" />','<xsl:value-of select="@GeometryType" />', clock_timestamp());\r
- BEGIN;\r
- <xsl:choose>\r
- <xsl:when test="$numparamrasts > '1'">\r
- SELECT 'Raster <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="$pix1type" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@GeometryType" />';\r
- <!-- If input is raster show wkt rep -->\r
- SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsText(ST_ConvexHull(rast1.rast)) As ref1_geom, ST_AsText(ST_ConvexHull(rast2.rast)) As ref2_geom\r
- </xsl:when>\r
- <xsl:when test="$numparamgeoms > '0'">\r
- SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@GeometryType" />';\r
- <!-- If input is geometry show ewkt rep -->\r
- SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsEWKT(rast1.rast::geometry) As ref1_geom, ST_AsEWKT(foo2.the_geom) As ref2_geom\r
- </xsl:when>\r
- <xsl:otherwise>\r
- SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@GeometryType" />';\r
- <!-- If input is geography show wkt rep -->\r
- SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- FROM (<xsl:value-of select="$from1" />) As rast1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- LIMIT 2;\r
- <!-- log completion -->\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@PixType" />';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
- </xsl:for-each>\r
-SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@PixType" /> against other types';\r
- </xsl:for-each>\r
- </xsl:when>\r
- </xsl:choose>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
-\r
- <!--macro to replace func args with dummy var args -->\r
- <xsl:template name="replaceparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="contains(parameter, 'georefcoords')">\r
- <xsl:value-of select="$var_georefcoords" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'format')">\r
- <xsl:value-of select="$var_format" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'pt')">\r
- <xsl:value-of select="$var_pt" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'pixeltype')">\r
- <xsl:value-of select="$var_pixeltype" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'distance')">\r
- <xsl:value-of select="$var_distance" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'srid')">\r
- <xsl:value-of select="$var_srid" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'position')">\r
- <xsl:value-of select="$var_position" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'NDR')">\r
- '<xsl:value-of select="$var_NDRXDR" />'\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'version') and position() = 2">\r
- <xsl:value-of select="$var_version1" />\r
- </xsl:when>\r
- <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">\r
- <xsl:text>foo2.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">\r
- <xsl:text>rast1.rast::geometry::geography</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">\r
- <xsl:text>rast1.rast::geometry</xsl:text>\r
- </xsl:when>\r
- \r
- <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">\r
- <xsl:text>foo2.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="type = 'geography' or type = 'geography '">\r
- <xsl:text>geography(foo2.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="type = 'raster' or type = 'raster '">\r
- <xsl:text>rast1.rast</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="type = 'raster' or type = 'raster '">\r
- <xsl:text>rast2.rast</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">\r
- ARRAY[foo1.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]')">\r
- ARRAY[foo2.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKT')">\r
- <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'WKT')">\r
- <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKB')">\r
- <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'bytea')">\r
- <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'float') or contains(type, 'double')">\r
- <xsl:value-of select="$var_float1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'spheroid')">\r
- <xsl:value-of select="$var_spheroid" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer') and position() = 2">\r
- <xsl:value-of select="$var_integer1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer')">\r
- <xsl:value-of select="$var_integer2" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'text')">\r
- <xsl:value-of select="$var_text" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'varchar')">\r
- <xsl:value-of select="$var_varchar" />\r
- </xsl:when>\r
- <xsl:when test="contains(type,'timestamp') or type = 'date'">\r
- <xsl:text>'2009-01-01'</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'boolean')">\r
- <xsl:value-of select="$var_boolean" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
-\r
- <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->\r
- <xsl:template name="listparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="count(parameter) > 0">\r
- <xsl:value-of select="parameter" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
- \r
- <!-- copied from http://www.thedumbterminal.co.uk/php/knowledgebase/?action=view&id=94 -->\r
- <xsl:template name="escapesinglequotes">\r
- <xsl:param name="arg1"/>\r
- <xsl:variable name="apostrophe">'</xsl:variable>\r
- <xsl:choose>\r
- <!-- this string has at least on single quote -->\r
- <xsl:when test="contains($arg1, $apostrophe)">\r
- <xsl:if test="string-length(normalize-space(substring-before($arg1, $apostrophe))) > 0"><xsl:value-of select="substring-before($arg1, $apostrophe)" disable-output-escaping="yes"/>''</xsl:if>\r
- <xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1"><xsl:value-of select="substring-after($arg1, $apostrophe)" disable-output-escaping="yes"/></xsl:with-param>\r
- </xsl:call-template>\r
- </xsl:when>\r
- <!-- no quotes found in string, just print it -->\r
- <xsl:when test="string-length(normalize-space($arg1)) > 0"><xsl:value-of select="normalize-space($arg1)"/></xsl:when>\r
- </xsl:choose>\r
- </xsl:template>\r
-</xsl:stylesheet>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">
+<!-- ********************************************************************
+ * $Id$
+ ********************************************************************
+ Copyright 2010, Regina Obe
+ License: BSD
+ Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the raster related functions we have documented
+ using a garden variety of rasters. Its intent is to flag major crashes.
+ ******************************************************************** -->
+ <xsl:output method="text" />
+ <xsl:variable name='testversion'>2.0.0</xsl:variable>
+ <xsl:variable name='fnexclude'>AddRasterColumn DropRasterColumn DropRasterTable</xsl:variable>
+ <!--This is just a place holder to state functions not supported in 1.3 or tested separately -->
+
+ <xsl:variable name='var_format'>'GDAL'</xsl:variable>
+ <xsl:variable name='var_srid'>3395</xsl:variable>
+ <xsl:variable name='var_band'>1</xsl:variable>
+ <xsl:variable name='var_integer1'>1</xsl:variable>
+ <xsl:variable name='var_integer2'>2</xsl:variable>
+ <xsl:variable name='var_float1'>1.5</xsl:variable>
+ <xsl:variable name='var_float2'>1.75</xsl:variable>
+ <xsl:variable name='var_distance'>100</xsl:variable>
+ <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>
+ <xsl:variable name='var_text'>'monkey'</xsl:variable>
+ <xsl:variable name='var_varchar'>'test'</xsl:variable>
+ <xsl:variable name='var_pixeltype'>'1BB'</xsl:variable>
+ <xsl:variable name='var_pixeltypenoq'>8BUI</xsl:variable>
+ <xsl:variable name='var_pixelvalue'>0</xsl:variable>
+ <xsl:variable name='var_boolean'>false</xsl:variable>
+ <xsl:variable name='var_logtable'>raster_garden_log</xsl:variable>
+ <xsl:variable name='var_pixeltypes'>{8BUI,1BB}</xsl:variable>
+ <xsl:variable name='var_pixelvalues'>{255,0}</xsl:variable>
+ <xsl:variable name='var_pt'>ST_Centroid(rast1.rast::geometry)</xsl:variable>
+ <xsl:variable name='var_georefcoords'>'2 0 0 3 0.5 0.5'</xsl:variable>
+ <xsl:variable name='var_logupdatesql'>UPDATE <xsl:value-of select="$var_logtable" /> SET log_end = clock_timestamp()
+ FROM (SELECT logid FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC limit 1) As foo
+ WHERE <xsl:value-of select="$var_logtable" />.logid = foo.logid AND <xsl:value-of select="$var_logtable" />.log_end IS NULL;</xsl:variable>
+
+ <xsl:variable name='var_logresultsasxml'>INSERT INTO <xsl:value-of select="$var_logtable" />_output(logid, log_output)
+ SELECT logid, query_to_xml(log_sql, false,false,'') As log_output
+ FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC LIMIT 1;</xsl:variable>
+
+ <pgis:gardens>
+ <pgis:gset ID='PointSet' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) j
+ ORDER BY i,j
+ )</pgis:gset>
+ <pgis:gset ID='LineSet' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) As j
+ WHERE NOT(i = j)
+ ORDER BY i, i*j)</pgis:gset>
+ <pgis:gset ID='PolySet' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, i*j, j)</pgis:gset>
+
+ <pgis:gset ID="SingleNULL" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom)</pgis:gset>
+ <pgis:gset ID="MultipleNULLs" GeometryType="GEOMETRY" createtable="false">(SELECT CAST(Null As geometry) As the_geom FROM generate_series(1,4) As foo)</pgis:gset>
+ </pgis:gardens>
+ <!--changed all to no skew so they pass the world tests -->
+ <pgis:pixeltypes>
+ <pgis:pixeltype ID="1BB" PixType="1BB" createtable="true" nodata="0">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '1BB'), i, (i+1),0),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="2BUI" PixType="2BUI" createtable="true" nodata="2">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '2BUI'), i, (i+1),1),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="4BUI" PixType="4BUI" createtable="true" nodata="15">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '4BUI'), i, (i+1),14),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="8BSI" PixType="8BSI" createtable="true" nodata="-56">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '8BSI'), i, (i+1),-50),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="8BUI" PixType="8BUI" createtable="true" nodata="255">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '8BUI'), i, (i+1),150),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="16BSI" PixType="16BSI" createtable="true" nodata="0">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '16BSI'), i, (i+1),-6000),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="16BUI" PixType="16BUI" createtable="true" nodata="65535">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '16BUI'), i, (i+1),64567),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="32BSI" PixType="32BSI" createtable="true" nodata="-4294967295">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '32BSI'), i, (i+1),-429496),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="32BUI" PixType="32BUI" createtable="true" nodata="4294967295">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '32BUI'), i, (i+1),42949),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="32BF" PixType="32BF" createtable="true" nodata="-4294.967295">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '32BF'), i, (i+1),-4294),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ <pgis:pixeltype ID="64BF" PixType="64BF" createtable="true" nodata="429496.7295">
+ (SELECT ST_SetSRID(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster( 100, 100, (i-1)*100, (i-1)*100, 0.0005, -0.0005, 0*i, 0*i), '64BF'), i, (i+1),42949.12345),4326) As rast
+ FROM generate_series(1,10) As i)
+ </pgis:pixeltype>
+ </pgis:pixeltypes>
+ <!-- We deal only with the reference chapter -->
+ <xsl:template match="/">
+<!-- Create logging table -->
+<!-- Create logging tables -->
+DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />;
+CREATE TABLE <xsl:value-of select="$var_logtable" />(logid serial PRIMARY KEY, log_label text, spatial_class text DEFAULT 'raster', func text, g1 text, g2 text, log_start timestamp, log_end timestamp, log_sql text);
+DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />_output;
+CREATE TABLE <xsl:value-of select="$var_logtable" />_output(logid integer PRIMARY KEY, log_output xml);
+ <xsl:apply-templates select="/book/chapter[@id='RT_reference']" />
+ </xsl:template>
+ <xsl:template match='chapter'>
+<!-- define a table we call pgis_rgarden_mega that will contain a raster column with a band for all types of pixels we support -->
+DROP TABLE IF EXISTS pgis_rgarden_mega;
+CREATE TABLE pgis_rgarden_mega(rid serial PRIMARY KEY, rast raster);
+<!--Start Test table creation -->
+ <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype[not(contains(@createtable,'false'))]">
+ <xsl:variable name='log_label'>create table Test <xsl:value-of select="@PixType" /></xsl:variable>
+SELECT '<xsl:value-of select="$log_label" />: Start Testing';
+<xsl:variable name='var_sql'>CREATE TABLE pgis_rgarden_<xsl:value-of select="@ID" />(rid serial PRIMARY KEY);
+ SELECT AddRasterColumn('public', lower('pgis_rgarden_<xsl:value-of select="@ID" />'), 'rast',4326, '{<xsl:value-of select="@PixType" />}',false, true, '{<xsl:value-of select="@nodata" />}', 0.25,-0.25,200,300, null);
+ SELECT AddRasterColumn('public', lower('pgis_rgarden_<xsl:value-of select="@ID" />'),'r_rasttothrow', 4326, '{<xsl:value-of select="@PixType" />,<xsl:value-of select="$var_pixeltypenoq" />}',false, true, '{<xsl:value-of select="@nodata" />, <xsl:value-of select="$var_pixelvalue" />}', 0.25,-0.25,200,300, null);</xsl:variable>
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start,log_sql)
+VALUES('<xsl:value-of select="$log_label" /> AddRasterColumn','AddRasterColumn', '<xsl:value-of select="@PixType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');
+BEGIN;
+ <xsl:value-of select="$var_sql" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;<xsl:text>
+</xsl:text>
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start,log_sql)
+VALUES('<xsl:value-of select="$log_label" /> insert data raster','insert data', '<xsl:value-of select="@PixType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1">INSERT INTO pgis_rgarden_mega(rast)
+ SELECT rast
+ FROM (<xsl:value-of select="." />) As foo;</xsl:with-param></xsl:call-template>');
+BEGIN;
+ INSERT INTO pgis_rgarden_mega(rast)
+ SELECT rast
+ FROM (<xsl:value-of select="." />) As foo;
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+ </xsl:for-each>
+<!--End Test table creation -->
+
+<!--Start Test table drop -->
+ <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype[not(contains(@createtable,'false'))]">
+ <xsl:variable name='log_label'>drop table Test <xsl:value-of select="@PixType" /></xsl:variable>
+ <xsl:variable name='var_sql'>SELECT DropRasterTable('public', lower('pgis_rgarden_<xsl:value-of select="@ID" />'));</xsl:variable>
+SELECT '<xsl:value-of select="$log_label" />: Start Testing';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+VALUES('<xsl:value-of select="$log_label" /> DropRasterTable','DropRasterTable', '<xsl:value-of select="@PixType" />', clock_timestamp(),
+'<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');
+BEGIN;
+ <xsl:value-of select="$var_sql" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;<xsl:text>
+</xsl:text>
+ </xsl:for-each>
+<!--End Test table drop -->
+
+<!--Start test on operators -->
+ <xsl:for-each select="sect1[contains(@id,'RT_Operator')]/refentry">
+ <xsl:sort select="@id"/>
+ <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">
+ <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>
+ <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>
+ <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">
+ <!--Store first garden sql raster from -->
+ <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>
+ <xsl:variable name='pix1type'><xsl:value-of select="@PixType"/></xsl:variable>
+ <xsl:variable name='log_label'><xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" /> against other types</xsl:variable>
+ SELECT '<xsl:value-of select="$log_label" />: Start Testing ';
+ <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">
+ <xsl:choose>
+ <xsl:when test="contains($fndef, 'geometry')">
+ SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1type" />, <xsl:value-of select="@GeometryTypeype" />';
+ <xsl:variable name='var_sql'>SELECT foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2;</xsl:variable>
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start,log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Geometry <xsl:value-of select="$geom1type" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1type" />','<xsl:value-of select="@GeometryType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');
+
+ BEGIN;
+ <!-- log query result to output table -->
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name='var_sql'>SELECT rast1.rast <xsl:value-of select="$fnname" /> rast2.rast
+ FROM (<xsl:value-of select="$from1" />) As rast1 CROSS JOIN (<xsl:value-of select="." />) As rast2;</xsl:variable>
+ SELECT 'Raster <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@PixType" />';
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Raster <xsl:value-of select="$pix1type" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$pix1type" />','<xsl:value-of select="@PixType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');
+
+ BEGIN;
+ <!-- log query result to output table -->
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@PixType" /> against other types';
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+<!--End test on operators -->
+
+<!-- Start regular function checks excluding operators -->
+ <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">
+ <xsl:sort select="@id"/>
+
+ <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">
+<!--Create dummy parameters to be used later -->
+ <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>
+ <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>
+ <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>
+ <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>
+ <xsl:variable name='numparamrasts'><xsl:value-of select="count(paramdef/type[contains(text(),'raster')] )" /></xsl:variable>
+ <xsl:variable name='log_label'><xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)</xsl:variable>
+
+ <xsl:variable name="geoftype">
+ <!--Conditionally instantiate a value to be assigned to the variable -->
+ <xsl:choose>
+ <xsl:when test="contains(paramdef, 'geometry ')">
+ <xsl:value-of select="Geometry"/>
+ </xsl:when>
+ <xsl:when test="contains(paramdef, 'geography ')">
+ <xsl:value-of select="Geography"/>
+ </xsl:when>
+ <xsl:when test="contains(paramdef, 'raster ')">
+ <xsl:value-of select="Raster"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="Other"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- For each function prototype generate a test sql statement -->
+ <xsl:choose>
+<!--Test functions that take no arguments or take no geometries -->
+ <xsl:when test="$numparamrasts = '0' and not(contains($fnexclude,funcdef/function))">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';
+ <xsl:variable name='var_sql'>SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />);</xsl:variable>
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" />','<xsl:value-of select="$fnname" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');
+
+ BEGIN;
+ <!-- log query result to output table -->
+ <xsl:value-of select="$var_logresultsasxml" />
+ <!-- log completion -->
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';
+ </xsl:when>
+<!--Start Test aggregate and unary functions -->
+<!-- put functions that take only one raster no need to cross with another raster collection, these are unary raster, aggregates, and so forth -->
+ <xsl:when test="$numparamrasts = '1' and $numparamgeoms = '0' and not(contains($fnexclude,funcdef/function))" >
+ <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">
+ SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@PixType" />';
+ <xsl:choose>
+ <xsl:when test="contains(paramdef, 'raster ')">
+ <!-- If output is raster show ewkt convexhull rep -->
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@PixType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1">SELECT ST_AsEWKT(ST_ConvexHull(<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />))) FROM (<xsl:value-of select="." />) As rast1 LIMIT 3;</xsl:with-param></xsl:call-template>'
+ );
+ </xsl:when>
+ <xsl:otherwise>
+ SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@GeometryType" />';
+ <!-- If output is geometry show ewkt rep -->
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text><xsl:value-of select="@PixType" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@PixType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) FROM (<xsl:value-of select="." />) As rast1 LIMIT 3;</xsl:with-param></xsl:call-template>'
+ );
+ </xsl:otherwise>
+ </xsl:choose>
+
+ BEGIN;
+ <!-- log query result to output table -->
+ <xsl:value-of select="$var_logresultsasxml" />
+ <!-- log completion -->
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@PixType" />';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+ </xsl:when>
+
+<!--Functions more than 1 args not already covered this will cross every raster pixel type with every other -->
+ <xsl:when test="not(contains($fnexclude,funcdef/function))">
+ <xsl:for-each select="document('')//pgis:pixeltypes/pgis:pixeltype">
+<!-- log to results table -->
+ SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="@PixType" />';
+
+ <!--Store first garden sql geometry from -->
+ <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>
+ <xsl:variable name='pix1type'><xsl:value-of select="@PixType"/></xsl:variable>
+
+ SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" /> against other types';
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$pix1type" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text>','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$pix1type" />','<xsl:value-of select="@GeometryType" />', clock_timestamp());
+ BEGIN;
+ <xsl:choose>
+ <xsl:when test="$numparamrasts > '1'">
+ SELECT 'Raster <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="$pix1type" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@GeometryType" />';
+ <!-- If input is raster show wkt rep -->
+ SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsText(ST_ConvexHull(rast1.rast)) As ref1_geom, ST_AsText(ST_ConvexHull(rast2.rast)) As ref2_geom
+ </xsl:when>
+ <xsl:when test="$numparamgeoms > '0'">
+ SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@GeometryType" />';
+ <!-- If input is geometry show ewkt rep -->
+ SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />), ST_AsEWKT(rast1.rast::geometry) As ref1_geom, ST_AsEWKT(foo2.the_geom) As ref2_geom
+ </xsl:when>
+ <xsl:otherwise>
+ SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@GeometryType" />';
+ <!-- If input is geography show wkt rep -->
+ SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)
+ </xsl:otherwise>
+ </xsl:choose>
+ FROM (<xsl:value-of select="$from1" />) As rast1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ LIMIT 2;
+ <!-- log completion -->
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$pix1type" />, <xsl:value-of select="@PixType" />';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@PixType" /> against other types';
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!--macro to replace func args with dummy var args -->
+ <xsl:template name="replaceparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="contains(parameter, 'georefcoords')">
+ <xsl:value-of select="$var_georefcoords" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'format')">
+ <xsl:value-of select="$var_format" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'pt')">
+ <xsl:value-of select="$var_pt" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'pixeltype')">
+ <xsl:value-of select="$var_pixeltype" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'distance')">
+ <xsl:value-of select="$var_distance" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'srid')">
+ <xsl:value-of select="$var_srid" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'position')">
+ <xsl:value-of select="$var_position" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'NDR')">
+ '<xsl:value-of select="$var_NDRXDR" />'
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'version') and position() = 2">
+ <xsl:value-of select="$var_version1" />
+ </xsl:when>
+ <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">
+ <xsl:text>foo2.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">
+ <xsl:text>rast1.rast::geometry::geography</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">
+ <xsl:text>rast1.rast::geometry</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">
+ <xsl:text>foo2.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="type = 'geography' or type = 'geography '">
+ <xsl:text>geography(foo2.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="type = 'raster' or type = 'raster '">
+ <xsl:text>rast1.rast</xsl:text>
+ </xsl:when>
+ <xsl:when test="type = 'raster' or type = 'raster '">
+ <xsl:text>rast2.rast</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">
+ ARRAY[foo1.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]')">
+ ARRAY[foo2.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKT')">
+ <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'WKT')">
+ <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKB')">
+ <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'bytea')">
+ <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'float') or contains(type, 'double')">
+ <xsl:value-of select="$var_float1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'spheroid')">
+ <xsl:value-of select="$var_spheroid" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer') and position() = 2">
+ <xsl:value-of select="$var_integer1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer')">
+ <xsl:value-of select="$var_integer2" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'text')">
+ <xsl:value-of select="$var_text" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'varchar')">
+ <xsl:value-of select="$var_varchar" />
+ </xsl:when>
+ <xsl:when test="contains(type,'timestamp') or type = 'date'">
+ <xsl:text>'2009-01-01'</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'boolean')">
+ <xsl:value-of select="$var_boolean" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->
+ <xsl:template name="listparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="count(parameter) > 0">
+ <xsl:value-of select="parameter" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- copied from http://www.thedumbterminal.co.uk/php/knowledgebase/?action=view&id=94 -->
+ <xsl:template name="escapesinglequotes">
+ <xsl:param name="arg1"/>
+ <xsl:variable name="apostrophe">'</xsl:variable>
+ <xsl:choose>
+ <!-- this string has at least on single quote -->
+ <xsl:when test="contains($arg1, $apostrophe)">
+ <xsl:if test="string-length(normalize-space(substring-before($arg1, $apostrophe))) > 0"><xsl:value-of select="substring-before($arg1, $apostrophe)" disable-output-escaping="yes"/>''</xsl:if>
+ <xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1"><xsl:value-of select="substring-after($arg1, $apostrophe)" disable-output-escaping="yes"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- no quotes found in string, just print it -->
+ <xsl:when test="string-length(normalize-space($arg1)) > 0"><xsl:value-of select="normalize-space($arg1)"/></xsl:when>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">\r
-<!-- ********************************************************************\r
- * $Id: topology_gardentest.sql.xsl 6490 2010-12-23 17:41:27Z robe $\r
- ********************************************************************\r
- Copyright 2008-2010, Regina Obe\r
- License: BSD\r
- Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the functions we have documented\r
- using a garden variety of geometries. Its intent is to flag major crashes.\r
- ******************************************************************** -->\r
- <xsl:output method="text" />\r
- <xsl:variable name='testversion'>2.0.0</xsl:variable>\r
- <xsl:variable name='fnexclude'>AddTopoGeometryColumn DropTopoGeometryColumn CreateTopology</xsl:variable>\r
- <!--This is just a place holder to state functions not supported in 1.3 or tested separately -->\r
-\r
- <xsl:variable name='var_srid'>3395</xsl:variable>\r
- <xsl:variable name='var_position'>1</xsl:variable>\r
- <xsl:variable name='var_integer1'>3</xsl:variable>\r
- <xsl:variable name='var_integer2'>5</xsl:variable>\r
- <xsl:variable name='var_float1'>0.5</xsl:variable>\r
- <xsl:variable name='var_float2'>0.75</xsl:variable>\r
- <xsl:variable name='var_distance'>100</xsl:variable>\r
- <xsl:variable name='var_version1'>1</xsl:variable>\r
- <xsl:variable name='var_version2'>2</xsl:variable>\r
- <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>\r
- <xsl:variable name='var_text'>'monkey'</xsl:variable>\r
- <xsl:variable name='var_varchar'>'test'</xsl:variable>\r
- <xsl:variable name='var_spheroid'>'SPHEROID["GRS_1980",6378137,298.257222101]'</xsl:variable>\r
- <xsl:variable name='var_matrix'>'FF1FF0102'</xsl:variable>\r
- <xsl:variable name='var_boolean'>false</xsl:variable>\r
- <xsl:variable name='var_logtable'>postgis_garden_log</xsl:variable>\r
- <xsl:variable name='var_logupdatesql'>UPDATE <xsl:value-of select="$var_logtable" /> SET log_end = clock_timestamp() \r
- FROM (SELECT logid FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC limit 1) As foo\r
- WHERE <xsl:value-of select="$var_logtable" />.logid = foo.logid AND <xsl:value-of select="$var_logtable" />.log_end IS NULL;</xsl:variable>\r
- \r
- <!-- for queries that result data, we first log the sql in our log table and then use query_to_xml to output it as xml for easy storage \r
- with this approach our run statement is always exactly the same -->\r
- <xsl:variable name='var_logresultsasxml'>INSERT INTO <xsl:value-of select="$var_logtable" />_output(logid, log_output)\r
- SELECT logid, query_to_xml(log_sql, false,false,'') As log_output\r
- FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC LIMIT 1;</xsl:variable>\r
- <pgis:gardens>\r
- <pgis:gset ID='POINT' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) j\r
- ORDER BY i,j\r
- )</pgis:gset>\r
- <pgis:gset ID='LINESTRING' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 15) As j\r
- WHERE NOT(i = j)\r
- ORDER BY i, i*j)</pgis:gset>\r
- <pgis:gset ID='POLYGON' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom\r
- FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)\r
- CROSS JOIN generate_series(40,70, 20) As j\r
- ORDER BY i, i*j, j)</pgis:gset>\r
- <pgis:gset ID='POINTM' GeometryType='POINTM'>(SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(50,70, 20) AS j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, i*j*m)</pgis:gset>\r
- <pgis:gset ID='LINESTRINGM' GeometryType='LINESTRINGM'>(SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- WHERE NOT(i = j)\r
- ORDER BY i, j, m, i*j*m)</pgis:gset>\r
-<!-- <pgis:gset ID='PolygonMSet' GeometryType='POLYGONM'>(SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePointM(i+m,j,m),4326),ST_SetSRID(ST_MakePointM(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePointM(i,j,m),4326)),ST_SetSRID(ST_MakePointM(i+m,j,m),4326))) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, m, i*j*m\r
- )</pgis:gset>-->\r
- <pgis:gset ID='POLYGONM' GeometryType='POLYGONM'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2503 1,-71.132 42.2502 3,-71.1323 42.2504 -2,-71.1322 42.2505 1,-71.1319 42.2503 0))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2512 0,-71.1318 42.2511 20,-71.1317 42.2511 -20,-71.1317 42.251 5,-71.1317 42.2509 4,-71.132 42.2511 6,-71.1319 42.2512 30))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
- <pgis:gset ID='POINTZ' GeometryType='POINTZ'>(SELECT ST_SetSRID(ST_MakePoint(i,j,k),4326) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 20) j\r
- CROSS JOIN generate_series(1,2) k\r
- ORDER BY i,i*j, j*k, i + j + k)</pgis:gset>\r
- <pgis:gset ID='LINESTRINGZ' GeometryType='LINESTRINGZ'>(SELECT ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 20) j\r
- CROSS JOIN generate_series(1,2) k\r
- ORDER BY i, j, i+j+k, k, i*j*k)</pgis:gset>\r
-<!-- <pgis:gset ID='PolygonSet3D' GeometryType='POLYGONZ'>(SELECT ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(50,70, 20) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ORDER BY i, j, i+j+m, m, i*j*m)</pgis:gset>--> \r
- <pgis:gset ID='POLYGONZ' GeometryType='POLYGONZ'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1,-71.0767 42.3872 1,-71.0767 42.3863 1,-71.0771 42.3866 1))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2,-71.0773 42.3863 1.75,-71.0773 42.3859 1.75,-71.0775 42.386 2))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
- <pgis:gset ID='POLYGONZM' GeometryType='POLYGONZM'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1 2,-71.0767 42.3872 1 2.3,-71.0767 42.3863 1 2.3,-71.0771 42.3866 1 2))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2 1.5,-71.0773 42.3863 1.75 1.5,-71.0773 42.3859 1.75 1.5,-71.0775 42.386 2 1.5))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
- \r
-<!-- MULTIs start here -->\r
- <pgis:gset ID='MULTIPOINT' GeometryType='MULTIPOINT'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom\r
- FROM generate_series(-10,50,15) As i\r
- CROSS JOIN generate_series(40,70, 15) j\r
- ) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTILINESTRING' GeometryType='MULTILINESTRING'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 15) As j\r
- WHERE NOT(i = j)) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTIPOLYGON' GeometryType='MULTIPOLYGON'>(SELECT ST_Multi(ST_Union(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05))) As the_geom\r
- FROM generate_series(-10,50,10) As i\r
- CROSS JOIN generate_series(40,70, 25) As j)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTIPOINTZ' GeometryType='MULTIPOINTZ'>(SELECT ST_Collect(ST_SetSRID(ST_MakePoint(i,j,k),4326)) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 25) j\r
- CROSS JOIN generate_series(1,3) k\r
- )</pgis:gset>\r
-\r
- <pgis:gset ID='MULTILINESTRINGZ' GeometryType='MULTILINESTRINGZ'>(SELECT ST_Multi(ST_Union(ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326))) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(40,70, 25) j\r
- CROSS JOIN generate_series(1,2) k\r
- )</pgis:gset>\r
-\r
-<!-- <pgis:gset ID='MultiPolySet3D' GeometryType='MULTIPOLYGONZ'>(SELECT ST_Multi(ST_Union(s.the_geom)) As the_geom\r
- FROM (SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePoint(i+m,j,m),4326),ST_SetSRID(ST_MakePoint(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePoint(i,j,m),4326)),ST_SetSRID(ST_MakePoint(i+m,j,m),4326))) As the_geom\r
- FROM generate_series(-10,50,20) As i\r
- CROSS JOIN generate_series(50,70, 25) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- ) As s)</pgis:gset>-->\r
- <pgis:gset ID='MULTIPOLYGONZ' GeometryType='MULTIPOLYGONZ'>(SELECT geom As the_geom\r
-FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.0821 42.3036 2,-71.0822 42.3036 2,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),\r
- ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 1,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1)))') )\r
- ) As g(geom))</pgis:gset>\r
- \r
-\r
- <pgis:gset ID='MULTIPOINTM' GeometryType='MULTIPOINTM'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326) As the_geom\r
- FROM generate_series(-71,50,15) As i\r
- CROSS JOIN generate_series(42,70, 25) AS j\r
- CROSS JOIN generate_series(1,2) As m\r
- ) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTILINESTRINGM' GeometryType='MULTILINESTRINGM'>(SELECT ST_Collect(s.the_geom) As the_geom\r
- FROM (SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom\r
- FROM generate_series(-71,50,15) As i\r
- CROSS JOIN generate_series(50,70, 25) As j\r
- CROSS JOIN generate_series(1,2) As m\r
- WHERE NOT(i = j)) As s)</pgis:gset>\r
-\r
- <pgis:gset ID='MULTIPOLYGONM' GeometryType='MULTIPOLYGONM'>(\r
- SELECT ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 2,10 0 1,10 10 -2,0 10 -5,0 0 -5),(5 5 6,7 5 6,7 7 6,5 7 10,5 5 -2)))') As the_geom\r
- )</pgis:gset>\r
- \r
- \r
-\r
- <!-- TODO: Finish off MULTI list -->\r
- </pgis:gardens>\r
- \r
-\r
- <!-- We deal only with the reference chapter -->\r
- <xsl:template match="/">\r
-<!-- Create logging tables -->\r
-DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />;\r
-CREATE TABLE <xsl:value-of select="$var_logtable" />(logid serial PRIMARY KEY, log_label text, spatial_class text, func text, g1 text, g2 text, log_start timestamp, log_end timestamp, log_sql text);\r
-DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />_output;\r
-CREATE TABLE <xsl:value-of select="$var_logtable" />_output(logid integer PRIMARY KEY, log_output xml);\r
-\r
- <xsl:apply-templates select="/book/chapter[@id='Topology']" />\r
- </xsl:template>\r
-\r
- <xsl:template match='chapter'>\r
-<!--Start Test table creation, insert, analyze crash test, drop -->\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset[not(contains(@createtable,'false'))]">\r
- <xsl:variable name='log_label'>table Test <xsl:value-of select="@GeometryType" /></xsl:variable>\r
-SELECT '<xsl:value-of select="$log_label" />: Start Testing';\r
-<xsl:variable name='var_sql'>CREATE TABLE pgis_garden (gid serial);\r
- SELECT AddGeometryColumn('pgis_garden','the_geom',ST_SRID(the_geom),GeometryType(the_geom),ST_CoordDim(the_geom))\r
- FROM (<xsl:value-of select="." />) As foo limit 1;\r
- SELECT AddGeometryColumn('pgis_garden','the_geom_multi',ST_SRID(the_geom),GeometryType(ST_Multi(the_geom)),ST_CoordDim(the_geom))\r
- FROM (<xsl:value-of select="." />) As foo limit 1;</xsl:variable>\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
-VALUES('<xsl:value-of select="$log_label" /> AddGeometryColumn','AddGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');\r
-BEGIN;\r
- <xsl:value-of select="$var_sql" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-\r
-SELECT '<xsl:value-of select="$log_label" /> Geometry index: Start Testing <xsl:value-of select="@ID" />';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geometry','CREATE gist index geometry', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- CREATE INDEX idx_pgis_geom_gist ON pgis_garden USING gist(the_geom);\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> geometry index: End Testing <xsl:value-of select="@ID" />';\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> insert data Geometry','insert data', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-\r
-BEGIN;\r
- INSERT INTO pgis_garden(the_geom, the_geom_multi)\r
- SELECT the_geom, ST_Multi(the_geom)\r
- FROM (<xsl:value-of select="." />) As foo;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT; \r
- \r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> UpdateGeometrySRID','UpdateGeometrySRID', '<xsl:value-of select="@GeometryType" />', clock_timestamp());\r
-BEGIN;\r
- SELECT UpdateGeometrySRID('pgis_garden', 'the_geom', 4269);\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geometry','vacuum analyze Geometry', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-VACUUM ANALYZE pgis_garden;\r
-<xsl:value-of select="$var_logupdatesql" />\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> DropGeometryColumn','DropGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp());\r
-\r
-BEGIN;\r
- SELECT DropGeometryColumn ('pgis_garden','the_geom');\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) \r
-VALUES('<xsl:value-of select="$log_label" /> DropGeometryTable','DropGeometryTable', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-\r
-BEGIN;\r
- SELECT DropGeometryTable ('pgis_garden');\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" />: End Testing <xsl:value-of select="@ID" />';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
-SELECT '<xsl:value-of select="$log_label" /> Geography: Start Testing <xsl:value-of select="@ID" />';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> Create Table / Add data - Geography','CREATE TABLE geography', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- CREATE TABLE pgis_geoggarden (gid serial PRIMARY KEY, the_geog geography(<xsl:value-of select="@GeometryType" />, 4326));\r
- INSERT INTO pgis_geoggarden(the_geog)\r
- SELECT the_geom\r
- FROM (<xsl:value-of select="." />) As foo;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing <xsl:value-of select="@ID" />';\r
-\r
-SELECT '<xsl:value-of select="$log_label" /> Geography index: Start Testing <xsl:value-of select="@ID" />';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geography','CREATE gist index geography', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- CREATE INDEX idx_pgis_geoggarden_geog_gist ON pgis_geoggarden USING gist(the_geog);\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> Geography index: End Testing <xsl:value-of select="@ID" />';\r
-\r
-\r
-<!-- vacuum analyze can't be put in a commit so we can't completely tell if it completes if it doesn't crash -->\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geography','analyze geography table', '<xsl:value-of select="@ID" />', clock_timestamp(),\r
- 'VACUUM ANALYZE pgis_geoggarden;');\r
-VACUUM ANALYZE pgis_geoggarden;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> drop Geography table','drop geography table', '<xsl:value-of select="@ID" />', clock_timestamp());\r
-BEGIN;\r
- SELECT 'BEFORE DROP' As look_at, * FROM geography_columns;\r
- DROP TABLE pgis_geoggarden;\r
- SELECT 'AFTER DROP' As look_at, * FROM geography_columns;\r
- <xsl:value-of select="$var_logupdatesql" />\r
-COMMIT;\r
-SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
- </xsl:for-each>\r
-<!--End Test table creation, insert, drop -->\r
-\r
-<!--Start test on operators -->\r
- <xsl:for-each select="sect1[contains(@id,'Operator') and not(contains($fnexclude,funcdef/function))]/refentry">\r
- <xsl:sort select="@id"/>\r
- <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">\r
- <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>\r
- <xsl:variable name='fndef'><xsl:value-of select="." /></xsl:variable>\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <!--Store first garden sql geometry from -->\r
- <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>\r
- <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>\r
- <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>\r
- <xsl:variable name='log_label'><xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="$geom1id" /> against other types</xsl:variable>\r
- SELECT '<xsl:value-of select="$log_label" />: Start Testing ';\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <xsl:choose>\r
- <xsl:when test="contains($fndef, 'geography')">\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Geography <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeog1, ST_AsEWKT(foo2.the_geom) as ewktgeog2, geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom) As geog1_op_geog2\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- WHERE (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = true OR\r
- (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = false;</xsl:with-param>\r
-</xsl:call-template>');\r
-\r
- SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:when>\r
- <xsl:otherwise>\r
- SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Geometry <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeom1, ST_AsEWKT(foo2.the_geom) as ewktgeom2, foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom As geom1_op_geom2\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- WHERE (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = true OR\r
- (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = false;</xsl:with-param></xsl:call-template>');\r
-\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- </xsl:for-each>\r
- SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@GeometryType" /> against other types';\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
-<!--End test on operators -->\r
-<!-- Start regular function checks excluding operators -->\r
- <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">\r
- <xsl:sort select="@id"/>\r
-\r
- <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">\r
-<!--Create dummy paramaters to be used later -->\r
- <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>\r
- <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>\r
- <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>\r
- <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>\r
- <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>\r
- <xsl:variable name='numparamgeogs'><xsl:value-of select="count(paramdef/type[contains(text(),'geography')] )" /></xsl:variable>\r
- <xsl:variable name='log_label'><xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)</xsl:variable>\r
-\r
- <xsl:variable name="geoftype">\r
- <!--Conditionally instantiate a value to be assigned to the variable -->\r
- <xsl:choose>\r
- <xsl:when test="$numparamgeoms > '0'">\r
- <xsl:value-of select="'Geometry'"/>\r
- </xsl:when>\r
- <xsl:when test="$numparamgeogs > '0'">\r
- <xsl:value-of select="'Geography'"/>\r
- </xsl:when>\r
- <xsl:otherwise>\r
- <xsl:value-of select="'Other'"/>\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- </xsl:variable>\r
- <!-- For each function prototype generate a test sql statement -->\r
- <xsl:choose>\r
-<!--Test functions that take no arguments and take no geometries/geographies -->\r
- <xsl:when test="($numparamgeoms = '0' and $numparamgeogs = '0') and not(contains($fnexclude,funcdef/function))">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';\r
-INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" />','<xsl:value-of select="$fnname" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />) As output;</xsl:with-param></xsl:call-template>');\r
- \r
-BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" /> \r
-COMMIT;\r
-SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';\r
- </xsl:when>\r
-<!--Start Test aggregate and unary functions for both geometry and geography -->\r
-<!-- put functions that take only one geometry/geography no need to cross with another geom collection, these are unary geom, aggregates, and so forth -->\r
- <xsl:when test="($numparamgeoms = '1' or $numparamgeogs = '1') and not(contains($fnexclude,funcdef/function))" >\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing';\r
-\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text>','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result\r
- FROM (<xsl:value-of select="." />) As foo1\r
- LIMIT 3;</xsl:with-param></xsl:call-template>');\r
-BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" /> \r
-COMMIT; \r
- SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing'; \r
- </xsl:for-each>\r
- </xsl:when>\r
-\r
-<!--Functions more than 1 args not already covered this will cross every geometry type with every other -->\r
- <xsl:when test="not(contains($fnexclude,funcdef/function))">\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <!--Store first garden sql geometry from -->\r
- <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>\r
- <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>\r
- <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>\r
-SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" /> against other types';\r
- <xsl:for-each select="document('')//pgis:gardens/pgis:gset">\r
- <xsl:choose>\r
- <xsl:when test="($numparamgeogs > '0' or $numparamgeoms > '0')">\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text> <xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />','<xsl:value-of select="$geom1id" />', '<xsl:value-of select="@ID" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result, ST_AsText(foo1.the_geom) As ref1_geom, ST_AsText(foo2.the_geom) As ref2_geom\r
- FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2\r
- LIMIT 2;</xsl:with-param></xsl:call-template>');\r
-\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:when>\r
- <xsl:otherwise>\r
- INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql) \r
- VALUES('<xsl:value-of select="$log_label" /> Other <xsl:text> </xsl:text><xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@DI" />', clock_timestamp(),\r
- '<xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)</xsl:with-param></xsl:call-template>');\r
-\r
- SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';\r
- BEGIN;\r
- <xsl:value-of select="$var_logresultsasxml" />\r
- <xsl:value-of select="$var_logupdatesql" />\r
- COMMIT;\r
- </xsl:otherwise>\r
- </xsl:choose>\r
- \r
- SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';\r
- <xsl:text>\r
-\r
- </xsl:text>\r
- </xsl:for-each>\r
-SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@GeometryType" /> against other types';\r
- </xsl:for-each>\r
- </xsl:when>\r
- </xsl:choose>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- <!-- flag primary grouping the functions belong in -->\r
- UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geography' WHERE (log_label ILIKE '%geography%' or log_sql ILIKE '%geography%') AND spatial_class IS NULL;\r
- UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geometry' WHERE log_label ILIKE '%geometry%' or log_label ILIKE '%other%' AND spatial_class IS NULL;\r
-\r
- </xsl:template>\r
-\r
- <!--macro to replace func args with dummy var args -->\r
- <xsl:template name="replaceparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="contains(parameter, 'matrix') or contains(parameter, 'Matrix')">\r
- <xsl:value-of select="$var_matrix" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'distance')">\r
- <xsl:value-of select="$var_distance" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'srid')">\r
- <xsl:value-of select="$var_srid" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'position')">\r
- <xsl:value-of select="$var_position" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'NDR')">\r
- '<xsl:value-of select="$var_NDRXDR" />'\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'gj_version')">\r
- <xsl:value-of select="$var_gj_version" />\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'version') and position() = 2">\r
- <xsl:value-of select="$var_version1" />\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter, 'version'))">\r
- <xsl:value-of select="$var_version2" />\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter,'geomgml'))">\r
- <xsl:text>ST_AsGML(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(contains(parameter,'geomkml'))">\r
- <xsl:text>ST_AsKML(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">\r
- <xsl:text>foo1.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">\r
- <xsl:text>geography(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">\r
- <xsl:text>foo2.the_geom</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="type = 'geography' or type = 'geography '">\r
- <xsl:text>geography(foo2.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">\r
- ARRAY[foo1.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'geometry[]')">\r
- ARRAY[foo2.the_geom]\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKT')">\r
- <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'WKT')">\r
- <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(parameter, 'EWKB')">\r
- <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'bytea')">\r
- <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'float') or contains(type, 'double')">\r
- <xsl:value-of select="$var_float1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'spheroid')">\r
- <xsl:value-of select="$var_spheroid" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer') and position() = 2">\r
- <xsl:value-of select="$var_integer1" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'integer')">\r
- <xsl:value-of select="$var_integer2" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'text')">\r
- <xsl:value-of select="$var_text" />\r
- </xsl:when>\r
- <xsl:when test="contains(type, 'varchar')">\r
- <xsl:value-of select="$var_varchar" />\r
- </xsl:when>\r
- <xsl:when test="contains(type,'timestamp') or type = 'date'">\r
- <xsl:text>'2009-01-01'</xsl:text>\r
- </xsl:when>\r
- <xsl:when test="contains(type,'boolean')">\r
- <xsl:value-of select="$var_boolean" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
-\r
- <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->\r
- <xsl:template name="listparams">\r
- <xsl:param name="func" />\r
- <xsl:for-each select="$func">\r
- <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>\r
- <xsl:for-each select="paramdef">\r
- <xsl:choose>\r
- <xsl:when test="count(parameter) > 0">\r
- <xsl:value-of select="parameter" />\r
- </xsl:when>\r
- </xsl:choose>\r
- <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>\r
- </xsl:for-each>\r
- </xsl:for-each>\r
- </xsl:template>\r
- \r
- <!-- copied from http://www.thedumbterminal.co.uk/php/knowledgebase/?action=view&id=94 -->\r
- <xsl:template name="escapesinglequotes">\r
- <xsl:param name="arg1"/>\r
- <xsl:variable name="apostrophe">'</xsl:variable>\r
- <xsl:choose>\r
- <!-- this string has at least on single quote -->\r
- <xsl:when test="contains($arg1, $apostrophe)">\r
- <xsl:if test="string-length(normalize-space(substring-before($arg1, $apostrophe))) > 0"><xsl:value-of select="substring-before($arg1, $apostrophe)" disable-output-escaping="yes"/>''</xsl:if>\r
- <xsl:call-template name="escapesinglequotes">\r
- <xsl:with-param name="arg1"><xsl:value-of select="substring-after($arg1, $apostrophe)" disable-output-escaping="yes"/></xsl:with-param>\r
- </xsl:call-template>\r
- </xsl:when>\r
- <!-- no quotes found in string, just print it -->\r
- <xsl:when test="string-length(normalize-space($arg1)) > 0"><xsl:value-of select="normalize-space($arg1)"/></xsl:when>\r
- </xsl:choose>\r
- </xsl:template>\r
-\r
-</xsl:stylesheet>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pgis="http://www.postgis.org/pgis">
+<!-- ********************************************************************
+ * $Id: topology_gardentest.sql.xsl 6490 2010-12-23 17:41:27Z robe $
+ ********************************************************************
+ Copyright 2008-2010, Regina Obe
+ License: BSD
+ Purpose: This is an xsl transform that generates an sql test script from xml docs to test all the functions we have documented
+ using a garden variety of geometries. Its intent is to flag major crashes.
+ ******************************************************************** -->
+ <xsl:output method="text" />
+ <xsl:variable name='testversion'>2.0.0</xsl:variable>
+ <xsl:variable name='fnexclude'>AddTopoGeometryColumn DropTopoGeometryColumn CreateTopology</xsl:variable>
+ <!--This is just a place holder to state functions not supported in 1.3 or tested separately -->
+
+ <xsl:variable name='var_srid'>3395</xsl:variable>
+ <xsl:variable name='var_position'>1</xsl:variable>
+ <xsl:variable name='var_integer1'>3</xsl:variable>
+ <xsl:variable name='var_integer2'>5</xsl:variable>
+ <xsl:variable name='var_float1'>0.5</xsl:variable>
+ <xsl:variable name='var_float2'>0.75</xsl:variable>
+ <xsl:variable name='var_distance'>100</xsl:variable>
+ <xsl:variable name='var_version1'>1</xsl:variable>
+ <xsl:variable name='var_version2'>2</xsl:variable>
+ <xsl:variable name='var_NDRXDR'>XDR</xsl:variable>
+ <xsl:variable name='var_text'>'monkey'</xsl:variable>
+ <xsl:variable name='var_varchar'>'test'</xsl:variable>
+ <xsl:variable name='var_spheroid'>'SPHEROID["GRS_1980",6378137,298.257222101]'</xsl:variable>
+ <xsl:variable name='var_matrix'>'FF1FF0102'</xsl:variable>
+ <xsl:variable name='var_boolean'>false</xsl:variable>
+ <xsl:variable name='var_logtable'>postgis_garden_log</xsl:variable>
+ <xsl:variable name='var_logupdatesql'>UPDATE <xsl:value-of select="$var_logtable" /> SET log_end = clock_timestamp()
+ FROM (SELECT logid FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC limit 1) As foo
+ WHERE <xsl:value-of select="$var_logtable" />.logid = foo.logid AND <xsl:value-of select="$var_logtable" />.log_end IS NULL;</xsl:variable>
+
+ <!-- for queries that result data, we first log the sql in our log table and then use query_to_xml to output it as xml for easy storage
+ with this approach our run statement is always exactly the same -->
+ <xsl:variable name='var_logresultsasxml'>INSERT INTO <xsl:value-of select="$var_logtable" />_output(logid, log_output)
+ SELECT logid, query_to_xml(log_sql, false,false,'') As log_output
+ FROM <xsl:value-of select="$var_logtable" /> ORDER BY logid DESC LIMIT 1;</xsl:variable>
+ <pgis:gardens>
+ <pgis:gset ID='POINT' GeometryType='POINT'>(SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) j
+ ORDER BY i,j
+ )</pgis:gset>
+ <pgis:gset ID='LINESTRING' GeometryType='LINESTRING'>(SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 15) As j
+ WHERE NOT(i = j)
+ ORDER BY i, i*j)</pgis:gset>
+ <pgis:gset ID='POLYGON' GeometryType='POLYGON'>(SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom
+ FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i)
+ CROSS JOIN generate_series(40,70, 20) As j
+ ORDER BY i, i*j, j)</pgis:gset>
+ <pgis:gset ID='POINTM' GeometryType='POINTM'>(SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(50,70, 20) AS j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, i*j*m)</pgis:gset>
+ <pgis:gset ID='LINESTRINGM' GeometryType='LINESTRINGM'>(SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i,j,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ WHERE NOT(i = j)
+ ORDER BY i, j, m, i*j*m)</pgis:gset>
+<!-- <pgis:gset ID='PolygonMSet' GeometryType='POLYGONM'>(SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePointM(i+m,j,m),4326),ST_SetSRID(ST_MakePointM(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePointM(i,j,m),4326)),ST_SetSRID(ST_MakePointM(i+m,j,m),4326))) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, m, i*j*m
+ )</pgis:gset>-->
+ <pgis:gset ID='POLYGONM' GeometryType='POLYGONM'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2503 1,-71.132 42.2502 3,-71.1323 42.2504 -2,-71.1322 42.2505 1,-71.1319 42.2503 0))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGONM((-71.1319 42.2512 0,-71.1318 42.2511 20,-71.1317 42.2511 -20,-71.1317 42.251 5,-71.1317 42.2509 4,-71.132 42.2511 6,-71.1319 42.2512 30))') )
+ ) As g(geom))</pgis:gset>
+
+ <pgis:gset ID='POINTZ' GeometryType='POINTZ'>(SELECT ST_SetSRID(ST_MakePoint(i,j,k),4326) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 20) j
+ CROSS JOIN generate_series(1,2) k
+ ORDER BY i,i*j, j*k, i + j + k)</pgis:gset>
+ <pgis:gset ID='LINESTRINGZ' GeometryType='LINESTRINGZ'>(SELECT ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 20) j
+ CROSS JOIN generate_series(1,2) k
+ ORDER BY i, j, i+j+k, k, i*j*k)</pgis:gset>
+<!-- <pgis:gset ID='PolygonSet3D' GeometryType='POLYGONZ'>(SELECT ST_SetSRID(ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_MakePoint(i+m,j,m),ST_MakePoint(j+m,i-m,m)),ST_MakePoint(i,j,m)),ST_MakePointM(i+m,j,m))),4326) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(50,70, 20) As j
+ CROSS JOIN generate_series(1,2) As m
+ ORDER BY i, j, i+j+m, m, i*j*m)</pgis:gset>-->
+ <pgis:gset ID='POLYGONZ' GeometryType='POLYGONZ'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1,-71.0767 42.3872 1,-71.0767 42.3863 1,-71.0771 42.3866 1))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2,-71.0773 42.3863 1.75,-71.0773 42.3859 1.75,-71.0775 42.386 2))') )
+ ) As g(geom))</pgis:gset>
+
+ <pgis:gset ID='POLYGONZM' GeometryType='POLYGONZM'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0771 42.3866 1 2,-71.0767 42.3872 1 2.3,-71.0767 42.3863 1 2.3,-71.0771 42.3866 1 2))') ),
+ ( ST_GeomFromEWKT('SRID=4326;POLYGON((-71.0775 42.386 2 1.5,-71.0773 42.3863 1.75 1.5,-71.0773 42.3859 1.75 1.5,-71.0775 42.386 2 1.5))') )
+ ) As g(geom))</pgis:gset>
+
+
+<!-- MULTIs start here -->
+ <pgis:gset ID='MULTIPOINT' GeometryType='MULTIPOINT'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom
+ FROM generate_series(-10,50,15) As i
+ CROSS JOIN generate_series(40,70, 15) j
+ ) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTILINESTRING' GeometryType='MULTILINESTRING'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_MakeLine(ST_SetSRID(ST_Point(i,j),4326),ST_SetSRID(ST_Point(j,i),4326)) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 15) As j
+ WHERE NOT(i = j)) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTIPOLYGON' GeometryType='MULTIPOLYGON'>(SELECT ST_Multi(ST_Union(ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05))) As the_geom
+ FROM generate_series(-10,50,10) As i
+ CROSS JOIN generate_series(40,70, 25) As j)</pgis:gset>
+
+ <pgis:gset ID='MULTIPOINTZ' GeometryType='MULTIPOINTZ'>(SELECT ST_Collect(ST_SetSRID(ST_MakePoint(i,j,k),4326)) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 25) j
+ CROSS JOIN generate_series(1,3) k
+ )</pgis:gset>
+
+ <pgis:gset ID='MULTILINESTRINGZ' GeometryType='MULTILINESTRINGZ'>(SELECT ST_Multi(ST_Union(ST_SetSRID(ST_MakeLine(ST_MakePoint(i,j,k), ST_MakePoint(i+k,j+k,k)),4326))) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(40,70, 25) j
+ CROSS JOIN generate_series(1,2) k
+ )</pgis:gset>
+
+<!-- <pgis:gset ID='MultiPolySet3D' GeometryType='MULTIPOLYGONZ'>(SELECT ST_Multi(ST_Union(s.the_geom)) As the_geom
+ FROM (SELECT ST_MakePolygon(ST_AddPoint(ST_AddPoint(ST_MakeLine(ST_SetSRID(ST_MakePoint(i+m,j,m),4326),ST_SetSRID(ST_MakePoint(j+m,i-m,m),4326)),ST_SetSRID(ST_MakePoint(i,j,m),4326)),ST_SetSRID(ST_MakePoint(i+m,j,m),4326))) As the_geom
+ FROM generate_series(-10,50,20) As i
+ CROSS JOIN generate_series(50,70, 25) As j
+ CROSS JOIN generate_series(1,2) As m
+ ) As s)</pgis:gset>-->
+ <pgis:gset ID='MULTIPOLYGONZ' GeometryType='MULTIPOLYGONZ'>(SELECT geom As the_geom
+FROM (VALUES ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.0821 42.3036 2,-71.0822 42.3036 2,-71.082 42.3038 2,-71.0819 42.3037 2,-71.0821 42.3036 2)))') ),
+ ( ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-71.1261 42.2703 1,-71.1257 42.2703 1,-71.1257 42.2701 1,-71.126 42.2701 1,-71.1261 42.2702 1,-71.1261 42.2703 1)))') )
+ ) As g(geom))</pgis:gset>
+
+
+ <pgis:gset ID='MULTIPOINTM' GeometryType='MULTIPOINTM'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326) As the_geom
+ FROM generate_series(-71,50,15) As i
+ CROSS JOIN generate_series(42,70, 25) AS j
+ CROSS JOIN generate_series(1,2) As m
+ ) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTILINESTRINGM' GeometryType='MULTILINESTRINGM'>(SELECT ST_Collect(s.the_geom) As the_geom
+ FROM (SELECT ST_MakeLine(ST_SetSRID(ST_MakePointM(i - 0.0821,j + 0.3036,m),4326),ST_SetSRID(ST_MakePointM(j,i,m),4326)) As the_geom
+ FROM generate_series(-71,50,15) As i
+ CROSS JOIN generate_series(50,70, 25) As j
+ CROSS JOIN generate_series(1,2) As m
+ WHERE NOT(i = j)) As s)</pgis:gset>
+
+ <pgis:gset ID='MULTIPOLYGONM' GeometryType='MULTIPOLYGONM'>(
+ SELECT ST_GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 2,10 0 1,10 10 -2,0 10 -5,0 0 -5),(5 5 6,7 5 6,7 7 6,5 7 10,5 5 -2)))') As the_geom
+ )</pgis:gset>
+
+
+
+ <!-- TODO: Finish off MULTI list -->
+ </pgis:gardens>
+
+
+ <!-- We deal only with the reference chapter -->
+ <xsl:template match="/">
+<!-- Create logging tables -->
+DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />;
+CREATE TABLE <xsl:value-of select="$var_logtable" />(logid serial PRIMARY KEY, log_label text, spatial_class text, func text, g1 text, g2 text, log_start timestamp, log_end timestamp, log_sql text);
+DROP TABLE IF EXISTS <xsl:value-of select="$var_logtable" />_output;
+CREATE TABLE <xsl:value-of select="$var_logtable" />_output(logid integer PRIMARY KEY, log_output xml);
+
+ <xsl:apply-templates select="/book/chapter[@id='Topology']" />
+ </xsl:template>
+
+ <xsl:template match='chapter'>
+<!--Start Test table creation, insert, analyze crash test, drop -->
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset[not(contains(@createtable,'false'))]">
+ <xsl:variable name='log_label'>table Test <xsl:value-of select="@GeometryType" /></xsl:variable>
+SELECT '<xsl:value-of select="$log_label" />: Start Testing';
+<xsl:variable name='var_sql'>CREATE TABLE pgis_garden (gid serial);
+ SELECT AddGeometryColumn('pgis_garden','the_geom',ST_SRID(the_geom),GeometryType(the_geom),ST_CoordDim(the_geom))
+ FROM (<xsl:value-of select="." />) As foo limit 1;
+ SELECT AddGeometryColumn('pgis_garden','the_geom_multi',ST_SRID(the_geom),GeometryType(ST_Multi(the_geom)),ST_CoordDim(the_geom))
+ FROM (<xsl:value-of select="." />) As foo limit 1;</xsl:variable>
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+VALUES('<xsl:value-of select="$log_label" /> AddGeometryColumn','AddGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes"><xsl:with-param name="arg1"><xsl:value-of select="$var_sql" /></xsl:with-param></xsl:call-template>');
+BEGIN;
+ <xsl:value-of select="$var_sql" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+
+SELECT '<xsl:value-of select="$log_label" /> Geometry index: Start Testing <xsl:value-of select="@ID" />';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geometry','CREATE gist index geometry', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ CREATE INDEX idx_pgis_geom_gist ON pgis_garden USING gist(the_geom);
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> geometry index: End Testing <xsl:value-of select="@ID" />';
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> insert data Geometry','insert data', '<xsl:value-of select="@ID" />', clock_timestamp());
+
+BEGIN;
+ INSERT INTO pgis_garden(the_geom, the_geom_multi)
+ SELECT the_geom, ST_Multi(the_geom)
+ FROM (<xsl:value-of select="." />) As foo;
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> UpdateGeometrySRID','UpdateGeometrySRID', '<xsl:value-of select="@GeometryType" />', clock_timestamp());
+BEGIN;
+ SELECT UpdateGeometrySRID('pgis_garden', 'the_geom', 4269);
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geometry','vacuum analyze Geometry', '<xsl:value-of select="@ID" />', clock_timestamp());
+VACUUM ANALYZE pgis_garden;
+<xsl:value-of select="$var_logupdatesql" />
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> DropGeometryColumn','DropGeometryColumn', '<xsl:value-of select="@GeometryType" />', clock_timestamp());
+
+BEGIN;
+ SELECT DropGeometryColumn ('pgis_garden','the_geom');
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start)
+VALUES('<xsl:value-of select="$log_label" /> DropGeometryTable','DropGeometryTable', '<xsl:value-of select="@ID" />', clock_timestamp());
+
+BEGIN;
+ SELECT DropGeometryTable ('pgis_garden');
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" />: End Testing <xsl:value-of select="@ID" />';
+ <xsl:text>
+
+ </xsl:text>
+SELECT '<xsl:value-of select="$log_label" /> Geography: Start Testing <xsl:value-of select="@ID" />';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> Create Table / Add data - Geography','CREATE TABLE geography', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ CREATE TABLE pgis_geoggarden (gid serial PRIMARY KEY, the_geog geography(<xsl:value-of select="@GeometryType" />, 4326));
+ INSERT INTO pgis_geoggarden(the_geog)
+ SELECT the_geom
+ FROM (<xsl:value-of select="." />) As foo;
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing <xsl:value-of select="@ID" />';
+
+SELECT '<xsl:value-of select="$log_label" /> Geography index: Start Testing <xsl:value-of select="@ID" />';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> gist index Geography','CREATE gist index geography', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ CREATE INDEX idx_pgis_geoggarden_geog_gist ON pgis_geoggarden USING gist(the_geog);
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> Geography index: End Testing <xsl:value-of select="@ID" />';
+
+
+<!-- vacuum analyze can't be put in a commit so we can't completely tell if it completes if it doesn't crash -->
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql) VALUES('<xsl:value-of select="$log_label" /> vacuum analyze Geography','analyze geography table', '<xsl:value-of select="@ID" />', clock_timestamp(),
+ 'VACUUM ANALYZE pgis_geoggarden;');
+VACUUM ANALYZE pgis_geoggarden;
+ <xsl:value-of select="$var_logupdatesql" />
+
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start) VALUES('<xsl:value-of select="$log_label" /> drop Geography table','drop geography table', '<xsl:value-of select="@ID" />', clock_timestamp());
+BEGIN;
+ SELECT 'BEFORE DROP' As look_at, * FROM geography_columns;
+ DROP TABLE pgis_geoggarden;
+ SELECT 'AFTER DROP' As look_at, * FROM geography_columns;
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT '<xsl:value-of select="$log_label" /> Geography: End Testing';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+<!--End Test table creation, insert, drop -->
+
+<!--Start test on operators -->
+ <xsl:for-each select="sect1[contains(@id,'Operator') and not(contains($fnexclude,funcdef/function))]/refentry">
+ <xsl:sort select="@id"/>
+ <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">
+ <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>
+ <xsl:variable name='fndef'><xsl:value-of select="." /></xsl:variable>
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <!--Store first garden sql geometry from -->
+ <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>
+ <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>
+ <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>
+ <xsl:variable name='log_label'><xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="$geom1id" /> against other types</xsl:variable>
+ SELECT '<xsl:value-of select="$log_label" />: Start Testing ';
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <xsl:choose>
+ <xsl:when test="contains($fndef, 'geography')">
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Geography <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeog1, ST_AsEWKT(foo2.the_geom) as ewktgeog2, geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom) As geog1_op_geog2
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ WHERE (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = true OR
+ (geography(foo1.the_geom) <xsl:value-of select="$fnname" /> geography(foo2.the_geom)) = false;</xsl:with-param>
+</xsl:call-template>');
+
+ SELECT 'Geography <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:when>
+ <xsl:otherwise>
+ SELECT 'Geometry <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@ID" />';
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Geometry <xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT ST_AsEWKT(foo1.the_geom) as ewktgeom1, ST_AsEWKT(foo2.the_geom) as ewktgeom2, foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom As geom1_op_geom2
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ WHERE (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = true OR
+ (foo1.the_geom <xsl:value-of select="$fnname" /> foo2.the_geom) = false;</xsl:with-param></xsl:call-template>');
+
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing <xsl:value-of select="@GeometryType" /> against other types';
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+<!--End test on operators -->
+<!-- Start regular function checks excluding operators -->
+ <xsl:for-each select="sect1[not(contains(@id,'Operator'))]/refentry">
+ <xsl:sort select="@id"/>
+
+ <xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype">
+<!--Create dummy parameters to be used later -->
+ <xsl:variable name='fnfakeparams'><xsl:call-template name="replaceparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnargs'><xsl:call-template name="listparams"><xsl:with-param name="func" select="." /></xsl:call-template></xsl:variable>
+ <xsl:variable name='fnname'><xsl:value-of select="funcdef/function"/></xsl:variable>
+ <xsl:variable name='fndef'><xsl:value-of select="funcdef"/></xsl:variable>
+ <xsl:variable name='numparams'><xsl:value-of select="count(paramdef/parameter)" /></xsl:variable>
+ <xsl:variable name='numparamgeoms'><xsl:value-of select="count(paramdef/type[contains(text(),'geometry') or contains(text(),'geography') or contains(text(),'box') or contains(text(), 'bytea')]) + count(paramdef/parameter[contains(text(),'WKT')]) + count(paramdef/parameter[contains(text(),'geomgml')])" /></xsl:variable>
+ <xsl:variable name='numparamgeogs'><xsl:value-of select="count(paramdef/type[contains(text(),'geography')] )" /></xsl:variable>
+ <xsl:variable name='log_label'><xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)</xsl:variable>
+
+ <xsl:variable name="geoftype">
+ <!--Conditionally instantiate a value to be assigned to the variable -->
+ <xsl:choose>
+ <xsl:when test="$numparamgeoms > '0'">
+ <xsl:value-of select="'Geometry'"/>
+ </xsl:when>
+ <xsl:when test="$numparamgeogs > '0'">
+ <xsl:value-of select="'Geography'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'Other'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- For each function prototype generate a test sql statement -->
+ <xsl:choose>
+<!--Test functions that take no arguments and take no geometries/geographies -->
+ <xsl:when test="($numparamgeoms = '0' and $numparamgeogs = '0') and not(contains($fnexclude,funcdef/function))">SELECT 'Starting <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';
+INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" />','<xsl:value-of select="$fnname" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnfakeparams" />) As output;</xsl:with-param></xsl:call-template>');
+
+BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+SELECT 'Ending <xsl:value-of select="funcdef/function" />(<xsl:value-of select="$fnargs" />)';
+ </xsl:when>
+<!--Start Test aggregate and unary functions for both geometry and geography -->
+<!-- put functions that take only one geometry/geography no need to cross with another geom collection, these are unary geom, aggregates, and so forth -->
+ <xsl:when test="($numparamgeoms = '1' or $numparamgeogs = '1') and not(contains($fnexclude,funcdef/function))" >
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: Start Testing';
+
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" /><xsl:text> </xsl:text>','<xsl:value-of select="$fnname" />', '<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result
+ FROM (<xsl:value-of select="." />) As foo1
+ LIMIT 3;</xsl:with-param></xsl:call-template>');
+BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+COMMIT;
+ SELECT '<xsl:value-of select="$geoftype" /> <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />: End Testing';
+ </xsl:for-each>
+ </xsl:when>
+
+<!--Functions more than 1 args not already covered this will cross every geometry type with every other -->
+ <xsl:when test="not(contains($fnexclude,funcdef/function))">
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <!--Store first garden sql geometry from -->
+ <xsl:variable name="from1"><xsl:value-of select="." /></xsl:variable>
+ <xsl:variable name='geom1type'><xsl:value-of select="@GeometryType"/></xsl:variable>
+ <xsl:variable name='geom1id'><xsl:value-of select="@ID"/></xsl:variable>
+SELECT '<xsl:value-of select="$fnname" /> <xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" /> against other types';
+ <xsl:for-each select="document('')//pgis:gardens/pgis:gset">
+ <xsl:choose>
+ <xsl:when test="($numparamgeogs > '0' or $numparamgeoms > '0')">
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> <xsl:value-of select="$geoftype" /> <xsl:text> </xsl:text> <xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />','<xsl:value-of select="$geom1id" />', '<xsl:value-of select="@ID" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />) As result, ST_AsText(foo1.the_geom) As ref1_geom, ST_AsText(foo2.the_geom) As ref2_geom
+ FROM (<xsl:value-of select="$from1" />) As foo1 CROSS JOIN (<xsl:value-of select="." />) As foo2
+ LIMIT 2;</xsl:with-param></xsl:call-template>');
+
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:when>
+ <xsl:otherwise>
+ INSERT INTO <xsl:value-of select="$var_logtable" />(log_label, func, g1, g2, log_start, log_sql)
+ VALUES('<xsl:value-of select="$log_label" /> Other <xsl:text> </xsl:text><xsl:value-of select="$geom1id" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />','<xsl:value-of select="$fnname" />', '<xsl:value-of select="$geom1id" />','<xsl:value-of select="@DI" />', clock_timestamp(),
+ '<xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1">SELECT <xsl:value-of select="$fnname" />(<xsl:value-of select="$fnfakeparams" />)</xsl:with-param></xsl:call-template>');
+
+ SELECT 'Other <xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): Start Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';
+ BEGIN;
+ <xsl:value-of select="$var_logresultsasxml" />
+ <xsl:value-of select="$var_logupdatesql" />
+ COMMIT;
+ </xsl:otherwise>
+ </xsl:choose>
+
+ SELECT '<xsl:value-of select="$fnname" />(<xsl:value-of select="$fnargs" />) <xsl:text> </xsl:text> <xsl:value-of select="@ID" />: End Testing <xsl:value-of select="$geom1id" />, <xsl:value-of select="@GeometryType" />';
+ <xsl:text>
+
+ </xsl:text>
+ </xsl:for-each>
+SELECT '<xsl:value-of select="$fnname" /><xsl:text> </xsl:text><xsl:value-of select="@ID" />(<xsl:value-of select="$fnargs" />): End Testing <xsl:value-of select="@GeometryType" /> against other types';
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ <!-- flag primary grouping the functions belong in -->
+ UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geography' WHERE (log_label ILIKE '%geography%' or log_sql ILIKE '%geography%') AND spatial_class IS NULL;
+ UPDATE <xsl:value-of select="$var_logtable" /> SET spatial_class = 'geometry' WHERE log_label ILIKE '%geometry%' or log_label ILIKE '%other%' AND spatial_class IS NULL;
+
+ </xsl:template>
+
+ <!--macro to replace func args with dummy var args -->
+ <xsl:template name="replaceparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="contains(parameter, 'matrix') or contains(parameter, 'Matrix')">
+ <xsl:value-of select="$var_matrix" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'distance')">
+ <xsl:value-of select="$var_distance" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'srid')">
+ <xsl:value-of select="$var_srid" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'position')">
+ <xsl:value-of select="$var_position" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'NDR')">
+ '<xsl:value-of select="$var_NDRXDR" />'
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'gj_version')">
+ <xsl:value-of select="$var_gj_version" />
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'version') and position() = 2">
+ <xsl:value-of select="$var_version1" />
+ </xsl:when>
+ <xsl:when test="(contains(parameter, 'version'))">
+ <xsl:value-of select="$var_version2" />
+ </xsl:when>
+ <xsl:when test="(contains(parameter,'geomgml'))">
+ <xsl:text>ST_AsGML(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="(contains(parameter,'geomkml'))">
+ <xsl:text>ST_AsKML(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="(contains(type,'box') or type = 'geometry' or type = 'geometry ' or contains(type,'geometry set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1')">
+ <xsl:text>foo1.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="(type = 'geography' or type = 'geography ' or contains(type,'geography set')) and (position() = 1 or count($func/paramdef/type[contains(text(),'geography')]) = '1' )">
+ <xsl:text>geography(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'box') or type = 'geometry' or type = 'geometry '">
+ <xsl:text>foo2.the_geom</xsl:text>
+ </xsl:when>
+ <xsl:when test="type = 'geography' or type = 'geography '">
+ <xsl:text>geography(foo2.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]') and count($func/paramdef/type[contains(text(),'geometry') or contains(text(),'box') or contains(text(), 'WKT') or contains(text(), 'bytea')]) = '1'">
+ ARRAY[foo1.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(type, 'geometry[]')">
+ ARRAY[foo2.the_geom]
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKT')">
+ <xsl:text>ST_AsEWKT(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'WKT')">
+ <xsl:text>ST_AsText(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(parameter, 'EWKB')">
+ <xsl:text>ST_AsEWKB(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'bytea')">
+ <xsl:text>ST_AsBinary(foo1.the_geom)</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type, 'float') or contains(type, 'double')">
+ <xsl:value-of select="$var_float1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'spheroid')">
+ <xsl:value-of select="$var_spheroid" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer') and position() = 2">
+ <xsl:value-of select="$var_integer1" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'integer')">
+ <xsl:value-of select="$var_integer2" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'text')">
+ <xsl:value-of select="$var_text" />
+ </xsl:when>
+ <xsl:when test="contains(type, 'varchar')">
+ <xsl:value-of select="$var_varchar" />
+ </xsl:when>
+ <xsl:when test="contains(type,'timestamp') or type = 'date'">
+ <xsl:text>'2009-01-01'</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(type,'boolean')">
+ <xsl:value-of select="$var_boolean" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->
+ <xsl:template name="listparams">
+ <xsl:param name="func" />
+ <xsl:for-each select="$func">
+ <xsl:if test="count(paramdef/parameter) > 0"> </xsl:if>
+ <xsl:for-each select="paramdef">
+ <xsl:choose>
+ <xsl:when test="count(parameter) > 0">
+ <xsl:value-of select="parameter" />
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="position()<last()"><xsl:text>, </xsl:text></xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- copied from http://www.thedumbterminal.co.uk/php/knowledgebase/?action=view&id=94 -->
+ <xsl:template name="escapesinglequotes">
+ <xsl:param name="arg1"/>
+ <xsl:variable name="apostrophe">'</xsl:variable>
+ <xsl:choose>
+ <!-- this string has at least on single quote -->
+ <xsl:when test="contains($arg1, $apostrophe)">
+ <xsl:if test="string-length(normalize-space(substring-before($arg1, $apostrophe))) > 0"><xsl:value-of select="substring-before($arg1, $apostrophe)" disable-output-escaping="yes"/>''</xsl:if>
+ <xsl:call-template name="escapesinglequotes">
+ <xsl:with-param name="arg1"><xsl:value-of select="substring-after($arg1, $apostrophe)" disable-output-escaping="yes"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- no quotes found in string, just print it -->
+ <xsl:when test="string-length(normalize-space($arg1)) > 0"><xsl:value-of select="normalize-space($arg1)"/></xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>