This commit was manufactured by cvs2svn to create tag 'pgis_1_0_2'. pgis_1_0_2
authorNo Body <no@body.net>
Fri, 1 Jul 2005 14:43:37 +0000 (14:43 +0000)
committerNo Body <no@body.net>
Fri, 1 Jul 2005 14:43:37 +0000 (14:43 +0000)
git-svn-id: http://svn.osgeo.org/postgis/tags/pgis_1_0_2@1803 b70326c6-7e19-0410-871a-916f4a2858ee

25 files changed:
CHANGES
CREDITS
Makefile.config
Version.config
doc/man/pgsql2shp.1
doc/man/shp2pgsql.1
doc/postgis.xml
jdbc2/.cvsignore
jdbc2/Makefile
loader/pgsql2shp.c
loader/shp2pgsql.c
lwgeom/Makefile
lwgeom/lwgeom_btree.c
lwgeom/lwgeom_estimate.c
lwgeom/lwgeom_geos.c
lwgeom/lwgeom_gist.c
lwgeom/lwgeom_pg.c
lwgeom/lwgeom_spheroid.c
lwgeom/lwpostgis.sql.in
regress/test_index_concurrency [new file with mode: 0755]
spatial_ref_sys.sql
utils/postgis_proc_upgrade.pl [new file with mode: 0755]
utils/postgis_restore.pl
utils/test_estimation.pl
utils/test_joinestimation.pl

diff --git a/CHANGES b/CHANGES
index 3559669517f864e318de5f2d26bcb73e15f7cbad..69196b6d78ca72ab76f33b0a11a934a6333183b8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,29 @@
+PostGIS 1.0.2
+2005/07/04
+       - Fault tolerant btree ops
+       - Memory Leak fix in pg_error
+       - Rtree index fix. See:
+         http://archives.postgresql.org/pgsql-hackers/2005-06/msg01108.php
+        - Initial support for postgresql 8.1dev
+       - Cleaner build scripts: avoided mix of CFLAGS and CXXFLAGS
+       - NEW -I switch for pgsql2shp (GiST index)
+
+PostGIS 1.0.1
+2005/05/24
+       - BUGFIX in shp2pgql escape functions
+       - BUGFIX in 3d computation of lenght_spheroid
+       - better support for concurrent postgis in multiple schemas
+       - documentation fixes
+       - BUGFIX in join selectivity estimator returning invalid estimates (>1)
+       - jdbc2: compile with "-target 1.2 -source 1.2" by default
+       - NEW -k switch for pgsql2shp
+       - NEW support for custom createdb options in postgis_restore.pl
+       - BUGFIX in pgsql2shp attribute names unicity enforcement
+       - BUGFIX in Paris projections definitions
+       - postgis_restore.pl cleanups
+
 PostGIS 1.0.0
+2005/04/19
        - NEW manual pages for loader/dumper
        - NEW shp2pgsql support for old (HWGEOM) postgis versions
        - NEW -p flag for shp2pgsql
@@ -7,6 +32,8 @@ PostGIS 1.0.0
        - NEW chapter about OGC compliancy enforcement
        - BUGFIX in shp2pgsql escape of values starting with "'" or "\t" 
        - NEW autoconf support for JTS lib
+       - BUGFIX in estimator testers (support for LWGEOM and schema parsing)
+       - BUGFIX in join selectivity estimator (defaults, leaks, tuplecount, sd)
 
 PostGIS 1.0.0RC6
 2005/03/30
diff --git a/CREDITS b/CREDITS
index 224a2725658b3425c6769739e8bc7b6c1f40e35d..01119a3a42c70890acd42db299698a58ed57bbd3 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -42,5 +42,10 @@ Version 0.9 of PostGIS includes patches from:
   Olivier Courtin <pnine@free.fr> on AsSVG()
   Bruno Wolff III on the distance_sphere algorithm
 
+Version 1.0.0 of PostGIS includes code from:
+  Mark Cave-Ayland <m.cave-ayland@webbased.co.uk> with new positional
+       operators, join estimator and general testing and support.
+  Markus Schaber <markus@schabi.de> author of the jdbc2 interface
+
 See the postgis manual for more contributors.
 
index 1e343156b9a5c5d9fd6fd1f2ef9f9050b88cb5f8..aa4a869d3ed36b100a50886a7a9ff9175284cb1c 100644 (file)
@@ -124,7 +124,11 @@ else
                        ifneq ($(findstring 7.4,$(VERSION)),)
                                USE_VERSION=74
                        else
-                               USE_VERSION=80
+                               ifneq ($(findstring 8.0,$(VERSION)),)
+                                       USE_VERSION=80
+                               else
+                                       USE_VERSION=81
+                               endif
                        endif
                endif
        endif
index 84d53f96e426b05f5cb3ab1fe136edf6a5a61246..d96ae0cc5c98408cf497a4a602b3678b5e040d51 100644 (file)
@@ -4,7 +4,7 @@
 # shared library version
 SO_MAJOR_VERSION=1
 SO_MINOR_VERSION=0
-SO_MICRO_VERSION=0
+SO_MICRO_VERSION=2
 
 # sql scripts version
 SCRIPTS_VERSION=0.3.0
index 03f8cbb0e85f181487fe4bf193893c232eb1b5de..aadd78450f4f5a7220c8805e5e13920c81222193 100644 (file)
@@ -56,6 +56,10 @@ Raw mode. Do not drop the gid field, or escape column names.
 \fB\-d\fR
 For backward compatibility: write a 3\-dimensional shape file when dumping from old (pre\-1.0.0) postgis databases (the default is to write a 2\-dimensional shape file in that case). Starting from postgis\-1.0.0+, dimensions are fully encoded. 
 
