]> granicus.if.org Git - postgis/commitdiff
#821: doc typos errata from Kashif Rasul
authorRegina Obe <lr@pcorp.us>
Wed, 9 Feb 2011 12:54:23 +0000 (12:54 +0000)
committerRegina Obe <lr@pcorp.us>
Wed, 9 Feb 2011 12:54:23 +0000 (12:54 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@6790 b70326c6-7e19-0410-871a-916f4a2858ee

14 files changed:
doc/ZMSgeoms.txt
doc/extras_historytable.xml
doc/extras_topology.xml
doc/installation.xml
doc/reference_management.xml
doc/reference_measure.xml
doc/reference_output.xml
doc/reference_processing.xml
doc/reference_raster.xml
doc/reference_type.xml
doc/xsl/postgis_gardentest.sql.xsl
doc/xsl/postgis_gardentest_subset.sql.xsl
doc/xsl/raster_gardentest.sql.xsl
doc/xsl/topology_gardentest.sql.xsl

index 2196413934fe77ae010e47f267267bf71f154e97..9e0d8ab0f9184a2dc3945121c5aee3e937172776 100644 (file)
@@ -59,7 +59,7 @@ to the type specifies the presence of Z coordinate:
        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
index 24704e1b283b6334de9b3a83e2d6673ef69cf927..d230b1deebc5fd02e57b558584303b5c12a1f272 100644 (file)
@@ -82,7 +82,7 @@
                <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>
index 37a88b0b0336e2a3accb4bbced96753b23d166cc..09906ee9c3435bcfc2b863f107947500fe3d08e1 100644 (file)
@@ -65,7 +65,7 @@
                          </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">
@@ -162,7 +162,7 @@ ERROR:  value for domain topology.topoelement violates check constraint "dimensi
                  </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>
@@ -178,7 +178,7 @@ SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]]::topology.topoelementarray As tea;
 -------
 {{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
@@ -274,7 +274,7 @@ ERROR:  value for domain topology.topoelementarray violates check constraint "di
                        <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>
@@ -325,7 +325,7 @@ SELECT topology.AddTopoGeometryColumn('ri_topo', 'ri', 'roads', 'topo', 'LINE');
             
                 <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>
         
@@ -452,7 +452,7 @@ topoid
                        <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>
@@ -689,7 +689,7 @@ faceid
                 <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 -->
@@ -737,7 +737,7 @@ nodeid
                        <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 -->
@@ -869,7 +869,7 @@ nodeid
                        <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>
index 0208824b4b23b6c9469a829dc6b47fb248083721..c3f520d48ed81afd30cdfc9ceeea992943a25704 100644 (file)
@@ -316,7 +316,7 @@ tar -xvzf postgis-&last_release_version;.tar.gz</programlisting>
 
                        <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
@@ -424,7 +424,7 @@ tar -xvzf postgis-&last_release_version;.tar.gz</programlisting>
 
                <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>
@@ -495,7 +495,7 @@ tar -xvzf postgis-&last_release_version;.tar.gz</programlisting>
                  <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
@@ -507,7 +507,7 @@ tar -xvzf postgis-&last_release_version;.tar.gz</programlisting>
          </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>
 
index acdacd5afbde650eb0c18be8c4f2ae33ab48153e..107bec54d94dea164328cefd2b77d24cc033ba5c 100644 (file)
@@ -843,7 +843,7 @@ the_geom IS NULL)
 
                <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>
index 27022ad5710a8d6400af11564c399d10d6eb252a..a42de87dbae362b63fafd0094d6b8cda106b6cee 100644 (file)
@@ -288,8 +288,8 @@ ST_DWithin(
          <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 
@@ -2369,7 +2369,7 @@ 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
@@ -2980,7 +2980,7 @@ CAST('SPHEROID["GRS_1980",6378137,298.257222101]' As spheroid) As sph_m)  as foo
                        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>
index 935b2c2c5698e1ce8ebe8f126a0495fde578b302..e8110a8b8fd691104b8d7f5d54b5628549ddb338 100644 (file)
@@ -30,7 +30,7 @@
                        <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>
index baad8fb93208d200356edde440fcd684e0c43a84..fca2622753f067e83a2bf616af143b196914037a 100644 (file)
@@ -530,7 +530,7 @@ MULTILINESTRING((1 2,3 4),(3 4,4 5))
 
                <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.
@@ -546,7 +546,7 @@ MULTILINESTRING((1 2,3 4),(3 4,4 5))
                        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>
                        
@@ -2392,7 +2392,7 @@ MULTILINESTRING((1 3 2.75,1 4 2),(1 1 3,1 2 2.25))
 
   <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>
 
index 7aadb20643702ccc195e71453e4dd3f263059ed2..dbc1068f435dbcd544c9f1c3520909a1ed94a442 100644 (file)
@@ -1370,7 +1370,7 @@ FROM dummy_rast;
        </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>
@@ -1424,8 +1424,8 @@ FROM dummy_rast;
                        <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>
                                
@@ -2190,7 +2190,7 @@ WHERE
                        
                        <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>
@@ -2239,7 +2239,7 @@ GROUP BY (foo.geomval).val;
                <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>
@@ -2261,7 +2261,7 @@ GROUP BY (foo.geomval).val;
                        <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>
@@ -2714,7 +2714,7 @@ select st_bandisnodata(rast, 1) from dummy_rast where rid = 1; -- Expected true
                                <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>
@@ -2813,7 +2813,7 @@ rid |        rastbox
                                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 subtle
+                               <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>
@@ -2954,7 +2954,7 @@ ORDER BY val;
                        <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>),
