[postgis] 01/04: Imported Upstream version 2.3.2+dfsg

Bas Couwenberg sebastic at debian.org
Tue Jan 31 07:41:46 UTC 2017


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository postgis.

commit 049887b68c98af698b1a300c24c923d6ef764347
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Jan 31 08:18:50 2017 +0100

    Imported Upstream version 2.3.2+dfsg
---
 ChangeLog                                          |  79 ++++
 NEWS                                               |  36 +-
 README.postgis                                     |   7 +-
 Version.config                                     |   2 +-
 doc/release_notes.xml                              |  14 +
 extensions/address_standardizer/Makefile           |  10 +-
 .../address_standardizer.control                   |   2 +-
 .../address_standardizer_data_us.control           |   2 +-
 extensions/postgis/Makefile                        |   2 +-
 extensions/postgis/postgis.control                 |   2 +-
 extensions/postgis_sfcgal/Makefile                 |   2 +-
 extensions/postgis_sfcgal/postgis_sfcgal.control   |   2 +-
 extensions/postgis_tiger_geocoder/Makefile         |   2 +-
 .../postgis_tiger_geocoder.control                 |   2 +-
 extensions/postgis_topology/Makefile               |   2 +-
 .../postgis_topology/postgis_topology.control      |   2 +-
 extensions/upgradeable_versions.mk                 |   4 +-
 extras/tiger_geocoder/tiger_loader_2016.sql        |   2 +-
 liblwgeom/cunit/cu_print.c                         |   2 +
 liblwgeom/lwprint.c                                |  20 +-
 postgis/geography.sql.in                           |  89 +----
 postgis/geography_brin.sql.in                      | 104 ++++++
 postgis/gserialized_gist_2d.c                      |  30 +-
 postgis/postgis.sql.in                             | 406 +++------------------
 postgis/postgis_brin.sql.in                        | 336 +++++++++++++++++
 postgis/sqldefines.h                               |  10 +-
 postgis_svn_revision.h                             |   2 +-
 regress/knn_recheck.sql                            |  13 +
 regress/knn_recheck_expected                       |   2 +
 utils/postgis_proc_upgrade.pl                      |  11 +
 30 files changed, 702 insertions(+), 497 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6b4111d..32007c9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,82 @@
+2017-01-28 04:10  Regina Obe <lr at pcorp.us>
+
+	* [r15295] liblwgeom/lwprint.c: Fix for 32-bit lwprint to support
+	  ST_AsLatLonText
+	  References #3688 for PostGIS 2.3.2
+
+2017-01-25 23:42  Regina Obe <lr at pcorp.us>
+
+	* [r15293] extras/tiger_geocoder/tiger_loader_2016.sql: Turn off
+	  loading of tabblock by default. It's been broken since 2014
+	  References #3898 for PostGIS 2.3
+
+2017-01-22 07:44  Regina Obe <lr at pcorp.us>
+
+	* [r15291] postgis/geography.sql.in, postgis/geography_brin.sql.in,
+	  postgis/postgis.sql.in, postgis/postgis_brin.sql.in: Fix for
+	  pg_upgrade of pg < 9.5 + 2.3+, pg_upgrade and doing a postgis
+	  micro update to latest stable.
+	  closes #3683 for PostGIS 2.3
+
+2017-01-18 21:07  Sandro Santilli <strk at kbt.io>
+
+	* [r15289] NEWS, liblwgeom/cunit/cu_print.c, liblwgeom/lwprint.c:
+	  ST_AsLatLonText: round minutes [2.3 backport]
+	  
+	  Patch by Mike Toews, closes #3688
+
+2017-01-07 08:52  Regina Obe <lr at pcorp.us>
+
+	* [r15285] NEWS, postgis/gserialized_gist_2d.c,
+	  regress/knn_recheck.sql, regress/knn_recheck_expected: KNN
+	  recheck in 9.5+ fails with index returned tuples in wrong order
+	  references #3418 for PostGIS 2.3
+
+2017-01-06 10:31  Regina Obe <lr at pcorp.us>
+
+	* [r15282] NEWS: update news with latest 2 bug fixes
+
+2017-01-05 19:15  Regina Obe <lr at pcorp.us>
+
+	* [r15280] postgis/postgis.sql.in: Relationship functions not using
+	  an index in some cases
+	  Set cost back to 1 for functions that return a geometry
+	  A higher cost has the side-effect of making the planner
+	  think when used in conjunction with relate constructs like
+	  ST_Intersects
+	  it's cheaper to compute the geometry once rather
+	  than compute twice and break into an index and non-index call.
+	  References #3657 for PostGIS 2.3
+
+2016-12-20 03:22  Regina Obe <lr at pcorp.us>
+
+	* [r15278] utils/postgis_proc_upgrade.pl: PostGIS upgrade scripts
+	  missing GRANT for views
+	  references #3680 for PostGIS 2.3
+
+2016-12-03 22:32  Sandro Santilli <strk at kbt.io>
+
+	* [r15270] NEWS: Indent and style NEWS file
+
+2016-12-03 20:39  Regina Obe <lr at pcorp.us>
+
+	* [r15268] postgis/postgis.sql.in: Cost on ST_SetSRID is preventing
+	  index use with relation functions. Change from 10 to 1.
+	  References #3675 for PostGIS 2.3
+
+2016-11-28 15:10  Regina Obe <lr at pcorp.us>
+
+	* [r15265] HOWTO_RELEASE, Version.config,
+	  extensions/upgradeable_versions.mk: More minor corrections to
+	  HOW_TO_RELEASE, bump version to 2.3.2dev
+
+2016-11-28 14:49  Regina Obe <lr at pcorp.us>
+
+	* [r15263] ChangeLog, HOWTO_RELEASE, NEWS, README.postgis,
+	  Version.config, doc/release_notes.xml,
+	  extensions/upgradeable_versions.mk: More corrections to
+	  HOWTO_RELEASE, prepare for PostGIS 2.3.1 release
+
 2016-11-26 21:49  Regina Obe <lr at pcorp.us>
 
 	* [r15260] HOWTO_RELEASE: Add build badges, trunk vs. branch
diff --git a/NEWS b/NEWS
index cb5b969..bc20478 100644
--- a/NEWS
+++ b/NEWS
@@ -1,23 +1,35 @@
+PostGIS 2.3.2
+2017/01/31
+
+  * Bug Fixes
+
+  - #3418, KNN recheck in 9.5+ fails with index returned tuples in wrong order
+  - #3675, Relationship functions not using an index in some cases
+  - #3680, PostGIS upgrade scripts missing GRANT for views
+  - #3683, Unable to update postgis after postgres pg_upgrade going from < 9.5 to pg > 9.4
+  - #3688, ST_AsLatLonText: round minutes
+
 PostGIS 2.3.1
 2016/11/28
 
   * Bug Fixes
+
   - #1973, st_concavehull() returns sometimes empty geometry collection
-           Fix from gde
+           (gde)
   - #3501, add raster constraint max extent exceeds array size limit
-        for large tables
+           for large tables
   - #3643, PostGIS not building on latest OSX XCode
   - #3644, Deadlock on interrupt
-  - #3650, Mark ST_Extent, ST_3DExtent and ST_Mem* 
-        agg functions as parallel safe so they can be parallelized
+  - #3650, Mark ST_Extent, ST_3DExtent and ST_Mem*
+           agg functions as parallel safe so they can be parallelized
   - #3652, Crash on Collection(MultiCurve())
   - #3656, Fix upgrade of aggregates from 2.2 or lower version
   - #3659, Crash caused by raster GUC define after CREATE EXTENSION
-     using wrong memory context. (manaeem)
+           using wrong memory context. (manaeem)
   - #3665, Index corruption and memory leak in BRIN indexes
-    patch from Julien Rouhaud (Dalibo)
+           (Julien Rouhaud of Dalibo)
   - #3667, geography ST_Segmentize bug
-    patch from Hugo Mercier (Oslandia)
+           (Hugo Mercier of Oslandia)
 
 PostGIS 2.3.0
 2016/09/26
@@ -33,8 +45,6 @@ PostGIS 2.3.0
   - #3396, ST_EstimatedExtent, throw WARNING instead of ERROR
            (Regina Obe)
 
- * Deprecated signatures *
-
  * New Features *
 
   - Add support for custom TOC in postgis_restore.pl
@@ -76,7 +86,9 @@ PostGIS 2.3.0
            (Hugo Mercier of Oslandia)
 
  * Bug Fixes
- - #2841, ST_MinimumBoundingCircle not covering original
+
+  - #2841, ST_MinimumBoundingCircle not covering original
+
  * Performance Enhancements *
 
   - #75, Enhancement to PIP short circuit (Dan Baston)
@@ -86,10 +98,6 @@ PostGIS 2.3.0
   - Make adding a line to topology interruptible (Sandro Santilli)
   - Documentation updates from Mike Toews
 
-PostGIS 2.3.0beta1
-2016/09/06
-See PostGIS 2.3.0 section for details
-
 PostGIS 2.2.2
 2016/03/22
 
diff --git a/README.postgis b/README.postgis
index 287782d..7ffa9a8 100644
--- a/README.postgis
+++ b/README.postgis
@@ -1,8 +1,8 @@
 PostGIS - Geographic Information Systems Extensions to PostgreSQL
 =================================================================
 
-:Version: 2.3.1
-:Date: 2016-11-28
+:Version: 2.3.2
+:Date: 2017-01-30
 :Website: http://postgis.net
 
 This distribution contains a module which implements GIS simple features, ties
