[postgis-tickets] r15634 - Revert rework of PGSQL_VERSION extraction for PostgreSQL 10+

Sandro Santilli strk at kbt.io
Tue Sep 5 14:23:18 PDT 2017


Author: strk
Date: 2017-09-05 14:23:18 -0700 (Tue, 05 Sep 2017)
New Revision: 15634

Modified:
   trunk/configure.ac
   trunk/postgis/gserialized_estimate.c
   trunk/postgis/postgis.sql.in
Log:
Revert rework of PGSQL_VERSION extraction for PostgreSQL 10+

Reverts r15633 and r15629

For information about PostgreSQL versioning changes, see
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=69dc5ae408f68c302029a6b43912a2cc16b1256c

Ref #3614

Modified: trunk/configure.ac
===================================================================
--- trunk/configure.ac	2017-09-05 21:11:57 UTC (rev 15633)
+++ trunk/configure.ac	2017-09-05 21:23:18 UTC (rev 15634)
@@ -438,18 +438,14 @@
   PGSQL_FULL_VERSION=`"$PG_CONFIG" --version`
 
   PGSQL_MAJOR_VERSION=`echo $PGSQL_FULL_VERSION | sed 's/[[^0-9]]*\([[0-9]]*\).*/\1/'`
-  PGSQL_MINOR_VERSION=`echo $PGSQL_FULL_VERSION | sed 's/[[^\.]]*\.\([[0-9]]*\).*/\1/'`
-  if test "$PGSQL_MINOR_VERSION" = "$PGSQL_FULL_VERSION"; then
-      dnl No match means there's no minor version
-      PGSQL_MINOR_VERSION="0"
-  fi
+  PGSQL_MINOR_VERSION=`$PG_CONFIG --version | sed 's/[[^0-9]]*\([[0-9]]\)\.\([[0-9]]\).*/\2/'`
 
   if test $PGSQL_MAJOR_VERSION -gt 9; then
-       dnl ==================================================================
-       dnl Starting with PostgreSQL 10, we use 2 digits for minor version
-       dnl This is to prevent things like 10.31 ranking higher than 11.0
-       dnl===================================================================
-       PGSQL_MINOR_VERSION=`printf %.2d $PGSQL_MINOR_VERSION`
+  	dnl ==================================================================
+  	dnl Starting with PostgreSQL 10, major is the new minor
+  	dnl This is to prevent things like 10.31 ranking higher than 11.0
+  	dnl===================================================================
+  	PGSQL_MINOR_VERSION=0
   fi
 
   POSTGIS_PGSQL_VERSION="$PGSQL_MAJOR_VERSION$PGSQL_MINOR_VERSION"

Modified: trunk/postgis/gserialized_estimate.c
===================================================================
--- trunk/postgis/gserialized_estimate.c	2017-09-05 21:11:57 UTC (rev 15633)
+++ trunk/postgis/gserialized_estimate.c	2017-09-05 21:23:18 UTC (rev 15634)
@@ -166,8 +166,8 @@
 /**
 * More modest fallback selectivity factor
 */
-#define FALLBACK_ND_SEL 0.2
-#define FALLBACK_ND_JOINSEL 0.3
+#define FALLBACK_ND_SEL 0.2	
+#define FALLBACK_ND_JOINSEL 0.3	
 
 /**
 * N-dimensional box type for calculations, to avoid doing
@@ -200,7 +200,7 @@
 {
 	/* Dimensionality of the histogram. */
 	float4 ndims;
-
+	
 	/* Size of n-d histogram in each dimension. */
 	float4 size[ND_DIMS];
 
@@ -209,10 +209,10 @@
 
 	/* How many rows in the table itself? */
 	float4 table_features;
-
+	
 	/* How many rows were in the sample that built this histogram? */
 	float4 sample_features;
-
+	
 	/* How many not-Null/Empty features were in the sample? */
 	float4 not_null_features;
 
@@ -221,12 +221,12 @@
 
 	/* How many cells in histogram? (sizex*sizey*sizez*sizem) */
 	float4 histogram_cells;
-
+	
 	/* How many cells did those histogram features cover? */
 	/* Since we are pro-rating coverage, this number should */
 	/* now always equal histogram_features */
 	float4 cells_covered;
-
+	
 	/* Variable length # of floats for histogram */
 	float4 value[1];
 } ND_STATS;
@@ -349,7 +349,7 @@
 	int i;
 	double sigma2 = 0;
 	double mean = avg(vals, nvals);
