[SCM] PostGIS branch master updated. 3.7.0beta1-29-ga76515485

git at osgeo.org git at osgeo.org
Sat Jul 25 10:37:42 PDT 2026


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".

The branch, master has been updated
       via  a7651548538b35cc78bfa3a654b31db0a908daae (commit)
       via  315484a1f854d265fa03879c624a8687dfc2564a (commit)
       via  122e00fa08f0fed8db2fc1f2771f1f442130853a (commit)
      from  17935ee71e12df9b315b171d2d080c7a16aa7193 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit a7651548538b35cc78bfa3a654b31db0a908daae
Merge: 17935ee71 315484a1f
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date:   Sat Jul 25 10:37:41 2026 -0700

    Merge pull request 'Fail early when extension scripts need a newer PostGIS library' (!504) from Komzpa/postgis:codex/create-extension-version-mismatch into master
    
    Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/504


commit 315484a1f854d265fa03879c624a8687dfc2564a
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Sat Jul 25 19:03:00 2026 +0400

    test: verify complete upgrade pass-through statements

diff --git a/utils/check_create_upgrade_replaced_function_errors.sh b/utils/check_create_upgrade_replaced_function_errors.sh
index cc0fbf075..321c7f917 100644
--- a/utils/check_create_upgrade_replaced_function_errors.sh
+++ b/utils/check_create_upgrade_replaced_function_errors.sh
@@ -18,6 +18,15 @@ SELECT check_upgrade_guard(
 	'3.7.0dev',
 	postgis_lib_version()
 );
+SELECT discarded_without_upgrade_pass_through();
+SQL
+
+cat > "${TMPDIR}/expected-pass-through.sql" <<'SQL'
+-- Upgrade pass-through
+SELECT check_upgrade_guard(
+	'3.7.0dev',
+	postgis_lib_version()
+);
 SQL
 
 "${PERL:-perl}" "${srcdir:-.}/create_upgrade.pl" "${TMPDIR}/postgis.sql" > "${TMPDIR}/upgrade.sql"
@@ -32,6 +41,14 @@ grep -Fq \
 	"retry SELECT postgis_extensions_upgrade()" \
 	"${TMPDIR}/upgrade.sql"
 
-grep -Fq \
-	"SELECT check_upgrade_guard(" \
-	"${TMPDIR}/upgrade.sql"
+sed -n \
+	'/^-- Upgrade pass-through$/,/^);$/p' \
+	"${TMPDIR}/upgrade.sql" > "${TMPDIR}/actual-pass-through.sql"
+diff -u \
+	"${TMPDIR}/expected-pass-through.sql" \
+	"${TMPDIR}/actual-pass-through.sql"
+
+if grep -Fq "discarded_without_upgrade_pass_through" "${TMPDIR}/upgrade.sql"; then
+	echo "ERROR: unmarked top-level statement leaked into upgrade SQL" >&2
+	exit 1
+fi

commit 122e00fa08f0fed8db2fc1f2771f1f442130853a
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Fri Jul 24 22:46:59 2026 +0400

    Fix CREATE EXTENSION with older PostGIS library

diff --git a/NEWS b/NEWS
index 1a986a230..d0f8c33e2 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,9 @@ These are only changes since 3.7.0beta1.
 
 * Bug Fixes *
 
+ - GT-504, Report extension script/library version mismatches before loading
+          functions unavailable in an older library (Darafei Praliaskouski)
+
 * Enhancements *
 
 
diff --git a/postgis/postgis.sql.in b/postgis/postgis.sql.in
index 9b19145b9..2cea4c384 100644
--- a/postgis/postgis.sql.in
+++ b/postgis/postgis.sql.in
@@ -61,6 +61,81 @@ BEGIN
 END
 $$ LANGUAGE 'plpgsql';
 