@@ -187,7 +187,8 @@ UPGRADING EXISTING SPATIAL DATABASES
 
 Upgrade PostGIS using the "ALTER EXTENSION" facility.
 
-  ALTER EXTENSION postgis UPDATE TO '2.2.0';
+  ALTER EXTENSION postgis UPDATE;
+  
   
 
 USAGE
diff --git a/Version.config b/Version.config
index 5fc9922..26c7df6 100644
--- a/Version.config
+++ b/Version.config
@@ -5,7 +5,7 @@
 
 POSTGIS_MAJOR_VERSION=2
 POSTGIS_MINOR_VERSION=3
-POSTGIS_MICRO_VERSION=1
+POSTGIS_MICRO_VERSION=2
 
 # Liblwgeom interface versioning, reset to 0:0:0 (cur:age:rev)
 # when changing POSTGIS_MINOR_VERSION
diff --git a/doc/release_notes.xml b/doc/release_notes.xml
index abaedc6..a4a231c 100644
--- a/doc/release_notes.xml
+++ b/doc/release_notes.xml
@@ -3,6 +3,20 @@
   <title>Appendix</title>
     <subtitle>Release Notes</subtitle>
     <sect1>
+      <title>Release 2.3.2</title>
+      <para>Release date: 2017/01/31</para>
+      <para>This is a bug fix and performance improvement release.</para>
+      <simplesect>
+        <title>Bug Fixes and Enhancements</title>
+          <para>#3418, KNN recheck in 9.5+ fails with index returned tuples in wrong order</para>
+          <para>#3675, Relationship functions not using an index in some cases</para>
+          <para>#3680, PostGIS upgrade scripts missing GRANT for views</para>
+          <para>#3683, Unable to update postgis after postgres pg_upgrade going from < 9.5 to pg > 9.4</para>
+          <para>#3688, ST_AsLatLonText: round minutes</para>
+      </simplesect>
+    </sect1>
+    
+    <sect1>
       <title>Release 2.3.1</title>
       <para>Release date: 2016/11/28</para>
       <para>This is a bug fix and performance improvement release.</para>
diff --git a/extensions/address_standardizer/Makefile b/extensions/address_standardizer/Makefile
index 026fcdf..20e1e0f 100644
--- a/extensions/address_standardizer/Makefile
+++ b/extensions/address_standardizer/Makefile
@@ -30,14 +30,14 @@ POSTGIS_PGSQL_VERSION=96
 SQLPP = /usr/bin/cpp -traditional-cpp -w -P
 GREP=/bin/grep
 PERL=/usr/bin/perl
-EXTVERSION    = 2.3.1
+EXTVERSION    = 2.3.2
 MINORVERSION  = 2.3
 MODULE_big = address_standardizer-2.3
 EXTENSION = address_standardizer
 DATA = address_standardizer_data_us.control sql/$(EXTENSION).sql sql/$(EXTENSION)_data_us.sql
 
 all:  sql/address_standardizer.sql sql/address_standardizer--1.0--$(EXTVERSION).sql sql/address_standardizer--$(EXTVERSION).sql sql/address_standardizer--$(EXTVERSION)--$(EXTVERSION)next.sql sql/address_standardizer--$(EXTVERSION)next--$(EXTVERSION).sql \
- sql/$(EXTENSION)_data_us.sql sql/address_standardizer--2.3.1.sql sql/$(EXTENSION)_data_us--2.3.1.sql  sql/$(EXTENSION)_data_us--$(EXTVERSION)--$(EXTVERSION)next.sql \
+ sql/$(EXTENSION)_data_us.sql sql/address_standardizer--2.3.2.sql sql/$(EXTENSION)_data_us--2.3.2.sql  sql/$(EXTENSION)_data_us--$(EXTVERSION)--$(EXTVERSION)next.sql \
 sql/$(EXTENSION)_data_us--$(EXTVERSION)next--$(EXTVERSION).sql \
 sql/test-init-extensions.sql sql/test-parseaddress.sql sql/test-standardize_address_1.sql sql/test-standardize_address_2.sql
 