-
+	
 	/* Calculate sigma2 */
 	for ( i = 0; i < nvals; i++ )
 	{
@@ -369,7 +369,7 @@
 {
 	int d;
 	int accum = 1, vdx = 0;
-
+	
 	/* Calculate the index into the 1-d values array that the (i,j,k,l) */
 	/* n-d histogram coordinate implies. */
 	/* index = x + y * sizex + z * sizex * sizey + m * sizex * sizey * sizez */
@@ -396,7 +396,7 @@
 	char *rv;
 	int i;
 	stringbuffer_t *sb = stringbuffer_create();
-
+	
 	stringbuffer_append(sb, "{\"min\":[");
 	for ( i = 0; i < ndims; i++ )
 	{
@@ -413,7 +413,7 @@
 
 	rv = stringbuffer_getstringcopy(sb);
 	stringbuffer_destroy(sb);
-	return rv;
+	return rv;	
 }
 
 
@@ -428,10 +428,10 @@
 	int d;
 	stringbuffer_t *sb = stringbuffer_create();
 	int ndims = (int)roundf(nd_stats->ndims);
-
+	
 	stringbuffer_append(sb, "{");
 	stringbuffer_aprintf(sb, "\"ndims\":%d,", ndims);
-
+	
 	/* Size */
 	stringbuffer_append(sb, "\"size\":[");
 	for ( d = 0; d < ndims; d++ )
@@ -445,7 +445,7 @@
 	json_extent = nd_box_to_json(&(nd_stats->extent), ndims);
 	stringbuffer_aprintf(sb, "\"extent\":%s,", json_extent);
 	pfree(json_extent);
-
+	
 	stringbuffer_aprintf(sb, "\"table_features\":%d,", (int)roundf(nd_stats->table_features));
 	stringbuffer_aprintf(sb, "\"sample_features\":%d,", (int)roundf(nd_stats->sample_features));
 	stringbuffer_aprintf(sb, "\"not_null_features\":%d,", (int)roundf(nd_stats->not_null_features));
@@ -457,7 +457,7 @@
 	str = stringbuffer_getstringcopy(sb);
 	stringbuffer_destroy(sb);
 	return str;
-}
+}	
 
 
 /**
@@ -533,7 +533,7 @@
 {
 	int d = 0;
 	POSTGIS_DEBUGF(3, " %s", gbox_to_string(gbox));
-
+	
 	nd_box_init(nd_box);
 	nd_box->min[d] = gbox->xmin;
 	nd_box->max[d] = gbox->xmax;
@@ -619,12 +619,12 @@
 nd_box_overlap(const ND_STATS *nd_stats, const ND_BOX *nd_box, ND_IBOX *nd_ibox)
 {
 	int d;
-
+	
 	POSTGIS_DEBUGF(4, " nd_box: %s", nd_box_to_json(nd_box, nd_stats->ndims));
-
+	
 	/* Initialize ibox */
 	memset(nd_ibox, 0, sizeof(ND_IBOX));
-
+	
 	/* In each dimension... */
 	for ( d = 0; d < nd_stats->ndims; d++ )
 	{
@@ -632,14 +632,14 @@
 		double smax = nd_stats->extent.max[d];
 		double width = smax - smin;
 		int size = roundf(nd_stats->size[d]);
-
+		
 		/* ... find cells the box overlaps with in this dimension */
 		nd_ibox->min[d] = floor(size * (nd_box->min[d] - smin) / width);
 		nd_ibox->max[d] = floor(size * (nd_box->max[d] - smin) / width);
 
 		POSTGIS_DEBUGF(5, " stats: dim %d: min %g: max %g: width %g", d, smin, smax, width);
 		POSTGIS_DEBUGF(5, " overlap: dim %d: (%d, %d)", d, nd_ibox->min[d], nd_ibox->max[d]);
-
+		
 		/* Push any out-of range values into range */
 		nd_ibox->min[d] = Max(nd_ibox->min[d], 0);
 		nd_ibox->max[d] = Min(nd_ibox->max[d], size-1);
@@ -658,16 +658,16 @@
 	double ivol = 1.0;
 	double vol2 = 1.0;
 	double vol1 = 1.0;
-
+	
 	for ( d = 0 ; d < ndims; d++ )
 	{
 		if ( b1->max[d] <= b2->min[d] || b1->min[d] >= b2->max[d] )
 			return 0.0; /* Disjoint */
-
+		
 		if ( b1->min[d] > b2->min[d] || b1->max[d] < b2->max[d] )
 			covered = FALSE;
 	}
-
+	
 	if ( covered )
 		return 1.0;
 
@@ -676,21 +676,21 @@
 		double width1 = b1->max[d] - b1->min[d];
 		double width2 = b2->max[d] - b2->min[d];
 		double imin, imax, iwidth;
-
+		
 		vol1 *= width1;
 		vol2 *= width2;
-
+		
 		imin = Max(b1->min[d], b2->min[d]);
 		imax = Min(b1->max[d], b2->max[d]);
 		iwidth = imax - imin;
 		iwidth = Max(0.0, iwidth);
-
+		
 		ivol *= iwidth;
 	}