+CREATE OR REPLACE FUNCTION _postgis_scripts_version_cmp_key(ver text)
+	RETURNS int[]
+	AS $$
+	DECLARE
+		ver_match text[];
+	BEGIN
+		ver_match := pg_catalog.regexp_match(
+			pg_catalog.lower(ver),
+			E'^([0-9]+)\\.([0-9]+)\\.([0-9]+)(dev|alpha|beta|rc)?([0-9]*)([^0-9a-z].*)?$'
+		);
+		IF ver_match IS NULL THEN
+			RETURN NULL;
+		END IF;
+
+		RETURN ARRAY[
+			ver_match[1]::int,
+			ver_match[2]::int,
+			ver_match[3]::int,
+			CASE coalesce(ver_match[4], '')
+				WHEN 'dev' THEN 0
+				WHEN 'alpha' THEN 1
+				WHEN 'beta' THEN 2
+				WHEN 'rc' THEN 3
+				ELSE 4
+			END,
+			CASE coalesce(ver_match[5], '')
+				WHEN '' THEN 0
+				ELSE ver_match[5]::int
+			END
+		];
+	EXCEPTION WHEN OTHERS THEN
+		RETURN NULL;
+	END
+	$$
+	LANGUAGE 'plpgsql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION postgis_lib_version() RETURNS text
+	AS 'MODULE_PATHNAME'
+	LANGUAGE 'c' IMMUTABLE; -- a new lib will require a new session
+
+CREATE OR REPLACE FUNCTION _postgis_check_library_version(
+	scripts_version text,
+	library_version text
+)
+	RETURNS boolean
+	AS $$
+	DECLARE
+		scripts_key int[];
+		library_key int[];
+	BEGIN
+		scripts_key := @extschema at ._postgis_scripts_version_cmp_key(scripts_version);
+		library_key := @extschema at ._postgis_scripts_version_cmp_key(library_version);
+
+		-- Shared-library compatibility follows the major.minor release line.
+		-- Micro versions and postfixes do not establish C-symbol availability.
+		IF library_key[1:2] < scripts_key[1:2]
+		THEN
+			RAISE EXCEPTION
+				'PostGIS extension scripts version % cannot use older library version %',
+				scripts_version,
+				library_version
+			USING HINT =
+				'Install matching PostGIS shared-library and extension-script packages, reconnect, and retry.';
+		END IF;
+
+		RETURN true;
+	END
+	$$
+	LANGUAGE 'plpgsql' IMMUTABLE STRICT;
+
+-- Upgrade pass-through
+SELECT @extschema at ._postgis_check_library_version(
+	POSTGIS_LIB_VERSION,
+	@extschema at .postgis_lib_version()
+);
 
 -- Let the user know about a deprecated signature and its new name, if any
 CREATE OR REPLACE FUNCTION _postgis_deprecate(oldname text, newname text, version text)
@@ -3143,52 +3218,12 @@ CREATE OR REPLACE FUNCTION postgis_scripts_installed() RETURNS text
 	AS _POSTGIS_SQL_SELECT_POSTGIS_SCRIPTS_VERSION
 	LANGUAGE 'sql' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION postgis_lib_version() RETURNS text
-	AS 'MODULE_PATHNAME'
-	LANGUAGE 'c' IMMUTABLE; -- a new lib will require a new session
-
 -- NOTE: from 1.1.0 to 1.5.x this was the same of postgis_lib_version()
 -- NOTE: from 2.0.0 up it includes postgis revision
 CREATE OR REPLACE FUNCTION postgis_scripts_released() RETURNS text
 	AS 'MODULE_PATHNAME'
 	LANGUAGE 'c' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION _postgis_scripts_version_cmp_key(ver text)
-	RETURNS int[]
-	AS $$
-	DECLARE
-		ver_match text[];
-	BEGIN
-		ver_match := pg_catalog.regexp_match(
-			pg_catalog.lower(ver),
-			E'^([0-9]+)\\.([0-9]+)\\.([0-9]+)(dev|alpha|beta|rc)?([0-9]*)([^0-9a-z].*)?$'
-		);
-		IF ver_match IS NULL THEN
-			RETURN NULL;
-		END IF;
-
-		RETURN ARRAY[
-			ver_match[1]::int,
-			ver_match[2]::int,
-			ver_match[3]::int,
-			CASE coalesce(ver_match[4], '')
-				WHEN 'dev' THEN 0
-				WHEN 'alpha' THEN 1
-				WHEN 'beta' THEN 2
-				WHEN 'rc' THEN 3
-				ELSE 4
-			END,
-			CASE coalesce(ver_match[5], '')
-				WHEN '' THEN 0
-				ELSE ver_match[5]::int
-			END
-		];
-	EXCEPTION WHEN OTHERS THEN
-		RETURN NULL;
-	END
-	$$
-	LANGUAGE 'plpgsql' IMMUTABLE STRICT;
-
 CREATE OR REPLACE FUNCTION postgis_geos_version() RETURNS text
 	AS 'MODULE_PATHNAME'
 	LANGUAGE 'c' IMMUTABLE;
diff --git a/regress/core/postgis_full_version.sql b/regress/core/postgis_full_version.sql
index 5cbc5d9ed..4cbba626f 100644
--- a/regress/core/postgis_full_version.sql
+++ b/regress/core/postgis_full_version.sql
@@ -1,5 +1,38 @@
 BEGIN;
 
