[postgis-commits] svn - r2799 - trunk/lwgeom
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Thu Jun 5 03:19:01 PDT 2008
Author: mcayland
Date: 2008-06-05 03:19:01 -0700 (Thu, 05 Jun 2008)
New Revision: 2799
Modified:
trunk/lwgeom/lwgeom_btree.c
trunk/lwgeom/lwgeom_dump.c
trunk/lwgeom/lwgeom_estimate.c
trunk/lwgeom/lwgeom_functions_basic.c
trunk/lwgeom/lwgeom_gist.c
trunk/lwgeom/lwgeom_inout.c
trunk/lwgeom/lwgeom_transform.c
trunk/lwgeom/lwpostgis.sql.in.c
trunk/lwgeom/pgsql_compat.h
trunk/lwgeom/sqldefines.h.in
Log:
Blast away the huge amounts of legacy C code related to PostgreSQL versions < 8.1. Next step will be to work on the SQL script files too.
Modified: trunk/lwgeom/lwgeom_btree.c
===================================================================
--- trunk/lwgeom/lwgeom_btree.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwgeom_btree.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -28,15 +28,7 @@
Datum lwgeom_cmp(PG_FUNCTION_ARGS);
-#if POSTGIS_PGSQL_VERSION == 72
-#define BTREE_SRID_MISMATCH_SEVERITY NOTICE
-#else
-#if POSTGIS_PGSQL_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)
Modified: trunk/lwgeom/lwgeom_dump.c
===================================================================
--- trunk/lwgeom/lwgeom_dump.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwgeom_dump.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -1,10 +1,5 @@
#include "../postgis_config.h"
-/*
- * This only works for PGSQL > 72
- */
-#if POSTGIS_PGSQL_VERSION > 72
-
#include <math.h>
#include <float.h>
#include <string.h>
@@ -307,5 +302,3 @@
}
-
-#endif /* POSTGIS_PGSQL_VERSION > 72 */
Modified: trunk/lwgeom/lwgeom_estimate.c
===================================================================
--- trunk/lwgeom/lwgeom_estimate.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwgeom_estimate.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -28,7 +28,6 @@
-#if POSTGIS_PGSQL_VERSION >= 80
#include "commands/vacuum.h"
#include "utils/lsyscache.h"
@@ -81,7 +80,6 @@
static float8 estimate_selectivity(BOX2DFLOAT4 *box, GEOM_STATS *geomstats);
-#endif /* POSTGIS_PGSQL_VERSION >= 80 */
#define SHOW_DIGS_DOUBLE 15
#define MAX_DIGS_DOUBLE (SHOW_DIGS_DOUBLE + 6 + 1 + 3 +1)
@@ -104,644 +102,14 @@
*/
#define REALLY_DO_JOINSEL 1
-/* --------------------------------------------
- * lwhistogram2d type
- *
- * 2d histogram is a bounding box with a bunch of cells in it.
- * The cells will have width (xmax-xmin)/boxesPerSide
- * and height(ymax-ymin)/boxesPerSide
- * The first box is the ll corner's box, the send is directly to the right
- * (row-major).
- *
- * Size of structure is:
- * 4 (size) + 32 (box) + 4 (boxesPerSide) +
- * boxesPerSide*boxesPerSide*4 (data)
- */
-typedef struct histotag
-{
- int32 size; /* postgres variable-length type requirement */
- int boxesPerSide; /* boxesPerSide * boxesPerSide = total boxes in grid */
- double avgFeatureArea; /* average bbox area of features in this histogram */
- double xmin,ymin, xmax, ymax; /* BOX of area */
- unsigned int value[1]; /* variable length # of ints for histogram */
-} LWHISTOGRAM2D;
-
-Datum lwhistogram2d_in(PG_FUNCTION_ARGS);
-Datum lwhistogram2d_out(PG_FUNCTION_ARGS);
-Datum create_lwhistogram2d(PG_FUNCTION_ARGS);
-Datum build_lwhistogram2d(PG_FUNCTION_ARGS);
-Datum explode_lwhistogram2d(PG_FUNCTION_ARGS);
-Datum estimate_lwhistogram2d(PG_FUNCTION_ARGS);
Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS);
Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS);
Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS);
-#if POSTGIS_PGSQL_VERSION >= 80
Datum LWGEOM_analyze(PG_FUNCTION_ARGS);
-#endif
-/*
- * text form of LWHISTOGRAM2D is:
- * 'HISTOGRAM2D(xmin,ymin,xmax,ymax,boxesPerSide;value[0],value[1],...')
- * note the ";" in the middle (for easy parsing)
- * I dont expect anyone to actually create one by hand
- */
-PG_FUNCTION_INFO_V1(lwhistogram2d_in);
-Datum lwhistogram2d_in(PG_FUNCTION_ARGS)
-{
- char *str = PG_GETARG_CSTRING(0);
- LWHISTOGRAM2D *histo ;
- int nitems;
- double xmin,ymin,xmax,ymax;
- int boxesPerSide;
- double avgFeatureArea;
- char *str2,*str3;
- long datum;
- /*elog(NOTICE, "lwhistogram2d parser called");*/
-
- int t;
-
- while (isspace(*str))
- str++;
-
- if (strstr(str,"HISTOGRAM2D(") != str)
- {
- elog(ERROR, "lwhistogram2d parser - doesnt start with 'HISTOGRAM2D(\n");
- PG_RETURN_NULL() ;
- }
- if (strstr(str,";") == NULL)
- {
- elog(ERROR, "lwhistogram2d parser - doesnt have a ; in sring!\n");
- PG_RETURN_NULL() ;
- }
-
- nitems = sscanf(str,"HISTOGRAM2D(%lf,%lf,%lf,%lf,%i,%lf;",&xmin,&ymin,&xmax,&ymax,&boxesPerSide,&avgFeatureArea);
-
- if (nitems != 6)
- {
- elog(ERROR, "lwhistogram2d parser - couldnt parse initial portion of histogram!\n");
- PG_RETURN_NULL() ;
- }
-
- if ( (boxesPerSide > 50) || (boxesPerSide <1) )
- {
- elog(ERROR, "lwhistogram2d parser - boxesPerSide is too big or too small\n");
- PG_RETURN_NULL() ;
- }
-
- str2 = strstr(str,";");
- str2++;
-
- if (str2[0] ==0)
- {
- elog(ERROR, "lwhistogram2d parser - no histogram values\n");
- PG_RETURN_NULL() ;
- }
-
- histo = (LWHISTOGRAM2D *) palloc (sizeof(LWHISTOGRAM2D) + (boxesPerSide*boxesPerSide-1)*4 );
- histo->size = sizeof(LWHISTOGRAM2D) + (boxesPerSide*boxesPerSide-1)*4;
-
- for (t=0;t<boxesPerSide*boxesPerSide;t++)
- {
- datum = strtol(str2,&str3,10); /* str2=start of int, str3=end of int, base 10 */
- /* str3 points to "," or ")" */
- if (str3[0] ==0)
- {
- elog(ERROR, "lwhistogram2d parser - histogram values prematurely ended!\n");
- PG_RETURN_NULL() ;
- }
- histo->value[t] = (unsigned int) datum;
- str2= str3+1; /* move past the "," or ")" */
- }
- histo->xmin = xmin;
- histo->xmax = xmax;
- histo->ymin = ymin;
- histo->ymax = ymax;
- histo->avgFeatureArea = avgFeatureArea;
- histo->boxesPerSide = boxesPerSide;
-
- PG_RETURN_POINTER(histo);
-}
-
-
-
-/* text version */
-PG_FUNCTION_INFO_V1(lwhistogram2d_out);
-Datum lwhistogram2d_out(PG_FUNCTION_ARGS)
-{
- LWHISTOGRAM2D *histo = (LWHISTOGRAM2D *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- char *result;
- int t;
- char temp[100];
- int size;
-
- size = 26+6*MAX_DIGS_DOUBLE + histo->boxesPerSide*histo->boxesPerSide* (MAX_DIGS_DOUBLE+1);
- result = palloc(size);
-
- sprintf(result,"HISTOGRAM2D(%.15g,%.15g,%.15g,%.15g,%i,%.15g;",
- histo->xmin,histo->ymin,histo->xmax,histo->ymax,histo->boxesPerSide,histo->avgFeatureArea );
-
- POSTGIS_DEBUGF(3, "so far: %s",result);
- POSTGIS_DEBUGF(3, "buffsize=%i, size=%i",size,histo->size);
-
- for (t=0;t<histo->boxesPerSide*histo->boxesPerSide;t++)
- {
- if (t) sprintf(temp, ",%u", histo->value[t]);
- else sprintf(temp, "%u", histo->value[t]);
- strcat(result,temp);
- }
-
- strcat(result,")");
-
- POSTGIS_DEBUGF(3, "about to return string (len=%d): -%s-", (int)strlen(result),result);
- POSTGIS_DEBUGF(3, "result@%p", result);
-
- PG_RETURN_CSTRING(result);
-}
-
-/*create_lwhistogram2d(BOX2D, boxesPerSide)*/
-/* returns a histgram with 0s in all the boxes.*/
-PG_FUNCTION_INFO_V1(create_lwhistogram2d);
-Datum create_lwhistogram2d(PG_FUNCTION_ARGS)
-{
- /*BOX3D *bbox = (BOX3D *) PG_GETARG_POINTER(0);*/
- BOX2DFLOAT4 *bbox = (BOX2DFLOAT4 *)PG_GETARG_DATUM(0);
- int32 boxesPerSide = PG_GETARG_INT32(1);
- LWHISTOGRAM2D *histo;
- int size,t;
-
- if ( (boxesPerSide <1) || (boxesPerSide >50) )
- {
- elog(ERROR, "create_lwhistogram2d - boxesPerSide is too small or big.\n");
- PG_RETURN_NULL() ;
- }
-
- size = sizeof(LWHISTOGRAM2D) + (boxesPerSide*boxesPerSide-1)*4 ;
-
- histo = (LWHISTOGRAM2D *)palloc(size);
- histo->size = size;
-
- histo->xmin = bbox->xmin;
- histo->ymin = bbox->ymin;
- histo->xmax = bbox->xmax;
- histo->ymax = bbox->ymax;
-
- histo->avgFeatureArea = 0;
-
- histo->boxesPerSide = boxesPerSide;
-
- for (t=0;t<boxesPerSide*boxesPerSide; t++)
- {
- histo->value[t] = 0;
- }
-
- /*elog(NOTICE,"create_lwhistogram2d returning");*/
-
- PG_RETURN_POINTER(histo);
-}
-
-/*
- * build_histogram2d (LWHISTOGRAM2D, tablename, columnname)
- * executes the SPI 'SELECT box3d(columnname) FROM tablename'
- * and sticks all the results in the histogram
- */
-PG_FUNCTION_INFO_V1(build_lwhistogram2d);
-Datum build_lwhistogram2d(PG_FUNCTION_ARGS)
-{
- LWHISTOGRAM2D *histo = (LWHISTOGRAM2D *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- char *tablename, *columnname;
- LWHISTOGRAM2D *result;
- int SPIcode;
- char sql[1000];
- SPITupleTable *tuptable;
- TupleDesc tupdesc ;
- int ntuples,t;
- Datum datum;
- bool isnull;
- HeapTuple tuple ;
- BOX2DFLOAT4 *box;
- double box_area, area_intersect, cell_area;
- int x_idx_min, x_idx_max;
- int y_idx_min, y_idx_max;
- double xmin,ymin, xmax,ymax;
- double intersect_x, intersect_y;
- int x,y;
- int total;
- double sum_area;
- int sum_area_numb;
-
- double sum_area_new = 0;
- int sum_area_numb_new =0;
- int bump=0;
-
- int tuplimit = 500000; /* No. of tuples returned on each cursor fetch */
- bool moredata;
- void *SPIplan;
- void *SPIportal;
-
- /*elog(NOTICE,"build_lwhistogram2d called");*/
-
- xmin = histo->xmin;
- ymin = histo->ymin;
- xmax = histo->xmax;
- ymax = histo->ymax;
-
- POSTGIS_DEBUGF(3, " build_histogram2d: histogram extent = %g %g, %g %g",
- histo->xmin, histo->ymin, histo->xmax, histo->ymax);
-
- result = (LWHISTOGRAM2D *) malloc(histo->size);
- memcpy(result,histo,histo->size);
-
-
- total = 0;
- for(t=0;t<histo->boxesPerSide*histo->boxesPerSide;t++)
- {
- total+=histo->value[t];
- }
-
-
-
- sum_area = histo->avgFeatureArea * total;
- sum_area_numb = total;
-
-
-
- tablename = DatumGetCString(DirectFunctionCall1(textout,
- PointerGetDatum(PG_GETARG_DATUM(1))));
-
- columnname = DatumGetCString(DirectFunctionCall1(textout,
- PointerGetDatum(PG_GETARG_DATUM(2))));
-
- POSTGIS_DEBUGF(3, "Start build_histogram2d with %i items already existing", sum_area_numb);
- POSTGIS_DEBUGF(3, "table=\"%s\", column = \"%s\"", tablename, columnname);
-
- SPIcode = SPI_connect();
-
- if (SPIcode != SPI_OK_CONNECT)
- {
- elog(ERROR,"build_histogram2d: couldnt open a connection to SPI");
- PG_RETURN_NULL() ;
- }
-
-
- sprintf(sql,"SELECT box2d(\"%s\") FROM \"%s\"",columnname,tablename);
- /*elog(NOTICE,"executing %s",sql);*/
-
- SPIplan = SPI_prepare(sql, 0, NULL);
- if (SPIplan == NULL)
- {
- elog(ERROR,"build_histogram2d: couldnt create query plan via SPI");
- PG_RETURN_NULL() ;
- }
-
-#if POSTGIS_PGSQL_VERSION >= 80
- SPIportal = SPI_cursor_open(NULL, SPIplan, NULL, NULL, 1);
-#else
- SPIportal = SPI_cursor_open(NULL, SPIplan, NULL, NULL);
-#endif
- if (SPIportal == NULL)
- {
- elog(ERROR,"build_histogram2d: couldn't create cursor via SPI");
- PG_RETURN_NULL() ;
- }
-
-
- moredata = TRUE;
- while (moredata==TRUE)
- {
-
-
- POSTGIS_DEBUG(3, "about to fetch...");
-
- SPI_cursor_fetch(SPIportal, TRUE, tuplimit);
-
- ntuples = SPI_processed;
-
- POSTGIS_DEBUGF(3, "processing %d records", ntuples);
-
- if (ntuples > 0) {
-
- tuptable = SPI_tuptable;
- tupdesc = SPI_tuptable->tupdesc;
-
- cell_area = ( (xmax-xmin)*(ymax-ymin)/(histo->boxesPerSide*histo->boxesPerSide) );
-
- for (t=0;t<ntuples;t++)
- {
- tuple = tuptable->vals[t];
- datum = SPI_getbinval(tuple, tupdesc, 1, &isnull);
- if (!(isnull))
- {
- box = (BOX2DFLOAT4 *)DatumGetPointer(datum);
- box_area = (box->xmax-box->xmin)*(box->ymax-box->ymin);
-
- sum_area_new += box_area;
- sum_area_numb_new ++;
-
- if (box_area > cell_area )
- box_area = cell_area;
- if (box_area<0)
- box_area =0; /* for precision! */
-
- /* check to see which boxes this intersects */
- x_idx_min = (box->xmin-xmin)/(xmax-xmin)*histo->boxesPerSide;
- if (x_idx_min <0)
- x_idx_min = 0;
- if (x_idx_min >= histo->boxesPerSide)
- x_idx_min = histo->boxesPerSide-1;
- y_idx_min = (box->ymin-ymin)/(ymax-ymin)*histo->boxesPerSide;
- if (y_idx_min <0)
- y_idx_min = 0;
- if (y_idx_min >= histo->boxesPerSide)
- y_idx_min = histo->boxesPerSide-1;
-
- x_idx_max = (box->xmax-xmin)/(xmax-xmin)*histo->boxesPerSide;
- if (x_idx_max <0)
- x_idx_max = 0;
- if (x_idx_max >= histo->boxesPerSide)
- x_idx_max = histo->boxesPerSide-1;
- y_idx_max = (box->ymax-ymin)/(ymax-ymin)*histo->boxesPerSide ;
- if (y_idx_max <0)
- y_idx_max = 0;
- if (y_idx_max >= histo->boxesPerSide)
- y_idx_max = histo->boxesPerSide-1;
-
- /*
- * the {x,y}_idx_{min,max} define the grid squares that the box intersects
- * if the area of the intersect between the box and the grid square > 5% of
- */
-
- POSTGIS_DEBUGF(3, "box is : (%.15g,%.15g to %.15g,%.15g)",box->xmin,box->ymin, box->xmax, box->ymax);
- POSTGIS_DEBUGF(3, " search is in x: %i to %i y: %i to %i",x_idx_min, x_idx_max, y_idx_min,y_idx_max);
-
- for (y= y_idx_min; y<=y_idx_max;y++)
- {
- for (x=x_idx_min;x<= x_idx_max;x++)
- {
- intersect_x = LW_MIN(box->xmax, xmin+ (x+1) * (xmax-xmin)/histo->boxesPerSide ) - LW_MAX(box->xmin, xmin + x*(xmax-xmin)/histo->boxesPerSide ) ;
-
- intersect_y = LW_MIN(box->ymax, ymin+ (y+1) * (ymax-ymin)/histo->boxesPerSide ) - LW_MAX(box->ymin, ymin+ y*(ymax-ymin)/histo->boxesPerSide ) ;
-
- /* for a point, intersect_x=0, intersect_y=0, box_area =0*/
- POSTGIS_DEBUGF(3, "x=%i,y=%i, intersect_x= %.15g, intersect_y = %.15g",x,y,intersect_x,intersect_y);
-
- if ( (intersect_x>=0) && (intersect_y>=0) )
- {
- area_intersect = intersect_x*intersect_y;
- if (area_intersect >= box_area*0.05)
- {
- POSTGIS_DEBUG(3, "bump");
-
- bump++;
- result->value[x+y*histo->boxesPerSide]++;
- }
- }
- }
- } /* End of y */
-
- } /* End isnull */
-
- } /* End of for loop */
-
- /*
- * Free all the results after each fetch, otherwise all tuples stay
- * in memory until the end of the table...
- */
- SPI_freetuptable(tuptable);
-
- } else {
- moredata = FALSE;
- } /* End of if ntuples > 0 */
-
- } /* End of while loop */
-
-
- /* Close the cursor */
- SPI_cursor_close(SPIportal);
-
- SPIcode =SPI_finish();
- if (SPIcode != SPI_OK_FINISH )
- {
- elog(ERROR,"build_histogram2d: couldnt disconnect from SPI");
- PG_RETURN_NULL() ;
- }
-
- POSTGIS_DEBUG(3, "finishing up build_histogram2d ");
-
- /*pfree(tablename);*/
- /*pfree(columnname);*/
-
- total = 0;
- for(t=0;t<histo->boxesPerSide*histo->boxesPerSide;t++)
- {
- total+=result->value[t];
- }
-
- POSTGIS_DEBUGF(3, "histogram finishes with %i items in it - acutally added %i rows and %i bumps\n",total,sum_area_numb_new,bump);
- POSTGIS_DEBUG(3, "done build_histogram2d ");
-
-
- /* re-calculate statistics on avg bbox size */
- if (sum_area_numb_new >0)
- result->avgFeatureArea = (sum_area_new+sum_area)/((double)(sum_area_numb_new+sum_area_numb));
-
- PG_RETURN_POINTER(result) ;
-}
-
+#if ! REALLY_DO_JOINSEL
/*
- * explode_lwhistogram2d(histogram2d, tablename::text)
- * executes CREATE TABLE tablename (the_geom geometry, id int, hits int, percent float)
- * then populates it
- * DOES NOT UPDATE GEOMETRY_COLUMNS
- */
-PG_FUNCTION_INFO_V1(explode_lwhistogram2d);
-Datum explode_lwhistogram2d(PG_FUNCTION_ARGS)
-{
- LWHISTOGRAM2D *histo = (LWHISTOGRAM2D *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- char *tablename;
- char sql[1000];
- char geom[1000];
- int t;
- int total;
- double cellx,celly;
- int x,y;
- int SPIcode;
-
- cellx = (histo->xmax-histo->xmin)/histo->boxesPerSide;
- celly = (histo->ymax-histo->ymin)/histo->boxesPerSide;
-
- tablename = DatumGetCString(DirectFunctionCall1(textout,
- PointerGetDatum(PG_GETARG_DATUM(1))));
-
- total = 0;
- for(t=0;t<histo->boxesPerSide*histo->boxesPerSide;t++)
- {
- total+=histo->value[t];
- }
- if (total==0)
- total=1;
-
- SPIcode = SPI_connect();
- if (SPIcode != SPI_OK_CONNECT)
- {
- elog(ERROR,"build_histogram2d: couldnt open a connection to SPI");
- PG_RETURN_NULL() ;
-
- }
-
- sprintf(sql,"CREATE TABLE %s (the_geom geometry, id int, hits int, percent float)",tablename);
-
- SPIcode = SPI_exec(sql, 2147483640 ); /* max signed int32 */
-
- if (SPIcode != SPI_OK_UTILITY )
- {
- elog(ERROR,"explode_histogram2d: couldnt create table");
- PG_RETURN_NULL() ;
- }
- t=0;
- for(y=0;y<histo->boxesPerSide;y++)
- {
- for(x=0;x<histo->boxesPerSide;x++)
- {
-
- sprintf(geom,"POLYGON((%.15g %.15g, %.15g %.15g, %.15g %.15g, %.15g %.15g, %.15g %.15g ))",
- histo->xmin + x*cellx, histo->ymin+y*celly,
- histo->xmin + (x)*cellx, histo->ymin+ (y+1)*celly,
- histo->xmin + (x+1)*cellx, histo->ymin+ (y+1)*celly,
- histo->xmin + (x+1)*cellx, histo->ymin+y*celly,
- histo->xmin + x*cellx, histo->ymin+y*celly
- );
- sprintf(sql,"INSERT INTO %s VALUES('%s'::geometry,%i,%i,%.15g)",tablename,geom,t,histo->value[t],histo->value[t]/((double)total)*100.0);
- t++;
- SPIcode = SPI_exec(sql, 2147483640 ); /* max signed int32 */
- if (SPIcode != SPI_OK_INSERT )
- {
- elog(ERROR,"explode_histogram2d: couldnt insert into");
- PG_RETURN_NULL() ;
- }
- }
- }
-
- SPIcode =SPI_finish();
- if (SPIcode != SPI_OK_FINISH )
- {
- elog(ERROR,"build_histogram2d: couldnt disconnect from SPI");
- PG_RETURN_NULL() ;
- }
-
- PG_RETURN_POINTER(histo) ;
-}
-
-/*
- * estimate_histogram2d(histogram2d, box2d)
- * returns a % estimate of the # of features that will be returned by that box query
- *
- * For each grid cell that intersects the query box
- * Calculate area of intersection (AOI)
- * IF AOI < avgFeatureArea THEN set AOI = avgFeatureArea
- * SUM AOI/area-of-cell*value-of-cell
- *
- * change : instead of avgFeatureArea, use avgFeatureArea or 10% of a grid cell (whichever is smaller)
- */
-PG_FUNCTION_INFO_V1(estimate_lwhistogram2d);
-Datum estimate_lwhistogram2d(PG_FUNCTION_ARGS)
-{
- LWHISTOGRAM2D *histo = (LWHISTOGRAM2D *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- BOX2DFLOAT4 *box = (BOX2DFLOAT4 *) PG_GETARG_POINTER(1);
- double box_area;
- int x_idx_min, x_idx_max, y_idx_min, y_idx_max;
- double intersect_x, intersect_y, AOI;
- int x,y;
- double xmin,ymin,xmax,ymax;
- int32 result_sum;
- double cell_area;
- int total,t;
- double avg_feature_size;
-
-
-
- result_sum = 0;
- xmin = histo->xmin;
- ymin = histo->ymin;
- xmax = histo->xmax;
- ymax = histo->ymax;
-
- cell_area = ( (xmax-xmin)*(ymax-ymin)/(histo->boxesPerSide*histo->boxesPerSide) );
-
- avg_feature_size = histo->avgFeatureArea;
- if ( avg_feature_size > cell_area*0.1)
- {
- avg_feature_size = cell_area*0.1;
- }
-
-
- POSTGIS_DEBUG(3, "start estimate_histogram2d: ");
- POSTGIS_DEBUGF(3, "box is : (%.15g,%.15g to %.15g,%.15g)",box->xmin, box->ymin, box->xmax, box->ymax);
-
- box_area = (box->xmax-box->xmin)*(box->ymax-box->ymin);
-
- if (box_area<0) box_area = 0; /* for precision! */
-
- /*
- * check to see which boxes this intersects
- */
- x_idx_min = (box->xmin-xmin)/(xmax-xmin)*histo->boxesPerSide;
- if (x_idx_min <0) x_idx_min = 0;
- if (x_idx_min >= histo->boxesPerSide)
- x_idx_min = histo->boxesPerSide-1;
- y_idx_min = (box->ymin-ymin)/(ymax-ymin)*histo->boxesPerSide;
- if (y_idx_min <0) y_idx_min = 0;
- if (y_idx_min >= histo->boxesPerSide)
- y_idx_min = histo->boxesPerSide-1;
-
- x_idx_max = (box->xmax-xmin)/(xmax-xmin)*histo->boxesPerSide;
- if (x_idx_max <0) x_idx_max = 0;
- if (x_idx_max >= histo->boxesPerSide)
- x_idx_max = histo->boxesPerSide-1;
- y_idx_max = (box->ymax-ymin)/(ymax-ymin)*histo->boxesPerSide ;
- if (y_idx_max <0) y_idx_max = 0;
- if (y_idx_max >= histo->boxesPerSide)
- y_idx_max = histo->boxesPerSide-1;
-
- /* The {x,y}_idx_{min,max} define the grid squares that the box intersects */
-
- POSTGIS_DEBUGF(3, " search is in x: %i to %i y: %i to %i",x_idx_min, x_idx_max, y_idx_min,y_idx_max);
-
- for (y= y_idx_min; y<=y_idx_max;y++)
- {
- for (x=x_idx_min;x<= x_idx_max;x++)
- {
- intersect_x = LW_MIN(box->xmax, xmin+ (x+1) * (xmax-xmin)/histo->boxesPerSide ) - LW_MAX(box->xmin, xmin+ x*(xmax-xmin)/histo->boxesPerSide ) ;
- intersect_y = LW_MIN(box->ymax, ymin+ (y+1) * (ymax-ymin)/histo->boxesPerSide ) - LW_MAX(box->ymin, ymin+ y*(ymax-ymin)/histo->boxesPerSide ) ;
-
-/* for a point, intersect_x=0, intersect_y=0, box_area =0 */
-/* elog(NOTICE,"x=%i,y=%i, intersect_x= %.15g, intersect_y = %.15g",x,y,intersect_x,intersect_y); */
- if ( (intersect_x>=0) && (intersect_y>=0) )
- {
- AOI = intersect_x*intersect_y;
- if (AOI< avg_feature_size)
- AOI = avg_feature_size;
- result_sum += AOI/cell_area *
- histo->value[x+y*histo->boxesPerSide];
- }
- }
- }
- total = 0;
- for(t=0;t<histo->boxesPerSide*histo->boxesPerSide;t++)
- {
- total+=histo->value[t];
- }
-
- if ( (histo->avgFeatureArea <=0) && (box_area <=0) )
- PG_RETURN_FLOAT8(1.0/((double)(total)));
- else
- PG_RETURN_FLOAT8(result_sum/((double)total));
-
-}
-
-
-#if ! REALLY_DO_JOINSEL || POSTGIS_PGSQL_VERSION < 80
-/*
* JOIN selectivity in the GiST && operator
* for all PG versions
*/
@@ -754,7 +122,7 @@
PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL);
}
-#else /* REALLY_DO_JOINSEL && POSTGIS_PGSQL_VERSION >= 80 */
+#else /* REALLY_DO_JOINSEL */
int calculate_column_intersection(BOX2DFLOAT4 *search_box, GEOM_STATS *geomstats1, GEOM_STATS *geomstats2);
@@ -791,11 +159,8 @@
PG_FUNCTION_INFO_V1(LWGEOM_gist_joinsel);
Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS)
{
-#if POSTGIS_PGSQL_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);
@@ -853,13 +218,9 @@
var1 = (Var *)arg1;
var2 = (Var *)arg2;
-#if POSTGIS_PGSQL_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
POSTGIS_DEBUGF(3, "Working with relations oids: %d %d", relid1, relid2);
@@ -1011,365 +372,7 @@
/**************************** FROM POSTGIS ****************/
-#if POSTGIS_PGSQL_VERSION < 80
/*
- * get_restriction_var
- * Examine the args of a restriction clause to see if it's of the
- * form (var op something) or (something op var). If so, extract
- * and return the var and the other argument.
- *
- * Inputs:
- * args: clause argument list
- * varRelid: see specs for restriction selectivity functions
- *
- * Outputs: (these are set only if TRUE is returned)
- * *var: gets Var node
- * *other: gets other clause argument
- * *varonleft: set TRUE if var is on the left, FALSE if on the right
- *
- * Returns TRUE if a Var is identified, otherwise FALSE.
- */
-static bool
-get_restriction_var(List *args, int varRelid, Var **var,
- Node **other, bool *varonleft)
-{
- Node *left, *right;
-
- if (length(args) != 2) return false;
-
- left = (Node *) lfirst(args);
- right = (Node *) lsecond(args);
-
- /* Ignore any binary-compatible relabeling */
-
- if (IsA(left, RelabelType))
- left = (Node *)((RelabelType *) left)->arg;
- if (IsA(right, RelabelType))
- right = (Node *)((RelabelType *) right)->arg;
-
- /* Look for the var */
-
- if (IsA(left, Var) &&
- (varRelid == 0 || varRelid == ((Var *) left)->varno))
- {
- *var = (Var *) left;
- *other = right;
- *varonleft = true;
- }
- else if (IsA(right, Var) &&
- (varRelid == 0 || varRelid == ((Var *) right)->varno))
- {
- *var = (Var *) right;
- *other = left;
- *varonleft = false;
- }
- else
- {
- /* Duh, it's too complicated for me... */
- return false;
- }
-
- return true;
-}
-
-/* restriction in the GiST && operator */
-PG_FUNCTION_INFO_V1(LWGEOM_gist_sel);
-Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS)
-{
- Query *root = (Query *) PG_GETARG_POINTER(0);
- List *args = (List *) PG_GETARG_POINTER(2);
- int varRelid = PG_GETARG_INT32(3);
- char *in;
- BOX2DFLOAT4 search_box;
- char sql[1000];
-
- SPITupleTable *tuptable;
- TupleDesc tupdesc ;
- HeapTuple tuple ;
-
- Datum datum;
- bool isnull;
-
- Var *var;
- Node *other;
- bool varonleft;
- Oid relid;
- int SPIcode;
-
- double myest;
-
-#ifndef POSTGIS_USE_STATS
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
-#endif
-
- POSTGIS_DEBUG(2, "LWGEOM_gist_sel was called");
-
- if (!get_restriction_var(args, varRelid, &var, &other, &varonleft))
- {
- POSTGIS_DEBUG(3, "get_restriction_var FAILED -returning early");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
- }
-
- relid = getrelid(var->varno, root->rtable);
- if (relid == InvalidOid)
- {
- POSTGIS_DEBUG(3, "getrelid FAILED (invalid oid) -returning early");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
- }
-
- POSTGIS_DEBUGF(3, "operator's oid = %i (this should be GEOMETRY && GEOMETRY)",operator);
- POSTGIS_DEBUGF(3, "relations' oid = %i (this should be the relation that the && is working on) ",relid);
- POSTGIS_DEBUGF(3, "varatt oid = %i (basically relations column #) ",var->varattno);
-
-
- if (IsA(other, Const) &&((Const *) other)->constisnull)
- {
- POSTGIS_DEBUG(3, "other operand of && is NULL - returning early");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
- }
-
- if (IsA(other, Const))
- {
- POSTGIS_DEBUGF(3, "The other side of the && is a constant with type (oid) = %i and length %i. This should be GEOMETRY with length -1 (variable length)",((Const*)other)->consttype,((Const*)other)->constlen);
-
- }
- else
- {
- POSTGIS_DEBUG(3, "the other side of && isnt a constant - returning early");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL);
- }
-
- /* get the BOX thats being searched in */
- in = (char *)PG_DETOAST_DATUM( ((Const*)other)->constvalue );
-
- if ( ! getbox2d_p(in+4, &search_box) )
- {
- /* empty geom */
- POSTGIS_DEBUG("search box is EMPTY");
-
- PG_RETURN_FLOAT8(0.0);
- }
-
- POSTGIS_DEBUGF(3, "requested search box is : (%.15g %.15g, %.15g %.15g)",search_box->xmin,search_box->ymin,search_box->xmax,search_box->ymax);
-
-
- SPIcode = SPI_connect();
- if (SPIcode != SPI_OK_CONNECT)
- {
- elog(NOTICE,"LWGEOM_gist_sel: couldnt open a connection to SPI:%i",SPIcode);
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL) ;
- }
-
- sprintf(sql,"SELECT stats FROM GEOMETRY_COLUMNS WHERE attrelid=%u AND varattnum=%i",relid,var->varattno);
-
- POSTGIS_DEBUGF(3, "sql:%s",sql);
-
- SPIcode = SPI_exec(sql, 1 );
- if (SPIcode != SPI_OK_SELECT )
- {
- SPI_finish();
- elog(NOTICE,"LWGEOM_gist_sel: couldnt execute sql via SPI");
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL) ;
- }
-
- if (SPI_processed !=1)
- {
- SPI_finish();
-
- POSTGIS_DEBUG(3, "LWGEOM_gist_sel: geometry_columns didnt return a unique value");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL) ;
- }
-
- tuptable = SPI_tuptable;
- tupdesc = SPI_tuptable->tupdesc;
- tuple = tuptable->vals[0];
- datum = SPI_getbinval(tuple, tupdesc, 1, &isnull);
- if (isnull)
- {
- SPI_finish();
-
- POSTGIS_DEBUG(3, "LWGEOM_gist_sel: geometry_columns returned a null histogram");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL) ;
- }
-
- POSTGIS_DEBUG(3, "LWGEOM_gist_sel: checking against estimate_histogram2d");
-
-
- /* now we have the histogram, and our search box - use the estimate_histogram2d(histo,box) to get the result! */
- myest = DatumGetFloat8( DirectFunctionCall2( estimate_lwhistogram2d, datum, PointerGetDatum(&search_box) ) );
-
- if ( (myest<0) || (myest!=myest) ) /* <0? or NaN? */
- {
- POSTGIS_DEBUG(3, "LWGEOM_gist_sel: got something crazy back from estimate_histogram2d");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL) ;
- }
-
- SPIcode =SPI_finish();
- if (SPIcode != SPI_OK_FINISH )
- {
- POSTGIS_DEBUG(3, "LWGEOM_gist_sel: couldnt disconnect from SPI");
-
- PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL) ;
- }
-
- POSTGIS_DEBUGF(3, "LWGEOM_gist_sel: finished, returning with %lf",myest);
-
- PG_RETURN_FLOAT8(myest);
-}
-
-/*
- * Return the extent of the table
- * looking at gathered statistics (or NULL if
- * no statistics have been gathered).
- */
-PG_FUNCTION_INFO_V1(LWGEOM_estimated_extent);
-Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS)
-{
- text *txnsp = NULL;
- text *txtbl = NULL;
- text *txcol = NULL;
- char *nsp = NULL;
- char *tbl = NULL;
- char *col = NULL;
- char *query;
- size_t querysize;
- SPITupleTable *tuptable;
- TupleDesc tupdesc ;
- HeapTuple tuple ;
- LWHISTOGRAM2D *histo;
- Datum datum;
- int SPIcode;
- bool isnull;
- BOX2DFLOAT4 *box;
-
- if ( PG_NARGS() == 3 )
- {
- txnsp = PG_GETARG_TEXT_P(0);
- nsp = palloc(VARSIZE(txnsp)+1);
- memcpy(nsp, VARDATA(txnsp), VARSIZE(txnsp)-VARHDRSZ);
- nsp[VARSIZE(txnsp)-VARHDRSZ]='\0';
-
- txtbl = PG_GETARG_TEXT_P(1);
- txcol = PG_GETARG_TEXT_P(2);
- }
- else if ( PG_NARGS() == 2 )
- {
- txtbl = PG_GETARG_TEXT_P(0);
- txcol = PG_GETARG_TEXT_P(1);
- }
- else
- {
- elog(ERROR, "estimated_extent() called with wrong number of arguments");
- PG_RETURN_NULL();
- }
-
- tbl = palloc(VARSIZE(txtbl)+1);
- memcpy(tbl, VARDATA(txtbl), VARSIZE(txtbl)-VARHDRSZ);
- tbl[VARSIZE(txtbl)-VARHDRSZ]='\0';
-
- col = palloc(VARSIZE(txcol)+1);
- memcpy(col, VARDATA(txcol), VARSIZE(txcol)-VARHDRSZ);
- col[VARSIZE(txcol)-VARHDRSZ]='\0';
-
- POSTGIS_DEBUG(2, "LWGEOM_estimated_extent called");
-
- /* Connect to SPI manager */
- SPIcode = SPI_connect();
- if (SPIcode != SPI_OK_CONNECT)
- {
- elog(ERROR, "LWGEOM_estimated_extent: couldnt open a connection to SPI");
- PG_RETURN_NULL() ;
- }
-
- querysize = strlen(tbl)+strlen(col)+256;
- if ( nsp )
- {
- querysize += strlen(nsp)+32;
- query = palloc(querysize);
- sprintf(query, "SELECT stats FROM geometry_columns WHERE f_table_schema = '%s' AND f_table_name = '%s' AND f_geometry_column = '%s'", nsp, tbl, col);
- }
- else
- {
- query = palloc(querysize);
- sprintf(query, "SELECT stats FROM geometry_columns WHERE f_table_name = '%s' AND f_geometry_column = '%s'", tbl, col);
- }
-
- POSTGIS_DEBUGF(4, " query: %s", query);
-
- SPIcode = SPI_exec(query, 1);
- if (SPIcode != SPI_OK_SELECT )
- {
- SPI_finish();
- elog(ERROR,"LWGEOM_estimated_extent: couldnt execute sql via SPI");
- PG_RETURN_NULL();
- }
- if (SPI_processed > 1)
- {
- SPI_finish();
- elog(NOTICE, " More then a single row (%d) in geometry_columns matches given schema/table/column specs", SPI_processed);
- PG_RETURN_NULL() ;
- }
- if (SPI_processed == 0)
- {
- SPI_finish();
-
- POSTGIS_DEBUG(3, " %d stat rows", SPI_processed);
-
- PG_RETURN_NULL() ;
- }
-
- tuptable = SPI_tuptable;
- tupdesc = SPI_tuptable->tupdesc;
- tuple = tuptable->vals[0];
- datum = SPI_getbinval(tuple, tupdesc, 1, &isnull);
- if (isnull)
- {
- SPI_finish();
-
- POSTGIS_DEBUG(3, " stats are NULL");
-
- PG_RETURN_NULL();
- }
-
- histo = (LWHISTOGRAM2D *)PG_DETOAST_DATUM(datum);
-
- POSTGIS_DEBUGF(3, " histogram extent = %g %g, %g %g", histo->xmin,
- histo->ymin, histo->xmax, histo->ymax);
-
- /*
- * Construct box2dfloat4.
- * Must allocate this in upper executor context
- * to keep it alive after SPI_finish().
- */
- box = SPI_palloc(sizeof(BOX2DFLOAT4));
-
- box->xmin = histo->xmin;
- box->ymin = histo->ymin;
- box->xmax = histo->xmax;
- box->ymax = histo->ymax;
-
- POSTGIS_DEBUGF(3, " histogram extent = %f %f, %f %f", box->xmin,
- box->ymin, box->xmax, box->ymax);
-
- SPIcode = SPI_finish();
- if (SPIcode != SPI_OK_FINISH )
- {
- elog(ERROR, "LWGEOM_estimated_extent: couldnt disconnect from SPI");
- }
-
- PG_RETURN_POINTER(box);
-}
-
-#else /* POSTGIS_PGSQL_VERSION >= 80 */
-
-/*
* This function returns an estimate of the selectivity
* of a search_box looking at data in the GEOM_STATS
* structure.
@@ -1612,11 +615,8 @@
PG_FUNCTION_INFO_V1(LWGEOM_gist_sel);
Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS)
{
-#if POSTGIS_PGSQL_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); */
@@ -1699,12 +699,7 @@
* Get pg_statistic row
*/
-#if POSTGIS_PGSQL_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 )
@@ -2487,7 +1482,6 @@
}
-#endif /* POSTGIS_PGSQL_VERSION >= 80 */
/**********************************************************************
Modified: trunk/lwgeom/lwgeom_functions_basic.c
===================================================================
--- trunk/lwgeom/lwgeom_functions_basic.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwgeom_functions_basic.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -1837,15 +1837,7 @@
Datum datum;
PG_LWGEOM *geom;
ArrayType *result;
-#if POSTGIS_PGSQL_VERSION > 72
-# if POSTGIS_PGSQL_VERSION == 73
- Oid oid = getGeometryOID();
-# else /* POSTGIS_PGSQL_VERSION > 73 */
- Oid oid = get_fn_expr_argtype(fcinfo->flinfo, 1);
-# endif /* POSTGIS_PGSQL_VERSION > 73 */
-#endif /* POSTGIS_PGSQL_VERSION > 72 */
-
POSTGIS_DEBUG(2, "LWGEOM_accum called");
datum = PG_GETARG_DATUM(0);
@@ -1899,9 +1891,6 @@
SET_VARSIZE(result, nbytes);
result->ndim = 1;
-#if POSTGIS_PGSQL_VERSION > 72
- result->elemtype = oid;
-#endif
#if POSTGIS_PGSQL_VERSION > 81
result->dataoffset = 0;
#endif
Modified: trunk/lwgeom/lwgeom_gist.c
===================================================================
--- trunk/lwgeom/lwgeom_gist.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwgeom_gist.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -9,9 +9,8 @@
#include "postgres.h"
#include "access/gist.h"
#include "access/itup.h"
-#if POSTGIS_PGSQL_VERSION > 80
#include "access/skey.h"
-#endif
+
#include "fmgr.h"
#include "utils/elog.h"
@@ -759,11 +758,8 @@
PG_FUNCTION_INFO_V1(LWGEOM_gist_union);
Datum LWGEOM_gist_union(PG_FUNCTION_ARGS)
{
-#if POSTGIS_PGSQL_VERSION < 80
- bytea *entryvec = (bytea *) PG_GETARG_POINTER(0);
-#else
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
-#endif
+
int *sizep = (int *) PG_GETARG_POINTER(1);
int numranges,
i;
@@ -772,13 +768,9 @@
POSTGIS_DEBUG(2, "GIST: LWGEOM_gist_union called\n");
-#if POSTGIS_PGSQL_VERSION < 80
- numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
- cur = (BOX2DFLOAT4 *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[0].key);
-#else
numranges = entryvec->n;
cur = (BOX2DFLOAT4 *) DatumGetPointer(entryvec->vector[0].key);
-#endif
+
pageunion = (BOX2DFLOAT4 *) palloc(sizeof(BOX2DFLOAT4));
memcpy((void *) pageunion, (void *) cur, sizeof(BOX2DFLOAT4));
@@ -787,11 +779,7 @@
for (i = 1; i < numranges; i++)
{
-#if POSTGIS_PGSQL_VERSION < 80
- cur = (BOX2DFLOAT4*) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
-#else
cur = (BOX2DFLOAT4*) DatumGetPointer(entryvec->vector[i].key);
-#endif
if (pageunion->xmax < cur->xmax)
pageunion->xmax = cur->xmax;
@@ -963,11 +951,8 @@
PG_FUNCTION_INFO_V1(LWGEOM_gist_picksplit);
Datum LWGEOM_gist_picksplit(PG_FUNCTION_ARGS)
{
-#if POSTGIS_PGSQL_VERSION < 80
- bytea *entryvec = (bytea *) PG_GETARG_POINTER(0);
-#else
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
-#endif
+
GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
OffsetNumber i;
OffsetNumber *listL, *listR, *listB, *listT;
@@ -984,13 +969,8 @@
posL = posR = posB = posT = 0;
-#if POSTGIS_PGSQL_VERSION < 80
- maxoff = ((VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY)) - 1;
- cur = (BOX2DFLOAT4*) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[FirstOffsetNumber].key);
-#else
maxoff = entryvec->n - 1;
cur = (BOX2DFLOAT4*) DatumGetPointer(entryvec->vector[FirstOffsetNumber].key);
-#endif
memcpy((void *) &pageunion, (void *) cur, sizeof(BOX2DFLOAT4));
@@ -1000,11 +980,7 @@
/* find MBR */
for (i = OffsetNumberNext(FirstOffsetNumber); i <= maxoff; i = OffsetNumberNext(i))
{
-#if POSTGIS_PGSQL_VERSION < 80
- cur = (BOX2DFLOAT4*) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
-#else
cur = (BOX2DFLOAT4 *) DatumGetPointer(entryvec->vector[i].key);
-#endif
if ( allisequal == true && (
pageunion.xmax != cur->xmax ||
@@ -1036,11 +1012,7 @@
{
POSTGIS_DEBUG(4, " AllIsEqual!");
-#if POSTGIS_PGSQL_VERSION < 80
- cur = (BOX2DFLOAT4*) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[OffsetNumberNext(FirstOffsetNumber)].key);
-#else
cur = (BOX2DFLOAT4*) DatumGetPointer(entryvec->vector[OffsetNumberNext(FirstOffsetNumber)].key);
-#endif
if (memcmp((void *) cur, (void *) &pageunion, sizeof(BOX2DFLOAT4)) == 0)
@@ -1092,11 +1064,8 @@
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
{
-#if POSTGIS_PGSQL_VERSION < 80
- cur = (BOX2DFLOAT4*) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
-#else
cur = (BOX2DFLOAT4*) DatumGetPointer(entryvec->vector[i].key);
-#endif
+
if (cur->xmin - pageunion.xmin < pageunion.xmax - cur->xmax)
ADDLIST(listL, unionL, posL,i);
else
@@ -1119,11 +1088,7 @@
KBsort *arr = (KBsort*)palloc( sizeof(KBsort) * maxoff );
posL = posR = posB = posT = 0;
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) {
-#if POSTGIS_PGSQL_VERSION < 80
- arr[i-1].key = (BOX2DFLOAT4*) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
-#else
arr[i-1].key = (BOX2DFLOAT4*) DatumGetPointer(entryvec->vector[i].key);
-#endif
arr[i-1].pos = i;
}
qsort( arr, maxoff, sizeof(KBsort), compare_KB );
Modified: trunk/lwgeom/lwgeom_inout.c
===================================================================
--- trunk/lwgeom/lwgeom_inout.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwgeom_inout.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -15,9 +15,7 @@
#include "fmgr.h"
#include "utils/elog.h"
-#if POSTGIS_PGSQL_VERSION > 73
# include "lib/stringinfo.h" /* for binary input */
-#endif
#include "liblwgeom.h"
@@ -39,10 +37,8 @@
Datum LWGEOM_from_bytea(PG_FUNCTION_ARGS);
Datum LWGEOM_asHEXEWKB(PG_FUNCTION_ARGS);
Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS);
-#if POSTGIS_PGSQL_VERSION > 73
Datum LWGEOM_recv(PG_FUNCTION_ARGS);
Datum LWGEOM_send(PG_FUNCTION_ARGS);
-#endif
Datum BOOL_to_text(PG_FUNCTION_ARGS);
@@ -516,7 +512,6 @@
}
-#if POSTGIS_PGSQL_VERSION > 73
/*
* This function must advance the StringInfo.cursor pointer
* and leave it at the end of StringInfo.buf. If it fails
@@ -569,9 +564,6 @@
PG_RETURN_POINTER(result);
}
-
-#endif /* POSTGIS_PGSQL_VERSION > 73 */
-
PG_FUNCTION_INFO_V1(LWGEOM_to_bytea);
Datum LWGEOM_to_bytea(PG_FUNCTION_ARGS)
{
Modified: trunk/lwgeom/lwgeom_transform.c
===================================================================
--- trunk/lwgeom/lwgeom_transform.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwgeom_transform.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -29,33 +29,6 @@
Datum postgis_proj_version(PG_FUNCTION_ARGS);
-/* if POSTGIS_PROJ_VERSION undefined, we get a do-nothing transform() function */
-#ifndef POSTGIS_PROJ_VERSION
-
-PG_FUNCTION_INFO_V1(transform);
-Datum transform(PG_FUNCTION_ARGS)
-{
-
- elog(ERROR,"PostGIS transform() called, but support not compiled in. Modify your makefile to add proj support, remake and re-install");
- PG_RETURN_NULL();
-}
-
-PG_FUNCTION_INFO_V1(transform_geom);
-Datum transform_geom(PG_FUNCTION_ARGS)
-{
-
- elog(ERROR,"PostGIS transform_geom() called, but support not compiled in. Modify your makefile to add proj support, remake and re-install");
- PG_RETURN_NULL();
-}
-
-PG_FUNCTION_INFO_V1(postgis_proj_version);
-Datum postgis_proj_version(PG_FUNCTION_ARGS)
-{
- PG_RETURN_NULL();
-}
-
-#else /* defined POSTGIS_PROJ_VERSION */
-
#include "projects.h"
#include "utils/memutils.h"
#include "executor/spi.h"
@@ -121,15 +94,7 @@
/* PJ Hash API */
-#if POSTGIS_PGSQL_VERSION == 72
-long mcxt_ptr_hash(void *key, int keysize);
-#endif
-#if POSTGIS_PGSQL_VERSION == 73
-uint32 mcxt_ptr_hash(void *key, int keysize);
-#endif
-#if POSTGIS_PGSQL_VERSION > 73
uint32 mcxt_ptr_hash(const void *key, Size keysize);
-#endif
static HTAB *CreatePJHash(void);
static void AddPJHashEntry(MemoryContext mcxt, PJ *projection);
@@ -158,53 +123,20 @@
/* Memory context definition must match the current version of PostgreSQL */
-#if POSTGIS_PGSQL_VERSION == 72
static MemoryContextMethods PROJ4SRSCacheContextMethods = {
NULL,
NULL,
- NULL,
- PROJ4SRSCacheInit,
- PROJ4SRSCacheReset,
- PROJ4SRSCacheDelete,
-#ifdef MEMORY_CONTEXT_CHECKING
- PROJ4SRSCacheCheck,
-#endif
- PROJ4SRSCacheStats
-};
-#endif
-
-#if POSTGIS_PGSQL_VERSION == 73 || POSTGIS_PGSQL_VERSION == 74
-static MemoryContextMethods PROJ4SRSCacheContextMethods = {
NULL,
- NULL,
- NULL,
PROJ4SRSCacheInit,
PROJ4SRSCacheReset,
PROJ4SRSCacheDelete,
NULL,
- PROJ4SRSCacheStats
-#ifdef MEMORY_CONTEXT_CHECKING
- ,PROJ4SRSCacheCheck
-#endif
-};
-#endif
-
-#if POSTGIS_PGSQL_VERSION >= 80
-static MemoryContextMethods PROJ4SRSCacheContextMethods = {
- NULL,
- NULL,
- NULL,
- PROJ4SRSCacheInit,
- PROJ4SRSCacheReset,
- PROJ4SRSCacheDelete,
- NULL,
PROJ4SRSCacheIsEmpty,
PROJ4SRSCacheStats
#ifdef MEMORY_CONTEXT_CHECKING
,PROJ4SRSCacheCheck
#endif
};
-#endif
static void
@@ -288,15 +220,7 @@
* has changed over the years....
*/
-#if POSTGIS_PGSQL_VERSION == 72
-long mcxt_ptr_hash(void *key, int keysize)
-#endif
-#if POSTGIS_PGSQL_VERSION == 73
-uint32 mcxt_ptr_hash(void *key, int keysize)
-#endif
-#if POSTGIS_PGSQL_VERSION > 73
uint32 mcxt_ptr_hash(const void *key, Size keysize)
-#endif
{
uint32 hashval;
@@ -575,7 +499,6 @@
*/
void SetPROJ4LibPath(void)
{
-#if POSTGIS_PGSQL_VERSION >= 80
char *path;
const char **proj_lib_path;
@@ -595,10 +518,6 @@
/* Ensure we only do this once... */
IsPROJ4LibPathSet = true;
-#else
- /* Ensure we only do this once... */
- IsPROJ4LibPathSet = true;
-#endif
}
@@ -1102,5 +1021,4 @@
}
-#endif
Modified: trunk/lwgeom/lwpostgis.sql.in.c
===================================================================
--- trunk/lwgeom/lwpostgis.sql.in.c 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/lwpostgis.sql.in.c 2008-06-05 10:19:01 UTC (rev 2799)
@@ -24,50 +24,6 @@
BEGIN;
-------------------------------------------------------------------
--- HISTOGRAM2D TYPE (lwhistogram2d)
--------------------------------------------------------------------
-
-#if POSTGIS_PGSQL_VERSION < 73
-# define HISTOGRAM_IN_REP opaque
-# define HISTOGRAM_OUT_REP opaque
-#else
-# define HISTOGRAM_IN_REP histogram2d
-# define HISTOGRAM_OUT_REP cstring
-#endif
-
--- Deprecation in 1.2.3
-CREATEFUNCTION histogram2d_in(HISTOGRAM_OUT_REP)
- RETURNS HISTOGRAM_IN_REP
- AS 'MODULE_PATHNAME', 'lwhistogram2d_in'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
--- Availability: 1.2.2
-CREATEFUNCTION ST_histogram2d_in(HISTOGRAM_OUT_REP)
- RETURNS HISTOGRAM_IN_REP
- AS 'MODULE_PATHNAME', 'lwhistogram2d_in'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
--- Deprecation in 1.2.3
-CREATEFUNCTION histogram2d_out(HISTOGRAM_IN_REP)
- RETURNS HISTOGRAM_OUT_REP
- AS 'MODULE_PATHNAME', 'lwhistogram2d_out'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
--- Availability: 1.2.2
-CREATEFUNCTION ST_histogram2d_out(HISTOGRAM_IN_REP)
- RETURNS HISTOGRAM_OUT_REP
- AS 'MODULE_PATHNAME', 'lwhistogram2d_out'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
-CREATE TYPE histogram2d (
- alignment = double,
- internallength = variable,
- input = ST_histogram2d_in,
- output = ST_histogram2d_out,
- storage = main
-);
-
--------------------------------------------------------------------
-- SPHEROID TYPE
-------------------------------------------------------------------
@@ -2498,101 +2454,6 @@
);
-----------------------------------------------------------------------
--- CREATE_HISTOGRAM2D( <box2d>, <size> )
------------------------------------------------------------------------
---
--- Returns a histgram with 0s in all the boxes.
---
------------------------------------------------------------------------
--- Deprecation in 1.2.3
-CREATEFUNCTION create_histogram2d(box2d,int)
- RETURNS histogram2d
- AS 'MODULE_PATHNAME','create_lwhistogram2d'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
--- Availability: 1.2.2
-CREATEFUNCTION ST_create_histogram2d(box2d,int)
- RETURNS histogram2d
- AS 'MODULE_PATHNAME','create_lwhistogram2d'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
------------------------------------------------------------------------
--- BUILD_HISTOGRAM2D( <histogram2d>, <tablename>, <columnname> )
------------------------------------------------------------------------
--- Deprecation in 1.2.3
-CREATEFUNCTION build_histogram2d (histogram2d,text,text)
- RETURNS histogram2d
- AS 'MODULE_PATHNAME','build_lwhistogram2d'
- LANGUAGE 'C' _STABLE_STRICT; -- WITH (isstrict);
-
--- Availability: 1.2.2
-CREATEFUNCTION ST_build_histogram2d (histogram2d,text,text)
- RETURNS histogram2d
- AS 'MODULE_PATHNAME','build_lwhistogram2d'
- LANGUAGE 'C' _STABLE_STRICT; -- WITH (isstrict);
-
-#if POSTGIS_PGSQL_VERSION >= 73
------------------------------------------------------------------------
--- BUILD_HISTOGRAM2D(<histogram2d>,<schema>,<tablename>,<columnname>)
------------------------------------------------------------------------
--- This is a wrapper to the omonimous schema unaware function,
--- thanks to Carl Anderson for the idea.
------------------------------------------------------------------------
--- Deprecation in 1.2.3
-CREATEFUNCTION build_histogram2d (histogram2d,text,text,text)
-RETURNS histogram2d
-AS '
-BEGIN
- EXECUTE ''SET local search_path = ''||$2||'',public'';
- RETURN public.build_histogram2d($1,$3,$4);
-END
-'
-LANGUAGE 'plpgsql' _STABLE_STRICT; -- WITH (isstrict);
-
--- Availability: 1.2.2
-CREATEFUNCTION ST_build_histogram2d (histogram2d,text,text,text)
-RETURNS histogram2d
-AS '
-BEGIN
- EXECUTE ''SET local search_path = ''||$2||'',public'';
- RETURN public.build_histogram2d($1,$3,$4);
-END
-'
-LANGUAGE 'plpgsql' _STABLE_STRICT; -- WITH (isstrict);
-
-#endif
-
------------------------------------------------------------------------
--- EXPLODE_HISTOGRAM2D( <histogram2d>, <tablename> )
------------------------------------------------------------------------
--- Deprecation in 1.2.3
-CREATEFUNCTION explode_histogram2d (histogram2d,text)
- RETURNS histogram2d
- AS 'MODULE_PATHNAME','explode_lwhistogram2d'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
--- Availability: 1.2.2
-CREATEFUNCTION ST_explode_histogram2d (histogram2d,text)
- RETURNS histogram2d
- AS 'MODULE_PATHNAME','explode_lwhistogram2d'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
------------------------------------------------------------------------
--- ESTIMATE_HISTOGRAM2D( <histogram2d>, <box> )
------------------------------------------------------------------------
--- Deprecation in 1.2.3
-CREATEFUNCTION estimate_histogram2d(histogram2d,box2d)
- RETURNS float8
- AS 'MODULE_PATHNAME','estimate_lwhistogram2d'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
--- Availability: 1.2.2
-CREATEFUNCTION ST_estimate_histogram2d(histogram2d,box2d)
- RETURNS float8
- AS 'MODULE_PATHNAME','estimate_lwhistogram2d'
- LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict);
-
------------------------------------------------------------------------
-- ESTIMATED_EXTENT( <schema name>, <table name>, <column name> )
-----------------------------------------------------------------------
-- Deprecation in 1.2.3
Modified: trunk/lwgeom/pgsql_compat.h
===================================================================
--- trunk/lwgeom/pgsql_compat.h 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/pgsql_compat.h 2008-06-05 10:19:01 UTC (rev 2799)
@@ -1,9 +1,5 @@
#ifndef _PGSQL_COMPAT_H
-#if POSTGIS_PGSQL_VERSION < 73
-#define WARNING NOTICE
-#endif
-
/* PostgreSQL < 8.3 uses VARATT_SIZEP rather than SET_VARSIZE for varlena types */
#if POSTGIS_PGSQL_VERSION < 83
#define SET_VARSIZE(var, size) VARATT_SIZEP(var) = size
Modified: trunk/lwgeom/sqldefines.h.in
===================================================================
--- trunk/lwgeom/sqldefines.h.in 2008-05-31 10:35:04 UTC (rev 2798)
+++ trunk/lwgeom/sqldefines.h.in 2008-06-05 10:19:01 UTC (rev 2799)
@@ -16,10 +16,8 @@
#define _POSTGIS_SQL_SELECT_POSTGIS_VERSION 'SELECT ''@POSTGIS_VERSION@''::text AS version'
#define _POSTGIS_SQL_SELECT_POSTGIS_BUILD_DATE 'SELECT ''@POSTGIS_BUILD_DATE@''::text AS version'
-
#define CREATEFUNCTION CREATE OR REPLACE FUNCTION
-#if POSTGIS_PGSQL_VERSION > 72
# define _IMMUTABLE_STRICT IMMUTABLE STRICT
# define _IMMUTABLE IMMUTABLE
# define _STABLE_STRICT STABLE STRICT
@@ -28,19 +26,7 @@
# define _VOLATILE VOLATILE
# define _STRICT STRICT
# define _SECURITY_DEFINER SECURITY DEFINER
-#else
-# define _IMMUTABLE_STRICT with(iscachable,isstrict)
-# define _IMMUTABLE with(iscachable)
-# define _STABLE_STRICT with(isstrict)
-# define _STABLE
-# define _VOLATILE_STRICT with(isstrict)
-# define _VOLATILE
-# define _STRICT with(isstrict)
-# define _SECURITY_DEFINER
-#endif
-#if POSTGIS_PGSQL_VERSION >= 73
# define HAS_SCHEMAS 1
-#endif
#endif /* _LWPGIS_DEFINES */
More information about the postgis-commits
mailing list