-
+	
 	if ( vol2 == 0.0 )
 		return vol2;
-
+	
 	return ivol / vol2;
 }
 
@@ -724,17 +724,17 @@
 #endif
 	int   bmin, bmax;   /* Bin min, bin max */
 	const ND_BOX *ndb;
-
-	/* For each dimension... */
+	
+	/* For each dimension... */	
 	for ( d = 0; d < ndims; d++ )
 	{
 		/* Initialize counts for this dimension */
 		memset(counts, 0, sizeof(int)*num_bins);
-
+		
 		smin = extent->min[d];
 		smax = extent->max[d];
 		swidth = smax - smin;
-
+		
 		/* Don't try and calculate distribution of overly narrow dimensions */
 		if ( swidth < MIN_DIMENSION_WIDTH )
 		{
@@ -746,14 +746,14 @@
 		for ( i = 0; i < num_boxes; i++ )
 		{
 			double minoffset, maxoffset;
-
+			
 			/* Skip null entries */
-			ndb = nd_boxes[i];
+			ndb = nd_boxes[i];	
 			if ( ! ndb ) continue;
-
+			
 			/* Where does box fall relative to the working range */
 			minoffset = ndb->min[d] - smin;
-			maxoffset = ndb->max[d] - smin;
+			maxoffset = ndb->max[d] - smin;				
 
 			/* Skip boxes that our outside our working range */
 			if ( minoffset < 0 || minoffset > swidth ||
@@ -761,19 +761,19 @@
 			{
 				continue;
 			}
-
+				
 			/* What bins does this range correspond to? */
 			bmin = num_bins * (minoffset) / swidth;
 			bmax = num_bins * (maxoffset) / swidth;
-
+			
 			POSTGIS_DEBUGF(4, " dimension %d, feature %d: bin %d to bin %d", d, i, bmin, bmax);
-
+		
 			/* Increment the counts in all the bins this feature overlaps */
 			for ( k = bmin; k <= bmax; k++ )
 			{
 				counts[k] += 1;
 			}
-
+			
 		}
 
 		/* How dispersed is the distribution of features across bins? */
@@ -789,10 +789,10 @@
 		POSTGIS_DEBUGF(3, " dimension %d: stddev = %.6g", d, sdev);
 		POSTGIS_DEBUGF(3, " dimension %d: stddev_ratio = %.6g", d, sdev_ratio);
 #endif
-
+		
 		distribution[d] = range;
 	}
-
+	
 	return TRUE;
 }
 
@@ -835,24 +835,24 @@
 	if ( mode == 2 ) stats_kind = STATISTIC_KIND_2D;
 
     /* Then read the geom status histogram from that */
-
-#if POSTGIS_PGSQL_VERSION < 1000
+  
+#if POSTGIS_PGSQL_VERSION < 100
 	float4 *floatptr;
 	int nvalues;
-
+	
 	rv = get_attstatsslot(stats_tuple, 0, 0, stats_kind, InvalidOid,
 						NULL, NULL, NULL, &floatptr, &nvalues);
-
+	
 	if ( ! rv ) {
 		POSTGIS_DEBUGF(2,
 				"no slot of kind %d in stats tuple", stats_kind);
 		return NULL;
 	}
-
+		
 	/* Clone the stats here so we can release the attstatsslot immediately */
 	nd_stats = palloc(sizeof(float) * nvalues);
 	memcpy(nd_stats, floatptr, sizeof(float) * nvalues);
-
+	
 	/* Clean up */
 	free_attstatsslot(0, NULL, 0, floatptr, nvalues);
 #else /* PostgreSQL 10 or higher */
@@ -864,11 +864,11 @@
 				"no slot of kind %d in stats tuple", stats_kind);
 		return NULL;
 	}
