[SCM] PostGIS branch master updated. 3.7.0beta1-60-g05b899365

git at osgeo.org git at osgeo.org
Mon Jul 27 09:06:02 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  05b8993652abbc9894a0435b59573c7ad92636b5 (commit)
       via  b80f15f0c62743a16da2238dfe7dad200dc0482c (commit)
       via  e65cb986e71b4b208685eb0b711725b3672ae5c8 (commit)
       via  014f9297a3134ed73f6b39c0c581efefdabff38f (commit)
       via  01b63c251ed6ceda37cd6b609b9af00299413ea8 (commit)
       via  01a58f7760e6bd8b37f1acd6abacfa6a326d4eb3 (commit)
       via  545bf87e4ef464faf8f5d1bfddf8438b4d652a3b (commit)
       via  7d897c307490cec67666896f5117f924a2030215 (commit)
       via  b9c35c6a55ab7fb2a600ea682b85e430c2e620c0 (commit)
       via  7f6e2241ecc8fa7bcab0ec506cea465797770b91 (commit)
      from  827e06ab9152ed04bc82f2e7991c48bffa1b9315 (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 05b8993652abbc9894a0435b59573c7ad92636b5
Merge: 827e06ab9 b80f15f0c
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date:   Mon Jul 27 09:06:00 2026 -0700

    Merge pull request 'Combine metadata-view privilege and NULL-guard fixes' (!560) from Komzpa/postgis:codex/four-pr-combine-20260727 into master
    
    Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/560


commit b80f15f0c62743a16da2238dfe7dad200dc0482c
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 15:58:43 2026 +0400

    regress: revoke column privilege before role cleanup

diff --git a/regress/core/regress_management.sql b/regress/core/regress_management.sql
index 4a5059ebf..92bfaba53 100644
--- a/regress/core/regress_management.sql
+++ b/regress/core/regress_management.sql
@@ -19,6 +19,12 @@ BEGIN
 		DROP SCHEMA IF EXISTS test6038_private CASCADE;
 		DROP TABLE IF EXISTS public.test6038_visible_geom;
 		DROP TABLE IF EXISTS public.test6038_column_geom;
+		IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'test6038_invisible') THEN
+			DROP OWNED BY test6038_invisible;
+		END IF;
+		IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'test6038_visible') THEN
+			DROP OWNED BY test6038_visible;
+		END IF;
 		DROP ROLE IF EXISTS test6038_invisible;
 		DROP ROLE IF EXISTS test6038_visible;
 		CREATE ROLE test6038_invisible;
@@ -75,6 +81,7 @@ BEGIN
 
 		DROP SCHEMA test6038_private CASCADE;
 		DROP TABLE public.test6038_visible_geom;
+		REVOKE SELECT (visible_geom) ON public.test6038_column_geom FROM test6038_visible;
 		DROP TABLE public.test6038_column_geom;
 		DROP ROLE test6038_invisible;
 		DROP ROLE test6038_visible;

commit e65cb986e71b4b208685eb0b711725b3672ae5c8
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 15:56:24 2026 +0400

    geometry_columns: honor explicit column ACL grants
    
    https://gitea.osgeo.org/postgis/postgis/pulls/484 switched the visible relation check to has_column_privilege, but geometry_columns still had a final relation-ACL gate.
    
    Include attribute ACLs there so explicit column SELECT grants can expose the matching metadata row.

diff --git a/postgis/postgis.sql.in b/postgis/postgis.sql.in
index 4fd57e8ec..6ddc03af8 100644
--- a/postgis/postgis.sql.in
+++ b/postgis/postgis.sql.in
@@ -6793,6 +6793,12 @@ SELECT current_database()::character varying(256) AS f_table_catalog,
       WHERE acl.privilege_type = 'SELECT'
         AND (acl.grantee = 0 OR pg_has_role(acl.grantee, 'USAGE'))
     )
+    OR EXISTS (
+      SELECT 1
+      FROM aclexplode(a.attacl) AS acl
+      WHERE acl.privilege_type = 'SELECT'
+        AND (acl.grantee = 0 OR pg_has_role(acl.grantee, 'USAGE'))
+    )
   );
 
 -- TODO: support RETURNING and raise a WARNING

