[libspatialite/f20] Solve issue with sqlite 3.8.5's rtree implementation

Volker Fröhlich volter at fedoraproject.org
Tue Jul 29 05:27:17 UTC 2014


commit fa11a0ac6a35f88c8d1ec42a7fdcff67942ec93a
Author: Volker Fröhlich <volker27 at gmx.at>
Date:   Tue Jul 29 07:26:37 2014 +0200

    Solve issue with sqlite 3.8.5's rtree implementation
    
    https://groups.google.com/forum/#!topic/spatialite-users/hVHjs_iY8io

 libspatialite-4.1.1-sqlite-3.8.5.patch |  123 ++++++++++++++++++++++++++++++++
 libspatialite.spec                     |   14 +++-
 2 files changed, 134 insertions(+), 3 deletions(-)
---
diff --git a/libspatialite-4.1.1-sqlite-3.8.5.patch b/libspatialite-4.1.1-sqlite-3.8.5.patch
new file mode 100644
index 0000000..ca45fec
--- /dev/null
+++ b/libspatialite-4.1.1-sqlite-3.8.5.patch
@@ -0,0 +1,123 @@
+diff --git a/src/spatialite/spatialite.c b/src/spatialite/spatialite.c
+index 69d592c..feaf495 100644
+--- a/src/spatialite/spatialite.c
++++ b/src/spatialite/spatialite.c
+@@ -4513,6 +4513,7 @@ check_spatial_index (sqlite3 * sqlite, const unsigned char *table,
+     sqlite3_stmt *stmt;
+     sqlite3_int64 count_geom;
+     sqlite3_int64 count_rtree;
++    sqlite3_int64 count_rev = 0;
+     double g_xmin;
+     double g_ymin;
+     double g_xmax;
+@@ -4629,93 +4630,6 @@ check_spatial_index (sqlite3 * sqlite, const unsigned char *table,
+ 	  goto mismatching_zero;
+       }
+ 
+-/* checking the geometry-table against the corresponding R*Tree */
+-    sql_statement =
+-	sqlite3_mprintf ("SELECT MbrMinX(g.\"%s\"), MbrMinY(g.\"%s\"), "
+-			 "MbrMaxX(g.\"%s\"), MbrMaxY(g.\"%s\"), i.xmin, i.ymin, i.xmax, i.ymax\n"
+-			 "FROM \"%s\" AS g\nLEFT JOIN \"%s\" AS i ON (g.ROWID = i.pkid)",
+-			 xgeom, xgeom, xgeom, xgeom, xtable, xidx_name);
+-    ret = sqlite3_prepare_v2 (sqlite, sql_statement, strlen (sql_statement),
+-			      &stmt, NULL);
+-    sqlite3_free (sql_statement);
+-    if (ret != SQLITE_OK)
+-      {
+-	  spatialite_e ("CheckSpatialIndex SQL error: %s\n",
+-			sqlite3_errmsg (sqlite));
+-	  goto err_label;
+-      }
+-    while (1)
+-      {
+-	  ret = sqlite3_step (stmt);
+-	  if (ret == SQLITE_DONE)
+-	      break;
+-	  if (ret == SQLITE_ROW)
+-	    {
+-		/* checking a row */
+-		ok_g_xmin = 1;
+-		ok_g_ymin = 1;
+-		ok_g_xmax = 1;
+-		ok_g_ymax = 1;
+-		ok_i_xmin = 1;
+-		ok_i_ymin = 1;
+-		ok_i_xmax = 1;
+-		ok_i_ymax = 1;
+-		if (sqlite3_column_type (stmt, 0) == SQLITE_NULL)
+-		    ok_g_xmin = 0;
+-		else
+-		    g_xmin = sqlite3_column_double (stmt, 0);
+-		if (sqlite3_column_type (stmt, 1) == SQLITE_NULL)
+-		    ok_g_ymin = 0;
+-		else
+-		    g_ymin = sqlite3_column_double (stmt, 1);
+-		if (sqlite3_column_type (stmt, 2) == SQLITE_NULL)
+-		    ok_g_xmax = 0;
+-		else
+-		    g_xmax = sqlite3_column_double (stmt, 2);
+-		if (sqlite3_column_type (stmt, 3) == SQLITE_NULL)
+-		    ok_g_ymax = 0;
+-		else
+-		    g_ymax = sqlite3_column_double (stmt, 3);
+-		if (sqlite3_column_type (stmt, 4) == SQLITE_NULL)
+-		    ok_i_xmin = 0;
+-		else
+-		    i_xmin = sqlite3_column_double (stmt, 4);
+-		if (sqlite3_column_type (stmt, 5) == SQLITE_NULL)
+-		    ok_i_ymin = 0;
+-		else
+-		    i_ymin = sqlite3_column_double (stmt, 5);
+-		if (sqlite3_column_type (stmt, 6) == SQLITE_NULL)
+-		    ok_i_xmax = 0;
+-		else
+-		    i_xmax = sqlite3_column_double (stmt, 6);
+-		if (sqlite3_column_type (stmt, 7) == SQLITE_NULL)
+-		    ok_i_ymax = 0;
+-		else
+-		    i_ymax = sqlite3_column_double (stmt, 7);
+-		if (eval_rtree_entry (ok_g_xmin, g_xmin, ok_i_xmin, i_xmin)
+-		    == 0)
+-		    goto mismatching;
+-		if (eval_rtree_entry (ok_g_ymin, g_ymin, ok_i_ymin, i_ymin)
+-		    == 0)
+-		    goto mismatching;
+-		if (eval_rtree_entry (ok_g_xmax, g_xmax, ok_i_xmax, i_xmax)
+-		    == 0)
+-		    goto mismatching;
+-		if (eval_rtree_entry (ok_g_ymax, g_ymax, ok_i_ymax, i_ymax)
+-		    == 0)
+-		    goto mismatching;
+-	    }
+-	  else
+-	    {
+-		printf ("sqlite3_step() error: %s\n", sqlite3_errmsg (sqlite));
+-		sqlite3_finalize (stmt);
+-		goto err_label;
+-	    }
+-      }
+-/* we have now to finalize the query [memory cleanup] */
+-    sqlite3_finalize (stmt);
+-
+-
+ /* now we'll check the R*Tree against the corresponding geometry-table */
+     sql_statement =
+ 	sqlite3_mprintf ("SELECT MbrMinX(g.\"%s\"), MbrMinY(g.\"%s\"), "
+@@ -4739,6 +4653,7 @@ check_spatial_index (sqlite3 * sqlite, const unsigned char *table,
+ 	  if (ret == SQLITE_ROW)
+ 	    {
+ 		/* checking a row */
++		count_rev++;
+ 		ok_g_xmin = 1;
+ 		ok_g_ymin = 1;
+ 		ok_g_xmax = 1;
+@@ -4800,6 +4715,8 @@ check_spatial_index (sqlite3 * sqlite, const unsigned char *table,
+ 	    }
+       }
+     sqlite3_finalize (stmt);
++    if (count_geom != count_rev)
++	goto mismatching;
+     strcpy (sql, "Check SpatialIndex: is valid");
+     updateSpatiaLiteHistory (sqlite, (const char *) table,
+ 			     (const char *) geom, sql);
diff --git a/libspatialite.spec b/libspatialite.spec
index b61e321..f035f7c 100644
--- a/libspatialite.spec
+++ b/libspatialite.spec
@@ -37,13 +37,17 @@
 
 Name:      libspatialite
 Version:   4.1.1
-Release:   2%{?dist}
+Release:   3%{?dist}
 Summary:   Enables SQLite to support spatial data
 Group:     System Environment/Libraries
 License:   MPLv1.1 or GPLv2+ or LGPLv2+
 URL:       https://www.gaia-gis.it/fossil/libspatialite
 Source0:   http://www.gaia-gis.it/gaia-sins/%{name}-sources/%{name}-%{version}.tar.gz
 
+# Rtree issue with sqlite 3.8.5
+# https://groups.google.com/forum/#!topic/spatialite-users/hVHjs_iY8io
+Patch0:    %{name}-4.1.1-sqlite-3.8.5.patch
+
 BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
 
 # EPEL 5 reminiscences are for ELGIS
@@ -80,6 +84,7 @@ developing applications that use %{name}.
 
 %prep
 %setup -q
+%patch0 -p1 -b .sqlite~
 
 # Remove test failing on 32 bit systems
 # Contacted the author about it
@@ -137,6 +142,9 @@ rm -rf %{buildroot}
 
 
 %changelog
+* Tue Jul 29 2014 Volker Fröhlich <volker27 at gmx.at> - 4.1.1-3
+- Solve issue with sqlite 3.8.5's rtree implementation 
+
 * Sat Aug 03 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 4.1.1-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
 
@@ -157,7 +165,7 @@ rm -rf %{buildroot}
 * Thu Feb 14 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 4.0.0-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
 
-* Sun Dec  1 2012 Volker Fröhlich <volker27 at gmx.at> - 4.0.0-1
+* Sat Dec  1 2012 Volker Fröhlich <volker27 at gmx.at> - 4.0.0-1
 - New upstream release
 - Remove arch restrictions, solving BZ 663938 and 846301
 - Update conditional for geosadvanced
@@ -177,7 +185,7 @@ rm -rf %{buildroot}
 - Don't run checks if built without advancedgeos
 - Include examples as documentation
 
-* Wed Jan 14 2012 Volker Fröhlich <volker27 at gmx.at> - 3.0.1-1
+* Sat Jan 14 2012 Volker Fröhlich <volker27 at gmx.at> - 3.0.1-1
 - New upstream release
 - Drop defattr
 - Run tests


More information about the scm-commits mailing list