-
+	
 	/* Clone the stats here so we can release the attstatsslot immediately */
 	nd_stats = palloc(sizeof(float4) * sslot.nnumbers);
 	memcpy(nd_stats, sslot.numbers, sizeof(float4) * sslot.nnumbers);
-
+	
 	free_attstatsslot(&sslot);
 #endif
 
@@ -915,7 +915,7 @@
 			"histogram for attribute %d of table \"%s\" does not exist?",
 			att_num, get_rel_name(table_oid));
 	}
-
+	
 	return nd_stats;
 }
 
@@ -948,7 +948,7 @@
 		elog(ERROR, "attribute name is null");
 		return NULL;
 	}
-
+	
 	return pg_get_nd_stats(table_oid, att_num, mode, only_parent);
 }
 
@@ -972,7 +972,7 @@
 	int ndims1, ndims2, ndims;
 	double ntuples_max;
 	double ntuples_not_null1, ntuples_not_null2;
-
+	
 	ND_BOX extent1, extent2;
 	ND_IBOX ibox1, ibox2;
 	int at1[ND_DIMS];
@@ -1007,10 +1007,10 @@
 		s1 = s2;
 		s2 = stats_tmp;
 	}
-
+	
 	POSTGIS_DEBUGF(3, "s1: %s", nd_stats_to_json(s1));
 	POSTGIS_DEBUGF(3, "s2: %s", nd_stats_to_json(s2));
-
+	
 	/* Re-read that info after the swap */
 	ncells1 = (int)roundf(s1->histogram_cells);
 	ncells2 = (int)roundf(s2->histogram_cells);
@@ -1025,7 +1025,7 @@
 	ndims1 = (int)roundf(s1->ndims);
 	ndims2 = (int)roundf(s2->ndims);
 	ndims = Max(ndims1, ndims2);
-
+	
 	/* Get the extents */
 	extent1 = s1->extent;
 	extent2 = s2->extent;
@@ -1036,7 +1036,7 @@
 		POSTGIS_DEBUG(3, "relation stats do not intersect, returning 0");
 		PG_RETURN_FLOAT8(0.0);
 	}
-
+	
 	/*
 	 * First find the index range of the part of the smaller
 	 * histogram that overlaps the larger one.
@@ -1044,9 +1044,9 @@
 	if ( ! nd_box_overlap(s1, &extent2, &ibox1) )
 	{
 		POSTGIS_DEBUG(3, "could not calculate overlap of relations");
-		PG_RETURN_FLOAT8(FALLBACK_ND_JOINSEL);
+		PG_RETURN_FLOAT8(FALLBACK_ND_JOINSEL);		
 	}
-
+	
 	/* Initialize counters / constants on s1 */
 	for ( d = 0; d < ndims1; d++ )
 	{
@@ -1078,27 +1078,27 @@
 			nd_cell1.min[d] = min1[d] + (at1[d]+0) * cellsize1[d];
 			nd_cell1.max[d] = min1[d] + (at1[d]+1) * cellsize1[d];
 		}
-
+		
 		/* Find the cells of s2 that cell1 overlaps.. */
 		nd_box_overlap(s2, &nd_cell1, &ibox2);
-
+		
 		/* Initialize counter */
 		for ( d = 0; d < ndims2; d++ )
 		{
 			at2[d] = ibox2.min[d];
 		}
-
+		
 		POSTGIS_DEBUGF(3, "at1 %d,%d  %s", at1[0], at1[1], nd_box_to_json(&nd_cell1, ndims1));
-
+		
 		/* Get the value at this cell */
 		val1 = s1->value[nd_stats_value_index(s1, at1)];
-
+		
 		/* For each overlapped cell of s2... */
 		do
 		{
 			double ratio2;
 			double val2;
-
+			
 			/* Construct the bounds of this cell */
 			ND_BOX nd_cell2;
 			nd_box_init(&nd_cell2);
@@ -1109,22 +1109,22 @@
 			}
 
 			POSTGIS_DEBUGF(3, "  at2 %d,%d  %s", at2[0], at2[1], nd_box_to_json(&nd_cell2, ndims2));
-
+			
 			/* Calculate overlap ratio of the cells */
 			ratio2 = nd_box_ratio(&nd_cell1, &nd_cell2, Max(ndims1, ndims2));