@@ -46,9 +46,9 @@ EXTRA_CLEAN += sql/*.sql
 
 
 DOCS = README.address_standardizer
-PG_CPPFLAGS =  -I/var/lib/jenkins/workspace/geos/rel-3.6.1devw64/include  -I/usr/include/libxml2 -I/usr/include -DHAVE_SFCGAL   -I/var/lib/jenkins/workspace/pg/rel/pg9.6w64/pg9.6/include -g -O0
+PG_CPPFLAGS =  -I/var/lib/jenkins/workspace/geos/rel-3.7.0devw64/include  -I/usr/include/libxml2 -I/usr/include -DHAVE_SFCGAL   -I/var/lib/jenkins/workspace/pg/rel/pg9.6w64/pg9.6/include -g -O0
 
-SHLIB_LINK =  -L/var/lib/jenkins/workspace/geos/rel-3.6.1devw64/lib  -lgeos_c -lproj  -ljson-c -lxml2 -L/usr/lib/x86_64-linux-gnu -lSFCGAL  -Wl,--exclude-libs,ALL -lpcre
+SHLIB_LINK =  -L/var/lib/jenkins/workspace/geos/rel-3.7.0devw64/lib  -lgeos_c -lproj  -ljson-c -lxml2 -L/usr/lib/x86_64-linux-gnu -lSFCGAL  -Wl,--exclude-libs,ALL -lpcre
 EXTRA_CLEAN = usps-st-city-name.txt mk-st-regexp mk-city-regex test_main
 REGRESS = test-init-extensions test-parseaddress test-standardize_address_1 test-standardize_address_2
 
@@ -68,7 +68,7 @@ sql/%.sql: %.sql.in
 	$(SQLPP) -I../libpgcommon $< | grep -v '^#' | \
 	$(PERL) -lpe "s'MODULE_PATHNAME'\$$libdir/${EXTENSION}-${MINORVERSION}'g" > $@
 	
-sql/address_standardizer--2.3.1.sql: sql/address_standardizer_types.sql \
+sql/address_standardizer--2.3.2.sql: sql/address_standardizer_types.sql \
     sql/address_standardizer_functions.sql
 	cat $^ > $@
 	
diff --git a/extensions/address_standardizer/address_standardizer.control b/extensions/address_standardizer/address_standardizer.control
index 6a5a76c..011a6fa 100644
--- a/extensions/address_standardizer/address_standardizer.control
+++ b/extensions/address_standardizer/address_standardizer.control
@@ -1,4 +1,4 @@
 # address_standardizer extension
 comment = 'Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.'
-default_version = '2.3.1'
+default_version = '2.3.2'
 relocatable = true
diff --git a/extensions/address_standardizer/address_standardizer_data_us.control b/extensions/address_standardizer/address_standardizer_data_us.control
index 6c5c17a..65e5218 100644
--- a/extensions/address_standardizer/address_standardizer_data_us.control
+++ b/extensions/address_standardizer/address_standardizer_data_us.control
@@ -1,4 +1,4 @@
 # address standardizer us dataset
 comment = 'Address Standardizer US dataset example'
-default_version = '2.3.1'
+default_version = '2.3.2'
 relocatable = true
diff --git a/extensions/postgis/Makefile b/extensions/postgis/Makefile
index 0dd31f1..69e6848 100644
--- a/extensions/postgis/Makefile
+++ b/extensions/postgis/Makefile
@@ -1,7 +1,7 @@
 include ../upgradeable_versions.mk
 
 EXTENSION     = postgis
-EXTVERSION    = 2.3.1
+EXTVERSION    = 2.3.2
 MINORVERSION  = 2.3
 GREP = /bin/grep
 PERL = /usr/bin/perl
diff --git a/extensions/postgis/postgis.control b/extensions/postgis/postgis.control
index f15c2f3..5156b26 100644
--- a/extensions/postgis/postgis.control
+++ b/extensions/postgis/postgis.control
@@ -1,5 +1,5 @@
 # postgis extension
 comment = 'PostGIS geometry, geography, and raster spatial types and functions'
-default_version = '2.3.1'
+default_version = '2.3.2'
 module_pathname = '$libdir/postgis-2.3'
 relocatable = false
diff --git a/extensions/postgis_sfcgal/Makefile b/extensions/postgis_sfcgal/Makefile
index de04b48..3a9c146 100644
--- a/extensions/postgis_sfcgal/Makefile
+++ b/extensions/postgis_sfcgal/Makefile
@@ -1,7 +1,7 @@
 include ../upgradeable_versions.mk
 
 EXTENSION    = postgis_sfcgal
-EXTVERSION    = 2.3.1
+EXTVERSION    = 2.3.2
 MINORVERSION  = 2.3
 GREP = /bin/grep
 PERL = /usr/bin/perl
diff --git a/extensions/postgis_sfcgal/postgis_sfcgal.control b/extensions/postgis_sfcgal/postgis_sfcgal.control
index 23dd8e0..ae39248 100644
--- a/extensions/postgis_sfcgal/postgis_sfcgal.control
+++ b/extensions/postgis_sfcgal/postgis_sfcgal.control
@@ -1,5 +1,5 @@
 # postgis topology extension
 comment = 'PostGIS SFCGAL functions'
-default_version = '2.3.1'
+default_version = '2.3.2'
 relocatable = true
 requires = postgis
diff --git a/extensions/postgis_tiger_geocoder/Makefile b/extensions/postgis_tiger_geocoder/Makefile
index ab65cf4..c5b4813 100644
--- a/extensions/postgis_tiger_geocoder/Makefile
+++ b/extensions/postgis_tiger_geocoder/Makefile
@@ -1,7 +1,7 @@
 include ../upgradeable_versions.mk
 
 EXTENSION    = postgis_tiger_geocoder
-EXTVERSION    = 2.3.1
+EXTVERSION    = 2.3.2
 MINORVERSION  = 2011.2.3
 GREP = /bin/grep
 PERL = /usr/bin/perl
diff --git a/extensions/postgis_tiger_geocoder/postgis_tiger_geocoder.control b/extensions/postgis_tiger_geocoder/postgis_tiger_geocoder.control
index 15da133..45bbc5b 100644
--- a/extensions/postgis_tiger_geocoder/postgis_tiger_geocoder.control
+++ b/extensions/postgis_tiger_geocoder/postgis_tiger_geocoder.control
@@ -1,6 +1,6 @@
 # postgis tiger geocoder extension
 comment = 'PostGIS tiger geocoder and reverse geocoder'
-default_version = '2.3.1'
+default_version = '2.3.2'
 relocatable = false
 schema = tiger
 requires = 'postgis,fuzzystrmatch'
diff --git a/extensions/postgis_topology/Makefile b/extensions/postgis_topology/Makefile
index 5e99b96..84e2267 100644
--- a/extensions/postgis_topology/Makefile
+++ b/extensions/postgis_topology/Makefile
@@ -1,7 +1,7 @@
 include ../upgradeable_versions.mk
 
 EXTENSION     = postgis_topology
-EXTVERSION    = 2.3.1
+EXTVERSION    = 2.3.2
 MINORVERSION  = 2.3
 GREP = /bin/grep
 PERL = /usr/bin/perl
diff --git a/extensions/postgis_topology/postgis_topology.control b/extensions/postgis_topology/postgis_topology.control
index 04039a2..be7b734 100644
--- a/extensions/postgis_topology/postgis_topology.control
+++ b/extensions/postgis_topology/postgis_topology.control
@@ -1,6 +1,6 @@
 # postgis topology extension
 comment = 'PostGIS topology spatial types and functions'
-default_version = '2.3.1'
+default_version = '2.3.2'
 relocatable = false
 schema = topology
 requires = postgis
diff --git a/extensions/upgradeable_versions.mk b/extensions/upgradeable_versions.mk
index 625b277..751ae95 100644
--- a/extensions/upgradeable_versions.mk
+++ b/extensions/upgradeable_versions.mk
@@ -22,7 +22,9 @@ UPGRADEABLE_VERSIONS = \
 	2.2.2 \
 	2.2.3 \
 	2.2.4 \
-	2.3.0
+	2.2.5 \
+	2.3.0 \
+	2.3.1
 
 # This is to avoid forcing "check-installed-upgrades" as a default
 # rule, see https://trac.osgeo.org/postgis/ticket/3420
diff --git a/extras/tiger_geocoder/tiger_loader_2016.sql b/extras/tiger_geocoder/tiger_loader_2016.sql
index 08bf8c4..7418e3a 100644
--- a/extras/tiger_geocoder/tiger_loader_2016.sql
+++ b/extras/tiger_geocoder/tiger_loader_2016.sql
@@ -263,7 +263,7 @@ VALUES(10, 'tract', 'tract', true, false, true,false, 'c',
 	${psql} -c "ALTER TABLE ${data_schema}.${state_abbrev}_${lookup_name} ADD CONSTRAINT chk_statefp CHECK (statefp = ''${state_fips}'');"', ARRAY['gid']);
 
 INSERT INTO loader_lookuptables(process_order, lookup_name, table_name, load, level_county, level_state, single_geom_mode, insert_mode, pre_load_process, post_load_process, columns_exclude )
-VALUES(11, 'tabblock', 'tabblock', true, false, true,false, 'c',
+VALUES(11, 'tabblock', 'tabblock', false, false, true,false, 'c',
 '${psql} -c "CREATE TABLE ${data_schema}.${state_abbrev}_${lookup_name}(CONSTRAINT pk_${state_abbrev}_${lookup_name} PRIMARY KEY (tabblock_id)) INHERITS(tiger.${lookup_name});" ',
 '${psql} -c "ALTER TABLE ${staging_schema}.${state_abbrev}_${lookup_name} RENAME geoid10 TO tabblock_id;"
 ${psql} -c "ALTER TABLE ${data_schema}.${state_abbrev}_${lookup_name} ADD CONSTRAINT chk_statefp CHECK (statefp = ''${state_fips}'');"
diff --git a/liblwgeom/cunit/cu_print.c b/liblwgeom/cunit/cu_print.c
index 782aa99..319e39a 100644
--- a/liblwgeom/cunit/cu_print.c
+++ b/liblwgeom/cunit/cu_print.c
@@ -80,6 +80,8 @@ static void test_lwprint_default_format(void)
 	test_lwprint_assert_format("POINT(-181 -91)",           ""  , "89\xC2\xB0""0'0.000\"S 1\xC2\xB0""0'0.000\"W");
 	test_lwprint_assert_format("POINT(-180.0001 -90.0001)", NULL, "89\xC2\xB0""59'59.640\"S 0\xC2\xB0""0'0.360\"W");
 	test_lwprint_assert_format("POINT(-2348982391.123456 -238749827.34879)", ""  , "12\xC2\xB0""39'4.356\"N 31\xC2\xB0""7'24.442\"W");
+	/* See https://trac.osgeo.org/postgis/ticket/3688 */
+	test_lwprint_assert_format("POINT (76.6 -76.6)",        NULL, "76\xC2\xB0""36'0.000\"S 76\xC2\xB0""36'0.000\"E");
 }
 
 /*
diff --git a/liblwgeom/lwprint.c b/liblwgeom/lwprint.c
index 7265d7a..6557ec0 100644
--- a/liblwgeom/lwprint.c
+++ b/liblwgeom/lwprint.c
@@ -26,6 +26,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <math.h>
 #include "liblwgeom_internal.h"
 
 /* Ensures the given lat and lon are in the "normal" range:
@@ -105,6 +106,8 @@ static char * lwdouble_to_dms(double val, const char *pos_dir_symbol, const char
 	int sec_dec_digits = 0;
 	int sec_piece = -1;
 
+	int round_pow = 0;
+
 	int format_length = ((NULL == format) ? 0 : strlen(format));
 
 	char * result;
@@ -312,8 +315,8 @@ static char * lwdouble_to_dms(double val, const char *pos_dir_symbol, const char
 	degrees = val;
 	if (min_digits > 0)
 	{
-		degrees = (long)degrees;
-		minutes = (val - degrees) * 60;
+		/* Break degrees to integer and use fraction for minutes */
+		minutes = modf(val, &degrees) * 60;
 	}
 	if (sec_digits > 0)
 	{
@@ -321,8 +324,17 @@ static char * lwdouble_to_dms(double val, const char *pos_dir_symbol, const char
 		{
 			lwerror("Bad format, cannot include seconds (SS.SSS) without including minutes (MM.MMM).");
 		}
-		minutes = (long)minutes;
-		seconds = (val - (degrees + (minutes / 60))) * 3600;
+		seconds = modf(minutes, &minutes) * 60;
+		if (sec_piece >= 0)
+		{
+			/* See if the formatted seconds round up to 60. If so, increment minutes and reset seconds. */
+			round_pow = pow(10, sec_dec_digits);
+			if (floorf(seconds * round_pow) / round_pow >= 60)
+			{
+				minutes += 1;
+				seconds = 0;
+			}
+		}
 	}
 
 	/* Handle the compass direction.  If not using compass dir, display degrees as a positive/negative number. */
diff --git a/postgis/geography.sql.in b/postgis/geography.sql.in
index 9caf40d..36a2155 100644
--- a/postgis/geography.sql.in
+++ b/postgis/geography.sql.in
@@ -286,93 +286,8 @@ CREATE OPERATOR CLASS gist_geography_ops
 	FUNCTION        6        geography_gist_picksplit (internal, internal),
 	FUNCTION        7        geography_gist_same (box2d, box2d, internal);
 
-#if POSTGIS_PGSQL_VERSION > 94
---------------------------------------------------------------------
--- BRIN support for geographies                                   --
---------------------------------------------------------------------
-
---------------------------------
--- the needed cross-operators --
---------------------------------
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_geog(gidx, geography)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_gidx_geog_overlaps'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_geog(gidx, gidx)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_gidx_gidx_overlaps'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OPERATOR && (
-  LEFTARG    = gidx,
-  RIGHTARG   = geography,
-  PROCEDURE  = overlaps_geog,
-  COMMUTATOR = &&
-);
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_geog(geography, gidx)
-RETURNS boolean
-AS $$
-  SELECT $2 OPERATOR(@extschema at .&&) $1;
-$$ LANGUAGE SQL IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OPERATOR && (
-  LEFTARG    = geography,
-  RIGHTARG   = gidx,
-  PROCEDURE  = overlaps_geog,
-  COMMUTATOR = &&
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR && (
-  LEFTARG   = gidx,
-  RIGHTARG  = gidx,
-  PROCEDURE = overlaps_geog,
-  COMMUTATOR = &&
-);
-
---------------------------------
--- the OpFamily               --
---------------------------------
-
--- Availability: 2.3.0
-CREATE OPERATOR FAMILY brin_geography_inclusion_ops USING brin;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION geog_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
-        AS 'MODULE_PATHNAME','geog_brin_inclusion_add_value'
-        LANGUAGE 'c';
-
--- Availability: 2.3.0
-CREATE OPERATOR CLASS brin_geography_inclusion_ops
-  DEFAULT FOR TYPE geography
-  USING brin
-  FAMILY brin_geography_inclusion_ops AS
-    OPERATOR      3        &&(geography, geography),
-    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
-    FUNCTION      2        geog_brin_inclusion_add_value(internal, internal, internal, internal) ,
-    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
-    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
-  STORAGE gidx;
-
-ALTER OPERATOR FAMILY brin_geography_inclusion_ops USING brin ADD
-    OPERATOR      3         &&(gidx, geography),
-
-    OPERATOR      3         &&(geography, gidx),
-
-    OPERATOR      3         &&(gidx, gidx);
-
----------------------------------------------------------------
--- END
----------------------------------------------------------------
-#endif
+-- moved to separate file cause its invovled
+#include "geography_brin.sql.in"
 
 -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 -- B-Tree Functions
diff --git a/postgis/geography_brin.sql.in b/postgis/geography_brin.sql.in
new file mode 100644
index 0000000..d6503d8
--- /dev/null
+++ b/postgis/geography_brin.sql.in
@@ -0,0 +1,104 @@
+#if POSTGIS_PGSQL_VERSION > 94
+--------------------------------------------------------------------
+-- BRIN support for geographies                                   --
+--------------------------------------------------------------------
+
+--------------------------------
+-- the needed cross-operators --
+--------------------------------
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_geog(gidx, geography)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_gidx_geog_overlaps'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_geog(gidx, gidx)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_gidx_gidx_overlaps'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+
+-- logic to create missing brin operators
+-- note we can't use CREATE IF NOT EXISTS since not currently supported for operators or families
+-- an earlier 2.3+ might miss this if doing upgrade from < 9.5 to 9.5+
+-- so we need to include this always for 9.5+
+-- Intentionally not indenting DDL cause our uninstall process can't pick it up
+-- also not dollar quoting functions inside DO since gets tripped up by perl upgrade script parser
+DO  language 'plpgsql' $$
+BEGIN
+	-- add geography brin ops if missing and are running a newer than 9.4 --
+	-- use wildcard since if schema postgis is installed is not in search path, will have schema name in front
+	IF NOT EXISTS(SELECT 1 from pg_operator WHERE oprname = '&&' AND 
+		oprleft::regtype::text LIKE '%gidx' AND oprright::regtype::text LIKE '%geography' ) THEN
+-- Availability: 2.3.0
+CREATE OPERATOR && (
+  LEFTARG    = gidx,
+  RIGHTARG   = geography,
+  PROCEDURE  = overlaps_geog,
+  COMMUTATOR = &&
+);
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_geog(geography, gidx)
+RETURNS boolean
+AS 
+  'SELECT $2 OPERATOR(@extschema at .&&) $1;'
+ LANGUAGE SQL IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OPERATOR && (
+  LEFTARG    = geography,
+  RIGHTARG   = gidx,
+  PROCEDURE  = overlaps_geog,
+  COMMUTATOR = &&
+);
+
+-- Availability: 2.3.0
+CREATE OPERATOR && (
+  LEFTARG   = gidx,
+  RIGHTARG  = gidx,
+  PROCEDURE = overlaps_geog,
+  COMMUTATOR = &&
+);
+
+--------------------------------
+-- the OpFamily               --
+--------------------------------
+
+-- Availability: 2.3.0
+CREATE OPERATOR FAMILY brin_geography_inclusion_ops USING brin;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION geog_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
+        AS 'MODULE_PATHNAME','geog_brin_inclusion_add_value'
+        LANGUAGE 'c';
+
+-- Availability: 2.3.0
+CREATE OPERATOR CLASS brin_geography_inclusion_ops
+  DEFAULT FOR TYPE geography
+  USING brin
+  FAMILY brin_geography_inclusion_ops AS
+    OPERATOR      3        &&(geography, geography),
+    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
+    FUNCTION      2        geog_brin_inclusion_add_value(internal, internal, internal, internal) ,
+    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
+    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
+  STORAGE gidx;
+
+ALTER OPERATOR FAMILY brin_geography_inclusion_ops USING brin ADD
+    OPERATOR      3         &&(gidx, geography),
+
+    OPERATOR      3         &&(geography, gidx),
+
+    OPERATOR      3         &&(gidx, gidx);
+
+    END IF;
+  
+END;
+$$;
+---------------------------------------------------------------
+-- END
+---------------------------------------------------------------
+#endif
\ No newline at end of file
diff --git a/postgis/gserialized_gist_2d.c b/postgis/gserialized_gist_2d.c
index 6c38249..d83bfc8 100644
--- a/postgis/gserialized_gist_2d.c
+++ b/postgis/gserialized_gist_2d.c
@@ -396,7 +396,6 @@ static bool box2df_overabove(const BOX2DF *a, const BOX2DF *b)
 
 /**
 * Calculate the centroid->centroid distance between the boxes.
-* We return the square distance to avoid a call to sqrt.
 */
 static double box2df_distance_leaf_centroid(const BOX2DF *a, const BOX2DF *b)
 {
@@ -407,7 +406,6 @@ static double box2df_distance_leaf_centroid(const BOX2DF *a, const BOX2DF *b)
     double b_y = (b->ymax + b->ymin) / 2.0;
 
     /* This "distance" is only used for comparisons, */
-    /* so for speed we drop contants and skip the sqrt step. */
     return sqrt((a_x - b_x) * (a_x - b_x) + (a_y - b_y) * (a_y - b_y));
 }
 
@@ -499,27 +497,27 @@ static inline double pt_distance(double ax, double ay, double bx, double by)
 */
 static double box2df_distance(const BOX2DF *a, const BOX2DF *b)
 {
-    /* Check for overlap */
-    if ( box2df_overlaps(a, b) )
-        return 0.0;
+	/* Check for overlap */
+	if ( box2df_overlaps(a, b) )
+		return 0.0;
 
-    if ( box2df_left(a, b) )
-    {
-        if ( box2df_above(a, b) )
+	if ( box2df_left(a, b) )
+	{
+		if ( box2df_above(a, b) )
 			return pt_distance(a->xmax, a->ymin, b->xmin, b->ymax);
 		if ( box2df_below(a, b) )
 			return pt_distance(a->xmax, a->ymax, b->xmin, b->ymin);
 		else
-			return b->xmin - a->xmax;
+			return (double)b->xmin - (double)a->xmax;
 	}
 	if ( box2df_right(a, b) )
 	{
-        if ( box2df_above(a, b) )
+		if ( box2df_above(a, b) )
 			return pt_distance(a->xmin, a->ymin, b->xmax, b->ymax);
 		if ( box2df_below(a, b) )
 			return pt_distance(a->xmin, a->ymax, b->xmax, b->ymin);
 		else
-			return a->xmin - b->xmax;
+			return (double)a->xmin - (double)b->xmax;
 	}
 	if ( box2df_above(a, b) )
 	{
@@ -528,7 +526,7 @@ static double box2df_distance(const BOX2DF *a, const BOX2DF *b)
 		if ( box2df_right(a, b) )
 			return pt_distance(a->xmin, a->ymin, b->xmax, b->ymax);
 		else
-			return a->ymin - b->ymax;
+			return (double)a->ymin - (double)b->ymax;
 	}
 	if ( box2df_below(a, b) )
 	{
@@ -537,9 +535,9 @@ static double box2df_distance(const BOX2DF *a, const BOX2DF *b)
 		if ( box2df_right(a, b) )
 			return pt_distance(a->xmin, a->ymax, b->xmax, b->ymin);
 		else
-			return b->ymin - a->ymax;
+			return (double)b->ymin - (double)a->ymax;
 	}
-	
+
 	return FLT_MAX;
 }
 
@@ -1202,7 +1200,7 @@ Datum gserialized_gist_distance_2d(PG_FUNCTION_ARGS)
 	/* Box-style distance test */
 	if ( strategy == 14 ) /* operator <#> */
 	{
-		distance = (double)box2df_distance(entry_box, &query_box);
+		distance = box2df_distance(entry_box, &query_box);
 	}
 	/* True distance test (formerly centroid distance) */
 	else if ( strategy == 13 ) /* operator <-> */
@@ -1210,7 +1208,7 @@ Datum gserialized_gist_distance_2d(PG_FUNCTION_ARGS)
 		/* In all cases, since we only have keys (boxes) we'll return */
 		/* the minimum possible distance, which is the box2df_distance */
 		/* and let the recheck sort things out in the case of leaves */
-		distance = (double)box2df_distance(entry_box, &query_box);
+		distance = box2df_distance(entry_box, &query_box);
 
 		if (GIST_LEAF(entry))
 			*recheck = true;
diff --git a/postgis/postgis.sql.in b/postgis/postgis.sql.in
index 3df912e..61114ff 100644
--- a/postgis/postgis.sql.in
+++ b/postgis/postgis.sql.in
@@ -1291,7 +1291,7 @@ CREATE OR REPLACE FUNCTION ST_Force2D(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_2d'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 5;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 -- Deprecation in 2.1.0
@@ -1307,7 +1307,7 @@ CREATE OR REPLACE FUNCTION ST_Force3DZ(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_3dz'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 -- Deprecation in 2.1.0
@@ -1323,7 +1323,7 @@ CREATE OR REPLACE FUNCTION ST_Force3D(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_3dz'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 -- Deprecation in 2.1.0
@@ -1339,7 +1339,7 @@ CREATE OR REPLACE FUNCTION ST_Force3DM(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_3dm'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 -- Deprecation in 2.1.0
@@ -1355,7 +1355,7 @@ CREATE OR REPLACE FUNCTION ST_Force4D(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_4d'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 -- Deprecation in 2.1.0
@@ -1371,7 +1371,7 @@ CREATE OR REPLACE FUNCTION ST_ForceCollection(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_collection'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 10;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 -- Deprecation in 2.1.0
@@ -1399,7 +1399,7 @@ CREATE OR REPLACE FUNCTION ST_Multi(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_multi'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 10;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.2.0
 CREATE OR REPLACE FUNCTION ST_ForceCurve(geometry)
@@ -1418,42 +1418,42 @@ CREATE OR REPLACE FUNCTION ST_ForceSFS(geometry, version text)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_sfs'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 10;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 CREATE OR REPLACE FUNCTION ST_Expand(box3d,float8)
 	RETURNS box3d
 	AS 'MODULE_PATHNAME', 'BOX3D_expand'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.3.0
 CREATE OR REPLACE FUNCTION ST_Expand(box box3d, dx float8, dy float8, dz float8 DEFAULT 0)
 	RETURNS box3d
 	AS 'MODULE_PATHNAME', 'BOX3D_expand'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 CREATE OR REPLACE FUNCTION ST_Expand(geometry,float8)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_expand'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.3.0
 CREATE OR REPLACE FUNCTION ST_Expand(geom geometry, dx float8, dy float8, dz float8 DEFAULT 0, dm float8 DEFAULT 0)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_expand'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- PostGIS equivalent function: envelope(geometry)
 CREATE OR REPLACE FUNCTION ST_Envelope(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_envelope'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.2.0
 CREATE OR REPLACE FUNCTION ST_BoundingDiagonal(geom geometry, fits boolean DEFAULT false)
@@ -1466,14 +1466,14 @@ CREATE OR REPLACE FUNCTION ST_Reverse(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_reverse'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 10;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 CREATE OR REPLACE FUNCTION ST_ForceRHR(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_force_clockwise_poly'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 15;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.5.0
 CREATE OR REPLACE FUNCTION postgis_noop(geometry)
@@ -1487,7 +1487,7 @@ CREATE OR REPLACE FUNCTION ST_Normalize(geom geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'ST_Normalize'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 20; -- 20 as it delegates to GEOS
+	COST 1; -- reset cost, see #3675
 
 -- Deprecation in 1.5.0
 CREATE OR REPLACE FUNCTION ST_zmflag(geometry)
@@ -1692,14 +1692,14 @@ CREATE OR REPLACE FUNCTION ST_BuildArea(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'ST_BuildArea'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.4.0
 CREATE OR REPLACE FUNCTION ST_Polygonize (geometry[])
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'polygonize_garray'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.2
 CREATE OR REPLACE FUNCTION ST_ClusterIntersecting(geometry[])
@@ -1724,7 +1724,7 @@ CREATE OR REPLACE FUNCTION ST_LineMerge(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'linemerge'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 -----------------------------------------------------------------------------
 -- Affine transforms
@@ -1735,7 +1735,7 @@ CREATE OR REPLACE FUNCTION ST_Affine(geometry,float8,float8,float8,float8,float8
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_affine'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 CREATE OR REPLACE FUNCTION ST_Affine(geometry,float8,float8,float8,float8,float8,float8)
@@ -2746,7 +2746,7 @@ CREATE OR REPLACE FUNCTION ST_SetSRID(geometry,int4)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME','LWGEOM_set_srid'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 10;
+	COST 1;
 
 CREATE OR REPLACE FUNCTION ST_SRID(geometry)
 	RETURNS int4
@@ -2764,7 +2764,7 @@ CREATE OR REPLACE FUNCTION ST_Transform(geometry,integer)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME','transform'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.3.0
 CREATE OR REPLACE FUNCTION ST_Transform(geom geometry, to_proj text)
@@ -3095,28 +3095,28 @@ CREATE OR REPLACE FUNCTION ST_Simplify(geometry, float8)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_simplify2d'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 50;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.2.0
 CREATE OR REPLACE FUNCTION ST_Simplify(geometry, float8, boolean)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_simplify2d'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 50; -- COST guessed from ST_Simplify(geometry, float8)
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.2.0
 CREATE OR REPLACE FUNCTION ST_SimplifyVW(geometry,  float8)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_SetEffectiveArea'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 50; -- COST guessed from ST_Simplify(geometry, float8)
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 2.2.0
 CREATE OR REPLACE FUNCTION ST_SetEffectiveArea(geometry,  float8 default -1, integer default 1)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_SetEffectiveArea'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 50; -- COST guessed from ST_Simplify(geometry, float8)
+	COST 1; -- reset cost, see #3675
 
 -- ST_SnapToGrid(input, xoff, yoff, xsize, ysize)
 -- Availability: 1.2.2
@@ -3124,7 +3124,7 @@ CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8, float8, float8, float
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_snaptogrid'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- ST_SnapToGrid(input, xsize, ysize) # offsets=0
 -- Availability: 1.2.2
@@ -3132,7 +3132,7 @@ CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8, float8)
 	RETURNS geometry
 	AS 'SELECT @extschema at .ST_SnapToGrid($1, 0, 0, $2, $3)'
 	LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 -- ST_SnapToGrid(input, size) # xsize=ysize=size, offsets=0
 -- Availability: 1.2.2
@@ -3147,14 +3147,14 @@ CREATE OR REPLACE FUNCTION ST_SnapToGrid(geom1 geometry, geom2 geometry, float8,
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_snaptogrid_pointoff'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25; -- COST from ST_SnapToGrid(input, xoff, yoff, xsize, ysize)
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 CREATE OR REPLACE FUNCTION ST_Segmentize(geometry, float8)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_segmentize2d'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 ---------------------------------------------------------------
 -- LRS
@@ -3264,21 +3264,21 @@ CREATE OR REPLACE FUNCTION ST_Intersection(geom1 geometry, geom2 geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME','intersection'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 100; -- Guessed cost
+	COST 1; -- reset cost, see #3675
 
 -- PostGIS equivalent function: buffer(geometry,float8)
 CREATE OR REPLACE FUNCTION ST_Buffer(geometry,float8)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME','buffer'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 5000;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.5.0 - requires GEOS-3.2 or higher
 CREATE OR REPLACE FUNCTION _ST_Buffer(geometry,float8,cstring)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME','buffer'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 5000;
+	COST 1; -- reset cost, see #3675
 
 -- Availability: 1.2.2
 CREATE OR REPLACE FUNCTION ST_Buffer(geometry,float8,integer)
@@ -3314,21 +3314,21 @@ CREATE OR REPLACE FUNCTION ST_OffsetCurve(line geometry, distance float8, params
        RETURNS geometry
        AS 'MODULE_PATHNAME','ST_OffsetCurve'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 100; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 -- Availability: 2.3.0
 CREATE OR REPLACE FUNCTION ST_GeneratePoints(area geometry, npoints numeric)
        RETURNS geometry
        AS 'MODULE_PATHNAME','ST_GeneratePoints'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 400; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 -- PostGIS equivalent function: convexhull(geometry)
 CREATE OR REPLACE FUNCTION ST_ConvexHull(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME','convexhull'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 250;
+	COST 1; -- reset cost, see #3675
 
 -- Only accepts LINESTRING as parameters.
 -- Availability: 1.4.0
@@ -3350,7 +3350,7 @@ CREATE OR REPLACE FUNCTION ST_SimplifyPreserveTopology(geometry, float8)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME','topologypreservesimplify'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 2000;
+	COST 1; -- reset cost, see #3675
 
 -- Requires GEOS >= 3.1.0
 -- Availability: 1.4.0
@@ -3474,7 +3474,7 @@ CREATE OR REPLACE FUNCTION ST_RemoveRepeatedPoints(geom geometry, tolerance floa
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_RemoveRepeatedPoints'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 25;
+       COST 1; -- reset cost, see #3675
 
 -- Requires GEOS >= 3.5.0
 -- Availability: 2.2.0
@@ -3510,7 +3510,7 @@ CREATE OR REPLACE FUNCTION ST_MakeValid(geometry)
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_MakeValid'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 1000;
+       COST 1; -- reset cost, see #3675
 
 -- ST_CleanGeometry(in geometry)
 --
@@ -3531,7 +3531,7 @@ CREATE OR REPLACE FUNCTION ST_CleanGeometry(geometry)
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_CleanGeometry'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 1000;
+       COST 1; -- reset cost, see #3675
 
 --------------------------------------------------------------------------------
 -- ST_Split
@@ -3551,7 +3551,7 @@ CREATE OR REPLACE FUNCTION ST_Split(geom1 geometry, geom2 geometry)
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_Split'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 100; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 --------------------------------------------------------------------------------
 -- ST_SharedPaths
@@ -3574,7 +3574,7 @@ CREATE OR REPLACE FUNCTION ST_SharedPaths(geom1 geometry, geom2 geometry)
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_SharedPaths'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 100; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 --------------------------------------------------------------------------------
 -- ST_Snap
@@ -3591,7 +3591,7 @@ CREATE OR REPLACE FUNCTION ST_Snap(geom1 geometry, geom2 geometry, float8)
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_Snap'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 100; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 --------------------------------------------------------------------------------
 -- ST_RelateMatch
@@ -3627,7 +3627,7 @@ CREATE OR REPLACE FUNCTION ST_Node(g geometry)
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_Node'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 100; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 --------------------------------------------------------------------------------
 -- ST_DelaunayTriangles
@@ -3651,7 +3651,7 @@ CREATE OR REPLACE FUNCTION ST_DelaunayTriangles(g1 geometry, tolerance float8 DE
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_DelaunayTriangles'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-       COST 25000;
+       COST 1; -- reset cost, see #3675
 
 
 --------------------------------------------------------------------------------
@@ -3683,20 +3683,20 @@ CREATE OR REPLACE FUNCTION _ST_Voronoi(g1 geometry, clip geometry DEFAULT NULL,
        RETURNS geometry
        AS 'MODULE_PATHNAME', 'ST_Voronoi'
        LANGUAGE 'c' IMMUTABLE _PARALLEL
-       COST 25000; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 
 CREATE OR REPLACE FUNCTION ST_VoronoiPolygons(g1 geometry, tolerance float8 DEFAULT 0.0, extend_to geometry DEFAULT NULL)
        RETURNS geometry
        AS $$ SELECT @extschema at ._ST_Voronoi(g1, extend_to, tolerance, true) $$
        LANGUAGE SQL IMMUTABLE _PARALLEL
-       COST 25000; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 CREATE OR REPLACE FUNCTION ST_VoronoiLines(g1 geometry, tolerance float8 DEFAULT 0.0, extend_to geometry DEFAULT NULL)
        RETURNS geometry
        AS $$ SELECT @extschema at ._ST_Voronoi(g1, extend_to, tolerance, false) $$
        LANGUAGE SQL IMMUTABLE _PARALLEL
-       COST 25000; -- Guessed cost
+       COST 1; -- reset cost, see #3675
 
 --------------------------------------------------------------------------------
 -- Aggregates and their supporting functions
@@ -4144,7 +4144,7 @@ CREATE OR REPLACE FUNCTION ST_Centroid(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'centroid'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 
 -- Availability: 2.3.0
@@ -4164,7 +4164,7 @@ CREATE OR REPLACE FUNCTION ST_PointOnSurface(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'pointonsurface'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 2500; --this looks suspicious, should not be this high
+	COST 1; -- reset cost, see #3675
 
 -- PostGIS equivalent function: IsSimple(geometry)
 CREATE OR REPLACE FUNCTION ST_IsSimple(geometry)
@@ -5065,7 +5065,7 @@ CREATE OR REPLACE FUNCTION ST_SwapOrdinates(geom geometry, ords cstring)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'ST_SwapOrdinates'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25; -- COST guessed from ST_FlipCoordinates(geometry)
+	COST 1; -- reset cost, see #3675
 
 -- NOTE: same as ST_SwapOrdinates(geometry, 'xy')
 --       but slightly faster in that it doesn't need to parse ordinate
@@ -5074,7 +5074,7 @@ CREATE OR REPLACE FUNCTION ST_FlipCoordinates(geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'ST_FlipCoordinates'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
-	COST 25;
+	COST 1; -- reset cost, see #3675
 
 --
 -- SFSQL 1.1
@@ -5407,19 +5407,19 @@ CREATE OR REPLACE FUNCTION ST_3DClosestPoint(geom1 geometry, geom2 geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_closestpoint3d'
 	LANGUAGE 'c' IMMUTABLE STRICT
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 CREATE OR REPLACE FUNCTION ST_3DShortestLine(geom1 geometry, geom2 geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_shortestline3d'
 	LANGUAGE 'c' IMMUTABLE STRICT
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 CREATE OR REPLACE FUNCTION ST_3DLongestLine(geom1 geometry, geom2 geometry)
 	RETURNS geometry
 	AS 'MODULE_PATHNAME', 'LWGEOM_longestline3d'
 	LANGUAGE 'c' IMMUTABLE STRICT
-	COST 100;
+	COST 1; -- reset cost, see #3675
 
 CREATE OR REPLACE FUNCTION _ST_3DDWithin(geom1 geometry, geom2 geometry,float8)
 	RETURNS boolean
@@ -5569,300 +5569,8 @@ CREATE OR REPLACE FUNCTION ST_InterpolatePoint(Line geometry, Point geometry)
 	AS 'MODULE_PATHNAME', 'ST_InterpolatePoint'
 	LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
 
-#if POSTGIS_PGSQL_VERSION > 94
---------------------------------------------------------------------
--- BRIN support                                                   --
---------------------------------------------------------------------
-
----------------------------------
--- 2d operators                --
----------------------------------
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION contains_2d(box2df, geometry)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_contains_box2df_geom_2d'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION is_contained_2d(box2df, geometry)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_within_box2df_geom_2d'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_2d(box2df, geometry)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_overlaps_box2df_geom_2d'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_2d(box2df, box2df)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_contains_box2df_box2df_2d'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION contains_2d(box2df, box2df)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_contains_box2df_box2df_2d'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION is_contained_2d(box2df, box2df)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_contains_box2df_box2df_2d'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OPERATOR ~ (
-  LEFTARG    = box2df,
-  RIGHTARG   = geometry,
-  PROCEDURE  = contains_2d,
-  COMMUTATOR = @
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR @ (
-  LEFTARG    = box2df,
-  RIGHTARG   = geometry,
-  PROCEDURE  = is_contained_2d,
-  COMMUTATOR = ~
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR && (
-  LEFTARG    = box2df,
-  RIGHTARG   = geometry,
-  PROCEDURE  = overlaps_2d,
-  COMMUTATOR = &&
-);
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION contains_2d(geometry, box2df)
-RETURNS boolean
-AS $$
-  SELECT $2 @ $1;
-$$ LANGUAGE SQL IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION is_contained_2d(geometry, box2df)
-RETURNS boolean
-AS $$
-  SELECT $2 ~ $1;
-$$ LANGUAGE SQL IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_2d(geometry, box2df)
-RETURNS boolean
-AS $$
-  SELECT $2 OPERATOR(@extschema at .&&) $1;
-$$ LANGUAGE SQL IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OPERATOR ~ (
-  LEFTARG = geometry,
-  RIGHTARG = box2df,
-  COMMUTATOR = @,
-  PROCEDURE  = contains_2d
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR @ (
-  LEFTARG = geometry,
-  RIGHTARG = box2df,
-  COMMUTATOR = ~,
-  PROCEDURE = is_contained_2d
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR && (
-  LEFTARG    = geometry,
-  RIGHTARG   = box2df,
-  PROCEDURE  = overlaps_2d,
-  COMMUTATOR = &&
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR && (
-  LEFTARG   = box2df,
-  RIGHTARG  = box2df,
-  PROCEDURE = overlaps_2d,
-  COMMUTATOR = &&
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR @ (
-  LEFTARG   = box2df,
-  RIGHTARG  = box2df,
-  PROCEDURE = is_contained_2d,
-  COMMUTATOR = ~
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR ~ (
-  LEFTARG   = box2df,
-  RIGHTARG  = box2df,
-  PROCEDURE = contains_2d,
-  COMMUTATOR = @
-);
-
-----------------------------
--- nd operators           --
-----------------------------
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_nd(gidx, geometry)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_gidx_geom_overlaps'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_nd(gidx, gidx)
-RETURNS boolean
-AS 'MODULE_PATHNAME','gserialized_gidx_gidx_overlaps'
-LANGUAGE 'c' IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OPERATOR &&& (
-  LEFTARG    = gidx,
-  RIGHTARG   = geometry,
-  PROCEDURE  = overlaps_nd,
-  COMMUTATOR = &&&
-);
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION overlaps_nd(geometry, gidx)
-RETURNS boolean
-AS $$
-  SELECT $2 OPERATOR(@extschema at .&&&) $1;
-$$ LANGUAGE SQL IMMUTABLE STRICT;
-
--- Availability: 2.3.0
-CREATE OPERATOR &&& (
-  LEFTARG    = geometry,
-  RIGHTARG   = gidx,
-  PROCEDURE  = overlaps_nd,
-  COMMUTATOR = &&&
-);
-
--- Availability: 2.3.0
-CREATE OPERATOR &&& (
-  LEFTARG   = gidx,
-  RIGHTARG  = gidx,
-  PROCEDURE = overlaps_nd,
-  COMMUTATOR = &&&
-);
-
-------------------------------
--- Create operator families --
-------------------------------
-
--------------
--- 2D case --
--------------
-
--- Availability: 2.3.0
-CREATE OPERATOR FAMILY brin_geometry_inclusion_ops_2d USING brin;
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION geom2d_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
-	AS 'MODULE_PATHNAME','geom2d_brin_inclusion_add_value'
-	LANGUAGE 'c';
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION geom3d_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
-	AS 'MODULE_PATHNAME','geom3d_brin_inclusion_add_value'
-	LANGUAGE 'c';
-
--- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION geom4d_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
-	AS 'MODULE_PATHNAME','geom4d_brin_inclusion_add_value'
-	LANGUAGE 'c';
-
--- Availability: 2.3.0
-CREATE OPERATOR CLASS brin_geometry_inclusion_ops_2d
-  DEFAULT FOR TYPE geometry
-  USING brin
-  FAMILY brin_geometry_inclusion_ops_2d AS
-    OPERATOR      3        &&(geometry, geometry),
-    OPERATOR      7        ~(geometry, geometry),
-    OPERATOR      8        @(geometry, geometry),
-    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
-    FUNCTION      2        geom2d_brin_inclusion_add_value(internal, internal, internal, internal) ,
-    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
-    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
-  STORAGE box2df;
-
-ALTER OPERATOR FAMILY brin_geometry_inclusion_ops_2d USING brin ADD
-    OPERATOR      3         &&(box2df, geometry),
-    OPERATOR      7         ~(box2df, geometry),
-    OPERATOR      8         @(box2df, geometry),
-
-    OPERATOR      3         &&(geometry, box2df),
-    OPERATOR      7         ~(geometry, box2df),
-    OPERATOR      8         @(geometry, box2df),
-
-    OPERATOR      3         &&(box2df, box2df),
-    OPERATOR      7         ~(box2df, box2df),
-    OPERATOR      8         @(box2df, box2df);
-
--------------
--- 3D case --
--------------
-
--- Availability: 2.3.0
-CREATE OPERATOR FAMILY brin_geometry_inclusion_ops_3d USING brin;
-
--- Availability: 2.3.0
-CREATE OPERATOR CLASS brin_geometry_inclusion_ops_3d
-  FOR TYPE geometry
-  USING brin
-  FAMILY brin_geometry_inclusion_ops_3d AS
-    OPERATOR      3        &&&(geometry, geometry),
-    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
-    FUNCTION      2        geom3d_brin_inclusion_add_value(internal, internal, internal, internal) ,
-    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
-    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
-  STORAGE gidx;
-
-ALTER OPERATOR FAMILY brin_geometry_inclusion_ops_3d USING brin ADD
-    OPERATOR      3         &&&(gidx, geometry),
-
-    OPERATOR      3         &&&(geometry, gidx),
-
-    OPERATOR      3         &&&(gidx, gidx);
-
--------------
--- 4D case --
--------------
-
--- Availability: 2.3.0
-CREATE OPERATOR FAMILY brin_geometry_inclusion_ops_4d USING brin;
-
--- Availability: 2.3.0
-CREATE OPERATOR CLASS brin_geometry_inclusion_ops_4d
-  FOR TYPE geometry
-  USING brin
-  FAMILY brin_geometry_inclusion_ops_4d AS
-    OPERATOR      3        &&&(geometry, geometry),
-    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
-    FUNCTION      2        geom4d_brin_inclusion_add_value(internal, internal, internal, internal) ,
-    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
-    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
-  STORAGE gidx;
-
-ALTER OPERATOR FAMILY brin_geometry_inclusion_ops_4d USING brin ADD
-    OPERATOR      3         &&&(gidx, geometry),
-
-    OPERATOR      3         &&&(geometry, gidx),
-
-    OPERATOR      3         &&&(gidx, gidx);
-
----------------------------------------------------------------
--- END
----------------------------------------------------------------
-#endif
+-- moved to separate file cause its invovled
+#include "postgis_brin.sql.in"
 
 ---------------------------------------------------------------
 -- USER CONTRIBUTED
diff --git a/postgis/postgis_brin.sql.in b/postgis/postgis_brin.sql.in
new file mode 100644
index 0000000..d3dd983
--- /dev/null
+++ b/postgis/postgis_brin.sql.in
@@ -0,0 +1,336 @@
+#include "sqldefines.h"
+#if POSTGIS_PGSQL_VERSION > 94
+--------------------------------------------------------------------
+-- BRIN support start                                                --
+--------------------------------------------------------------------
+
+---------------------------------
+-- 2d operators                --
+---------------------------------
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION contains_2d(box2df, geometry)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_contains_box2df_geom_2d'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION is_contained_2d(box2df, geometry)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_within_box2df_geom_2d'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_2d(box2df, geometry)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_overlaps_box2df_geom_2d'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_2d(box2df, box2df)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_contains_box2df_box2df_2d'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION contains_2d(box2df, box2df)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_contains_box2df_box2df_2d'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION is_contained_2d(box2df, box2df)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_contains_box2df_box2df_2d'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- logic to create missing brin operators
+-- note we can't use CREATE IF NOT EXISTS since not currently supported for operators or families
+-- an earlier 2.3+ might miss this if doing upgrade from < 9.5 to 9.5+
+-- so we need to include this always for 9.5+
+-- Intentionally not indenting DDL cause our uninstall process can't pick it up
+DO  language 'plpgsql' $$
+BEGIN
+	-- add geometry brin ops if missing and are running a newer than 9.4 --
+	-- use wildcard since if schema postgis is installed in is not in search path, will have schema name in front
+	IF NOT EXISTS(SELECT 1 from pg_operator WHERE oprname = '~' AND 
+		oprleft::regtype::text LIKE '%box2df' AND oprright::regtype::text LIKE '%geometry' ) THEN
+-- Availability: 2.3.0
+CREATE OPERATOR ~ (
+	LEFTARG    = box2df,
+	RIGHTARG   = geometry,
+	PROCEDURE  = contains_2d,
+	COMMUTATOR = @
+);
+	END IF;
+	
+	IF NOT EXISTS(SELECT 1 from pg_operator WHERE oprname = '@' AND 
+		oprleft::regtype::text LIKE '%box2df' AND oprright::regtype::text LIKE '%geometry' ) THEN
+
+-- Availability: 2.3.0
+CREATE OPERATOR @ (
+	LEFTARG    = box2df,
+	RIGHTARG   = geometry,
+	PROCEDURE  = is_contained_2d,
+	COMMUTATOR = ~
+);
+
+-- Availability: 2.3.0
+CREATE OPERATOR && (
+	LEFTARG    = box2df,
+	RIGHTARG   = geometry,
+	PROCEDURE  = overlaps_2d,
+	COMMUTATOR = &&
+);
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION contains_2d(geometry, box2df)
+RETURNS boolean
+AS 
+	'SELECT $2 OPERATOR(@extschema at .@) $1;'
+LANGUAGE SQL IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION is_contained_2d(geometry, box2df)
+RETURNS boolean
+AS
+	'SELECT $2 OPERATOR(@extschema at .~) $1;'
+LANGUAGE SQL IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_2d(geometry, box2df)
+RETURNS boolean
+AS 
+	'SELECT $2 OPERATOR(@extschema at .&&) $1;'
+LANGUAGE SQL IMMUTABLE STRICT;
+
+
+-- Availability: 2.3.0
+CREATE OPERATOR ~ (
+	LEFTARG = geometry,
+	RIGHTARG = box2df,
+	COMMUTATOR = @,
+	PROCEDURE  = contains_2d
+);
+-- Availability: 2.3.0
+CREATE OPERATOR @ (
+	LEFTARG = geometry,
+	RIGHTARG = box2df,
+	COMMUTATOR = ~,
+	PROCEDURE = is_contained_2d
+);
+-- Availability: 2.3.0		
+CREATE OPERATOR && (
+	LEFTARG    = geometry,
+	RIGHTARG   = box2df,
+	PROCEDURE  = overlaps_2d,
+	COMMUTATOR = &&
+);
+-- Availability: 2.3.0		
+CREATE OPERATOR && (
+	LEFTARG   = box2df,
+	RIGHTARG  = box2df,
+	PROCEDURE = overlaps_2d,
+	COMMUTATOR = &&
+);
+-- Availability: 2.3.0		
+CREATE OPERATOR @ (
+	LEFTARG   = box2df,
+	RIGHTARG  = box2df,
+	PROCEDURE = is_contained_2d,
+	COMMUTATOR = ~
+);
+-- Availability: 2.3.0		
+CREATE OPERATOR ~ (
+	LEFTARG   = box2df,
+	RIGHTARG  = box2df,
+	PROCEDURE = contains_2d,
+	COMMUTATOR = @
+);
+	END IF;
+	
+----------------------------
+-- nd operators           --
+----------------------------
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_nd(gidx, geometry)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_gidx_geom_overlaps'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_nd(gidx, gidx)
+RETURNS boolean
+AS 'MODULE_PATHNAME','gserialized_gidx_gidx_overlaps'
+LANGUAGE 'c' IMMUTABLE STRICT;
+
+	IF NOT EXISTS(SELECT 1 from pg_operator WHERE oprname = '&&&' AND 
+		oprleft::regtype::text LIKE '%gidx' AND oprright::regtype::text LIKE '%geometry' ) THEN
+
+-- Availability: 2.3.0		
+CREATE OPERATOR &&& (
+	LEFTARG    = gidx,
+	RIGHTARG   = geometry,
+	PROCEDURE  = overlaps_nd,
+	COMMUTATOR = &&&
+);
+	
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION overlaps_nd(geometry, gidx)
+RETURNS boolean
+AS 
+	'SELECT $2 OPERATOR(@extschema at .&&&) $1;'
+LANGUAGE SQL IMMUTABLE STRICT;
+
+	
+-- Availability: 2.3.0
+CREATE OPERATOR &&& (
+	LEFTARG    = geometry,
+	RIGHTARG   = gidx,
+	PROCEDURE  = overlaps_nd,
+	COMMUTATOR = &&&
+);
+
+
+-- Availability: 2.3.0
+CREATE OPERATOR &&& (
+	LEFTARG   = gidx,
+	RIGHTARG  = gidx,
+	PROCEDURE = overlaps_nd,
+	COMMUTATOR = &&&
+);
+
+	END IF;
+	
+	------------------------------
+	-- Create operator families --
+	------------------------------
+	
+	-------------
+	-- 2D case --
+	-------------
+	IF NOT EXISTS(SELECT 1 FROM pg_opfamily WHERE opfname = 'brin_geometry_inclusion_ops_2d') THEN
+	
+CREATE OPERATOR FAMILY brin_geometry_inclusion_ops_2d USING brin;
+
+	END IF;
+	
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION geom2d_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
+	AS 'MODULE_PATHNAME','geom2d_brin_inclusion_add_value'
+	LANGUAGE 'c';
+	
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION geom3d_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
+	AS 'MODULE_PATHNAME','geom3d_brin_inclusion_add_value'
+	LANGUAGE 'c';
+	
+-- Availability: 2.3.0
+CREATE OR REPLACE FUNCTION geom4d_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
+	AS 'MODULE_PATHNAME','geom4d_brin_inclusion_add_value'
+	LANGUAGE 'c';
+		
+	IF NOT EXISTS(SELECT 1 FROM pg_opclass WHERE opcname = 'brin_geometry_inclusion_ops_2d') THEN
+	
+-- Availability: 2.3.0
+CREATE OPERATOR CLASS brin_geometry_inclusion_ops_2d
+  DEFAULT FOR TYPE geometry
+  USING brin
+  FAMILY brin_geometry_inclusion_ops_2d AS
+    OPERATOR      3        &&(geometry, geometry),
+    OPERATOR      7        ~(geometry, geometry),
+    OPERATOR      8        @(geometry, geometry),
+    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
+    FUNCTION      2        geom2d_brin_inclusion_add_value(internal, internal, internal, internal) ,
+    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
+    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
+  STORAGE box2df;
+
+ALTER OPERATOR FAMILY brin_geometry_inclusion_ops_2d USING brin ADD
+    OPERATOR      3         &&(box2df, geometry),
+    OPERATOR      7         ~(box2df, geometry),
+    OPERATOR      8         @(box2df, geometry),
+
+    OPERATOR      3         &&(geometry, box2df),
+    OPERATOR      7         ~(geometry, box2df),
+    OPERATOR      8         @(geometry, box2df),
+
+    OPERATOR      3         &&(box2df, box2df),
+    OPERATOR      7         ~(box2df, box2df),
+    OPERATOR      8         @(box2df, box2df);
+
+	END IF;
+	
+		-------------
+		-- 3D case --
+		-------------
+	IF NOT EXISTS(SELECT 1 FROM pg_opfamily WHERE opfname = 'brin_geometry_inclusion_ops_3d') THEN
+-- Availability: 2.3.0
+CREATE OPERATOR FAMILY brin_geometry_inclusion_ops_3d USING brin;
+
+	END IF;	
+	
+	IF NOT EXISTS(SELECT 1 FROM pg_opclass WHERE opcname = 'brin_geometry_inclusion_ops_3d') THEN
+	
+-- Availability: 2.3.0
+CREATE OPERATOR CLASS brin_geometry_inclusion_ops_3d
+  FOR TYPE geometry
+  USING brin
+  FAMILY brin_geometry_inclusion_ops_3d AS
+    OPERATOR      3        &&&(geometry, geometry),
+    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
+    FUNCTION      2        geom3d_brin_inclusion_add_value(internal, internal, internal, internal) ,
+    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
+    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
+  STORAGE gidx;
+
+ALTER OPERATOR FAMILY brin_geometry_inclusion_ops_3d USING brin ADD
+    OPERATOR      3         &&&(gidx, geometry),
+
+    OPERATOR      3         &&&(geometry, gidx),
+
+    OPERATOR      3         &&&(gidx, gidx);
+	
+	END IF;
+	
+	
+		-------------
+		-- 4D case --
+		-------------
+	IF NOT EXISTS(SELECT 1 FROM pg_opfamily WHERE opfname = 'brin_geometry_inclusion_ops_4d') THEN
+	
+-- Availability: 2.3.0
+CREATE OPERATOR FAMILY brin_geometry_inclusion_ops_4d USING brin;
+
+-- Availability: 2.3.0
+CREATE OPERATOR CLASS brin_geometry_inclusion_ops_4d
+  FOR TYPE geometry
+  USING brin
+  FAMILY brin_geometry_inclusion_ops_4d AS
+    OPERATOR      3        &&&(geometry, geometry),
+    FUNCTION      1        brin_inclusion_opcinfo(internal) ,
+    FUNCTION      2        geom4d_brin_inclusion_add_value(internal, internal, internal, internal) ,
+    FUNCTION      3        brin_inclusion_consistent(internal, internal, internal) ,
+    FUNCTION      4        brin_inclusion_union(internal, internal, internal) ,
+  STORAGE gidx;
+
+ALTER OPERATOR FAMILY brin_geometry_inclusion_ops_4d USING brin ADD
+    OPERATOR      3         &&&(gidx, geometry),
+
+    OPERATOR      3         &&&(geometry, gidx),
+
+    OPERATOR      3         &&&(gidx, gidx);
+	
+	END IF;
+		
+---------------------------------------------------------------
+-- END
+---------------------------------------------------------------
+END;
+$$;
+
+-----------------------
+-- BRIN support end
+-----------------------
+#endif
\ No newline at end of file
diff --git a/postgis/sqldefines.h b/postgis/sqldefines.h
index c0d2834..8932293 100644
--- a/postgis/sqldefines.h
+++ b/postgis/sqldefines.h
@@ -7,9 +7,9 @@
  * Define just the version numbers; otherwise we get some strange substitutions in postgis.sql.in
  */
 #define POSTGIS_PGSQL_VERSION 96
-#define POSTGIS_GEOS_VERSION 36
+#define POSTGIS_GEOS_VERSION 37
 #define POSTGIS_PROJ_VERSION 49
-#define POSTGIS_LIB_VERSION '2.3.1'
+#define POSTGIS_LIB_VERSION '2.3.2'
 #define POSTGIS_LIBXML2_VERSION 2.9.4
 #define POSTGIS_SFCGAL_VERSION 13
 
@@ -25,12 +25,12 @@
  * won't substitute within apostrophes)
  */
 #define _POSTGIS_SQL_SELECT_POSTGIS_VERSION 'SELECT ''2.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1''::text AS version'
-#define _POSTGIS_SQL_SELECT_POSTGIS_BUILD_DATE 'SELECT ''2016-11-28 15:14:03''::text AS version'
+#define _POSTGIS_SQL_SELECT_POSTGIS_BUILD_DATE 'SELECT ''2017-01-31 06:00:14''::text AS version'
 
 #if POSTGIS_SVN_REVISION
-#define _POSTGIS_SQL_SELECT_POSTGIS_SCRIPTS_VERSION $$ SELECT '2.3.1'::text || ' r' || POSTGIS_SVN_REVISION::text AS version $$
+#define _POSTGIS_SQL_SELECT_POSTGIS_SCRIPTS_VERSION $$ SELECT '2.3.2'::text || ' r' || POSTGIS_SVN_REVISION::text AS version $$
 #else
-#define _POSTGIS_SQL_SELECT_POSTGIS_SCRIPTS_VERSION $$ SELECT '2.3.1'::text AS version $$
+#define _POSTGIS_SQL_SELECT_POSTGIS_SCRIPTS_VERSION $$ SELECT '2.3.2'::text AS version $$
 #endif
 
 #define SRID_USR_MAX 998999
diff --git a/postgis_svn_revision.h b/postgis_svn_revision.h
index 747ef71..c680fe9 100644
--- a/postgis_svn_revision.h
+++ b/postgis_svn_revision.h
@@ -1 +1 @@
-#define POSTGIS_SVN_REVISION 15264
+#define POSTGIS_SVN_REVISION 15302
diff --git a/regress/knn_recheck.sql b/regress/knn_recheck.sql
index 1475c72..c216ead 100644
--- a/regress/knn_recheck.sql
+++ b/regress/knn_recheck.sql
@@ -223,3 +223,16 @@ DROP TABLE knn_recheck_geom_nd;
 -- #3573
 SELECT '#3573', 'POINT M (0 0 13)'::geometry <<->> 'LINESTRING M (0 0 5, 0 1 6)'::geometry;
 
+-- #3418
+CREATE TABLE test_wo (geo geometry);
+INSERT INTO test_wo VALUES 
+  ('0101000020E61000007D91D0967329E4BF6631B1F9B8D64A40'::geometry), 
+  ('0101000020E6100000E2AFC91AF510C1BFCDCCCCCCCCAC4A40'::geometry);
+CREATE INDEX ON TEST_WO USING GIST (GEO);
+analyze test_wo;
+SET enable_seqscan = false;
+SELECT '#3418' As ticket, '0101000020E610000092054CE0D6DDE5BFCDCCCCCCCCAC4A40'::geometry <-> geo, ST_Distance('0101000020E610000092054CE0D6DDE5BFCDCCCCCCCCAC4A40'::geometry, geo) 
+FROM test_wo ORDER BY geo <->
+('0101000020E610000092054CE0D6DDE5BFCDCCCCCCCCAC4A40'::geometry);
+DROP TABLE test_wo;
+set enable_seqscan to default;
diff --git a/regress/knn_recheck_expected b/regress/knn_recheck_expected
index b81bb72..9c37f23 100644
--- a/regress/knn_recheck_expected
+++ b/regress/knn_recheck_expected
@@ -125,3 +125,5 @@
 #3nd-3|600001|9749|54.5453|54.5453
 #3nd-3|600001|10041|54.6233|54.6233
 #3573|8
+#3418|0.331823813642119|0.331823813642119
+#3418|0.55|0.55
diff --git a/utils/postgis_proc_upgrade.pl b/utils/postgis_proc_upgrade.pl
index 0425b01..ebf7cf6 100755
--- a/utils/postgis_proc_upgrade.pl
+++ b/utils/postgis_proc_upgrade.pl
@@ -378,6 +378,17 @@ EOF
 			last if /\;\s*$/;
 		}
 	}
+	
+	# Always output grant permissions (see ticket #3680)
+	if ( /^grant select\s+(\S+)\s*/i )
+	{
+		print;
+		while(<INPUT>)
+		{
+			print;
+			last if /\;\s*$/;
+		}
+	}
 
 	# Always output create ore replace rule 
 	if ( /^create or replace rule\s+(\S+)\s*/i )

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/postgis.git



More information about the Pkg-grass-devel mailing list