index 36416918bc9f085e9f81a3250ed791a6b41cc0e1..25b892584af358c9f2731a6e4c78a9e55c805ea6 100644 (file)
@@ -42,7 +42,7 @@
       </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">
@@ -81,7 +81,7 @@
       </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">
index e2967b8dbc8a8db59a02ae86fbd1796c8790e37d..e1a8ddf787e5f8a1d3e36da3c82f0c470017cf90 100644 (file)
-<?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 &amp;&amp; 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()&lt;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) &gt; 0"> </xsl:if>\r
-                       <xsl:for-each select="paramdef">\r
-                               <xsl:choose>\r
-                                       <xsl:when test="count(parameter) &gt; 0">\r
-                                               <xsl:value-of select="parameter" />\r
-                                       </xsl:when>\r
-                               </xsl:choose>\r
-                               <xsl:if test="position()&lt;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 &amp;&amp; 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()&lt;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) &gt; 0"> </xsl:if>
+                       <xsl:for-each select="paramdef">
+                               <xsl:choose>
+                                       <xsl:when test="count(parameter) &gt; 0">
+                                               <xsl:value-of select="parameter" />
+                                       </xsl:when>
+                               </xsl:choose>
+                               <xsl:if test="position()&lt;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>
index ff344e0bbd3e7d1eb53f78347777c6683655e20e..300b954d6ae9ef4d6080b29c107f741afbad0841 100644 (file)
-<?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()&lt;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) &gt; 0"> </xsl:if>\r
-                       <xsl:for-each select="paramdef">\r
-                               <xsl:choose>\r
-                                       <xsl:when test="count(parameter) &gt; 0">\r
-                                               <xsl:value-of select="parameter" />\r
-                                       </xsl:when>\r
-                               </xsl:choose>\r
-                               <xsl:if test="position()&lt;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()&lt;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) &gt; 0"> </xsl:if>
+                       <xsl:for-each select="paramdef">
+                               <xsl:choose>
+                                       <xsl:when test="count(parameter) &gt; 0">
+                                               <xsl:value-of select="parameter" />
+                                       </xsl:when>
+                               </xsl:choose>
+                               <xsl:if test="position()&lt;last()"><xsl:text>, </xsl:text></xsl:if>
+                       </xsl:for-each>
+               </xsl:for-each>
+       </xsl:template>
+</xsl:stylesheet>
index 3370349f0a058df5acf38a63df1bac70f05e4beb..ffd3da958d5f16ae4727a153441b7c1e8617fb53 100644 (file)
-<?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()&lt;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) &gt; 0"> </xsl:if>\r
-                       <xsl:for-each select="paramdef">\r
-                               <xsl:choose>\r
-                                       <xsl:when test="count(parameter) &gt; 0">\r
-                                               <xsl:value-of select="parameter" />\r
-                                       </xsl:when>\r
-                               </xsl:choose>\r
-                               <xsl:if test="position()&lt;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()&lt;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) &gt; 0"> </xsl:if>
+                       <xsl:for-each select="paramdef">
+                               <xsl:choose>
+                                       <xsl:when test="count(parameter) &gt; 0">
+                                               <xsl:value-of select="parameter" />
+                                       </xsl:when>
+                               </xsl:choose>
+                               <xsl:if test="position()&lt;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>
index 12efeb6d8c2650523d7961757a816cf04cf27d9d..5f4c2df322da3d40dc0d8561b8937d067bfa1c13 100644 (file)
-<?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()&lt;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) &gt; 0"> </xsl:if>\r
-                       <xsl:for-each select="paramdef">\r
-                               <xsl:choose>\r
-                                       <xsl:when test="count(parameter) &gt; 0">\r
-                                               <xsl:value-of select="parameter" />\r
-                                       </xsl:when>\r
-                               </xsl:choose>\r
-                               <xsl:if test="position()&lt;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()&lt;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) &gt; 0"> </xsl:if>
+                       <xsl:for-each select="paramdef">
+                               <xsl:choose>
+                                       <xsl:when test="count(parameter) &gt; 0">
+                                               <xsl:value-of select="parameter" />
+                                       </xsl:when>
+                               </xsl:choose>
+                               <xsl:if test="position()&lt;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>