-
+			
 			/* Multiply the cell counts, scaled by overlap ratio */
 			val2 = s2->value[nd_stats_value_index(s2, at2)];
 			POSTGIS_DEBUGF(3, "  val1 %.6g  val2 %.6g  ratio %.6g", val1, val2, ratio2);
 			val += val1 * (val2 * ratio2);
 		}
 		while ( nd_increment(&ibox2, ndims2, at2) );
-
+		
 	}
 	while( nd_increment(&ibox1, ndims1, at1) );
-
+	
 	POSTGIS_DEBUGF(3, "val of histogram = %g", val);
-
+	
 	/*
 	 * In order to compare our total cell count "val" to the
 	 * ntuples_max, we need to scale val up to reflect a full
@@ -1135,7 +1135,7 @@
 	val *= (s2->table_features / s2->sample_features);
 
 	POSTGIS_DEBUGF(3, "val scaled to full table size = %g", val);
-
+	
 	/*
 	 * Because the cell counts are over-determined due to
 	 * double counting of features that overlap multiple cells
@@ -1162,7 +1162,7 @@
 	{
 		selectivity = 1.0;
 	}
-
+	
 	return selectivity;
 }
 
@@ -1216,7 +1216,7 @@
 	Node *arg1, *arg2;
 	Var *var1, *var2;
 	Oid relid1, relid2;
-
+	
 	ND_STATS *stats1, *stats2;
 	float8 selectivity;
 
@@ -1266,7 +1266,7 @@
 
 	selectivity = estimate_join_selectivity(stats1, stats2);
 	POSTGIS_DEBUGF(2, "got selectivity %g", selectivity);
-
+	
 	pfree(stats1);
 	pfree(stats2);
 	PG_RETURN_FLOAT8(selectivity);
@@ -1305,7 +1305,7 @@
 
 	ND_STATS *nd_stats;                /* Our histogram */
 	size_t    nd_stats_size;           /* Size to allocate */
-
+	
 	double total_width = 0;            /* # of bytes used by sample */
 	double total_sample_volume = 0;    /* Area/volume coverage of the sample */
 	double total_cell_count = 0;       /* # of cells in histogram affected by sample */
@@ -1313,7 +1313,7 @@
 	ND_BOX sum;                        /* Sum of extents of sample boxes */
 	ND_BOX avg;                        /* Avg of extents of sample boxes */
 	ND_BOX stddev;                     /* StdDev of extents of sample boxes */
-
+	
 	const ND_BOX **sample_boxes;       /* ND_BOXes for each of the sample features */
 	ND_BOX sample_extent;              /* Extent of the raw sample */
 	int    histo_size[ND_DIMS];        /* histogram nrows, ncols, etc */
@@ -1322,7 +1322,7 @@
 	int    histo_cells_target;         /* Number of cells we will shoot for, given the stats target */
 	int    histo_cells;                /* Number of cells in the histogram */
 	int    histo_cells_new = 1;        /* Temporary variable */
-
+	
 	int   ndims = 2;                    /* Dimensionality of the sample */
 	int   histo_ndims = 0;              /* Dimensionality of the histogram */
 	double sample_distribution[ND_DIMS]; /* How homogeneous is distribution of sample in each axis? */
@@ -1379,7 +1379,7 @@
 			null_cnt++;
 			continue;
 		}
-
+			
 		/* Read the bounds from the gserialized. */
 		geom = (GSERIALIZED *)PG_DETOAST_DATUM(datum);
 		is_copy = VARATT_IS_EXTENDED(datum);
@@ -1389,11 +1389,11 @@
 			POSTGIS_DEBUGF(3, " skipped empty geometry %d", i);
 			continue;
 		}
-
+		
 		/* If we're in 2D mode, zero out the higher dimensions for "safety" */
 		if ( mode == 2 )
 			gbox.zmin = gbox.zmax = gbox.mmin = gbox.mmax = 0.0;