commit 014f9297a3134ed73f6b39c0c581efefdabff38f
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 15:52:05 2026 +0400

    Add regressions for metadata privileges and empty MVT output
    
    Cover geometry_columns visibility with column-level SELECT grants and lock the zero-row ST_AsMVT aggregate result.

diff --git a/NEWS b/NEWS
index ac043babb..171cd735f 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ These are only changes since 3.7.0beta1.
           functions unavailable in an older library (Darafei Praliaskouski)
  - GT-515, Reject invalid ST_LargestEmptyCircle boundaries before GEOS can
           spend unbounded time on them (Darafei Praliaskouski)
+ - GT-484, Use column-level SELECT privileges for metadata views
+          (Arthur Bazin)
 
 * Enhancements *
 
diff --git a/regress/core/mvt.sql b/regress/core/mvt.sql
index 581e527df..06779eab2 100644
--- a/regress/core/mvt.sql
+++ b/regress/core/mvt.sql
@@ -503,6 +503,11 @@ FROM (
 		ST_MakeBox2D(ST_Point(0, 0), ST_Point(48, 48))
 	) AS geom
 ) AS q;
+SELECT 'TA10_empty', length(ST_AsMVT(q))
+FROM (
+	SELECT NULL::integer AS c1, NULL::geometry AS geom
+	WHERE false
+) AS q;
 
 -- Strings and text
 SELECT 'TA11', encode(ST_AsMVT(q, 'test', 4096, 'geom'), 'base64') FROM (
diff --git a/regress/core/mvt_expected b/regress/core/mvt_expected
index 6eab55643..3332355b5 100644
--- a/regress/core/mvt_expected
+++ b/regress/core/mvt_expected
@@ -94,6 +94,7 @@ TA8|Gk8KBHRlc3QSDhIEAAABABgBIgQJMt4/Eg4SBAAAAQEYASIECTTcPxIOEgQAAQECGAEiBAk03D8a
 AmMxGgJjMiICKAEiAigCIgIoAyiAIHgC
 TA9|0
 TA10|49
+TA10_empty|0
 TA11|GucCCgR0ZXN0Eg4SBAAAAQEYASIECTLePxoHY3N0cmluZxoFY3RleHQiCAoGQWJjRGZnIq8CCqwC
 TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4g
 UGhhc2VsbHVzIHNlZCBudWxsYSBhdWd1ZS4gUGVsbGVudGVzcXVlIHV0IHZ1bHB1dGF0ZSBleC4g
diff --git a/regress/core/regress_management.sql b/regress/core/regress_management.sql
index 47351a758..4a5059ebf 100644
--- a/regress/core/regress_management.sql
+++ b/regress/core/regress_management.sql
@@ -18,6 +18,7 @@ BEGIN
 	IF can_switch_role THEN
 		DROP SCHEMA IF EXISTS test6038_private CASCADE;
 		DROP TABLE IF EXISTS public.test6038_visible_geom;
+		DROP TABLE IF EXISTS public.test6038_column_geom;
 		DROP ROLE IF EXISTS test6038_invisible;
 		DROP ROLE IF EXISTS test6038_visible;
 		CREATE ROLE test6038_invisible;
@@ -44,6 +45,20 @@ BEGIN
 		END IF;
 		EXECUTE 'RESET ROLE';
 
+		CREATE TABLE public.test6038_column_geom(
+			visible_geom geometry(Point, 4326),
+			hidden_geom geometry(Point, 4326)
+		);
+		GRANT SELECT (visible_geom) ON public.test6038_column_geom TO test6038_visible;
+		EXECUTE 'SET LOCAL ROLE test6038_visible';
+		IF 1 != (SELECT count(*) FROM geometry_columns WHERE f_table_schema = 'public' AND f_table_name = 'test6038_column_geom' AND f_geometry_column = 'visible_geom') THEN
+			RAISE EXCEPTION 'geometry_columns did not expose metadata for selectable geometry column';
+		END IF;
+		IF 0 != (SELECT count(*) FROM geometry_columns WHERE f_table_schema = 'public' AND f_table_name = 'test6038_column_geom' AND f_geometry_column = 'hidden_geom') THEN
+			RAISE EXCEPTION 'geometry_columns exposed metadata for non-selectable geometry column';
+		END IF;
+		EXECUTE 'RESET ROLE';
+
 		-- The view must not resolve names inside schemas hidden from the caller.
 		EXECUTE 'SET LOCAL ROLE test6038_invisible';
 		IF 1 != (SELECT count(*) FROM geometry_columns WHERE f_table_schema = 'test6038_private') THEN
@@ -60,6 +75,7 @@ BEGIN
 
 		DROP SCHEMA test6038_private CASCADE;
 		DROP TABLE public.test6038_visible_geom;
+		DROP TABLE public.test6038_column_geom;
 		DROP ROLE test6038_invisible;
 		DROP ROLE test6038_visible;
 	END IF;

commit 01b63c251ed6ceda37cd6b609b9af00299413ea8
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 15:50:34 2026 +0400

    docs: credit Svyatoslav Bogdanov
    
    Normalize the Gonna-Give-You-Up and reversed-name aliases to the given-name-first contributor credit.
    
    Closes https://gitea.osgeo.org/postgis/postgis/pulls/530

diff --git a/.mailmap b/.mailmap
index f291a9559..d72621b92 100644
--- a/.mailmap
+++ b/.mailmap
@@ -128,6 +128,9 @@ Sergei Shoulbakov <managerzf168 at gmail.com> Sergei <managerzf168 at gmail.com>
 Sergei Shoulbakov <managerzf168 at gmail.com> sergei sh <managerzf168 at gmail.com>
 Sergei Shoulbakov <managerzf168 at gmail.com> sergei sh <sshoulbakov at kontur.io>
 
+Svyatoslav Bogdanov <svyatbogd at gmail.com> Bogdanov Svyatoslav <svyatbogd at gmail.com>
+Svyatoslav Bogdanov <svyatbogd at gmail.com> Gonna-Give-You-Up <svyatbogd at gmail.com>
+
 Stefan Corneliu Petrea <stefan.petrea at gmail.com> Stefan Petrea <stefan.petrea at gmail.com>
 
 Teramoto Ikuhiro <yellow at affrc.go.jp> <teramoto.ikuhiro576 at naro.go.jp>
diff --git a/doc/credits.xml b/doc/credits.xml
index ab47f3cc0..dbc890e93 100644
--- a/doc/credits.xml
+++ b/doc/credits.xml
@@ -395,6 +395,7 @@
 					<member>Stephen Frost</member>
 					<member>Stephen Woodbridge</member>
 					<member>Steven Ottens</member>
+					<member>Svyatoslav Bogdanov</member>
 					<member>Talha Rizwan</member>
 					<member>Temuri Doghonadze</member>
 					<member>Teramoto Ikuhiro</member>

commit 01a58f7760e6bd8b37f1acd6abacfa6a326d4eb3
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 15:49:43 2026 +0400

    shpcommon: format allocation failure guard

diff --git a/loader/shpcommon.c b/loader/shpcommon.c
index 8d23713fb..d8d0fd9d5 100644
--- a/loader/shpcommon.c
+++ b/loader/shpcommon.c
@@ -144,7 +144,8 @@ escape_connection_string(char *str)
 
 	size = ptr - str + toescape + 1;
 	result = calloc(1, size);
-	if (!result) {
+	if (!result)
+	{
 		lwerror("Memory allocation failed!");
 	}
 	optr = result;

commit 545bf87e4ef464faf8f5d1bfddf8438b4d652a3b
Author: Svyatoslav Bogdanov <svyatbogd at gmail.com>
Date:   Mon Jul 27 15:49:22 2026 +0400

    shpcommon: handle failed connection-string allocation
    
    Report allocation failure before escape_connection_string dereferences the result buffer.
    
    Closes https://github.com/postgis/postgis/pull/1169

diff --git a/loader/shpcommon.c b/loader/shpcommon.c
index a27d45dc4..8d23713fb 100644
--- a/loader/shpcommon.c
+++ b/loader/shpcommon.c
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 
 #include "shpcommon.h"
+#include "lwgeom_log.h"
 
 typedef struct
 {
@@ -143,6 +144,9 @@ escape_connection_string(char *str)
 
 	size = ptr - str + toescape + 1;
 	result = calloc(1, size);
+	if (!result) {
+		lwerror("Memory allocation failed!");
+	}
 	optr = result;
 	ptr = str;
 

commit 7d897c307490cec67666896f5117f924a2030215
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 15:49:16 2026 +0400

    mvt: avoid label-declaration syntax error
    
    Keep the empty-output handling from GH-1168, but return directly instead of jumping to a label followed by a declaration. Older C modes and PostgreSQL CI reject declarations immediately after labels.

diff --git a/postgis/mvt.c b/postgis/mvt.c
index 2838c13e2..b48f34637 100644
--- a/postgis/mvt.c
+++ b/postgis/mvt.c
@@ -1101,9 +1101,11 @@ static bytea *mvt_ctx_to_bytea(mvt_agg_context *ctx)
 	bytea *ba;
 
 	if (!ctx)
-    {
-        goto error;
-    }
+	{
+		ba = palloc(VARHDRSZ);
+		SET_VARSIZE(ba, VARHDRSZ);
+		return ba;
+	}
 	if (!ctx->tile)
 	{
 		ctx->tile = mvt_ctx_to_tile(ctx);
@@ -1112,7 +1114,9 @@ static bytea *mvt_ctx_to_bytea(mvt_agg_context *ctx)
 	/* Zero features => empty bytea output */
 	if (ctx->layer && ctx->layer->n_features == 0)
 	{
-		goto error;
+		ba = palloc(VARHDRSZ);
+		SET_VARSIZE(ba, VARHDRSZ);
+		return ba;
 	}
 
 	/* Serialize the Tile */
@@ -1121,11 +1125,6 @@ static bytea *mvt_ctx_to_bytea(mvt_agg_context *ctx)
 	vector_tile__tile__pack(ctx->tile, (uint8_t*)VARDATA(ba));
 	SET_VARSIZE(ba, len);
 	return ba;
-
-	error:
-	    bytea* ba_empty = palloc(VARHDRSZ);
-		SET_VARSIZE(ba_empty, VARHDRSZ);
-		return ba_empty;
 }
 
 

commit b9c35c6a55ab7fb2a600ea682b85e430c2e620c0
Author: Svyatoslav Bogdanov <svyatbogd at gmail.com>
Date:   Mon Jul 27 15:48:57 2026 +0400

    mvt: guard empty aggregate context before serialization
    
    Closes https://github.com/postgis/postgis/pull/1168

diff --git a/postgis/mvt.c b/postgis/mvt.c
index 0f6efe634..2838c13e2 100644
--- a/postgis/mvt.c
+++ b/postgis/mvt.c
@@ -1100,17 +1100,19 @@ static bytea *mvt_ctx_to_bytea(mvt_agg_context *ctx)
 	size_t len;
 	bytea *ba;
 
+	if (!ctx)
+    {
+        goto error;
+    }
 	if (!ctx->tile)
 	{
 		ctx->tile = mvt_ctx_to_tile(ctx);
 	}
 
 	/* Zero features => empty bytea output */
-	if (ctx && ctx->layer && ctx->layer->n_features == 0)
+	if (ctx->layer && ctx->layer->n_features == 0)
 	{
-		bytea* ba_empty = palloc(VARHDRSZ);
-		SET_VARSIZE(ba_empty, VARHDRSZ);
-		return ba_empty;
+		goto error;
 	}
 
 	/* Serialize the Tile */
@@ -1119,6 +1121,11 @@ static bytea *mvt_ctx_to_bytea(mvt_agg_context *ctx)
 	vector_tile__tile__pack(ctx->tile, (uint8_t*)VARDATA(ba));
 	SET_VARSIZE(ba, len);
 	return ba;
+
+	error:
+	    bytea* ba_empty = palloc(VARHDRSZ);
+		SET_VARSIZE(ba_empty, VARHDRSZ);
+		return ba_empty;
 }
 
 

commit 7f6e2241ecc8fa7bcab0ec506cea465797770b91
Author: Arthur Bazin <aba at arxit.com>
Date:   Mon Jul 27 15:47:43 2026 +0400

    Use column privileges in metadata views
    
    Apply column-level SELECT privilege checks in geometry, geography, and raster metadata views while preserving catalog-qualified helper calls.
    
    Closes https://gitea.osgeo.org/postgis/postgis/pulls/484

diff --git a/postgis/geography.sql.in b/postgis/geography.sql.in
index fa4e98b4d..edfd09d42 100644
--- a/postgis/geography.sql.in
+++ b/postgis/geography.sql.in
@@ -180,8 +180,8 @@ CREATE OR REPLACE VIEW geography_columns AS
 		AND a.attrelid = c.oid
 		AND c.relnamespace = n.oid
 		AND c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'm'::"char", 'f'::"char", 'p'::"char"] )