+.TP 
+\fB\-k\fR
+Keep idendifiers case (don't uppercase field names). 
+
 
 .SH "AUTHORS"
 .LP
index 6eb233f0abf86be6d3906ea3c36fe0ac79c40caf..09c02bc22df5d3240283aa02b2f40223254917ae 100644 (file)
@@ -41,7 +41,7 @@ Creates and populates the geometry tables with the specified SRID.
 
 .TP 
 \fB\-k\fR
-Keep idendifiers case (column, schema and attributes). Note that attributes in Shapefile are all UPPERCASE.
+Keep idendifiers case (column, schema and attributes). Note that attributes in Shapefile are usually all UPPERCASE.
 
 .TP 
 \fB\-i\fR
index 3f17e68dd12af1867f6051f521dde415f26bc2ba..82dc4ab2db26c30a77d9f24d144d183629aa62a6 100644 (file)
 
         <listitem>
           <para>The "<ulink
-          url="http://www.opengis.org/techno/specs/99-049.pdf">Simple Features
+          url="http://www.opengis.org/docs/99-049.pdf">Simple Features
           for Specification for SQL</ulink>" is available at the OpenGIS
           Consortium web site: <ulink
           url="http://www.opengis.org">http://www.opengis.org</ulink>.</para>
         <listitem>
           <para>Once your PostgreSQL installation is up-to-date, enter the
           "postgis" directory, and edit the
-          <filename>Makefile</filename>.</para>
+          <filename>Makefile.config</filename> file.</para>
 
           <itemizedlist>
             <listitem>
@@ -359,7 +359,7 @@ as follow:
        <programlisting>
        # Create a "custom-format" dump of the database you want
        # to upgrade (let's call it "olddb")
-       $ pg_dump -Fc olddb olddb.dump
+       $ pg_dump -Fc olddb &gt; olddb.dump
 
        # Restore the dump contextually upgrading postgis into
        # a new database. The new database doesn't have to exist.
@@ -384,7 +384,7 @@ as follow:
        # If you did make additions we assume you know how to backup them before
        # upgrading the table. Replace of it with the new one is done like this:
        $ psql newdb
-       newdb=&gt; drop table spatial_ref_sys;
+       newdb=&gt; delete from spatial_ref_sys; 
        DROP
        newdb=&gt; \i spatial_ref_sys.sql
        </programlisting>
@@ -448,7 +448,7 @@ as a "backup" in case postgis_restore.pl won't work for you:
         </orderedlist>
 
         <para>Also check that you have made any necessary changes to the top
-        of the Makefile. This includes:</para>
+        of the Makefile.config. This includes:</para>
 
         <orderedlist>
           <listitem>
@@ -456,7 +456,7 @@ as a "backup" in case postgis_restore.pl won't work for you:
             must install the Proj4 library on your system, set the
             <varname>USE_PROJ</varname> variable to 1 and the
             <varname>PROJ_DIR</varname> to your installation prefix in the
-            Makefile.</para>
+            Makefile.config.</para>
           </listitem>
 
           <listitem>
@@ -464,7 +464,7 @@ as a "backup" in case postgis_restore.pl won't work for you:
             install the GEOS library on your system, and set the
             <varname>USE_GEOS</varname> to 1 and the
             <varname>GEOS_DIR</varname> to your installation prefix in the
-            Makefile.</para>
+            Makefile.config</para>
           </listitem>
         </orderedlist>
       </sect2>
@@ -1518,7 +1518,7 @@ WHERE
   AsText(GEOM) AS GEOM 
 FROM ROADS_GEOM 
 WHERE 
-  GEOM &amp;&amp; GeomFromText('BOX3D(191232 243117,191232 243119)'::box3d,-1);</programlisting>
+  GEOM &amp;&amp; SetSRID('BOX3D(191232 243117,191232 243119)'::box3d,-1);</programlisting>
 
         <para>Note the use of the SRID, to specify the projection of the
         BOX3D. The value -1 is used to indicate no specified SRID.</para>
@@ -2755,7 +2755,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>SetSRID(geometry)</term>
+            <term>SetSRID(geometry, integer)</term>
 
             <listitem>
               <para>Set the SRID on a geometry to a particular integer value.
@@ -2770,7 +2770,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
 
         <variablelist>
           <varlistentry>
-            <term>Distance(geometry,geometry)</term>
+            <term>Distance(geometry, geometry)</term>
 
             <listitem>
               <para>Return the cartesian distance between two geometries in
@@ -2779,13 +2779,13 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Equals(geometry,geometry)</term>
+            <term>Equals(geometry, geometry)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry is "spatially equal" to
-              anotherGeometry. Use this for a 'better' answer than '='. equals
-              ('LINESTRING(0 0, 10 10)','LINESTRING(0 0, 5 5, 10 10)') is
-              true.</para>
+              <para>Returns 1 (TRUE) if the given Geometries are
+             "spatially equal". Use this for a 'better' answer than '='.
+             equals('LINESTRING(0 0, 10 10)','LINESTRING(0 0, 5 5, 10 10)')
+             is true.</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2794,11 +2794,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Disjoint(geometry,geometry)</term>
+            <term>Disjoint(geometry, geometry)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry is "spatially disjoint"
-              from anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if the Geometries are "spatially disjoint".
+             </para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2814,11 +2814,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Intersects(geometry,geometry)</term>
+            <term>Intersects(geometry, geometry)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry "spatially intersects"
-              anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if the Geometries "spatially intersect".
+              </para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2834,11 +2834,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Touches(geometry,geometry)</term>
+            <term>Touches(geometry, geometry)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry "spatially touches"
-              anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if the Geometries "spatially touch".
+              </para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2855,11 +2855,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Crosses(geometry,geometry)</term>
+            <term>Crosses(geometry, geometry)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry "spatially crosses"
-              anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if the Geometries "spatially cross".
+              </para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2875,11 +2875,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Within(geometry,geometry)</term>
+            <term>Within(geometry A, geometry B)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry is "spatially within"
-              anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if Geometry A is "spatially within"
+              Geometry B.</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2895,11 +2895,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Overlaps(geometry,geometry)</term>
+            <term>Overlaps(geometry, geometry)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry is "spatially
-              overlapping" anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if the Geometries "spatially
+              overlap".</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2914,11 +2914,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Contains(geometry,geometry)</term>
+            <term>Contains(geometry A, geometry B)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry is "spatially contains"
-              anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if Geometry A "spatially contains"
+              Geometry B.</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2929,16 +2929,16 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
               boolean, not an integer.</para>
 
               <para>OGC SPEC s2.1.1.2 // s2.1.13.3 - same as
-              within(geometry,geometry)</para>
+              within(geometry B, geometry A)</para>
             </listitem>
           </varlistentry>
 
           <varlistentry>
-            <term>Intersects(geometry,geometry)</term>
+            <term>Intersects(geometry, geometry)</term>
 
             <listitem>
-              <para>Returns 1 (TRUE) if this Geometry is "spatially
-              intersects" anotherGeometry.</para>
+              <para>Returns 1 (TRUE) if the Geometries "spatially
+              intersect".</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -2949,12 +2949,12 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
               boolean, not an integer.</para>
 
               <para>OGC SPEC s2.1.1.2 // s2.1.13.3 - NOT
-              disjoint(geometry,geometry)</para>
+              disjoint(geometry, geometry)</para>
             </listitem>
           </varlistentry>
 
           <varlistentry>
-            <term>Relate(geometry,geometry, intersectionPatternMatrix)</term>
+            <term>Relate(geometry, geometry, intersectionPatternMatrix)</term>
 
             <listitem>
               <para>Returns 1 (TRUE) if this Geometry is spatially related to
@@ -2975,7 +2975,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Relate(geometry,geometry)</term>
+            <term>Relate(geometry, geometry)</term>
 
             <listitem>
               <para>returns the DE-9IM (dimensionally extended
@@ -3060,7 +3060,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Buffer(geometry,double,[integer])</term>
+            <term>Buffer(geometry, double, [integer])</term>
 
             <listitem>
               <para>Returns a geometry that represents all points whose
@@ -3093,11 +3093,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Intersection(geometry,geometry)</term>
+            <term>Intersection(geometry, geometry)</term>
 
             <listitem>
               <para>Returns a geometry that represents the point set
-              intersection of this Geometry with anotherGeometry.</para>
+              intersection of the Geometies.</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -3109,11 +3109,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>SymDifference(geometry,geometry)</term>
+            <term>SymDifference(geometry A, geometry B)</term>
 
             <listitem>
               <para>Returns a geometry that represents the point set symmetric
-              difference of this Geometry with anotherGeometry.</para>
+              difference of Geometry A with Geometry B.</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -3125,11 +3125,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>Difference(geometry,geometry)</term>
+            <term>Difference(geometry A, geometry B)</term>
 
             <listitem>
               <para>Returns a geometry that represents the point set symmetric
-              difference of this Geometry with anotherGeometry.</para>
+              difference of Geometry A with Geometry B.</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -3141,11 +3141,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D.
           </varlistentry>
 
           <varlistentry>
-            <term>GeomUnion(geometry,geometry)</term>
+            <term>GeomUnion(geometry, geometry)</term>
 
             <listitem>
               <para>Returns a geometry that represents the point set union of
-              this Geometry with anotherGeometry.</para>
+              the Geometries.</para>
 
               <para>Performed by the GEOS module</para>
 
@@ -4661,9 +4661,90 @@ FROM geometry_table;</literallayout>
        <appendix>
                <title>Release Notes</title>
 
+               <sect1>
+                       <title>Release 1.0.2</title>
+                       <para>Release date: 2005/07/04</para>
+
+                       <para>
+                       Contains a few bug fixes and improvements.
+                       </para>
+
+                       <sect2>
+                               <title>Upgrading</title>
+
+                               <para>If you are upgrading from
+                               release 1.0.0RC6 or up you <emphasis>DO
+                               NOT</emphasis> need a dump/reload.</para>
+
+                               <para>Upgrading from older releases
+                               requires a dump/reload. 
+                               See the <link
+                               linkend="upgrading">upgrading</link>
+                               chapter for more informations.</para>
+                       </sect2>
+
+                       <sect2>
+                               <title>Bug fixes</title>
+       <para>Fault tolerant btree ops</para>
+       <para>Memory leak plugged in pg_error</para>
+       <para>Rtree index fix</para>
+       <para>Cleaner build scripts (avoided mix of CFLAGS and CXXFLAGS)</para>
+                       </sect2>
+
+                       <sect2>
+                               <title>Improvements</title>
+       <para>New index creation capabilities in loader (-I switch)</para>
+       <para>Initial support for postgresql 8.1dev</para>
+                       </sect2>
+
+               </sect1>
+
+               <sect1>
+                       <title>Release 1.0.1</title>
+                       <para>Release date: 2005/05/24</para>
+
+                       <para>
+                       Contains a few bug fixes and some improvements.
+                       </para>
+
+                       <sect2>
+                               <title>Upgrading</title>
+
+                               <para>If you are upgrading from
+                               release 1.0.0RC6 or up you <emphasis>DO
+                               NOT</emphasis> need a dump/reload.</para>
+
+                               <para>Upgrading from older releases
+                               requires a dump/reload. 
+                               See the <link
+                               linkend="upgrading">upgrading</link>
+                               chapter for more informations.</para>
+                       </sect2>
+
+                       <sect2>
+                               <title>Library changes</title>
+       <para>BUGFIX in 3d computation of lenght_spheroid()</para>
+       <para>BUGFIX in join selectivity estimator</para>
+                       </sect2>
+
+                       <sect2>
+                               <title>Other changes/additions</title>
+       <para>BUGFIX in shp2pgql escape functions</para>
+       <para>better support for concurrent postgis in multiple schemas</para>
+       <para>documentation fixes</para>
+       <para>jdbc2: compile with "-target 1.2 -source 1.2" by default</para>
+       <para>NEW -k switch for pgsql2shp</para>
+       <para>NEW support for custom createdb options in postgis_restore.pl</para>
+       <para>BUGFIX in pgsql2shp attribute names unicity enforcement</para>
+       <para>BUGFIX in Paris projections definitions</para>
+       <para>postgis_restore.pl cleanups</para>
+                       </sect2>
+
+               </sect1>
+
                <sect1>
                        <title>Release 1.0.0</title>
-                       <para>Release date: 2005/04/??</para>
+                       <para>Release date: 2005/04/19</para>
 
                        <para>Final 1.0.0 release.
                        Contains a few bug fixes, some improvements
@@ -4689,6 +4770,7 @@ FROM geometry_table;</literallayout>
                                <title>Library changes</title>
        <para>BUGFIX in transform() releasing random memory address</para>
        <para>BUGFIX in force_3dm() allocating less memory then required</para>
+       <para>BUGFIX in join selectivity estimator (defaults, leaks, tuplecount, sd)</para>
                        </sect2>
 
                        <sect2>
@@ -4699,6 +4781,7 @@ FROM geometry_table;</literallayout>
        <para>NEW -p (prepare) flag for shp2pgsql</para>
        <para>NEW manual chapter about OGC compliancy enforcement</para>
        <para>NEW autoconf support for JTS lib</para>
+       <para>BUGFIX in estimator testers (support for LWGEOM and schema parsing)</para>
                        </sect2>
 
                </sect1>
index 3cc40d652773ad8ca5ea23a7b8c9cb85e0a96fbc..5ad8b1efd5cb5d906b9e7e5e5af83b80cb62ddc6 100644 (file)
@@ -5,3 +5,4 @@ stubbin
 stubcompile
 jtscompile
 versionstamp
+eclipsebin
index 7fdd57048f18fdc7df744d84b69edd23c419d736..ed11a8f3bcea583b7a8392e2537868d926abc937 100644 (file)
@@ -27,7 +27,7 @@
 
 # Configure the helper executables used during build.
 
-JAVAC?=javac
+JAVAC?=javac -target 1.2 -source 1.2
 JAVA?=java
 JAR?=jar
 MKDIR?=mkdir -p
index 1d5e9a3cb039c6615e1e6e5bc5f45109963a3274..1a05c03a6746ebb32e5ceb0208c78ffb5c2a2b6f 100644 (file)
@@ -73,6 +73,7 @@ int dswitchprovided;
 int includegid;
 int unescapedattrs;
 int binary;
+int keep_fieldname_case;
 SHPObject * (*shape_creator)(byte *, int);
 int big_endian = 0;
 int pgis_major_version;
@@ -166,6 +167,7 @@ main(int ARGC, char **ARGV)
        includegid=0;
        unescapedattrs=0;
        binary = 0;
+       keep_fieldname_case = 0;
 #ifdef DEBUG
        FILE *debug;
 #endif
@@ -2272,7 +2274,8 @@ usage(int status)
        printf("  -b Use a binary cursor.\n");
        printf("  -r Raw mode. Do not assume table has been created by \n");
        printf("     the loader. This would not unescape attribute names\n");
-       printf("     and will not skip the 'gid' attribute.");
+       printf("     and will not skip the 'gid' attribute.\n");
+       printf("  -k Keep postgresql identifiers case.\n");
                printf("\n");
                exit (status);
 }
@@ -2287,50 +2290,52 @@ parse_commandline(int ARGC, char **ARGV)
        buf[1023] = '\0'; // just in case...
 
        /* Parse command line */
-        while ((c = getopt(ARGC, ARGV, "bf:h:du:p:P:g:r")) != EOF){
-               switch (c) {
-               case 'b':
-                    binary = 1;
-                    break;
-               case 'f':
-                    shp_file = optarg;
-                    break;
-               case 'h':
-                   //setenv("PGHOST", optarg, 1);
-                   snprintf(buf, 255, "PGHOST=%s", optarg);
-                   putenv(strdup(buf));
-                    break;
-               case 'd':
-                    dswitchprovided = 1;
-                   outtype = 'z';
-                    break;               
-               case 'r':
-                   includegid = 1;
-                   unescapedattrs = 1;
-                    break;               
-               case 'u':
-                   //setenv("PGUSER", optarg, 1);
-                   snprintf(buf, 255, "PGUSER=%s", optarg);
-                   putenv(strdup(buf));
-                    break;
-               case 'p':
-                   //setenv("PGPORT", optarg, 1);
-                   snprintf(buf, 255, "PGPORT=%s", optarg);
-                   putenv(strdup(buf));
-                    break;
-              case 'P':
-                   //setenv("PGPASSWORD", optarg, 1);
-                   snprintf(buf, 255, "PGPASSWORD=%s", optarg);
-                   putenv(strdup(buf));
-                   break;
-              case 'g':
-                   geo_col_name = optarg;
-                   break;
-               case '?':
-                    return 0;
-               default:
-                   return 0;
-               }
+        while ((c = getopt(ARGC, ARGV, "bf:h:du:p:P:g:rk")) != EOF){
+               switch (c) {
+                       case 'b':
+                               binary = 1;
+                               break;
+                       case 'f':
+                               shp_file = optarg;
+                               break;
+                       case 'h':
+                               //setenv("PGHOST", optarg, 1);
+                               snprintf(buf, 255, "PGHOST=%s", optarg);
+                               putenv(strdup(buf));
+                               break;
+                       case 'd':
+                               dswitchprovided = 1;
+                               outtype = 'z';
+                               break;            
+                       case 'r':
+                               includegid = 1;
+                               unescapedattrs = 1;
+                               break;            
+                       case 'u':
+                               //setenv("PGUSER", optarg, 1);
+                               snprintf(buf, 255, "PGUSER=%s", optarg);
+                               putenv(strdup(buf));
+                               break;
+                       case 'p':
+                               //setenv("PGPORT", optarg, 1);
+                               snprintf(buf, 255, "PGPORT=%s", optarg);
+                               putenv(strdup(buf));
+                               break;
+                       case 'P':
+                               //setenv("PGPASSWORD", optarg, 1);
+                               snprintf(buf, 255, "PGPASSWORD=%s", optarg);
+                               putenv(strdup(buf));
+                               break;
+                       case 'g':
+                               geo_col_name = optarg;
+                               break;
+                       case 'k':
+                               keep_fieldname_case = 1;
+                               break;
+                       case '?':
+                       default:
+                               return 0;
+               }
         }
 
         curindex=0;
@@ -2365,7 +2370,6 @@ get_postgis_major_version(void)
                exit(1);
        }
 
-       res = PQexec(conn, query);
        version = PQgetvalue(res, 0, 0);
        ver = atoi(version);
        PQclear(res);
@@ -2390,6 +2394,8 @@ initialize(void)
        int mainscan_nflds=0;
        int size;
        int gidfound=0;
+       char *dbf_flds[256];
+       int dbf_nfields=0;
 
        /* Detect postgis version */
        pgis_major_version = get_postgis_major_version();
@@ -2499,7 +2505,7 @@ initialize(void)
                         * This is exactly the geometry privided
                         * by the user.
                         */
-                       else if (!strcmp(geo_col_name,fname))
+                       else if (!strcmp(geo_col_name, fname))
                        {
                                geom_fld = mainscan_nflds;
                                type_ary[mainscan_nflds]=9; 
@@ -2533,42 +2539,38 @@ initialize(void)
                 * becomes __xmin when escaped
                 */
 
-
-               if(strlen(ptr) <32) strcpy(field_name, ptr);
-               else
-               {
-                       /*
-                        * TODO: you find an appropriate name if
-                        * running in RAW mode
-                        */
-                       printf("dbf attribute name %s is too long, must be "
-                               "less than 32 characters.\n", ptr);
-                       return 0;
-               }
-
-
-               /* make UPPERCASE */
-               for(j=0; j < strlen(field_name); j++)
-                       field_name[j] = toupper(field_name[j]);
+               /* Limit dbf field name to 10-digits */
+               strncpy(field_name, ptr, 10);
+               field_name[10] = 0;
 
                /* 
                 * make sure the fields all have unique names,
-                * 10-digit limit on dbf names...
                 */
-               for(j=0;j<i;j++)
+               tmpint=1;
+               for(j=0; j<dbf_nfields; j++)
                {
-                       if(strncmp(field_name, PQgetvalue(res, j, 0),10) == 0)
+                       if(!strncasecmp(field_name, dbf_flds[j], 10))
                        {
-               printf("\nWarning: Field '%s' has first 10 characters which "
-                       "duplicate a previous field name's.\n"
-                       "Renaming it to be: '",field_name);
-                               strncpy(field_name,field_name,9);
-                               field_name[9] = 0;
-                               sprintf(field_name,"%s%d",field_name,i);
-                               printf("%s'\n\n",field_name);
+                               sprintf(field_name,"%.7s_%.2d",
+                                       ptr,
+                                       tmpint++);
+                               j=-1; continue;
                        }
                }
 
+               /* make UPPERCASE if keep_fieldname_case = 0 */
+               if (keep_fieldname_case == 0)
+                       for(j=0; j<strlen(field_name); j++)
+                               field_name[j] = toupper(field_name[j]);
+
+               if ( strcasecmp(fname, field_name) ) {
+                       fprintf(stderr, "Warning, field %s renamed to %s\n",
+                               fname, field_name);
+               }
+
+               //fprintf(stderr, "DBFfield: %s\n", field_name);
+               dbf_flds[dbf_nfields++] = strdup(field_name);
+
                /*
                 * Find appropriate type of dbf attributes
                 */
@@ -2576,7 +2578,7 @@ initialize(void)
                /* integer type */
                if(type == 20 || type == 21 || type == 23)
                {
-                       if(DBFAddField(dbf, field_name,FTInteger,16,0) == -1)
+                       if(DBFAddField(dbf, field_name, FTInteger,16,0) == -1)
                        {
                                printf( "error - Field could not "
                                        "be created.\n");
@@ -2632,7 +2634,7 @@ initialize(void)
 //printf( "FIELD_NAME: %s, SIZE: %d\n", field_name, size);
                
                /* generic type (use string representation) */
-               if(DBFAddField(dbf, field_name,FTString,size,0) == -1)
+               if(DBFAddField(dbf, field_name, FTString, size, 0) == -1)
                {
                        printf( "error - Field could not "
                                        "be created.\n");
@@ -2642,6 +2644,9 @@ initialize(void)
                mainscan_flds[mainscan_nflds++] = fname;
        }
 
+       /* Release dbf field memory */
+       for (i=0; i<dbf_nfields; i++) free(dbf_flds[i]);
+
        /*
         * If no geometry has been found
         * we have finished with initialization
@@ -3117,6 +3122,12 @@ create_usrquerytable(void)
 
 /**********************************************************************
  * $Log$
+ * Revision 1.74.2.2  2005/05/16 17:51:17  strk
+ * BUGFIX in attribute names unicity enforcement
+ *
+ * Revision 1.74.2.1  2005/05/16 08:03:29  strk
+ * Back-ported -k patch
+ *
  * Revision 1.74  2005/03/25 18:43:07  strk
  * Fixed PQunescapeBytearea argument (might give problems on 64bit archs)
  *
index 6a9dc3185df9c792a38422b794dc8973a2b343c5..1dfaeff9c3b9961e5258170c00aeca495980b4e0 100644 (file)
@@ -59,6 +59,7 @@ typedef struct Ring {
 int    dump_format = 0; //0=insert statements, 1 = dump
 int    quoteidentifiers = 0;
 int    forceint4 = 0;
+int    createindex = 0;
 char    opt = ' ';
 char    *col_names = NULL;
 char   *pgtype;
@@ -90,6 +91,7 @@ char *protect_quotes_string(char *str);
 int PIP( Point P, Point* V, int n );
 void *safe_malloc(size_t size);
 void CreateTable(void);
+void CreateIndex(void);
 void usage(char *me, int exitcode);
 void InsertPoint(void);
 void InsertPointWKT(void);
@@ -172,7 +174,7 @@ make_good_string(char *str)
 
        if (toescape == 0) return str;
 
-       size = ptr-str+toescape;
+       size = ptr-str+toescape+1;
 
        result = calloc(1, size);
 
@@ -225,7 +227,7 @@ protect_quotes_string(char *str)
 
        if (toescape == 0) return str;
        
-       size = ptr-str+toescape;
+       size = ptr-str+toescape+1;
 
        result = calloc(1, size);
 
@@ -395,6 +397,11 @@ main (int ARGC, char **ARGV)
         */
        if(opt != 'a') CreateTable();
 
+       /*
+        * Create GiST index if requested
+        */
+       if(createindex) CreateIndex();
+
        /*
         * Generate INSERT or COPY lines
         */
@@ -566,6 +573,22 @@ CreateTable(void)
        printf("'%s',%d);\n", pgtype, pgdims);
 }
 
+void
+CreateIndex(void)
+{
+       /* 
+        * Create gist index
+        */
+       if ( schema )
+       {
+               printf("CREATE INDEX \"%s_%s_gist\" ON \"%s\".\"%s\" using gist (\"%s\" gist_geometry_ops);\n", table, geom, schema, table, geom);
+       }
+       else
+       {
+               printf("CREATE INDEX \"%s_%s_gist\" ON \"%s\" using gist (\"%s\" gist_geometry_ops);\n", table, geom, table, geom);
+       }
+}
+
 void
 LoadData(void)
 {
@@ -707,6 +730,8 @@ usage(char *me, int exitcode)
        fprintf(stderr, "\n");
        fprintf(stderr, "  -i  Use int4 type for all integer dbf fields.\n");
        fprintf(stderr, "\n");
+       fprintf(stderr, "  -I  Create a GiST index on the geometry column.\n");
+       fprintf(stderr, "\n");
        fprintf(stderr, "  -w  Use wkt format (for postgis-0.x support - drops M - drifts coordinates).\n");
 #ifdef USE_ICONV
        fprintf(stderr, "\n");
@@ -1176,7 +1201,7 @@ ParseCmdline(int ARGC, char **ARGV)
        extern char *optarg;
        extern int optind;
 
-       while ((c = getopt(ARGC, ARGV, "kcdapDs:g:iW:w")) != EOF){
+       while ((c = getopt(ARGC, ARGV, "kcdapDs:g:iW:wI")) != EOF){
                switch (c) {
                case 'c':
                     if (opt == ' ')
@@ -1217,6 +1242,9 @@ ParseCmdline(int ARGC, char **ARGV)
                case 'i':
                     forceint4 = 1;
                     break;
+               case 'I':
+                    createindex = 1;
+                    break;
                case 'w':
                     hwgeom = 1;
                     break;
@@ -1615,6 +1643,12 @@ utf8 (const char *fromcode, char *inputbuf)
 
 /**********************************************************************
  * $Log$
+ * Revision 1.88.2.2  2005/07/01 14:22:40  strk
+ * backported -I switch
+ *
+ * Revision 1.88.2.1  2005/04/21 09:07:41  strk
+ * Applied patch from Ron Mayer fixing a segfault in string escaper funx
+ *
  * Revision 1.88  2005/04/14 12:58:59  strk
  * Applied patch by Gino Lucrezi fixing bug in string escaping code.
  *
index 7766a5790a994c52aad3c30dc5d9da164bb86073..e168b160f009e6b343c10325733c2e69f1840163 100644 (file)
@@ -38,9 +38,8 @@ POSTGIS_BUILD_DATE := $(shell date -u "+%Y-%m-%d %H:%M:%S")
 
 #---------------------------------------------------------------
 
-override CFLAGS += -g -O2 -fexceptions
-override CFLAGS += -fPIC
-#override CFLAGS += -I$(srcdir) -DFRONTEND -DSYSCONFDIR='"$(sysconfdir)"' 
+CSTAR_FLAGS = -g -O2 -fPIC -fexceptions
+
 override CFLAGS += -DUSE_VERSION=$(USE_VERSION)
 override CFLAGS += -DPOSTGIS_LIB_VERSION='"$(POSTGIS_LIB_VERSION)"'
 override CFLAGS += -DPOSTGIS_SCRIPTS_VERSION='"$(SCRIPTS_VERSION)"'
@@ -48,14 +47,16 @@ override CFLAGS += -DPOSTGIS_BUILD_DATE='"$(POSTGIS_BUILD_DATE)"'
 
 JTS_OBJ=lwgeom_nojts.o
 ifeq ($(USE_GEOS),1)
-       override CFLAGS += -I$(GEOS_DIR)/include -DUSE_GEOS
+       CXXFLAGS += -I$(GEOS_DIR)/include 
+       CSTAR_FLAGS += -DUSE_GEOS
        GEOS_RULES=detect_geos_version
        GEOS_WRAPPER=lwgeom_geos_wrapper.o
        JTS_OBJ=lwgeom_geos.o
 endif
 
 ifeq ($(USE_JTS),1)
-       override CFLAGS += -I$(JTS_INCLUDES) -DUSE_JTS
+       CXXFLAGS += -I$(JTS_INCLUDES)
+       CSTAR_FLAGS += -DUSE_JTS
        JTS_WRAPPER=lwgeom_jts_wrapper.o
        JTS_OBJ=lwgeom_jts.o
 endif
@@ -68,7 +69,9 @@ override CFLAGS += -I$(PROJ_DIR)/include -DAUTOCACHE_BBOX=$(AUTOCACHE_BBOX)
 
 override DLLLIBS += $(BE_DLLLIBS) 
 
-override CXXFLAGS := $(CFLAGS)
+override CFLAGS += $(CSTAR_FLAGS)
+override CXXFLAGS += $(CSTAR_FLAGS)
+
 # memory debug for gcc 2.91, 2.95, 3.0 and 3.1
 # for gcc >= 3.2.2 set GLIBCPP_FORCE_NEW at runtime instead
 #override CXXFLAGS += -D__USE_MALLOC
index 70598fae7b6157648c6cfed27a681a9187872355..359b599a5262c70e29793d60eb01daadd3731773 100644 (file)
@@ -29,6 +29,16 @@ Datum lwgeom_cmp(PG_FUNCTION_ARGS);
 
 //#define PGIS_DEBUG
 
+#if USE_VERSION == 72
+#define BTREE_SRID_MISMATCH_SEVERITY NOTICE
+#else
+#if USE_VERSION < 80
+#define BTREE_SRID_MISMATCH_SEVERITY WARNING
+#else
+#define BTREE_SRID_MISMATCH_SEVERITY ERROR
+#endif
+#endif
+
 PG_FUNCTION_INFO_V1(lwgeom_lt);
 Datum lwgeom_lt(PG_FUNCTION_ARGS)
 {
@@ -43,7 +53,7 @@ Datum lwgeom_lt(PG_FUNCTION_ARGS)
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
        {
-               elog(ERROR,
+               elog(BTREE_SRID_MISMATCH_SEVERITY,
                        "Operation on two GEOMETRIES with different SRIDs\n");
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
                        pfree(geom1);
@@ -100,7 +110,7 @@ Datum lwgeom_le(PG_FUNCTION_ARGS)
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
        {
-               elog(ERROR,
+               elog(BTREE_SRID_MISMATCH_SEVERITY,
                        "Operation on two GEOMETRIES with different SRIDs\n");
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
                        pfree(geom1);
@@ -180,7 +190,7 @@ Datum lwgeom_eq(PG_FUNCTION_ARGS)
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
        {
-               elog(ERROR,
+               elog(BTREE_SRID_MISMATCH_SEVERITY,
                        "Operation on two GEOMETRIES with different SRIDs\n");
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
                        pfree(geom1);
@@ -240,7 +250,7 @@ Datum lwgeom_ge(PG_FUNCTION_ARGS)
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
        {
-               elog(ERROR,
+               elog(BTREE_SRID_MISMATCH_SEVERITY,
                        "Operation on two GEOMETRIES with different SRIDs\n");
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
                        pfree(geom1);
@@ -312,7 +322,7 @@ Datum lwgeom_gt(PG_FUNCTION_ARGS)
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
        {
-               elog(ERROR,
+               elog(BTREE_SRID_MISMATCH_SEVERITY,
                        "Operation on two GEOMETRIES with different SRIDs\n");
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
                        pfree(geom1);
@@ -380,7 +390,7 @@ Datum lwgeom_cmp(PG_FUNCTION_ARGS)
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
        {
-               elog(ERROR,
+               elog(BTREE_SRID_MISMATCH_SEVERITY,
                        "Operation on two GEOMETRIES with different SRIDs\n");
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
                        pfree(geom1);
@@ -449,6 +459,9 @@ Datum lwgeom_cmp(PG_FUNCTION_ARGS)
 /***********************************************************
  *
  * $Log$
+ * Revision 1.7.2.1  2005/06/15 16:04:31  strk
+ * fault tolerant btree ops
+ *
  * Revision 1.7  2005/02/07 13:21:10  strk
  * Replaced DEBUG* macros with PGIS_DEBUG*, to avoid clashes with postgresql DEBUG
  *
index 55ded4a1606c41e684daf2b93172bbb13e755c14..a4cc30c5b03f86405fff053a6d6a9e5049c92e19 100644 (file)
@@ -775,7 +775,11 @@ calculate_column_intersection(BOX2DFLOAT4 *search_box, GEOM_STATS *geomstats1, G
 PG_FUNCTION_INFO_V1(LWGEOM_gist_joinsel);
 Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
 {
+#if USE_VERSION < 81
        Query *root = (Query *) PG_GETARG_POINTER(0);
+#else
+       PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+#endif
        //Oid operator = PG_GETARG_OID(1);
        List *args = (List *) PG_GETARG_POINTER(2);
        JoinType jointype = (JoinType) PG_GETARG_INT16(3);
@@ -828,9 +832,14 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
        }
 
        var1 = (Var *)arg1;
-       relid1 = getrelid(var1->varno, root->rtable);
        var2 = (Var *)arg2;
+#if USE_VERSION < 81
+       relid1 = getrelid(var1->varno, root->rtable);
        relid2 = getrelid(var2->varno, root->rtable);
+#else
+       relid1 = getrelid(var1->varno, root->parse->rtable);
+       relid2 = getrelid(var2->varno, root->parse->rtable);
+#endif
 
 #if DEBUG_GEOMETRY_STATS
        elog(NOTICE, "Working with relations oids: %d %d", relid1, relid2);
@@ -841,9 +850,9 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
        if ( ! stats1_tuple )
        {
 #if DEBUG_GEOMETRY_STATS
-               elog(NOTICE, " No statistics, returning default estimate");
+               elog(NOTICE, " No statistics, returning default geometry join selectivity");
 #endif
-               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
+               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL);
        }
 
        
@@ -853,10 +862,10 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
                (float4 **)&geomstats1, &geomstats1_nvalues) )
        {
 #if DEBUG_GEOMETRY_STATS
-               elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry selectivity");
+               elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry join selectivity");
 #endif
                ReleaseSysCache(stats1_tuple);
-               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
+               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL);
        }
 
 
@@ -865,9 +874,12 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
        if ( ! stats2_tuple )
        {
 #if DEBUG_GEOMETRY_STATS
-               elog(NOTICE, " No statistics, returning default estimate");
+               elog(NOTICE, " No statistics, returning default geometry join selectivity");
 #endif
-               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
+               free_attstatsslot(0, NULL, 0, (float *)geomstats1,
+                       geomstats1_nvalues);
+               ReleaseSysCache(stats1_tuple);
+               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL);
        }
 
 
@@ -876,10 +888,13 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
                (float4 **)&geomstats2, &geomstats2_nvalues) )
        {
 #if DEBUG_GEOMETRY_STATS
-               elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry selectivity");
+               elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry join selectivity");
 #endif
+               free_attstatsslot(0, NULL, 0, (float *)geomstats1,
+                       geomstats1_nvalues);
                ReleaseSysCache(stats2_tuple);
-               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
+               ReleaseSysCache(stats1_tuple);
+               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL);
        }
 
 
@@ -963,6 +978,24 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
        elog(NOTICE, "Estimated rows returned: %f", rows_returned);
 #endif
 
+       /*
+        * One (or both) tuple count is zero...
+        * We return default selectivity estimate.
+        * We could probably attempt at an estimate
+        * w/out looking at tables tuple count, with
+        * a function of selectivity1, selectivity2.
+        */
+       if ( ! total_tuples )
+       {
+#if DEBUG_GEOMETRY_STATS
+       elog(NOTICE, "Total tuples == 0, returning default join selectivity");
+#endif
+               PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL);
+       }
+
+       if ( rows_returned > total_tuples )
+               PG_RETURN_FLOAT8(1.0);
+
        PG_RETURN_FLOAT8(rows_returned / total_tuples);
 }
 
@@ -1329,7 +1362,9 @@ Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS)
  * of a search_box looking at data in the GEOM_STATS 
  * structure.
  *
- * TODO: handle box dimension collapses
+ * TODO: handle box dimension collapses (probably should be handled
+ * by the statistic generator, avoiding GEOM_STATS with collapsed
+ * dimensions)
  */
 static float8
 estimate_selectivity(BOX2DFLOAT4 *box, GEOM_STATS *geomstats)
@@ -1381,6 +1416,11 @@ estimate_selectivity(BOX2DFLOAT4 *box, GEOM_STATS *geomstats)
        histocols = geomstats->cols;
        historows = geomstats->rows;
 
+#if DEBUG_GEOMETRY_STATS
+       elog(NOTICE, " histogram has %d cols, %d rows", histocols, historows);
+       elog(NOTICE, " histogram geosize is %fx%f", geow, geoh);
+#endif
+
        cell_area = (geow*geoh) / (histocols*historows);
        //box_area = (box->high.x-box->low.x)*(box->high.y-box->low.y);
        box_area = (box->xmax-box->xmin)*(box->ymax-box->ymin);
@@ -1571,7 +1611,11 @@ elog(NOTICE, " avg feat overlaps %f cells", avg_feat_cells);
 PG_FUNCTION_INFO_V1(LWGEOM_gist_sel);
 Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS)
 {
+#if USE_VERSION < 81
        Query *root = (Query *) PG_GETARG_POINTER(0);
+#else
+       PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+#endif
        //Oid operator = PG_GETARG_OID(1);
        List *args = (List *) PG_GETARG_POINTER(2);
        //int varRelid = PG_GETARG_INT32(3);
@@ -1656,8 +1700,12 @@ Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS)
         * Get pg_statistic row
         */
 
+#if USE_VERSION < 81
 //     relid = getrelid(varRelid, root->rtable);
        relid = getrelid(self->varno, root->rtable);
+#else
+       relid = getrelid(self->varno, root->parse->rtable);
+#endif
 
        stats_tuple = SearchSysCache(STATRELATT, ObjectIdGetDatum(relid), Int16GetDatum(self->varattno), 0, 0);
        if ( ! stats_tuple )
@@ -1917,10 +1965,10 @@ compute_geometry_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
                sdHIGx += (box->xmax - avgHIGx) * (box->xmax - avgHIGx);
                sdHIGy += (box->ymax - avgHIGy) * (box->ymax - avgHIGy);
        }
-       sdLOWx = sqrt(sdLOWx/(notnull_cnt-1));
-       sdLOWy = sqrt(sdLOWy/(notnull_cnt-1));
-       sdHIGx = sqrt(sdHIGx/(notnull_cnt-1));
-       sdHIGy = sqrt(sdHIGy/(notnull_cnt-1));
+       sdLOWx = sqrt(sdLOWx/notnull_cnt);
+       sdLOWy = sqrt(sdLOWy/notnull_cnt);
+       sdHIGx = sqrt(sdHIGx/notnull_cnt);
+       sdHIGy = sqrt(sdHIGy/notnull_cnt);
 
 #if DEBUG_GEOMETRY_STATS 
        elog(NOTICE, " standard deviations:");
@@ -2454,6 +2502,20 @@ Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS)
 
 /**********************************************************************
  * $Log$
+ * Revision 1.29.2.4  2005/06/28 22:00:05  strk
+ * Fixed extimators to work with postgresql 8.1.x
+ *
+ * Revision 1.29.2.3  2005/04/22 01:05:41  strk
+ * Fixed bug in join selectivity estimator returning invalid estimates (>1)
+ *
+ * Revision 1.29.2.2  2005/04/18 14:12:59  strk
+ * Slightly changed standard deviation computation to be more corner-case-friendly.
+ *
+ * Revision 1.29.2.1  2005/04/18 10:57:01  strk
+ * Applied patched by Ron Mayer fixing memory leakages and invalid results
+ * in join selectivity estimator. Fixed some return to use default JOIN
+ * selectivity estimate instead of default RESTRICT selectivity estimate.
+ *
  * Revision 1.29  2005/03/25 09:34:25  strk
  * code cleanup
  *
index e1a080e6169793fec1d4e958217a1d58eb9b0fd7..8a5aa3b4c826ebb6539cc16fd6e0f918b8bdfae3 100644 (file)
@@ -255,7 +255,6 @@ Datum unite_garray(PG_FUNCTION_ARGS)
 
 }
 
-
 //select geomunion('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','POLYGON((5 5, 15 5, 15 7, 5 7, 5 5))');
 PG_FUNCTION_INFO_V1(geomunion);
 Datum geomunion(PG_FUNCTION_ARGS)
index 98a0ae84d118e68cfd2da01a67fc3258d0cbee73..0e8c78ed7a974f163c77515590bffa6c63e41d98 100644 (file)
@@ -7,6 +7,9 @@
 #include "postgres.h"
 #include "access/gist.h"
 #include "access/itup.h"
+#if USE_VERSION > 80
+#include "access/rtree.h"
+#endif
 #include "fmgr.h"
 #include "utils/elog.h"
 
@@ -592,10 +595,6 @@ Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS)
        bool result;
        BOX2DFLOAT4  box;
 
-       /*
-        * if entry is not leaf, use rtree_internal_consistent,
-        * else use rtree_leaf_consistent
-        */
 #ifdef PGIS_DEBUG_CALLS
        elog(NOTICE,"GIST: LWGEOM_gist_consistent called");
 #endif
@@ -639,11 +638,13 @@ lwgeom_rtree_internal_consistent(BOX2DFLOAT4 *key, BOX2DFLOAT4 *query,
 #endif
 
        switch(strategy) {
-    case RTLeftStrategyNumber:
-    case RTOverLeftStrategyNumber:
-      retval = DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) );
-      break;
-    case RTOverlapStrategyNumber:  //optimized for speed
+               case RTLeftStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTOverLeftStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_right, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTOverlapStrategyNumber:  //optimized for speed
 
         retval = (((key->xmax>= query->xmax) &&
                         (key->xmin <= query->xmax)) ||
@@ -670,33 +671,41 @@ lwgeom_rtree_internal_consistent(BOX2DFLOAT4 *key, BOX2DFLOAT4 *query,
 
 elog(NOTICE,"%i:(int)<%.8g %.8g,%.8g %.8g>&&<%.8g %.8g,%.8g %.8g> %i",counter_intern,key->xmin,key->ymin,key->xmax,key->ymax,
                                                                query->xmin,query->ymin,query->xmax,query->ymax,   (int) retval);
-#endif
                        counter_intern++;
-                 return(retval);
-      break;
-    case RTOverRightStrategyNumber:
-    case RTRightStrategyNumber:
-      retval = DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) );
-      break;
-       case RTOverBelowStrategyNumber:
-       case RTBelowStrategyNumber:
-      retval = DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) );
-      break;
-       case RTAboveStrategyNumber:
-       case RTOverAboveStrategyNumber:
-      retval = DatumGetBool( DirectFunctionCall2( BOX2D_overabove, PointerGetDatum(key), PointerGetDatum(query) ) );
-      break;
-    case RTSameStrategyNumber:
-    case RTContainsStrategyNumber:
-      retval = DatumGetBool( DirectFunctionCall2( BOX2D_contain, PointerGetDatum(key), PointerGetDatum(query) ) );
-      break;
-    case RTContainedByStrategyNumber:
-      retval = DatumGetBool( DirectFunctionCall2( BOX2D_overlap, PointerGetDatum(key), PointerGetDatum(query) ) );
-      break;
-    default:
-      retval = FALSE;
-    }
-    return(retval);
+#endif
+
+                       return(retval);
+                       break;
+
+               case RTOverRightStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_left, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTRightStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTOverBelowStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_above, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTBelowStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overabove, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTAboveStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTOverAboveStrategyNumber:
+                       retval = !DatumGetBool( DirectFunctionCall2( BOX2D_below, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTSameStrategyNumber:
+               case RTContainsStrategyNumber:
+                       retval = DatumGetBool( DirectFunctionCall2( BOX2D_contain, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               case RTContainedByStrategyNumber:
+                       retval = DatumGetBool( DirectFunctionCall2( BOX2D_overlap, PointerGetDatum(key), PointerGetDatum(query) ) );
+                       break;
+               default:
+                       retval = FALSE;
+       }
+       return(retval);
 }
 
 
index 9dca717329bf12d4c9ac16b842bb8ac45793cbef..02824c92efd48caa977e7cece0a09e9deed946f6 100644 (file)
@@ -50,23 +50,17 @@ pg_free(void *ptr)
 void
 pg_error(const char *fmt, ...)
 {
-       char *msg;
+#define ERRMSG_MAXLEN 256
+
+       char errmsg[ERRMSG_MAXLEN+1];
        va_list ap;
 
        va_start (ap, fmt);
+       vsnprintf (errmsg, ERRMSG_MAXLEN, fmt, ap);
+       va_end (ap);
 
-       /*
-        * This is a GNU extension.
-        * Dunno how to handle errors here.
-        */
-       if (!vasprintf (&msg, fmt, ap))
-       {
-               va_end (ap);
-               return;
-       }
-       elog(ERROR, "%s", msg);
-       va_end(ap);
-       free(msg);
+       errmsg[ERRMSG_MAXLEN]='\0';
+       elog(ERROR, "%s", errmsg);
 }
 
 void
index 6b9f85f95ae05ffe39a1a34ae5e004678f166a23..d3dda2af4bfe44bb12752cded59a502e72425fdf 100644 (file)
@@ -302,7 +302,7 @@ double lwgeom_pointarray_length_ellipse(POINTARRAY *pts, SPHEROID *sphere)
                distellips = distance_ellipse(
                        frm.y*M_PI/180.0, frm.x*M_PI/180.0,
                        to.y*M_PI/180.0, to.x*M_PI/180.0, sphere);
-               dist += sqrt(distellips*distellips + (frm.z*frm.z));
+               dist += sqrt(distellips*distellips + (frm.z-to.z)*(frm.z-to.z));
        }
        return dist;
 }