+SELECT 'matching_library',
+	_postgis_check_library_version('3.7.0beta1', '3.7.0beta1');
+
+SELECT 'newer_library',
+	_postgis_check_library_version('3.6.4', '3.7.0beta1');
+
+SELECT 'dev_library_with_prerelease_scripts',
+	_postgis_check_library_version('3.7.0beta1', '3.7.0dev');
+
+SELECT 'dev_library_with_final_scripts',
+	_postgis_check_library_version('3.7.0', '3.7.0dev');
+
+SELECT 'dev_scripts_with_final_library',
+	_postgis_check_library_version('3.7.0dev', '3.7.0');
+
+SELECT 'same_minor_micro_versions',
+	_postgis_check_library_version('3.7.1', '3.7.0');
+
+SELECT 'same_minor_official_suffixes',
+	_postgis_check_library_version('3.7.0beta1', '3.7.0alpha1');
+
+DO $$
+DECLARE
+	error_hint text;
+BEGIN
+	PERFORM _postgis_check_library_version('3.7.0beta1', '3.6.4');
+EXCEPTION WHEN raise_exception THEN
+	GET STACKED DIAGNOSTICS error_hint = PG_EXCEPTION_HINT;
+	RAISE NOTICE '%', SQLERRM;
+	RAISE NOTICE 'HINT: %', error_hint;
+END
+$$;
+
 DO $$
 BEGIN
 	IF NOT EXISTS (
diff --git a/regress/core/postgis_full_version_expected b/regress/core/postgis_full_version_expected
index 8e3e2c8cd..56d2c9a3b 100644
--- a/regress/core/postgis_full_version_expected
+++ b/regress/core/postgis_full_version_expected
@@ -1,3 +1,12 @@
+matching_library|t
+newer_library|t
+dev_library_with_prerelease_scripts|t
+dev_library_with_final_scripts|t
+dev_scripts_with_final_library|t
+same_minor_micro_versions|t
+same_minor_official_suffixes|t
+NOTICE:  PostGIS extension scripts version 3.7.0beta1 cannot use older library version 3.6.4
+NOTICE:  HINT: Install matching PostGIS shared-library and extension-script packages, reconnect, and retry.
 topology_old_scripts|t
 topology_newer_scripts|t
 raster_newer_scripts|t
diff --git a/utils/check_create_upgrade_replaced_function_errors.sh b/utils/check_create_upgrade_replaced_function_errors.sh
index df9ebe224..cc0fbf075 100644
--- a/utils/check_create_upgrade_replaced_function_errors.sh
+++ b/utils/check_create_upgrade_replaced_function_errors.sh
@@ -13,6 +13,11 @@ cat > "${TMPDIR}/postgis.sql" <<'SQL'
 CREATE OR REPLACE FUNCTION ST_Test(geometry, float8 DEFAULT 0.0) RETURNS geometry
 AS 'MODULE_PATHNAME', 'ST_Test'
 LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
+-- Upgrade pass-through
+SELECT check_upgrade_guard(
+	'3.7.0dev',
+	postgis_lib_version()
+);
 SQL
 
 "${PERL:-perl}" "${srcdir:-.}/create_upgrade.pl" "${TMPDIR}/postgis.sql" > "${TMPDIR}/upgrade.sql"
@@ -26,3 +31,7 @@ grep -Fq \
 grep -Fq \
 	"retry SELECT postgis_extensions_upgrade()" \
 	"${TMPDIR}/upgrade.sql"
+
+grep -Fq \
+	"SELECT check_upgrade_guard(" \
+	"${TMPDIR}/upgrade.sql"
diff --git a/utils/create_upgrade.pl b/utils/create_upgrade.pl
index 22d24a52d..14959cfa0 100644
--- a/utils/create_upgrade.pl
+++ b/utils/create_upgrade.pl
@@ -197,6 +197,25 @@ while(<INPUT>)
         next;
     }
 
+    #
+    # Preserve explicitly marked top-level statements that must run in both
+    # install and upgrade scripts.
+    #
+    if ( $comment =~ /^\-\- Upgrade pass-through\s*$/m )
+    {
+        print $comment;
+        print;
+        while ( !/;\s*$/ )
+        {
+            $_ = <INPUT>;
+            die "ERROR: unterminated upgrade pass-through statement\n"
+              if !defined;
+            print;
+        }
+        $comment = '';
+        next;
+    }
+
     #
     # Allow through deprecations from postgis_drop.sql
     #
@@ -1067,4 +1086,3 @@ BEGIN
 END
 $$
 LANGUAGE 'plpgsql';
-

-----------------------------------------------------------------------

Summary of changes:
 NEWS                                               |   3 +
 postgis/postgis.sql.in                             | 115 ++++++++++++++-------
 regress/core/postgis_full_version.sql              |  33 ++++++
 regress/core/postgis_full_version_expected         |   9 ++
 ...heck_create_upgrade_replaced_function_errors.sh |  26 +++++
 utils/create_upgrade.pl                            |  20 +++-
 6 files changed, 165 insertions(+), 41 deletions(-)


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list