-		AND NOT pg_is_other_temp_schema(c.relnamespace)
-		AND has_table_privilege( c.oid, 'SELECT'::text );
+		AND NOT pg_catalog.pg_is_other_temp_schema(c.relnamespace)
+		AND pg_catalog.has_column_privilege(c.oid, a.attname,'SELECT'::text);
 
 -- Availability: 1.5.0
 CREATE OR REPLACE FUNCTION geography(geometry)
diff --git a/postgis/postgis.sql.in b/postgis/postgis.sql.in
index 2cea4c384..4fd57e8ec 100644
--- a/postgis/postgis.sql.in
+++ b/postgis/postgis.sql.in
@@ -6769,10 +6769,10 @@ SELECT current_database()::character varying(256) AS f_table_catalog,
   -- re-resolution guard so PostgreSQL cannot evaluate it for a stale OID.
   AND CASE WHEN has_schema_privilege(c.relnamespace, 'USAGE'::text)
            THEN CASE WHEN pg_catalog.to_regclass(pg_catalog.format('%I.%I', n.nspname, c.relname)) = c.oid
-                     THEN pg_catalog.has_table_privilege(c.oid, 'SELECT')
+                     THEN pg_catalog.has_column_privilege(c.oid, a.attname, 'SELECT'::text)
                      ELSE false
                 END