index bb176752dfefab1ca1b13878423f20879d35351b..952ad5b774231639bcd929be02fcad6d12f1e229 100644 (file)
@@ -825,8 +825,13 @@ CREATE OPERATOR CLASS gist_geometry_ops
         FUNCTION        7        LWGEOM_gist_same (box2d, box2d, internal);
 
 UPDATE pg_opclass 
-       SET opckeytype = (select oid from pg_type where typname = 'box2d') 
-       WHERE opcname = 'gist_geometry_ops';
+       SET opckeytype = (SELECT oid FROM pg_type 
+                          WHERE typname = 'box2d' 
+                          AND typnamespace = (SELECT oid FROM pg_namespace 
+                                              WHERE nspname=current_schema())) 
+       WHERE opcname = 'gist_geometry_ops' 
+        AND opcnamespace = (SELECT oid from pg_namespace 
+                            WHERE nspname=current_schema());
        
 -- TODO: add btree binding...
 
@@ -1982,7 +1987,8 @@ CREATE TABLE geometry_columns (
                f_table_catalog, 
                f_table_schema, 
                f_table_name, 
-               f_geometry_column ) );
+               f_geometry_column )
+) WITH OIDS;
 
 -----------------------------------------------------------------------
 -- RENAME_GEOMETRY_TABLE_CONSTRAINTS()