-
+		
 		/* Check bounds for validity (finite and not NaN) */
 		if ( ! gbox_is_valid(&gbox) )
 		{
@@ -1407,24 +1407,24 @@
 		 */
 		if ( mode != 2 )
 			ndims = Max(gbox_ndims(&gbox), ndims);
-
-		/* Convert gbox to n-d box */
+		
+		/* Convert gbox to n-d box */		
 		nd_box = palloc(sizeof(ND_BOX));
 		nd_box_from_gbox(&gbox, nd_box);
-
+		
 		/* Cache n-d bounding box */
 		sample_boxes[notnull_cnt] = nd_box;
 
 		/* Initialize sample extent before merging first entry */
 		if ( ! notnull_cnt )
 			nd_box_init_bounds(&sample_extent);
-
+		
 		/* Add current sample to overall sample extent */
 		nd_box_merge(nd_box, &sample_extent);
-
+		
 		/* How many bytes does this sample use? */
 		total_width += VARSIZE(geom);
-
+		
 		/* Add bounds coordinates to sums for stddev calculation */
 		for ( d = 0; d < ndims; d++ )
 		{
@@ -1434,7 +1434,7 @@
 
 		/* Increment our "good feature" count */
 		notnull_cnt++;
-
+		
 		/* Free up memory if our sample geometry was copied */
 		if ( is_copy )
 			pfree(geom);
@@ -1470,13 +1470,13 @@
 	/*
 	 * Second scan:
 	 *  o compute standard deviation
-	 */
+	 */	
 	for ( d = 0; d < ndims; d++ )
 	{
 		/* Calculate average bounds values */
 		avg.min[d] = sum.min[d] / notnull_cnt;
 		avg.max[d] = sum.max[d] / notnull_cnt;
-
+		
 		/* Calculate standard deviation for this dimension bounds */
 		for ( i = 0; i < notnull_cnt; i++ )
 		{
@@ -1486,7 +1486,7 @@
 		}
 		stddev.min[d] = sqrt(stddev.min[d] / notnull_cnt);
 		stddev.max[d] = sqrt(stddev.max[d] / notnull_cnt);
-
+		
 		/* Histogram bounds for this dimension bounds is avg +/- SDFACTOR * stdev */
 		histo_extent.min[d] = Max(avg.min[d] - SDFACTOR * stddev.min[d], sample_extent.min[d]);
 		histo_extent.max[d] = Min(avg.max[d] + SDFACTOR * stddev.max[d], sample_extent.max[d]);
@@ -1507,7 +1507,7 @@
 			POSTGIS_DEBUGF(4, " feature %d is a hard deviant, skipped", i);
 			sample_boxes[i] = NULL;
 			continue;
-		}
+		}	
 		/* Expand our new box to fit all the other features. */
 		nd_box_merge(ndb, &histo_extent_new);
 	}
@@ -1517,7 +1517,7 @@
 	 */
 	nd_box_expand(&histo_extent_new, 0.01);
 	histo_extent = histo_extent_new;
-
+	
 	/*
 	 * How should we allocate our histogram cells to the
 	 * different dimensions? We can't do it by raw dimensional width,
@@ -1540,7 +1540,7 @@
 	 * At this point, histo_cells_target is the approximate target number
 	 * of cells.
 	 */
-
+	
 	/*
 	 * Some dimensions have basically a uniform distribution, we want
 	 * to allocate no cells to those dimensions, only to dimensions
@@ -1552,7 +1552,7 @@
 		if ( sample_distribution[d] > 0 )
 			histo_ndims++;
 	}
-
+	
 	if ( histo_ndims == 0 )
 	{
 		/* Special case: all our dimensions had low variability! */
@@ -1602,11 +1602,11 @@
 		}
 		POSTGIS_DEBUGF(3, " histo_cells_new: %d", histo_cells_new);
 	}
-
+	
 	/* Update histo_cells to the actual number of cells we need to allocate */
 	histo_cells = histo_cells_new;
 	POSTGIS_DEBUGF(3, " histo_cells: %d", histo_cells);
-
+	
 	/*
 	 * Create the histogram (ND_STATS) in the stats memory context
 	 */
@@ -1656,11 +1656,11 @@
 
 		/* Give backend a chance of interrupting us */
 		vacuum_delay_point();
-
+		
 		/* Find the cells that overlap with this box and put them into the ND_IBOX */
 		nd_box_overlap(nd_stats, nd_box, &nd_ibox);
 		memset(at, 0, sizeof(int)*ND_DIMS);
-
+		
 		POSTGIS_DEBUGF(3, " feature %d: ibox (%d, %d, %d, %d) (%d, %d, %d, %d)", i,
 		  nd_ibox.min[0], nd_ibox.min[1], nd_ibox.min[2], nd_ibox.min[3],
 		  nd_ibox.max[0], nd_ibox.max[1], nd_ibox.max[2], nd_ibox.max[3]);