-           ELSE pg_catalog.has_table_privilege(c.oid, 'SELECT')
+           ELSE pg_catalog.has_column_privilege(c.oid, a.attname, 'SELECT'::text)
       END
   AND (
     EXISTS (
diff --git a/raster/rt_pg/rtpostgis.sql.in b/raster/rt_pg/rtpostgis.sql.in
index ef7cc66fa..704deecc3 100644
--- a/raster/rt_pg/rtpostgis.sql.in
+++ b/raster/rt_pg/rtpostgis.sql.in
@@ -8349,7 +8349,7 @@ CREATE OR REPLACE VIEW raster_columns AS
 		AND a.attrelid = c.oid
 		AND c.relnamespace = n.oid
 		AND c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'm'::"char", 'f'::"char", 'p'::"char"] )
-		AND NOT pg_is_other_temp_schema(c.relnamespace)  AND has_table_privilege(c.oid, 'SELECT'::text);
+		AND NOT pg_catalog.pg_is_other_temp_schema(c.relnamespace) AND pg_catalog.has_column_privilege(c.oid, a.attname,'SELECT'::text);
 
 ------------------------------------------------------------------------------
 -- overview constraint functions
@@ -8458,7 +8458,7 @@ CREATE OR REPLACE VIEW raster_overviews AS
 		AND s.connamespace = n.oid
 		AND s.conrelid = c.oid
 		AND s.consrc LIKE '%_overview_constraint(%'
-		AND NOT pg_is_other_temp_schema(c.relnamespace)  AND has_table_privilege(c.oid, 'SELECT'::text);
+		AND NOT pg_catalog.pg_is_other_temp_schema(c.relnamespace) AND pg_catalog.has_column_privilege(c.oid, a.attname,'SELECT'::text);
 
 ------------------------------------------------------------------------------
 -- AddOverviewConstraints

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

Summary of changes:
 .mailmap                            |  3 +++
 NEWS                                |  2 ++
 doc/credits.xml                     |  1 +
 loader/shpcommon.c                  |  5 +++++
 postgis/geography.sql.in            |  4 ++--
 postgis/mvt.c                       | 14 ++++++++++----
 postgis/postgis.sql.in              | 10 ++++++++--
 raster/rt_pg/rtpostgis.sql.in       |  4 ++--
 regress/core/mvt.sql                |  5 +++++
 regress/core/mvt_expected           |  1 +
 regress/core/regress_management.sql | 23 +++++++++++++++++++++++
 11 files changed, 62 insertions(+), 10 deletions(-)


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list