[SCM] PostGIS branch master updated. 3.6.0rc2-196-gc6f24e941

git at osgeo.org git at osgeo.org
Wed Nov 12 11:04:27 PST 2025


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  c6f24e9419fc0d0ee6bc73448791dfd743e9ced0 (commit)
       via  26639a287dfb03c669c599105fbdac1a07bad29e (commit)
       via  4748b533671032e8078870660757ab3a9b80fdf2 (commit)
      from  315d6b7d248c460ef9d6cdec4520228b9a42ef20 (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 c6f24e9419fc0d0ee6bc73448791dfd743e9ced0
Author: Regina Obe <lr at pcorp.us>
Date:   Tue Nov 11 00:36:49 2025 -0500

    Topogeometry corruption fix
    
     - Fix for topogeometry corruption
     - Add tests
     - Add documentation for new function
    
    References #5983 for PostGIS 3.7.0
    References https://gitea.osgeo.org/postgis/postgis/pulls/274

diff --git a/doc/extras_topology.xml b/doc/extras_topology.xml
index 640bee1fb..d50276dd4 100644
--- a/doc/extras_topology.xml
+++ b/doc/extras_topology.xml
@@ -553,6 +553,57 @@ Rename a topology from <varname>topo_stage</varname> to <varname>topo_prod</varn
 			</refsection>
 		</refentry>
 
+        <refentry xml:id="FixCorruptTopoGeometryColumn">
+			<refnamediv>
+				<refname>FixCorruptTopoGeometryColumn</refname>
+				<refpurpose>Fixes topogeometry corruption caused by upgrade to postgis_topology 3.6.0 and higher</refpurpose>
+			</refnamediv>
+            <refsynopsisdiv>
+                <funcsynopsis>
+                     <funcprototype>
+                        <funcdef>text <function>FixCorruptTopoGeometryColumn</function></funcdef>
+                        <paramdef><type>name </type>
+                        <parameter>layerSchema</parameter></paramdef>
+                        <paramdef><type>name </type>
+                        <parameter>layerTable</parameter></paramdef>
+                        <paramdef><type>name </type>
+                        <parameter>layerColumn </parameter></paramdef>
+                    </funcprototype>
+                </funcsynopsis>
+            </refsynopsisdiv>
+
+			<refsection>
+                <title>Description</title>
+
+                <para>
+When upgrading from PostGIS topology <3.6.0 to version >3.6.0+, the topogeometry column definition was changed.
+This caused corruption in topogeometries created before the upgrade. This function fixes this corruption in affected tables.
+                </para>
+
+                <!-- use this format if new function -->
+                <para role="availability" conformance="3.6.1">Availability: 3.6.1</para>
+
+			</refsection>
+
+			<refsection>
+				<title>Examples</title>
+                <para>Fix all topology columns</para>
+				<programlisting>
+SELECT topology.FixCorruptTopoGeometryColumn(schema_name, table_name, feature_column)
+    FROM topology.layer;
+                </programlisting>
+			</refsection>
+
+			<!-- Optionally add a "See Also" section -->
+			<refsection>
+				<title>See Also</title>
+
+				<para>
+				  <xref linkend="UpgradeTopology"/>
+				</para>
+			</refsection>
+		</refentry>
+
 		<refentry xml:id="Populate_Topology_Layer">
 			<refnamediv>
 				<refname>Populate_Topology_Layer</refname>
diff --git a/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
index 869a09ce6..ccfbc83b3 100644
--- a/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
+++ b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
@@ -18,30 +18,50 @@
 CREATE OR REPLACE FUNCTION topology.FixCorruptTopoGeometryColumn(layerSchema name, layerTable name, layerColumn name)
 RETURNS text AS
 $$
-DECLARE var_sql text; var_row_count bigint; result text;
+DECLARE var_sql text; var_row_count bigint; result text; var_create_index_sql text; var_drop_index_sql text;
 BEGIN
+    result = '';
 	-- if topogeometry is bigint, then fix damaged integer, need to upgrade to bigint
 	IF EXISTS ( SELECT 1
 		FROM  pg_catalog.pg_type AS pg_type
 			JOIN pg_catalog.pg_class AS pg_class ON pg_class.oid = pg_type.typrelid
 			JOIN pg_catalog.pg_attribute AS pga  ON pga.attrelid = pg_class.oid
 			JOIN pg_catalog.pg_type AS pg_attr_type on pg_attr_type.oid = pga.atttypid
-WHERE pg_type.typname::regtype::text = 'topogeometry' AND pga.attname = 'id'
+WHERE pg_type.typname = 'topogeometry' AND pga.attname = 'id'
 			AND
 		pg_type.typnamespace::regnamespace::text = 'topology' AND  pga.atttypid::regtype::text = 'bigint' ) THEN
+
+    -- generate index scripts to create and drop indexes that are based on the column
+    IF EXISTS( SELECT 1 FROM pg_indexes WHERE schemaname = layerSchema AND tablename = layerTable AND indexdef LIKE '%(' || layerColumn || ')%' ) THEN
+        SELECT string_agg(indexdef, ';'),  string_agg('DROP INDEX ' || quote_ident(schemaname) || '.' || quote_ident(indexname), ';')  INTO var_create_index_sql, var_drop_index_sql
+            FROM pg_indexes
+             WHERE schemaname = layerSchema
+                AND tablename = layerTable AND indexdef LIKE ('%(' || layerColumn || ')%');
+    END IF;
+
+    IF var_drop_index_sql > '' THEN
+        EXECUTE var_drop_index_sql;
+    END IF;
+
+    -- correct any corrupt topogeometries and fix
 	 var_sql =  format('UPDATE %1$I.%2$I
 	 	SET
 	   %3$I = (
 	     (%3$I).topology_id,
 	    (%3$I).layer_id,
-	     (%3$I).id & 0xFFFFFFFF,
-	     (%3$I).id >> 32
+	     ((%3$I).id & 0xFFFFFFFF)::bigint,
+	     ((%3$I).id >> 32)::integer
 	   )::topology.topogeometry
-	 WHERE (  (%3$I).id & 0xFFFFFFFF ) <> (%3$I).id OR  (  (%3$I).id >> 32 ) = (%3$I).type  ', layerSchema, layerTable, layerColumn);
+	 WHERE (  (%3$I).id & 0xFFFFFFFF )::bigint <> (%3$I).id OR  (  (%3$I).id >> 32 )::integer = (%3$I).type  ', layerSchema, layerTable, layerColumn);
 
 	 EXECUTE var_sql;
 	 GET DIAGNOSTICS var_row_count = ROW_COUNT;
-	 result = format('%s rows updated for %s.%s.%s column to bigint id type', var_row_count, layerSchema, layerTable, layerColumn);
+
+    IF var_create_index_sql > '' THEN
+        EXECUTE var_create_index_sql;
+        result = result || E'\n' || 'Recreating indexes';
+    END IF;
+	result = result || E'\n' || format('%s rows updated for %s.%s.%s column to bigint id type', var_row_count, layerSchema, layerTable, layerColumn);
   ELSE --we are coming from bigint and going back to integer
   	var_sql =  format('UPDATE %1$I.%2$I
 	 	SET
@@ -55,7 +75,7 @@ WHERE pg_type.typname::regtype::text = 'topogeometry' AND pga.attname = 'id'
 	 WHERE  l.topology_id = (%3$I).topology_id AND l.layer_id =  (%3$I).layer_id AND (%3$I).type <> l.feature_type  ', topo_schema, topo_table, topo_column);
 	 EXECUTE var_sql;
 	 GET DIAGNOSTICS var_row_count = ROW_COUNT;
-	 result = format('%s rows updated for %s.%s.%s column back to integer id type', var_row_count, topo_schema, topo_table, topo_column);
+	 result = result || format('%s rows updated for %s.%s.%s column back to integer id type', var_row_count, topo_schema, topo_table, topo_column);
   END IF;
   RETURN result;
 END
diff --git a/topology/test/regress/fix_topogeometry_columns.sql b/topology/test/regress/fix_topogeometry_columns.sql
new file mode 100644
index 000000000..4849b6bf5
--- /dev/null
+++ b/topology/test/regress/fix_topogeometry_columns.sql
@@ -0,0 +1,13 @@
+set client_min_messages to WARNING;
+
+\i :top_builddir/topology/test/load_topology-4326.sql
+\i ../load_features.sql
+\i ../more_features.sql
+\i ../hierarchy.sql
+SELECT * FROM topology.layer;
+SELECT topology.FixCorruptTopoGeometryColumn(schema_name, table_name, feature_column)
+FROM topology.layer
+WHERE schema_name > '' AND table_name > '' AND feature_column > '';
+
+SELECT topology.DropTopology('city_data');
+DROP SCHEMA features CASCADE;
diff --git a/topology/test/regress/fix_topogeometry_columns_expected b/topology/test/regress/fix_topogeometry_columns_expected
new file mode 100644
index 000000000..feab46c95
--- /dev/null
+++ b/topology/test/regress/fix_topogeometry_columns_expected
@@ -0,0 +1,13 @@
+162|1|features|land_parcels|feature|3|0|
+162|2|features|traffic_signs|feature|1|0|
+162|3|features|city_streets|feature|2|0|
+162|4|features|big_parcels|feature|3|1|1
+162|5|features|big_streets|feature|2|1|3
+162|6|features|big_signs|feature|1|1|2
+0 rows updated for features.land_parcels.feature column to bigint id type
+0 rows updated for features.traffic_signs.feature column to bigint id type
+0 rows updated for features.city_streets.feature column to bigint id type
+0 rows updated for features.big_parcels.feature column to bigint id type
+0 rows updated for features.big_streets.feature column to bigint id type
+0 rows updated for features.big_signs.feature column to bigint id type
+Topology 'city_data' dropped
diff --git a/topology/test/regress/hooks/hook-after-upgrade-topology.sql b/topology/test/regress/hooks/hook-after-upgrade-topology.sql
index 936b86319..c9b25bb51 100644
--- a/topology/test/regress/hooks/hook-after-upgrade-topology.sql
+++ b/topology/test/regress/hooks/hook-after-upgrade-topology.sql
@@ -1,8 +1,24 @@
+SELECT * FROM topology.layer;
+\d upgrade_test.feature
+-- https://trac.osgeo.org/postgis/ticket/5983
+SELECT topology.FixCorruptTopoGeometryColumn(schema_name, table_name, feature_column)
+    FROM topology.layer;
+
+\d upgrade_test.feature
+
 -- See https://trac.osgeo.org/postgis/ticket/5102
 SELECT topology.CopyTopology('upgrade_test', 'upgrade_test_copy');
+INSERT INTO upgrade_test.domain_test values (
+  '{1,2}'::topology.topoelement,
+  '{{2,3}}'::topology.topoelementarray
+);
 
--- check if corruption
-select geometrytype(tg) from upgrade_test.feature limit 2;
+SELECT * FROM topology.layer;
+
+INSERT INTO upgrade_test.domain_test values (
+  '{1,2}'::topology.topoelement,
+  '{{2,3}}'::topology.topoelementarray
+);
 
 SELECT topology.DropTopology('upgrade_test');
 SELECT topology.DropTopology('upgrade_test_copy');
diff --git a/topology/test/tests.mk b/topology/test/tests.mk
index 383e38ccf..0b0ab3ff9 100644
--- a/topology/test/tests.mk
+++ b/topology/test/tests.mk
@@ -97,4 +97,6 @@ TESTS += \
 	$(top_srcdir)/topology/test/regress/validatetopologyrelation_large.sql \
 	$(top_srcdir)/topology/test/regress/validatetopology.sql \
 	$(top_srcdir)/topology/test/regress/validatetopology_large.sql \
-	$(top_srcdir)/topology/test/regress/verifylargeids.sql
+	$(top_srcdir)/topology/test/regress/verifylargeids.sql \
+	$(top_srcdir)/topology/test/regress/fix_topogeometry_columns.sql
+

commit 26639a287dfb03c669c599105fbdac1a07bad29e
Author: Regina Obe <lr at pcorp.us>
Date:   Thu Oct 30 00:08:40 2025 -0400

    WIP: fix topogeometry column function addition

diff --git a/topology/Makefile.in b/topology/Makefile.in
index ce7cbb350..608f5e76a 100644
--- a/topology/Makefile.in
+++ b/topology/Makefile.in
@@ -141,6 +141,7 @@ topology.sql: \
 	sql/manage/CreateTopology.sql.in \
 	sql/manage/FindLayer.sql.in \
 	sql/manage/FindTopology.sql.in \
+	sql/manage/FixCorruptTopoGeometryColumn.sql.in \
 	sql/manage/ManageHelper.sql.in \
 	sql/manage/MakeTopologyPrecise.sql.in \
 	sql/manage/TotalTopologySize.sql.in \
diff --git a/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
new file mode 100644
index 000000000..869a09ce6
--- /dev/null
+++ b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
@@ -0,0 +1,63 @@
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+--
+-- PostGIS - Spatial Types for PostgreSQL
+-- https://postgis.net
+--
+-- Copyright (C) 2025 Regina Obe <lr at pcorp.us>
+--
+-- This is free software; you can redistribute and/or modify it under
+-- the terms of the GNU General Public License. See the COPYING file.
+--
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+--{
+--  FixCorruptTopGeometryColumn((layerSchema name, layerTable name, layerColumn name)
+--
+-- Needed to fix corruption of topogeometries caused by upgrade from < 3.6.0 to 3.6.0 and higher
+--
+-- Availability: 3.6.1
+CREATE OR REPLACE FUNCTION topology.FixCorruptTopoGeometryColumn(layerSchema name, layerTable name, layerColumn name)
+RETURNS text AS
+$$
+DECLARE var_sql text; var_row_count bigint; result text;
+BEGIN
+	-- if topogeometry is bigint, then fix damaged integer, need to upgrade to bigint
+	IF EXISTS ( SELECT 1
+		FROM  pg_catalog.pg_type AS pg_type
+			JOIN pg_catalog.pg_class AS pg_class ON pg_class.oid = pg_type.typrelid
+			JOIN pg_catalog.pg_attribute AS pga  ON pga.attrelid = pg_class.oid
+			JOIN pg_catalog.pg_type AS pg_attr_type on pg_attr_type.oid = pga.atttypid
+WHERE pg_type.typname::regtype::text = 'topogeometry' AND pga.attname = 'id'
+			AND
+		pg_type.typnamespace::regnamespace::text = 'topology' AND  pga.atttypid::regtype::text = 'bigint' ) THEN
+	 var_sql =  format('UPDATE %1$I.%2$I
+	 	SET
+	   %3$I = (
+	     (%3$I).topology_id,
+	    (%3$I).layer_id,
+	     (%3$I).id & 0xFFFFFFFF,
+	     (%3$I).id >> 32
+	   )::topology.topogeometry
+	 WHERE (  (%3$I).id & 0xFFFFFFFF ) <> (%3$I).id OR  (  (%3$I).id >> 32 ) = (%3$I).type  ', layerSchema, layerTable, layerColumn);
+
+	 EXECUTE var_sql;
+	 GET DIAGNOSTICS var_row_count = ROW_COUNT;
+	 result = format('%s rows updated for %s.%s.%s column to bigint id type', var_row_count, layerSchema, layerTable, layerColumn);
+  ELSE --we are coming from bigint and going back to integer
+  	var_sql =  format('UPDATE %1$I.%2$I
+	 	SET
+	   %3$I = (
+	     (%3$I).topology_id,
+	    (%3$I).layer_id,
+	     (%3$I).id,
+	     l.feature_type
+	   )::topogeometry
+	   FROM topology.layer AS l
+	 WHERE  l.topology_id = (%3$I).topology_id AND l.layer_id =  (%3$I).layer_id AND (%3$I).type <> l.feature_type  ', topo_schema, topo_table, topo_column);
+	 EXECUTE var_sql;
+	 GET DIAGNOSTICS var_row_count = ROW_COUNT;
+	 result = format('%s rows updated for %s.%s.%s column back to integer id type', var_row_count, topo_schema, topo_table, topo_column);
+  END IF;
+  RETURN result;
+END
+$$ language plpgsql;
+--}
diff --git a/topology/test/regress/hooks/hook-after-upgrade-topology.sql b/topology/test/regress/hooks/hook-after-upgrade-topology.sql
index 248b6206f..936b86319 100644
--- a/topology/test/regress/hooks/hook-after-upgrade-topology.sql
+++ b/topology/test/regress/hooks/hook-after-upgrade-topology.sql
@@ -1,6 +1,9 @@
 -- See https://trac.osgeo.org/postgis/ticket/5102
 SELECT topology.CopyTopology('upgrade_test', 'upgrade_test_copy');
 
+-- check if corruption
+select geometrytype(tg) from upgrade_test.feature limit 2;
+
 SELECT topology.DropTopology('upgrade_test');
 SELECT topology.DropTopology('upgrade_test_copy');
 
diff --git a/topology/topology.sql.in b/topology/topology.sql.in
index 96095fd5b..c364af34d 100644
--- a/topology/topology.sql.in
+++ b/topology/topology.sql.in
@@ -1417,6 +1417,7 @@ LANGUAGE 'plpgsql' VOLATILE STRICT;
 #include "sql/manage/CopyTopology.sql.in"
 #include "sql/manage/FindTopology.sql.in"
 #include "sql/manage/FindLayer.sql.in"
+#include "sql/manage/FixCorruptTopoGeometryColumn.sql.in"
 #include "sql/manage/populate_topology_layer.sql.in"
 #include "sql/manage/RenameTopology.sql.in"
 #include "sql/manage/ValidateTopology.sql.in"

commit 4748b533671032e8078870660757ab3a9b80fdf2
Author: Regina Obe <lr at pcorp.us>
Date:   Wed Nov 12 12:22:24 2025 -0500

    Fix xml entities issue in UK docs

diff --git a/doc/po/uk/postgis-manual.po b/doc/po/uk/postgis-manual.po
index 1881aa1a4..a28b267b1 100644
--- a/doc/po/uk/postgis-manual.po
+++ b/doc/po/uk/postgis-manual.po
@@ -40089,7 +40089,7 @@ msgstr ""
 "DE-9IM визначається як 9-елементна матриця, що вказує розмір перетинів між "
 "внутрішньою, межовою та зовнішньою частинами двох геометрій. Він "
 "представлений 9-символьним текстовим рядком із використанням символів 'F', "
-"'0', '1', '2' (наприклад, <code>“FF1FF0102”</code>)."
+"'0', '1', '2' (наприклад, <code>\"FF1FF0102\"</code>)."
 
 #. Tag: para
 #, no-c-format
@@ -40232,8 +40232,8 @@ msgid ""
 msgstr ""
 "<code>3</code>: <emphasis role=\"bold\">MultivalentEndpoint</emphasis> - "
 "кінцеві точки знаходяться в межі, якщо вони зустрічаються більше одного "
-"разу. Іншими словами, межа - це всі «приєднані» або «внутрішні» кінцеві "
-"точки (але не «неприєднані/зовнішні»)."
+"разу. Іншими словами, межа - це всі \"приєднані\" або \"внутрішні\" кінцеві "
+"точки (але не \"неприєднані/зовнішні\")."
 
 #. Tag: para
 #, no-c-format
@@ -40244,7 +40244,7 @@ msgid ""
 msgstr ""
 "<code>4</code>: <emphasis role=\"bold\">MonovalentEndpoint</emphasis> - "
 "кінцеві точки знаходяться в межі, якщо вони зустрічаються тільки один раз. "
-"Іншими словами, межа - це всі «неприєднані» або «зовнішні» кінцеві точки."
+"Іншими словами, межа - це всі \"неприєднані\" або \"зовнішні\" кінцеві точки."
 
 #. Tag: para
 #, no-c-format
@@ -40351,7 +40351,7 @@ msgid ""
 "be computed by <xref linkend=\"ST_Relate\"/>."
 msgstr ""
 "Перевіряє, чи значення <varname>intersectionMatrix</varname> моделі <link "
-"xlink:href=«http://en.wikipedia.org/wiki/DE-9IM»>Dimensionally Extended 9-"
+"xlink:href=\"http://en.wikipedia.org/wiki/DE-9IM\">Dimensionally Extended 9-"
 "Intersection Model</link> (DE-9IM) відповідає "
 "<varname>intersectionMatrixPattern</varname>. Значення матриці перетину "
 "можна обчислити за допомогою <xref linkend=\"ST_Relate\"/>."
@@ -41379,7 +41379,7 @@ msgid ""
 msgstr ""
 "<emphasis role=\"bold\">Агрегатний варіант:</emphasis> повертає геометрію, "
 "яка є 3D об'єднанням набору рядків геометрій. Функція ST_3DUnion() є "
-"«агрегатною» функцією в термінології PostgreSQL. Це означає, що вона оперує "
+"\"агрегатною\" функцією в термінології PostgreSQL. Це означає, що вона оперує "
 "рядками даних так само, як функції SUM() і AVG(), і, як і більшість "
 "агрегатів, ігнорує геометрії NULL."
 
@@ -41399,7 +41399,7 @@ msgid ""
 msgstr ""
 "<emphasis role=\"bold\">Агрегатний варіант:</emphasis> повертає геометрію, "
 "яка є 3D об'єднанням набору рядків геометрій. Функція CG_3DUnion() є "
-"«агрегатною» функцією в термінології PostgreSQL. Це означає, що вона оперує "
+"\"агрегатною\" функцією в термінології PostgreSQL. Це означає, що вона оперує "
 "рядками даних так само, як функції SUM() і AVG(), і, як і більшість "
 "агрегатів, ігнорує геометрії NULL."
 
@@ -41460,7 +41460,7 @@ msgid ""
 "produce more concave results. Alpha values greater than some data-dependent "
 "value produce the convex hull of the input."
 msgstr ""
-"«Тіснота прилягання» контролюється параметром <varname>alpha</varname>, який "
+"\"Тіснота прилягання\" контролюється параметром <varname>alpha</varname>, який "
 "може мати значення від 0 до нескінченності. Менші значення альфа дають більш "
 "увігнуті результати. Значення альфа, більші за певне значення, що залежить "
 "від даних, дають опуклу оболонку вхідних даних."
@@ -41477,7 +41477,7 @@ msgid ""
 "which defines alpha as the radius of the eroding disc."
 msgstr ""
 "Після впровадження CGAL значення альфа є <emphasis>квадратом</emphasis> "
-"радіуса диска, що використовується в алгоритмі Alpha-Shape для «ерозії» "
+"радіуса диска, що використовується в алгоритмі Alpha-Shape для \"ерозії\" "
 "триангуляції Делоне вхідних точок. Докладнішу інформацію див. у <link "
 "xlink:href=\"https://doc.cgal.org/latest/Alpha_shapes_2/index.html#"
 "Chapter_2D_Alpha_Shapes\">CGAL Alpha-Shapes</link>. Це відрізняється від "

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

Summary of changes:
 doc/extras_topology.xml                            | 51 +++++++++++++
 doc/po/uk/postgis-manual.po                        | 18 ++---
 topology/Makefile.in                               |  1 +
 .../sql/manage/FixCorruptTopoGeometryColumn.sql.in | 83 ++++++++++++++++++++++
 topology/test/regress/fix_topogeometry_columns.sql | 13 ++++
 .../test/regress/fix_topogeometry_columns_expected | 13 ++++
 .../regress/hooks/hook-after-upgrade-topology.sql  | 19 +++++
 topology/test/tests.mk                             |  4 +-
 topology/topology.sql.in                           |  1 +
 9 files changed, 193 insertions(+), 10 deletions(-)
 create mode 100644 topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
 create mode 100644 topology/test/regress/fix_topogeometry_columns.sql
 create mode 100644 topology/test/regress/fix_topogeometry_columns_expected


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list