@@ -1672,7 +1672,7 @@
 			min[d] = nd_stats->extent.min[d];
 			max[d] = nd_stats->extent.max[d];
 			cellsize[d] = (max[d] - min[d])/(nd_stats->size[d]);
-
+			
 			/* What's the volume (area) of this feature's box? */
 			tmp_volume *= (nd_box->max[d] - nd_box->min[d]);
 		}
@@ -1707,7 +1707,7 @@
 			POSTGIS_DEBUGF(3, "               at (%d, %d, %d, %d)", at[0], at[1], at[2], at[3]);
 		}
 		while ( nd_increment(&nd_ibox, nd_stats->ndims, at) );
-
+		
 		/* Keep track of overall number of overlaps counted */
 		total_cell_count += num_cells;
 		/* How many features have we added to this histogram? */
@@ -1726,7 +1726,7 @@
 		stats->stats_valid = false;
 		return;
 	}
-
+	
 	nd_stats->histogram_features = histogram_features;
 	nd_stats->histogram_cells = histo_cells;
 	nd_stats->cells_covered = total_cell_count;
@@ -1742,7 +1742,7 @@
 		stats_slot = STATISTIC_SLOT_ND;
 		stats_kind = STATISTIC_KIND_ND;
 	}
-
+	
 	/* Write the statistics data */
 	stats->stakind[stats_slot] = stats_kind;
 	stats->staop[stats_slot] = InvalidOid;
@@ -1792,7 +1792,7 @@
 	/* 2D Mode */
 	compute_gserialized_stats_mode(stats, fetchfunc, sample_rows, total_rows, 2);
 	/* ND Mode */
-	compute_gserialized_stats_mode(stats, fetchfunc, sample_rows, total_rows, 0);
+	compute_gserialized_stats_mode(stats, fetchfunc, sample_rows, total_rows, 0);	
 }
 
 
@@ -1863,7 +1863,7 @@
 static float8
 estimate_selectivity(const GBOX *box, const ND_STATS *nd_stats, int mode)
 {
-	int d; /* counter */
+	int d; /* counter */	
 	float8 selectivity;
 	ND_BOX nd_box;
 	ND_IBOX nd_ibox;
@@ -1872,8 +1872,8 @@
 	double min[ND_DIMS];
 	double max[ND_DIMS];
 	double total_count = 0.0;
-	int ndims_max = Max(nd_stats->ndims, gbox_ndims(box));
-//	int ndims_min = Min(nd_stats->ndims, gbox_ndims(box));
+	int ndims_max = Max(nd_stats->ndims, gbox_ndims(box));	
+//	int ndims_min = Min(nd_stats->ndims, gbox_ndims(box));	
 
 	/* Calculate the overlap of the box on the histogram */
 	if ( ! nd_stats )
@@ -1896,7 +1896,7 @@
 		POSTGIS_DEBUG(3, " in 2d mode, stripping the computation down to 2d");
 		ndims_max = 2;
 	}
-
+	
 	POSTGIS_DEBUGF(3, " nd_stats->extent: %s", nd_box_to_json(&(nd_stats->extent), nd_stats->ndims));
 	POSTGIS_DEBUGF(3, " nd_box: %s", nd_box_to_json(&(nd_box), gbox_ndims(box)));
 
@@ -1935,7 +1935,7 @@
 		max[d] = nd_stats->extent.max[d];
 		cell_size[d] = (max[d] - min[d]) / nd_stats->size[d];
 		POSTGIS_DEBUGF(3, " cell_size[%d] : %.9g", d, cell_size[d]);
-
+		
 		/* Initialize the counter */
 		at[d] = nd_ibox.min[d];
 	}