diff --git a/regress/test_index_concurrency b/regress/test_index_concurrency
new file mode 100755 (executable)
index 0000000..3a4b6ca
--- /dev/null
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+if [ -z "$TMPDIR" ]; then
+       TMPDIR=/tmp
+fi
+
+OUTFILE="${TMPDIR}/regress_index_out_$$"
+
+echo "Running GiST concurrency Regression."
+
+DB=postgis_reg
+export PGDATABASE=$DB
+
+if [ "$1" = "prepare" ]; then
+       echo ""
+       echo "Index Creation will take some time..."
+       echo ""
+
+       createdb > /dev/null
+       createlang plpgsql > /dev/null
+       psql -f ../lwpostgis.sql > /dev/null 2>&1
+
+       psql -f regress_lots_of_points.sql 
+       psql -c "INSERT INTO test SELECT num+5000, translate(the_geom, 1, 1, 0) FROM test"
+       psql -c "INSERT INTO test SELECT num+10000, translate(the_geom, -1, -1) FROM test"
+       psql -c "CREATE INDEX quick_gist on test using gist (the_geom)" 
+else
+if [ "$1" = "run" ]; then
+
+if [ -n "$2" ]; then
+       NUMCLIENTS=$2
+else
+       NUMCLIENTS=3
+fi
+
+
+o=$((1000/$NUMCLIENTS))
+f=0
+t=$o
+       # Concurrent clients:
+       echo "Concurrent clients: $NUMCLIENTS"
+       for n in `seq 1 $NUMCLIENTS`; do
+
+echo "update test set num=-num WHERE the_geom && 'BOX3D($f $f,$t $t)'::box3d;" | psql &
+f=$((f+o))
+t=$((t+o))
+       done
+
+       wait
+       
+else
+if [ "$1" = "drop" ]; then
+       dropdb $DB > /dev/null
+else
+       echo "Usage: $0 prepare | run [nclients] | drop"
+fi
+fi
+fi
+
index 1297735669afd747237b24a1e311c95a14bb5ce0..588aa42b47d4057be1f4668279ff66697f51fcf9 100644 (file)
@@ -6454,67 +6454,67 @@ INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4tex
 ---
 --- EPSG 27561 : NTF (Paris) / Lambert Nord France
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27561,'EPSG',27561,'PROJCS["NTF (Paris) / Lambert Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27561"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27561,'EPSG',27561,'PROJCS["NTF (Paris) / Lambert Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27561"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27562 : NTF (Paris) / Lambert Centre France
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27562,'EPSG',27562,'PROJCS["NTF (Paris) / Lambert Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27562"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27562,'EPSG',27562,'PROJCS["NTF (Paris) / Lambert Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27562"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27563 : NTF (Paris) / Lambert Sud France
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27563,'EPSG',27563,'PROJCS["NTF (Paris) / Lambert Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27563"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27563,'EPSG',27563,'PROJCS["NTF (Paris) / Lambert Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27563"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27564 : NTF (Paris) / Lambert Corse
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27564,'EPSG',27564,'PROJCS["NTF (Paris) / Lambert Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27564"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27564,'EPSG',27564,'PROJCS["NTF (Paris) / Lambert Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27564"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27571 : NTF (Paris) / Lambert zone I
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27571,'EPSG',27571,'PROJCS["NTF (Paris) / Lambert zone I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27571"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27571,'EPSG',27571,'PROJCS["NTF (Paris) / Lambert zone I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27571"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27572 : NTF (Paris) / Lambert zone II
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27572,'EPSG',27572,'PROJCS["NTF (Paris) / Lambert zone II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27572"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27572,'EPSG',27572,'PROJCS["NTF (Paris) / Lambert zone II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27572"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27573 : NTF (Paris) / Lambert zone III
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27573,'EPSG',27573,'PROJCS["NTF (Paris) / Lambert zone III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27573"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27573,'EPSG',27573,'PROJCS["NTF (Paris) / Lambert zone III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27573"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27574 : NTF (Paris) / Lambert zone IV
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27574,'EPSG',27574,'PROJCS["NTF (Paris) / Lambert zone IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27574"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27574,'EPSG',27574,'PROJCS["NTF (Paris) / Lambert zone IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27574"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27581 : NTF (Paris) / France I
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27581,'EPSG',27581,'PROJCS["NTF (Paris) / France I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27581"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27581,'EPSG',27581,'PROJCS["NTF (Paris) / France I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27581"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27582 : NTF (Paris) / France II
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27582,'EPSG',27582,'PROJCS["NTF (Paris) / France II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27582"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27582,'EPSG',27582,'PROJCS["NTF (Paris) / France II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27582"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27583 : NTF (Paris) / France III
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27583,'EPSG',27583,'PROJCS["NTF (Paris) / France III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27583"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27583,'EPSG',27583,'PROJCS["NTF (Paris) / France III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27583"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27584 : NTF (Paris) / France IV
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27584,'EPSG',27584,'PROJCS["NTF (Paris) / France IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27584"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27584,'EPSG',27584,'PROJCS["NTF (Paris) / France IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27584"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27591 : NTF (Paris) / Nord France
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27591,'EPSG',27591,'PROJCS["NTF (Paris) / Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27591"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27591,'EPSG',27591,'PROJCS["NTF (Paris) / Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27591"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27592 : NTF (Paris) / Centre France
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27592,'EPSG',27592,'PROJCS["NTF (Paris) / Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27592"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27592,'EPSG',27592,'PROJCS["NTF (Paris) / Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27592"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27593 : NTF (Paris) / Sud France
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27593,'EPSG',27593,'PROJCS["NTF (Paris) / Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27593"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27593,'EPSG',27593,'PROJCS["NTF (Paris) / Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27593"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27594 : NTF (Paris) / Corse
 ---
-INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27594,'EPSG',27594,'PROJCS["NTF (Paris) / Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27594"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27594,'EPSG',27594,'PROJCS["NTF (Paris) / Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27594"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ');
 ---
 --- EPSG 27700 : OSGB 1936 / British National Grid
 ---
diff --git a/utils/postgis_proc_upgrade.pl b/utils/postgis_proc_upgrade.pl
new file mode 100755 (executable)
index 0000000..eec853a
--- /dev/null
@@ -0,0 +1,112 @@
+#/bin/sh
+
+eval "exec perl -w $0 $@"
+       if (0);
+
+use strict;
+
+($#ARGV == 0) || die "Usage: perl postgis_funxupgrade.pl <postgis.sql>\nCreates a new SQL script to upgrade all of the PostGIS functions.\n";
+
+my $NEWVERSION = "UNDEF";
+
+print "BEGIN;\n";
+
+open( INPUT, $ARGV[0] ) || die "Couldn't open file: $ARGV[0]\n";
+
+FUNC:
+while(<INPUT>)
+{
+       if (m/^create or replace function postgis_scripts_installed()/i)
+       {
+               while(<INPUT>)
+               {
+                       if ( m/SELECT .'(\d\.\d\.\d).'::text/i )
+                       {
+                               $NEWVERSION = $1;
+                               last FUNC;
+                       }
+               }
+       }
+}
+
+while(<DATA>)
+{
+       s/NEWVERSION/$NEWVERSION/g;
+       print;
+}
+
+close(INPUT); open( INPUT, $ARGV[0] ) || die "Couldn't open file: $ARGV[0]\n";
+while(<INPUT>)
+{
+       my $checkit = 0;
+       if (m/^create or replace function/i)
+       {
+               $checkit = 1 if m/postgis_scripts_installed()/i;
+               print $_;
+               while(<INPUT>)
+               {
+                       if ( $checkit && m/SELECT .'(\d\.\d\.\d).'::text/i )
+                       {
+                               $NEWVERSION = $1;
+                       }
+                       print $_;
+                       last if m/^\s*LANGUAGE '/;
+               }
+       }
+
+#      # This code handles aggregates by dropping and recreating them.
+#      # The DROP would fail on aggregates as they would not exist
+#      # in old postgis installations, thus we avoid this until we
+#      # find a better strategy.
+#
+#      if (m/^create aggregate (.*) *\(/i)
+#      {
+#              my $aggname = $1;
+#              my $basetype = 'unknown';
+#              my $def = $_;
+#              while(<INPUT>)
+#              {
+#                      $def .= $_;
+#                      $basetype = $1 if (m/basetype *= *([^,]*) *,/);
+#                      last if m/\);/;
+#              }
+#              print "DROP AGGREGATE $aggname($basetype);\n";
+#              print "$def";
+#      }
+
+}
+
+close( INPUT );
+
+print "COMMIT;\n";
+
+1;
+
+__END__
+
+CREATE OR REPLACE FUNCTION postgis_script_version_check()
+RETURNS text
+AS '
+DECLARE
+       old_scripts text;
+       new_scripts text;
+       old_majmin text;
+       new_majmin text;
+BEGIN
+       SELECT into old_scripts postgis_scripts_installed();
+       SELECT into new_scripts ''NEWVERSION'';
+       SELECT into old_majmin substring(old_scripts from ''[^\.]*\.[^\.]*'');
+       SELECT into new_majmin substring(new_scripts from ''[^\.]*\.[^\.]*'');
+
+       IF old_majmin != new_majmin THEN
+               RAISE EXCEPTION ''Scripts upgrade from version % to version % requires a dump/reload. See postgis manual for instructions'', old_scripts, new_scripts;
+       ELSE
+               RETURN ''Scripts versions checked for upgrade: ok'';
+       END IF;
+END
+'
+LANGUAGE 'plpgsql';
+
+SELECT postgis_script_version_check();
+
+DROP FUNCTION postgis_script_version_check();
index 0e034d4165c17eabee6f3d7ef0c31e9aac3ae9fa..4913afe0097599cbe22e69a37e5fa82fb81774b9 100644 (file)
 #      pg_dump-743/pg743 => pg_restore-800/pg800
 #      pg_dump-800/pg800 => pg_restore-800/pg800
 #
-
 eval "exec perl -w $0 $@"
        if (0);
 
-(@ARGV == 3) || die "Usage: postgis_restore.pl <postgis.sql> <db> <dump>\nRestore a custom dump (pg_dump -Fc) of a postgis enabled database.\n";
+use strict;
+
+(@ARGV >= 3) || die "Usage: postgis_restore.pl <postgis.sql> <db> <dump> [<createdb_options>]\nRestore a custom dump (pg_dump -Fc) of a postgis enabled database.\n";
 
-$DEBUG=1;
+my $DEBUG=1;
 
 my %aggs = ();
 my %fncasts = ();
@@ -98,15 +99,19 @@ my %obsoleted_function = (
        'unite_finalfunc', 1
 );
 
-my $postgissql = $ARGV[0];
-my $dbname = $ARGV[1];
-my $dump = $ARGV[2];
+my $postgissql = $ARGV[0]; shift(@ARGV);
+my $dbname = $ARGV[0]; shift(@ARGV);
+my $dump = $ARGV[0]; shift(@ARGV);
+my $createdb_opt = '';
 my $dumplist=$dump.".list";
 my $dumpascii=$dump.".ascii";
 
+$createdb_opt = join(' ', @ARGV) if @ARGV;
+
 print "postgis.sql is $postgissql\n";
 print "dbname is $dbname\n";
 print "dumpfile is $dump\n";
+print "database creation options: $createdb_opt\n" if $createdb_opt;
 
 #
 # Scan postgis.sql
@@ -127,7 +132,7 @@ while( my $line = <INPUT>)
                my $geomfound = 0;
                for (my $i=0; $i<@args; $i++)
                {
-                       $arg = lc($args[$i]);
+                       my $arg = lc($args[$i]);
                        #print "ARG1: [$arg]\n";
                        $arg =~ s/^ *//;
                        $arg =~ s/ *$//;
@@ -162,7 +167,7 @@ while( my $line = <INPUT>)
                {
                        for (my $i=0; $i<@args; $i++)
                        {
-                               $arg = $args[$i];
+                               my $arg = $args[$i];
                                $arg = 'geometry' if ($arg eq 'oldgeometry');
                                $args[$i] = $arg;
                        }
@@ -342,7 +347,7 @@ while( my $line = <INPUT> )
                my $wkbinvolved = 0;
                for (my $i=0; $i<@args; $i++)
                {
-                       $arg = lc($args[$i]);
+                       my $arg = lc($args[$i]);
                        $arg =~ s/^ *//;
                        $arg =~ s/ *$//;
                        $arg =~ s/^public.//;
@@ -354,7 +359,7 @@ while( my $line = <INPUT> )
                        $wkbinvolved++ if ( $arg eq 'wkb' );
                }
 
-               $args = join(', ', @args);
+               my $args = join(', ', @args);
                #print "ARGS SCALAR: [$args]\n";
                my $id = $funcname."(".$args.")";
                #print "ID: [$id]\n";
@@ -392,7 +397,7 @@ while( my $line = <INPUT> )
                my @args = split(",", $3);
                for (my $i=0; $i<@args; $i++)
                {
-                       $arg = lc($args[$i]);
+                       my $arg = lc($args[$i]);
                        $arg =~ s/^ *//;
                        $arg =~ s/ *$//;
                        $arg =~ s/^public.//;
@@ -402,7 +407,7 @@ while( my $line = <INPUT> )
                        }
                        $args[$i] = $arg;
                }
-               $args = join(', ', @args);
+               my $args = join(', ', @args);
                my $id = $name."(".$args.")";
                if ( $aggs{$id} )
                {
@@ -595,8 +600,8 @@ close(OUTPUT);
 # Create the new db and install plpgsql language
 #
 print "Creating db ($dbname)\n";
-`createdb $dbname`;
-die "Can't restore in an existing database\n" if ($?);
+`createdb $dbname $createdb_opt`;
+die "Database creation failed\n" if ($?);
 print "Adding plpgsql\n";
 `createlang plpgsql $dbname`;
 
index 5616f802d2f3cee404aaf1cf3e21ef4c78ed5a87..ee7c809010350f12ea93c45cfc03ad87b06b79cc 100755 (executable)
@@ -111,11 +111,25 @@ $SRID = $res->getvalue(0, 0);
 
 
 # parse extent
-$EXTENT =~ /^BOX3D\((.*) (.*) (.*),(.*) (.*) (.*)\)$/;
-$ext{xmin} = $1;
-$ext{ymin} = $2;
-$ext{xmax} = $4;
-$ext{ymax} = $5;
+if ( $EXTENT =~ /^BOX3D\((.*) (.*) (.*),(.*) (.*) (.*)\)$/ ) 
+{
+       $ext{xmin} = $1;
+       $ext{ymin} = $2;
+       $ext{xmax} = $4;
+       $ext{ymax} = $5;
+}
+elsif ( $EXTENT =~ /^BOX\((.*) (.*),(.*) (.*)\)$/ ) 
+{
+       $ext{xmin} = $1;
+       $ext{ymin} = $2;
+       $ext{xmax} = $3;
+       $ext{ymax} = $4;
+}
+else
+{
+       print STDERR "Couldn't parse EXTENT: $EXTENT\n";
+       exit(1);
+}
 
 # vacuum analyze table
 if ( $VACUUM )
@@ -251,9 +265,9 @@ sub test_extent
        # Test whole extent query
        $query = 'explain analyze select oid from "'.
                $SCHEMA.'"."'.$TABLE.'" WHERE "'.$COLUMN.'" && '.
-               "'SRID=$SRID;BOX3D(".$ext->{'xmin'}." ".
+               "setSRID('BOX3D(".$ext->{'xmin'}." ".
                $ext->{'ymin'}.", ".$ext->{'xmax'}." ".
-               $ext->{'ymax'}.")'";
+               $ext->{'ymax'}.")'::BOX3D, $SRID)";
        $res = $conn->exec($query);
        if ( $res->resultStatus != PGRES_TUPLES_OK )  {
                print STDERR $conn->errorMessage;
@@ -272,6 +286,9 @@ sub test_extent
 
 # 
 # $Log$
+# Revision 1.8.4.1  2005/04/18 13:28:19  strk
+# Fixed to work against LWGEOM installations
+#
 # Revision 1.8  2004/03/08 17:21:57  strk
 # changed error computation code to delta/totrows
 #
index 1b29e1ecc934db28678dcb5d15c64986c008d5c9..50a213cedc4818e9efe63e8986db3e2ae996c891 100755 (executable)
@@ -83,8 +83,8 @@ $SCHEMA2 = 'public';
 $COLUMN2 = 'the_geom' if ( $COLUMN2 eq '' );
 if ( $TABLE2 =~ /(.*)\.(.*)/ ) 
 {
-       $SCHEMA1 = $1;
-       $TABLE1 = $2;
+       $SCHEMA2 = $1;
+       $TABLE2 = $2;
 }
 
 #connect
@@ -256,6 +256,9 @@ sub get_num_rows
 
 # 
 # $Log$
+# Revision 1.2.2.1  2005/04/18 13:49:55  strk
+# Fixed bug in table2 schema parsing.
+#
 # Revision 1.2  2004/12/23 14:48:25  strk
 # Fixed help string, and added a TODO item
 #