]> granicus.if.org Git - postgis/commitdiff
Applied patched by Ron Mayer fixing memory leakages and invalid results
authorSandro Santilli <strk@keybit.net>
Mon, 18 Apr 2005 10:57:13 +0000 (10:57 +0000)
committerSandro Santilli <strk@keybit.net>
Mon, 18 Apr 2005 10:57:13 +0000 (10:57 +0000)
in join selectivity estimator. Fixed some return to use default JOIN
selectivity estimate instead of default RESTRICT selectivity estimate.

git-svn-id: http://svn.osgeo.org/postgis/trunk@1629 b70326c6-7e19-0410-871a-916f4a2858ee

lwgeom/lwgeom_estimate.c

index 55ded4a1606c41e684daf2b93172bbb13e755c14..f47259211b64dc29361e8b313177d3ec609ad4f3 100644 (file)
@@ -841,9 +841,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 +853,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 +865,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 +879,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 +969,21 @@ 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);
+       }
+
        PG_RETURN_FLOAT8(rows_returned / total_tuples);
 }
 
@@ -1329,7 +1350,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 +1404,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);
@@ -2454,6 +2482,11 @@ Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS)
 
 /**********************************************************************
  * $Log$
+ * Revision 1.30  2005/04/18 10:57:13  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
  *