@@ -1945,7 +1945,7 @@
 	{
 		float cell_count, ratio;
 		ND_BOX nd_cell;
-
+		
 		/* We have to pro-rate partially overlapped cells. */
 		for ( d = 0; d < nd_stats->ndims; d++ )
 		{
@@ -1955,10 +1955,10 @@
 
 		ratio = nd_box_ratio(&nd_box, &nd_cell, nd_stats->ndims);
 		cell_count = nd_stats->value[nd_stats_value_index(nd_stats, at)];
-
+		
 		/* Add the pro-rated count for this cell to the overall total */
-		total_count += cell_count * ratio;
-		POSTGIS_DEBUGF(4, " cell (%d,%d), cell value %.6f, ratio %.6f", at[0], at[1], cell_count, ratio);
+		total_count += cell_count * ratio;	
+		POSTGIS_DEBUGF(4, " cell (%d,%d), cell value %.6f, ratio %.6f", at[0], at[1], cell_count, ratio);	
 	}
 	while ( nd_increment(&nd_ibox, nd_stats->ndims, at) );
 
@@ -2006,7 +2006,7 @@
 	nd_stats = pg_get_nd_stats_by_name(table_oid, att_text, mode, only_parent);
 	if ( ! nd_stats )
 		elog(ERROR, "stats for \"%s.%s\" do not exist", get_rel_name(table_oid), text2cstring(att_text));
-
+		
 	/* Convert to JSON */
 	str = nd_stats_to_json(nd_stats);
 	json = cstring2text(str);
@@ -2037,7 +2037,7 @@
 
 	/* Retrieve the stats object */
 	nd_stats = pg_get_nd_stats_by_name(table_oid, att_text, mode, FALSE);
-
+	
 	if ( ! nd_stats )
 		elog(ERROR, "stats for \"%s.%s\" do not exist", get_rel_name(table_oid), text2cstring(att_text));
 
@@ -2046,10 +2046,10 @@
 		elog(ERROR, "unable to calculate bounding box from geometry");
 
 	POSTGIS_DEBUGF(3, " %s", gbox_to_string(&gbox));
-
+	
 	/* Do the estimation */
 	selectivity = estimate_selectivity(&gbox, nd_stats, mode);
-
+	
 	pfree(nd_stats);
 	PG_RETURN_FLOAT8(selectivity);
 }
@@ -2087,12 +2087,12 @@
 		text *modetxt = PG_GETARG_TEXT_P(4);
 		char *modestr = text2cstring(modetxt);
 		if ( modestr[0] == 'N' )
-			mode = 0;
+			mode = 0;		
 	}
 
 	/* Do the estimation */
 	selectivity = estimate_join_selectivity(nd_stats1, nd_stats2);
-
+	
 	pfree(nd_stats1);
 	pfree(nd_stats2);
 	PG_RETURN_FLOAT8(selectivity);
@@ -2149,7 +2149,7 @@
 	List *args = (List *) PG_GETARG_POINTER(2);
 	/* int varRelid = PG_GETARG_INT32(3); */
 	int mode = PG_GETARG_INT32(4);
-
+	
 	VariableStatData vardata;
 	ND_STATS *nd_stats = NULL;
 
@@ -2157,7 +2157,7 @@
 	Var *self;
 	GBOX search_box;
 	float8 selectivity = 0;
-
+	
 	POSTGIS_DEBUG(2, "gserialized_gist_sel called");
 
 	/*
@@ -2168,7 +2168,7 @@
 	 * calculation should take account of the incoming operator
 	 * type and do the right thing.
 	 */
-
+	
 	/* Fail if not a binary opclause (probably shouldn't happen) */
 	if (list_length(args) != 2)
 	{
@@ -2282,7 +2282,7 @@
 
 	/* Estimated extent only returns 2D bounds, so use mode 2 */
 	nd_stats = pg_get_nd_stats_by_name(tbl_oid, col, 2, only_parent);
-
+	
 	/* Error out on no stats */
 	if ( ! nd_stats ) {
 		elog(WARNING, "stats for \"%s.%s\" do not exist", tbl, text2cstring(col));

Modified: trunk/postgis/postgis.sql.in
===================================================================
--- trunk/postgis/postgis.sql.in	2017-09-05 21:11:57 UTC (rev 15633)
+++ trunk/postgis/postgis.sql.in	2017-09-05 21:23:18 UTC (rev 15634)
@@ -2778,15 +2778,7 @@
 
 CREATE OR REPLACE FUNCTION _postgis_pgsql_version() RETURNS text
 AS $$
-	SELECT CASE
-		WHEN split_part(s,'.', 1)::integer > 9 THEN
-			split_part(s,'.', 1) || LPAD(
-				COALESCE(NULLIF(
-					split_part(s,'.', 2),
-				''), '0'), 2, '0')
-		ELSE
-			split_part(s,'.', 1) || split_part(s,'.', 2)
-	END AS v
+	SELECT CASE WHEN split_part(s,'.',1)::integer > 9 THEN split_part(s,'.',1) || '0' ELSE split_part(s,'.', 1) || split_part(s,'.', 2) END AS v
 	FROM substring(version(), 'PostgreSQL ([0-9\.]+)') AS s;
 $$ LANGUAGE 'sql' STABLE;
 



More information about the postgis-tickets mailing list