From trac at osgeo.org Wed Jul 1 00:05:08 2026 From: trac at osgeo.org (PostGIS) Date: Wed, 01 Jul 2026 07:05:08 -0000 Subject: [PostGIS] #6089: wrong node used when adding a new long line In-Reply-To: <050.8342530935d675946b264362c06bda65@osgeo.org> References: <050.8342530935d675946b264362c06bda65@osgeo.org> Message-ID: <065.80ba6c707d49a9f91f2d3823f2ac94ed@osgeo.org> #6089: wrong node used when adding a new long line --------------------------------+-------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: Component: topology | Version: master Resolution: | Keywords: snap --------------------------------+-------------------- Comment (by Lars Aksel Opsahl): Not sure I follow you here. Before adding line we have two nodes the upper and lower. I assume that node closest to incoming line should be used (the upper node). What happens is that lower node is used i my testcase. I also assume in this case the result should be equal when I run tolerance -1 or 1e-07 , related what nodes that are selected in this case. Running with -1 it snaps to upper node and not the lower node as when using 1e-07. The problem is not invalid topology, but that result i sliver topology that I have to remove later again. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Wed Jul 1 00:24:22 2026 From: trac at osgeo.org (PostGIS) Date: Wed, 01 Jul 2026 07:24:22 -0000 Subject: [PostGIS] #6089: wrong node used when adding a new long line In-Reply-To: <050.8342530935d675946b264362c06bda65@osgeo.org> References: <050.8342530935d675946b264362c06bda65@osgeo.org> Message-ID: <065.fb4693325760123fd7ab977fd1c2d3b9@osgeo.org> #6089: wrong node used when adding a new long line --------------------------------+-------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: Component: topology | Version: master Resolution: | Keywords: snap --------------------------------+-------------------- Comment (by strk): Replying to [comment:8 Lars Aksel Opsahl]: > What happens is that lower node is used i my testcase. When I test this _BOTH_ nodes are used, not ONLY the lower one. And that's because _BOTH_ nodes are within the given tolerance. > I also assume in this case the result should be equal when I run tolerance -1 or 1e-07 , related what nodes that are selected in this case. Running with -1 it snaps to upper node and not the lower node as when using 1e-07. Passing -1 asks PostGIS to compute the "minimum distance that can be represented with a 64bit floating point number between the further-from-0 vertex outward". I guess such distance (which I didn't check what it is) must be bigger than the distance between the incoming line and the upper node (which is computed by PostGIS as 0). > The problem is not invalid topology, but that result i sliver topology that I have to remove later again. At least you can spot and remove that sliver ! What I'm saying is that this is all expected behavior, not a bug, not "wrong". If you want to turn this ticket to a feature request we can keep it open, but maybe it would be cleaner to file a new ticket when there's a clear plan. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Wed Jul 1 00:39:16 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 1 Jul 2026 00:39:16 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-708-gcb9ded03d Message-ID: <20260701073917.E27C21A6234@trac.osgeo.org> 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 cb9ded03db4abfd2055c7cbb274b3411852a35a1 (commit) from 8c9f8a7342ad924ab0c65f0d412b72f39cdb80ee (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 cb9ded03db4abfd2055c7cbb274b3411852a35a1 Author: Teramoto Ikuhiro Date: Wed Jul 1 05:55:13 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 98.8% (5514 of 5579 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 9bdfe070a..15e542bef 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-06-12 20:29+0000\n" -"PO-Revision-Date: 2026-06-22 06:39+0000\n" +"PO-Revision-Date: 2026-07-01 07:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -4027,12 +4027,14 @@ msgid "" msgstr "" #. Tag: para -#, no-c-format +#, fuzzy, no-c-format msgid "" "Returns a relation in which each tuple is a pair of vertex/segment where the " "vertex is NOT an endpoint of the segment but the distance between them is " "below the given tolerance." msgstr "" +"?????????/?????????????????????????????" +"???????????????????????????" #. Tag: para #, no-c-format @@ -24163,13 +24165,16 @@ msgid "" msgstr "" #. Tag: para -#, no-c-format +#, fuzzy, no-c-format msgid "" "The nSegments parameter controls the density of the " "output. With nSegments = 5 (the default), each original " "span is divided into 5 sub-segments (inserting 4 new points per span). The " "minimum value is 2." msgstr "" +"nSegments???????????????????" +"nSegments = 5 (?????)?????????5????????? " +"(??????4?????????????)?????2???" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Wed Jul 1 02:17:19 2026 From: trac at osgeo.org (PostGIS) Date: Wed, 01 Jul 2026 09:17:19 -0000 Subject: [PostGIS] #6089: wrong node used when adding a new long line In-Reply-To: <050.8342530935d675946b264362c06bda65@osgeo.org> References: <050.8342530935d675946b264362c06bda65@osgeo.org> Message-ID: <065.c8a3ab41a9b53aa25864fce5107b4d4f@osgeo.org> #6089: wrong node used when adding a new long line --------------------------------+-------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: Component: topology | Version: master Resolution: | Keywords: snap --------------------------------+-------------------- Comment (by Lars Aksel Opsahl): The issue in this case is that we only need the upper node. However, since both nodes fall within the selected tolerance, both are selected, which matches the current expected behavior as I understand it. Selecting only the upper node in cases like this would require a new feature, as I understand your point. A typical problem when using high snap tolerance values is that we create many new lines that were never part of the original input. This happens because we snap to all vertices or nodes within the selected tolerance. While this behavior is expected, it leads to additional cleanup work later, especially when removing small sliver polygons. If snapping were instead limited to the closest node, I believe this could solve some of these issues and behave more like a line-merge operation. A key problem today is that we spend significant effort cleaning up sliver polygons created from what was originally an existing line segment input. Instead of reusing existing geometry, snapping can generate new lines, which increases complexity. The purpose of snapping should ideally be to reduce the number of geometries?not to create new ones when suitable existing lines are already available. I may try to create issue for this. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Wed Jul 1 02:18:04 2026 From: trac at osgeo.org (PostGIS) Date: Wed, 01 Jul 2026 09:18:04 -0000 Subject: [PostGIS] #6089: wrong node used when adding a new long line In-Reply-To: <050.8342530935d675946b264362c06bda65@osgeo.org> References: <050.8342530935d675946b264362c06bda65@osgeo.org> Message-ID: <065.5a866fc31740facc48a51793efde8bb4@osgeo.org> #6089: wrong node used when adding a new long line --------------------------------+-------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: closed Priority: medium | Milestone: Component: topology | Version: master Resolution: invalid | Keywords: snap --------------------------------+-------------------- Changes (by Lars Aksel Opsahl): * resolution: => invalid * status: new => closed -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Wed Jul 1 03:39:18 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 1 Jul 2026 03:39:18 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-709-gb12a6286a Message-ID: <20260701103918.CBF251A7DCA@trac.osgeo.org> 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 b12a6286a3f9d84f7458281dc6a1cab14cd070c9 (commit) from cb9ded03db4abfd2055c7cbb274b3411852a35a1 (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 b12a6286a3f9d84f7458281dc6a1cab14cd070c9 Author: Teramoto Ikuhiro Date: Wed Jul 1 09:34:36 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 99.1% (5534 of 5579 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 15e542bef..0ce97a723 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-06-12 20:29+0000\n" -"PO-Revision-Date: 2026-07-01 07:39+0000\n" +"PO-Revision-Date: 2026-07-01 10:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -4021,10 +4021,10 @@ msgid ", , " msgstr ", , " #. Tag: refpurpose -#, no-c-format +#, fuzzy, no-c-format msgid "" "Find pairs of topology vertex/segment that are closer than tolerated distance" -msgstr "" +msgstr "????????????????/??????????" #. Tag: para #, fuzzy, no-c-format @@ -24163,6 +24163,13 @@ msgid "" "original vertices, nSegments - 1 new intermediate points " "are inserted." msgstr "" +"Catmull-" +"Rom?????????????????????????????????" +"???????????????" +"??? ????????????????????????" +"???????????nSegments - 1???????????" +"?????" #. Tag: para #, fuzzy, no-c-format @@ -24183,6 +24190,9 @@ msgid "" "fewer vertices are returned unchanged. Points and multipoints are always " "returned unchanged." msgstr "" +"??????????4????????????????????????????" +"??????????????????????????????????????" +"??????" #. Tag: para #, no-c-format @@ -24195,31 +24205,37 @@ msgid "" "linkend=\"ST_SimplifyPreserveTopology\"/> and )." msgstr "" +"????????????????????????????1 + (N-1) * " +"nSegments?????????????????? 1 + N * " +"nSegments??????N??????????????????????" +"??????????????????????????? (, , " +"????????)?" #. Tag: para #, no-c-format msgid "Smoothing a 4-point collinear line with default nSegments=5:" -msgstr "" +msgstr "4??????????????????? (nSegments=5):" #. Tag: para #, no-c-format msgid "Smoothing a Polygon using nSegments = 5 and 10:" -msgstr "" +msgstr "???????? (nSegments = 5 ? 10):" #. Tag: para #, no-c-format msgid "nSegments = 5" -msgstr "" +msgstr "nSegments = 5" #. Tag: para #, no-c-format msgid "nSegments = 10" -msgstr "" +msgstr "nSegments = 10" #. Tag: para #, no-c-format msgid "Smoothing a LineString using nSegments = 5 and 10:" -msgstr "" +msgstr "???????????? (nSegments = 5 ? 10):" #. Tag: para #, no-c-format @@ -24227,6 +24243,8 @@ msgid "" ", , , " msgstr "" +", , , " #. Tag: refpurpose #, no-c-format @@ -37811,6 +37829,10 @@ msgid "" "version, a notice is emitted and the non-projected result is returned " "instead." msgstr "" +"projected?true????????????" +"???????????????????? (?????)?SFCGAL 2.3.0?????" +"???????????SFCGAL????????????????????????" +"??????????" #. Tag: para #, no-c-format @@ -37819,6 +37841,9 @@ msgid "" "SFCGAL >= 2.3.0 for projected result; falls back to non-projected with a " "notice on older versions." msgstr "" +"Availability: 3.7.0 - projected?????????????" +"?????? SFCGAL >= 2.3.0 ??????????????????????" +"???????????" #. Tag: para #, no-c-format @@ -37833,7 +37858,7 @@ msgstr ", " #. Tag: refpurpose #, no-c-format msgid "Generate a flat (box) roof from a footprint polygon." -msgstr "" +msgstr "???????????? (??)?????????" #. Tag: para #, no-c-format @@ -37842,11 +37867,14 @@ msgid "" "varname> from a 2D footprint polygon. The roof height above the ground plane " "is given by height (default 3.0)." msgstr "" +"2?????????????? (???)???3?? PolyhedralSurface " +"Z?????????????????? height??" +"?????? (????? 3.0)?" #. Tag: para #, no-c-format msgid "Availability: 3.7.0 - requires SFCGAL >= 2.3.0." -msgstr "" +msgstr "Availability: 3.7.0 - SFCGAL >= 2.3.0 ????" #. Tag: para #, no-c-format @@ -37854,11 +37882,13 @@ msgid "" ", , , " msgstr "" +", , , " #. Tag: refpurpose #, no-c-format msgid "Generate a hipped roof from a footprint polygon." -msgstr "" +msgstr "???????????????????" #. Tag: para #, no-c-format @@ -37867,11 +37897,14 @@ msgid "" "2D footprint polygon. All sides slope upward to meet at a ridge or apex. The " "roof height is given by height (default 3.0)." msgstr "" +"2????????????????3?? PolyhedralSurface Z" +"??????????????????????????????????????" +"? height???????? (????? 3.0)?" #. Tag: refpurpose #, no-c-format msgid "Generate a gable roof from a footprint polygon." -msgstr "" +msgstr "????????????????????" #. Tag: para #, no-c-format @@ -37883,6 +37916,12 @@ msgid "" "varname> controls the pitch in degrees (default 30.0). The SRID of the input " "geometry is preserved." msgstr "" +"2????????????????3?? PolyhedralSurface Z" +"??????????????????????????????????????" +"?????????????????????????? height???????? (????? 3.0)?slope_angle??" +"??????????? (????? 30.0)??????????SRID??????" +"??" #. Tag: para #, no-c-format @@ -37890,6 +37929,8 @@ msgid "" ", , , " msgstr "" +", , , " #. Tag: refpurpose #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 65 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 12 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Wed Jul 1 06:26:43 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 1 Jul 2026 06:26:43 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-711-g545966739 Message-ID: <20260701132644.33E111AD8ED@trac.osgeo.org> 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 5459667399bff3bd8d3c24208b712fa38c0fbca2 (commit) via f899947fd9623641872152f69ae65352d5461702 (commit) from b12a6286a3f9d84f7458281dc6a1cab14cd070c9 (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 5459667399bff3bd8d3c24208b712fa38c0fbca2 Merge: b12a6286a f899947fd Author: Regina Obe Date: Wed Jul 1 09:24:59 2026 -0400 Merge branch 'upgradecheck-pg16' Closes https://gitea.osgeo.org/postgis/postgis/pulls/359 commit f899947fd9623641872152f69ae65352d5461702 Author: Regina Obe Date: Tue Jun 30 19:15:03 2026 -0400 Try to speedup upgrade-check by going just from pg16 diff --git a/.woodpecker/regress.yml b/.woodpecker/regress.yml index f516bc4b3..56d269a5e 100644 --- a/.woodpecker/regress.yml +++ b/.woodpecker/regress.yml @@ -70,6 +70,15 @@ steps: - <<: *steps-env - <<: *steps-pg-build + build-pg16: + image: *test-image + depends_on: autogen + environment: + PGVER: 16 + commands: + - <<: *steps-env + - <<: *steps-pg-build + build-pg18: image: *test-image depends_on: autogen @@ -110,6 +119,17 @@ steps: - <<: *steps-pg-install - <<: *steps-pg-test-install + installcheck-pg16: + image: *test-image + depends_on: build-pg16 + environment: + PGVER: 16 + commands: + - <<: *steps-env + - <<: *steps-start-postgresql + - <<: *steps-pg-install + - <<: *steps-pg-test-install + installcheck-pg18: image: *test-image depends_on: build-pg18 @@ -121,11 +141,11 @@ steps: - <<: *steps-pg-install - <<: *steps-pg-test-install - upgradecheck-pg14: + upgradecheck-pg16: image: *test-image - depends_on: installcheck-pg14 + depends_on: installcheck-pg16 environment: - PGVER: 14 + PGVER: 16 commands: - <<: *steps-env - <<: *steps-start-postgresql ----------------------------------------------------------------------- Summary of changes: .woodpecker/regress.yml | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Wed Jul 1 20:45:58 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 1 Jul 2026 20:45:58 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-712-g6b318d7b2 Message-ID: <20260702034558.CB94A1B64EB@trac.osgeo.org> 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 6b318d7b20be83aae5ef075ac5297d8caf23135a (commit) from 5459667399bff3bd8d3c24208b712fa38c0fbca2 (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 6b318d7b20be83aae5ef075ac5297d8caf23135a Author: Sandro Santilli Date: Thu Jul 2 05:45:21 2026 +0200 Make CONTRIBUTING.md document more readable diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 80d719602..4c0339d67 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,19 +1,25 @@ -PostGIS development planning happens via a [Trac instance](https://trac.osgeo.org/postgis/). +PostGIS development planning happens via a +[Trac instance](https://trac.osgeo.org/postgis/). In order for proper scheduling of contributions acceptance/merging it is recommended to file a ticket there and add your patch or a link to a patch or to a public git branch where your development is ongoing. -Filing a ticket requires setting up an OSGeo account, which lets you -contribute to every project of the [Open Source Geospatial Foundation](http://www.osgeo.org/). +Filing a ticket requires setting up an +[OSGeo account](https://id.osgeo.org), +which lets you contribute to every project of the +[Open Source Geospatial Foundation](https://www.osgeo.org/). -As we understand you might not want to setup a new account, simply -filing a pull request on one of the [PostGIS code mirrors](https://trac.osgeo.org/postgis/wiki/CodeMirrors) is also welcome, -but it is easier for such contributions to miss our radars unless -it _also_ has a matching Trac ticket. +As we understand you might not want to setup a new account, although it +is easier for such contributions to miss our radars unless they _also_ +have a matching Trac ticket, we also welcome contributions via: + + - Pull requests on any of the [PostGIS code mirrors](https://trac.osgeo.org/postgis/wiki/CodeMirrors) + + - Patches [by email](https://git-send-email.io) + + - Patches in [the chat room](https://postgis.net/community/chat/) If you intend to be involved for more than an occasional patch we -recommend you to subscribe to the [development mailing list](https://lists.osgeo.org/mailman/listinfo/postgis-devel). - -Note that We also welcome -[git patches via email](https://git-send-email.io) +recommend you to setup an OSGeo account and subscribe to the +[development mailing list](https://lists.osgeo.org/mailman/listinfo/postgis-devel). ----------------------------------------------------------------------- Summary of changes: CONTRIBUTING.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Wed Jul 1 21:02:52 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 1 Jul 2026 21:02:52 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-713-g1a6911201 Message-ID: <20260702040252.A1D001B7188@trac.osgeo.org> 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 1a6911201c37ad9dfcdaeddf0d21b90da20a72e9 (commit) from 6b318d7b20be83aae5ef075ac5297d8caf23135a (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 1a6911201c37ad9dfcdaeddf0d21b90da20a72e9 Author: Sandro Santilli Date: Thu Jul 2 06:02:38 2026 +0200 Add a "getting the code" section Mention git notes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4c0339d67..02386b1f6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,5 @@ +# Planning milestones and tracking issues + PostGIS development planning happens via a [Trac instance](https://trac.osgeo.org/postgis/). @@ -10,6 +12,26 @@ Filing a ticket requires setting up an which lets you contribute to every project of the [Open Source Geospatial Foundation](https://www.osgeo.org/). +# Getting the code + +PostGIS source code is maintained in a git repository hosted +by the Open Source Geospatial Foundation (OSGeo). + +You can clone the repository with: + + git clone https://gitea.osgeo.org/postgis/postgis.git + cd postgis + +We occasionally publish commit notes so it is advisable +to configure your clone so it fetches those too: + + git config --add remote.origin.fetch "+refs/notes/*:refs/notes/*" + git fetch origin + git notes list # see git notes --help + git show fba033028 # an example commit containing notes + +# Contributing changes + As we understand you might not want to setup a new account, although it is easier for such contributions to miss our radars unless they _also_ have a matching Trac ticket, we also welcome contributions via: @@ -20,6 +42,8 @@ have a matching Trac ticket, we also welcome contributions via: - Patches in [the chat room](https://postgis.net/community/chat/) +# Getting more seriously involved + If you intend to be involved for more than an occasional patch we recommend you to setup an OSGeo account and subscribe to the [development mailing list](https://lists.osgeo.org/mailman/listinfo/postgis-devel). ----------------------------------------------------------------------- Summary of changes: CONTRIBUTING.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) hooks/post-receive -- PostGIS From git at osgeo.org Wed Jul 1 22:08:42 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 1 Jul 2026 22:08:42 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-714-g3d021d32b Message-ID: <20260702050842.6E7C630082@trac.osgeo.org> 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 3d021d32b46336463576654c4817d6e1f58721a8 (commit) from 1a6911201c37ad9dfcdaeddf0d21b90da20a72e9 (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 3d021d32b46336463576654c4817d6e1f58721a8 Author: Sandro Santilli Date: Thu Jul 2 07:08:22 2026 +0200 Move Makefile target documentation from README to `make help` diff --git a/doc/Makefile.in b/doc/Makefile.in index b7f684108..a24f92c9f 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -159,7 +159,7 @@ endif # TODO: add "html" to the BUILD_TARGET if it can be built -all: $(BUILD_TARGET) +all: $(BUILD_TARGET) ## Build all buildable documentation XML_SOURCES = \ administration.xml \ @@ -351,7 +351,7 @@ $(XML_UNIFIED_POT): $(XML_SOURCE_POTS) fi; # Creates or updates translation files -update-po: $(PO_FILES) +update-po: $(PO_FILES) ## Update translation files to be in sync with the source XML files (see check-localized) $(PO_FILES): $(XML_UNIFIED_POT) @mkdir -p `dirname $@` @@ -403,6 +403,8 @@ postgis-out.xml: postgis.xml Makefile $(XML_INPUTS) Makefile $(PERL) -lpe "s'@@LAST_RELEASE_VERSION@@'${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}'g;s'@@POSTGIS_DOWNLOAD_URL@@'${POSTGIS_DOWNLOAD_URL}'g;" $< > $@.in $(XMLLINT) $(XSLTPROC_PATH_OPT) --noent -o $@ $@.in +chunked-html: ## Generate multi-file html in html/postgis-en/ + chunked-html: $(html_builddir)/postgis$(DOCSUFFIX)/index.html $(html_builddir)/postgis$(DOCSUFFIX)/index.html: postgis-out.xml Makefile $(XSLTPROC) $(XSLTPROC_COMMONOPTS) \ @@ -412,7 +414,11 @@ $(html_builddir)/postgis$(DOCSUFFIX)/index.html: postgis-out.xml Makefile $(CHUNK_HTML_DOCBOOK_XSL) \ $< -html: $(html_builddir)/postgis$(DOCSUFFIX).html +html: $(html_builddir)/postgis$(DOCSUFFIX).html ## Generate a single-file html/postgis-en.html + +html-localized: ## Generate a single-file html/postgis-.html for supported languages +pdf-localized: ## Generate a postgis--.pdf for supported languages +check-localized: ## Check structural correctness of localized (translated) XML documentation. %-localized: rule=$(patsubst %-localized,%,$@); \ @@ -483,14 +489,16 @@ epub-uninstall: epub: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub -pdf: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).pdf +pdf: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).pdf ## Generate postgis--en.pdf doxygen.cfg: doxygen.cfg.in $(PERL) -lpe "s'@@LAST_RELEASE_VERSION@@'${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}'g" $< > $@ -doxygen: doxygen.cfg +doxygen: doxygen.cfg ## Generate developer's documentation using Doxygen doxygen $< +images: ## Generate images used in html and pdf targets + images images-install images-uninstall images-clean: $(MAKE) -C $(images_builddir) $@ @@ -515,7 +523,7 @@ cheatsheet-install: $(GENERATED_CHEATSHEET_FILES) cheatsheet-clean: rm -f $(GENERATED_CHEATSHEET_FILES) -clean: images-clean html-clean pdf-clean epub-clean cheatsheet-clean clean-pot +clean: images-clean html-clean pdf-clean epub-clean cheatsheet-clean clean-pot ## Remove generated files except comments rm -f images # work around https://trac.osgeo.org/postgis/ticket/5422 rm -f $(XML_GENERATED_SOURCES) rm -f postgis-nospecial.xml postgis-nospecial.xml.in @@ -537,9 +545,11 @@ distclean: clean $(MAKE) distclean-localized rm -f Makefile Makefile.comments -maintainer-clean: distclean +maintainer-clean: distclean ## Remove all generated files (including comments) rm -f $(GENERATED_COMMENT_FILES) +comments: ## Generate SQL scripts that add COMMENTs for every function (derived from the documentation) + ifneq ($(CAN_BUILD_COMMENTS),yes) comments: else @@ -548,6 +558,8 @@ endif cheatsheets: $(GENERATED_CHEATSHEET_FILES) +comments-install: ## Install the SQL comment scripts to the PostgreSQL contrib directory + ifneq ($(CAN_BUILD_COMMENTS),yes) comments-install: if test -e postgis_comments.sql -a \ @@ -561,7 +573,7 @@ comments-install: comments $(MAKE) -f Makefile.comments install endif -comments-uninstall: +comments-uninstall: ## Removes the SQL comment scripts from the PostgreSQL contrib directory $(MAKE) -f Makefile.comments uninstall man-install: man/shp2pgsql.1 man/pgsql2shp.1 man/raster2pgsql.1 man/pgtopo_export.1 man/pgtopo_import.1 man/postgis.1 man/postgis_restore.1 @@ -606,9 +618,9 @@ docs-install: html-install html-assets-install docs-uninstall: html-uninstall html-assets-uninstall rm -f $(DESTDIR)$(PGSQL_DOCDIR)/postgis/README.postgis -install: comments-install man-install +install: comments-install man-install ## Install sql comments and man pages -uninstall: comments-uninstall man-uninstall +uninstall: comments-uninstall man-uninstall ## Uninstall sql comments and man pages ifeq ($(XSLTPROC),) garden: requirements_not_met_xsltproc @@ -619,7 +631,7 @@ endif %_gardentest_${POSTGIS_MAJOR_VERSION}${POSTGIS_MINOR_VERSION}.sql: xsl/%_gardentest.sql.xsl postgis-out.xml $(XSLTPROC) -o $@ $(XSLTPROC_PATH_OPT) $^ -check: check-unit +check: check-unit ## Check structural correctness of XML documentation with DocBook DTD, RelaxNG, and XMLSchema validation check-regress: check-unit: $(CHECK_UNIT_TARGET) @@ -703,3 +715,6 @@ requirements_not_met_xml2pot: @echo "configure was unable to find the 'xml2pot' utility program." @echo "To update the translation templates, install poxml and then re-run configure." @echo + +help: ## Print this help message + @grep -E '^[a-zA-Z._-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/doc/README b/doc/README index 865190eb3..6e99f44fc 100644 --- a/doc/README +++ b/doc/README @@ -8,74 +8,13 @@ PostGIS documentation is written in DocBook XML. The input file is ``postgis.xml``, which in turn includes all the individual chapter XML files. From that file we can publish several formats, including HTML and PDF. +The documentation can be translated to multiple languages, see po/README for +instructions about how to do that. + Make targets ------------ -``make`` - same as ``make comments`` - -``make install`` - same as ``make comments-install`` - -``make uninstall`` - same as ``make comments-uninstall`` - -``make html`` - generates a single-file ``html/postgis.html`` - -``make html-localized`` - generates single-file ``html/postgis-.html`` for - each supported language - -``make chunked-html`` - generates a separate html file for every chapter or section break - You can use CHUNKED_HTML_USER_OPTS environment variable to tweak - the output, for example: - > make chunked-html XSLTPROCFLAGS="--stringparam html.script custom.js - -``make pdf`` - generates a single PDF file with the PostGIS version as a filename - -``make pdf-localized`` - generates a single PDF file with the PostGIS version as a filename - and ``-`` suffix for each supported language - -``make images`` - generates all the images used in the HTML and PDF targets - -``make comments`` - generates an SQL script that add COMMENTs for every function (derived from - the documentation) - -``make doxygen`` - generates the developer's documentation using Doxygen - -``make comments-install`` - copies the ``postgis-comments.sql`` script to the PostgreSQL ``contrib`` - directory - -``make comments-uninstall`` - removes the ``postgis-comments.sql`` script from the ``contrib`` directory - -``make clean`` - removes generated files except comments - -``make maintainer-clean`` - removes all generated files (including comments) - -``make update-po`` - update translation files to be in sync with the source - XML files. See ``make check-localized`` - -``make check`` - check structural correctness of XML documentation with DocBook DTD, - RelaxNG, and XMLSchema validation - -``make check-localized`` - check structural correctness of localized (translated) - XML documentation. Remember to run this before committing - updates to translation files (see ``make update-po``) - +Run `make help` to get help on notable targets. Requirements ------------ diff --git a/doc/po/README b/doc/po/README index b38e3203a..447de9efb 100644 --- a/doc/po/README +++ b/doc/po/README @@ -7,9 +7,9 @@ In language subdirectories, run ``make`` to build localized manual and comments, ``make local-pdf`` for the pdf. In parent directory (doc), run ``make update-po`` to update the translation -files to be in sync with the source code, ``make html-localized`` or -``make pdf-localized`` to build the localized html or pdf manual for -all enabled languages +files to be in sync with the source code, ``make check-localized`` to verify +structural correctness, ``make html-localized`` or ``make pdf-localized`` +to build the localized html or pdf manual for all enabled languages Adding languages ---------------- @@ -28,7 +28,7 @@ Adding new languages implies (relative to doc/ dir): - Running `make update-po` - Check the new language works: - make -C po/ + make -C po/ local-check html pdf - Add to the git repository the changes in the Makefile.in and all the new files in the po// ----------------------------------------------------------------------- Summary of changes: doc/Makefile.in | 37 ++++++++++++++++++++++--------- doc/README | 69 ++++----------------------------------------------------- doc/po/README | 8 +++---- 3 files changed, 34 insertions(+), 80 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Wed Jul 1 22:16:05 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 1 Jul 2026 22:16:05 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-715-g1cc22bee3 Message-ID: <20260702051606.2E04E3039C@trac.osgeo.org> 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 1cc22bee30384622c4fa3601408d5e56ef03126a (commit) from 3d021d32b46336463576654c4817d6e1f58721a8 (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 1cc22bee30384622c4fa3601408d5e56ef03126a Author: Sandro Santilli Date: Thu Jul 2 07:14:45 2026 +0200 Add epub make target documentation, tweak order of make help output diff --git a/doc/Makefile.in b/doc/Makefile.in index a24f92c9f..c8255543b 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -158,8 +158,10 @@ endif # TODO: add "html" to the BUILD_TARGET if it can be built +all: $(BUILD_TARGET) ## Build any buildable documentation assets except html (comments, pdf, epub) -all: $(BUILD_TARGET) ## Build all buildable documentation +help: ## Print this help message + @grep -E '^[a-zA-Z._-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' XML_SOURCES = \ administration.xml \ @@ -415,10 +417,7 @@ $(html_builddir)/postgis$(DOCSUFFIX)/index.html: postgis-out.xml Makefile $< html: $(html_builddir)/postgis$(DOCSUFFIX).html ## Generate a single-file html/postgis-en.html - html-localized: ## Generate a single-file html/postgis-.html for supported languages -pdf-localized: ## Generate a postgis--.pdf for supported languages -check-localized: ## Check structural correctness of localized (translated) XML documentation. %-localized: rule=$(patsubst %-localized,%,$@); \ @@ -487,9 +486,11 @@ epub-install: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGI epub-uninstall: rm -f $(DESTDIR)$(docdir)/postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub -epub: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub +epub: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub ## Generate postgis--en.epub +pdf-localized: ## Generate a postgis--.epub for supported languages pdf: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).pdf ## Generate postgis--en.pdf +pdf-localized: ## Generate a postgis--.pdf for supported languages doxygen.cfg: doxygen.cfg.in $(PERL) -lpe "s'@@LAST_RELEASE_VERSION@@'${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}'g" $< > $@ @@ -632,6 +633,8 @@ endif $(XSLTPROC) -o $@ $(XSLTPROC_PATH_OPT) $^ check: check-unit ## Check structural correctness of XML documentation with DocBook DTD, RelaxNG, and XMLSchema validation +check-localized: ## Check structural correctness of localized (translated) XML documentation. + check-regress: check-unit: $(CHECK_UNIT_TARGET) @@ -715,6 +718,3 @@ requirements_not_met_xml2pot: @echo "configure was unable to find the 'xml2pot' utility program." @echo "To update the translation templates, install poxml and then re-run configure." @echo - -help: ## Print this help message - @grep -E '^[a-zA-Z._-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' ----------------------------------------------------------------------- Summary of changes: doc/Makefile.in | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Wed Jul 1 22:30:17 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 02 Jul 2026 05:30:17 -0000 Subject: [PostGIS] #6089: wrong node used when adding a new long line In-Reply-To: <050.8342530935d675946b264362c06bda65@osgeo.org> References: <050.8342530935d675946b264362c06bda65@osgeo.org> Message-ID: <065.ce0f5e6c4e97460f851059ac632cb0e3@osgeo.org> #6089: wrong node used when adding a new long line --------------------------------+-------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: closed Priority: medium | Milestone: Component: topology | Version: master Resolution: invalid | Keywords: snap --------------------------------+-------------------- Comment (by strk): Thanks Lars, if you do create a new ticket please reference this ticket. I recommend you to do create the new ticket (an enhancement ticket) and maybe also a wiki page to draft a specification for what you'd like to see happen, with various cases that might be encountered (I can think about many which would break the "only snap to closest vertex"). -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Thu Jul 2 21:47:24 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 2 Jul 2026 21:47:24 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-718-g02f843698 Message-ID: <20260703044724.849751953F7@trac.osgeo.org> 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 02f84369857b2ce0d9d4036d79f7ac28be285619 (commit) via 9d91cff7bda1409902b47ec825303f1a9a238e66 (commit) via 0adb0647f56b7580bccaff7057acd775ca8ee616 (commit) from 1cc22bee30384622c4fa3601408d5e56ef03126a (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 02f84369857b2ce0d9d4036d79f7ac28be285619 Author: Lo?c Bartoletti Date: Fri Jun 26 07:31:39 2026 +0200 refactor: rename lwgeom_nurbs.c to lwnurbscurve.c diff --git a/liblwgeom/Makefile.in b/liblwgeom/Makefile.in index d053cddc0..00bb96470 100644 --- a/liblwgeom/Makefile.in +++ b/liblwgeom/Makefile.in @@ -122,7 +122,7 @@ SA_OBJS = \ lwgeom_geos_cluster.o \ lwgeom_geos_node.o \ lwgeom_geos_split.o \ - lwgeom_nurbs.o \ + lwnurbscurve.o \ topo/lwgeom_topo.o \ topo/lwgeom_topo_polygonizer.o \ topo/lwt_edgeend.o \ diff --git a/liblwgeom/lwgeom_nurbs.c b/liblwgeom/lwnurbscurve.c similarity index 100% rename from liblwgeom/lwgeom_nurbs.c rename to liblwgeom/lwnurbscurve.c commit 9d91cff7bda1409902b47ec825303f1a9a238e66 Author: Lo?c Bartoletti Date: Fri Jun 26 07:30:30 2026 +0200 fix: free points/bbox on construct failure in NURBS clone/force_dims diff --git a/liblwgeom/lwgeom_nurbs.c b/liblwgeom/lwgeom_nurbs.c index a55bd4197..7af0d2cb9 100644 --- a/liblwgeom/lwgeom_nurbs.c +++ b/liblwgeom/lwgeom_nurbs.c @@ -237,9 +237,15 @@ lwnurbscurve_clone_deep(const LWNURBSCURVE *curve) GBOX *bbox = curve->bbox ? gbox_copy(curve->bbox) : NULL; /* lwnurbscurve_construct will deep-copy weights and knots arrays */ - return lwnurbscurve_construct(curve->srid, bbox, curve->degree, points, + LWNURBSCURVE *result = lwnurbscurve_construct(curve->srid, bbox, curve->degree, points, curve->weights, curve->knots, curve->nweights, curve->nknots); + if (!result) + { + ptarray_free(points); + if (bbox) lwfree(bbox); + } + return result; } LWNURBSCURVE * @@ -255,9 +261,14 @@ lwnurbscurve_force_dims(const LWNURBSCURVE *curve, int hasz, int hasm, double zv points = ptarray_force_dims(curve->points, hasz, hasm, zval, mval); - return lwnurbscurve_construct(curve->srid, NULL, curve->degree, points, + LWNURBSCURVE *result = lwnurbscurve_construct(curve->srid, NULL, curve->degree, points, curve->weights, curve->knots, curve->nweights, curve->nknots); + if (!result) + { + ptarray_free(points); + } + return result; } /** commit 0adb0647f56b7580bccaff7057acd775ca8ee616 Author: Lo?c Bartoletti Date: Fri Jun 26 07:08:54 2026 +0200 fix: guard ST_MakeNurbsCurve optional args diff --git a/postgis/lwgeom_nurbs_functions.c b/postgis/lwgeom_nurbs_functions.c index 62c90125f..aa0e5f333 100644 --- a/postgis/lwgeom_nurbs_functions.c +++ b/postgis/lwgeom_nurbs_functions.c @@ -179,10 +179,10 @@ Datum ST_MakeNurbsCurve(PG_FUNCTION_ARGS) pcontrol_pts = PG_GETARG_GSERIALIZED_P(1); /* Optional parameters */ - if (!PG_ARGISNULL(2)) { + if (PG_NARGS() > 2 && !PG_ARGISNULL(2)) { weights_array = PG_GETARG_ARRAYTYPE_P(2); } - if (!PG_ARGISNULL(3)) { + if (PG_NARGS() > 3 && !PG_ARGISNULL(3)) { knots_array = PG_GETARG_ARRAYTYPE_P(3); } ----------------------------------------------------------------------- Summary of changes: liblwgeom/Makefile.in | 2 +- liblwgeom/{lwgeom_nurbs.c => lwnurbscurve.c} | 15 +++++++++++++-- postgis/lwgeom_nurbs_functions.c | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) rename liblwgeom/{lwgeom_nurbs.c => lwnurbscurve.c} (98%) hooks/post-receive -- PostGIS From trac at osgeo.org Sat Jul 4 16:18:42 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 04 Jul 2026 23:18:42 -0000 Subject: [PostGIS] #6090: proj 9.8.1 not being completely detected under mingw64 windows Message-ID: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> #6090: proj 9.8.1 not being completely detected under mingw64 windows --------------------------+--------------------------- Reporter: robe | Owner: robe Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: QA/buildbots | Version: master Keywords: windows | --------------------------+--------------------------- This is annoying, for some reason switching from proj 8.2.1 to 9.8.1, it doesn't get completely detected unless I include --with-projdir in my configure. Didn't need it for proj 8.2.1, having in PKG_CONFIG_PATH was sufficient for 8.2.1 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 4 16:22:38 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 04 Jul 2026 23:22:38 -0000 Subject: [PostGIS] #6090: proj 9.8.1 not being completely detected under mingw64 windows In-Reply-To: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> References: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> Message-ID: <061.b5930a6beea66255ccee6b50b16e670c@osgeo.org> #6090: proj 9.8.1 not being completely detected under mingw64 windows ---------------------------+--------------------------- Reporter: robe | Owner: robe Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: QA/buildbots | Version: master Resolution: | Keywords: windows ---------------------------+--------------------------- Comment (by robe): My pkg_config_path looks like this: {{{ /projects/sqlite/rel- sqlite3w64/lib/pkgconfig:/projects/protobuf/rel-3.2.0w64/lib/pkgconfig:/projects/json-c/rel-0.16w64/lib/pkgconfig:/projects/proj /rel- proj-9.8.1w64/lib/pkgconfig:/projects/gdal/rel-3.13.1w64/lib/pkgconfig:/projects/zlib /rel- zlib-1.2.13w64/lib/pkgconfig:/projects/gtkw64/lib/pkgconfig:/mingw/x86_64-w64-mingw32/lib/pkgconfig }}} and /projects/proj/rel-proj-9.8.1w64/lib/pkgconfig is the config folder for my proj. I did have to fix paths in the proj.pc which I also did for the 8.2.1 but that did not fix the issue. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 4 17:12:19 2026 From: trac at osgeo.org (PostGIS) Date: Sun, 05 Jul 2026 00:12:19 -0000 Subject: [PostGIS] #6090: proj 9.8.1 not being completely detected under mingw64 windows In-Reply-To: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> References: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> Message-ID: <061.e5d5f4d69f6d03a7821b1bc0f398ae11@osgeo.org> #6090: proj 9.8.1 not being completely detected under mingw64 windows ---------------------------+--------------------------- Reporter: robe | Owner: robe Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: QA/buildbots | Version: master Resolution: | Keywords: windows ---------------------------+--------------------------- Comment (by robe): even with thte --with-projdir it fails on the fuzzing engine check with {{{ C="cc" CXX="g++" CPPFLAGS=" -IE:/jenkins/geos/rel-3.15w64/include -I/projects/proj/rel-proj-9.8.1w64/include -IE:/jenkins/protobuf/rel-3.2.0w64/include -I/projects/libxml/rel- libxml2-2.12.5w64/include/libxml2 -IC:/ming64/mingw64/bin/../include -I/projects/CGAL/rel-sfcgal-2.3.0w64/include -IE:/jenkins/json-c/rel-0.16w64/include -IE:/jenkins/json-c/rel-0.16w64/include/json-c -DNDEBUG -I/projects/postgresql/rel/pg19w64/include -I/projects/rel- libiconv-1.17w64/include " CXXFLAGS="-L/projects/postgis/branches/3.7/fuzzers " LDFLAGS=" -Wl ,--enable-auto-import -L/projects/postgresql/rel/pg19w64/lib -L/projects/lz4/rel-lz4-1.9.3w64/lib -L/projects/rel-libiconv-1.17w64/lib -L/projects/zlib/rel-zlib-1.2.13w64/lib -lm -LE:/jenkins/geos/rel-3.15w64/lib -lgeos_c -L/projects/proj/rel- proj-9.8.1w64/lib -lproj -LE:/jenkins/json-c/rel-0.16w64/lib -ljson-c " POSTGIS_BUILD_DIR="/projects/postgis/branches/3.7" SRC="/projects/postgis/branches/3.7/fuzzers" OUT="/projects/postgis/tmp/3.7.0dev_pg19_geos3.15_gdal3.13.1w64/postgis- fuzzer-check.RnNeOM" /projects/postgis/branches/3.7/fuzzers/build_google_oss_fuzzers.sh Building fuzzer geojson_import_fuzzer C:/ming64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lproj_9: No such file or directory collect2.exe: error: ld returned 1 exit status }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 4 18:14:44 2026 From: trac at osgeo.org (PostGIS) Date: Sun, 05 Jul 2026 01:14:44 -0000 Subject: [PostGIS] #6090: proj 9.8.1 not being completely detected under mingw64 windows In-Reply-To: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> References: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> Message-ID: <061.1e001a9efbc5a5d310f8c9a70be2f5cd@osgeo.org> #6090: proj 9.8.1 not being completely detected under mingw64 windows ---------------------------+--------------------------- Reporter: robe | Owner: robe Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: QA/buildbots | Version: master Resolution: | Keywords: windows ---------------------------+--------------------------- Comment (by robe): fundamental issue seems to be with the pkg-config/proj.pc, if I copy the 8.2.1 one except changing the paths and version number it gets thru compile. Testing now to see if this fixes the fuzzy issue too. the original for 9.8.1 pkgconfig/proj.pc looks like {{{ prefix=/projects/proj/rel-proj-9.8.1w64 libdir=${prefix}/lib includedir=${prefix}/include datarootdir=${prefix}/share datadir=${datarootdir}/proj Name: PROJ Description: Coordinate transformation software library Requires: Version: 9.8.1 Libs: -L${libdir} -lproj_9 Libs.private: -lstdc++ -lgcc_s -lgcc_s Requires.private: sqlite3 libtiff libcurl Cflags: -I${includedir} }}} I changed it to essentially the 8.2.1 version but replacing the version number references {{{ prefix=/projects/proj/rel-proj-9.8.1w64 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include datarootdir=${prefix}/share datadir=${datarootdir}/proj Name: PROJ Description: Coordinate transformation software library Requires: Version: 9.8.1 Libs: -L${libdir} -lproj Libs.private: -lstdc++ -lsqlite3 -ltiff -lcurl Cflags: -I${includedir} }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 4 21:37:31 2026 From: trac at osgeo.org (PostGIS) Date: Sun, 05 Jul 2026 04:37:31 -0000 Subject: [PostGIS] #6090: proj 9.8.1 not being completely detected under mingw64 windows In-Reply-To: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> References: <046.d7da21b3fa008ce5aa50a869cec9f960@osgeo.org> Message-ID: <061.7502c2aa514b3e773394e27e9501641f@osgeo.org> #6090: proj 9.8.1 not being completely detected under mingw64 windows ---------------------------+--------------------------- Reporter: robe | Owner: robe Type: defect | Status: closed Priority: medium | Milestone: PostGIS 3.7.0 Component: QA/buildbots | Version: master Resolution: fixed | Keywords: windows ---------------------------+--------------------------- Changes (by robe): * resolution: => fixed * status: new => closed Comment: that seems to have fixed fuzzy too. Close out for now. Not an ideal fix but good enough. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Sun Jul 5 00:06:22 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 5 Jul 2026 00:06:22 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-723-g1386a7b21 Message-ID: <20260705070623.33E0C1B098A@trac.osgeo.org> 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 1386a7b21adb127818b215521509f0a0e729a2ec (commit) from 7d3e202d3db1b718adafc7fc0bbf22f57460b35f (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 1386a7b21adb127818b215521509f0a0e729a2ec Author: Regina Obe Date: Sun Jul 5 03:04:29 2026 -0400 Updates for NEWS - Move some news items from Bug fixes to Enhancements / Breaking Changes - Add news to release_notes - Update pot diff --git a/NEWS b/NEWS index 6453e122b..1a7f8db0a 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,7 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed https://git.osgeo.org/postgis/postgis_tiger_geocoder (Regina Obe) - #6079, Remove support for GEOS < 3.10 (Sandro Santilli) - #1793, Remove ST_MemCollect aggregate (Darafei Praliaskouski) + - GH-848, CG_AlphaShape now returns a MultiPolygon (Jean Felder) * New Features * @@ -56,6 +57,10 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - GT-270, Add NURBSCurve (Lo?c Bartoletti) - #2863, Add ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei Praliaskouski) + - [fuzzers] Centralize OSS-Fuzz build/dependency logic in PostGIS scripts, + prefer requested CXX over pg_config --cc for internal C++ checks, and + make fuzzer linking/runtime dependency packaging portable + (Darafei Praliaskouski) * Enhancements * @@ -86,23 +91,42 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - #6087, Add a repository-owned CI status checker and static dashboard generator (Darafei Praliaskouski) - -* Bug Fixes * - - #2807, [raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei Praliaskouski) - #2832, [raster] Avoid padding single-tile raster2pgsql overviews when padding is not requested (Darafei Praliaskouski) - #2623, Generate a pgsql2shp GID field when exporting geometry-only shapefiles (Darafei Praliaskouski) + - #2850, Preserve pgsql2shp numeric precision and scale in DBF metadata + (Darafei Praliaskouski) + - #2386, Add raster2pgsql man page (Darafei Praliaskouski) + - Build PostgreSQL extension modules with `-fno-semantic-interposition` when + available so LTO can optimize same-DSO calls to exported PostGIS + entry points directly instead of routing through the module PLT; in + a local PostgreSQL 18 `pgbench` microbenchmark over 100k four-point + groups this reduced `ST_Collect` aggregate latency by about 4% + (Darafei Praliaskouski) + - #5973, Install PostGIS utilities under `pg_config --bindir` by default + and document `pg_config`-derived install paths more accurately + (Darafei Praliaskouski) + - #2808, Clarify postgis_full_version() output when installed component + scripts are newer than core scripts (Darafei Praliaskouski) + - #5593, Docs: render manual images with GraphicsMagick without temporary files, + enabling parallel builds, keeping ImageMagick fallbacks working, and + documenting the generator workflow for contributors (Darafei Praliaskouski) + - #5645, Docs: keep code operators ("=>") intact in translated manuals + by enforcing verbatim CSS (Darafei Praliaskouski) + - #1408, Docs: flatten transparent manual images onto white backgrounds for + PDF builds while keeping HTML images transparent (Darafei Praliaskouski) + +* Bug Fixes * + - #4616, Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski) - #2838, Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski) - Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei Praliaskouski) - - #2850, Preserve pgsql2shp numeric precision and scale in DBF metadata - (Darafei Praliaskouski) - #6083, Pass configured dependency include paths to fuzzer smoke builds (Darafei Praliaskouski) - #3103, Add regression coverage for exact-schema find_srid and @@ -117,15 +141,12 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed deprecated-function cleanup (Darafei Praliaskouski) - GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks (Darafei Praliaskouski) - - #2386, Add missing raster2pgsql man page (Darafei Praliaskouski) - #5975, Initialize skipped union-find cluster ids deterministically (Darafei Praliaskouski) - #5904, [topology] Avoid MinGW format warnings when logging topology ids (Darafei Praliaskouski) - GH-885, [topology] Avoid GMP overflow in ring orientation for very large finite coordinates (Darafei Praliaskouski) - - GH-892, Add OSS-Fuzz coverage for TWKB and serialized raster inputs, - including guards for malformed TWKB reads and counts (Darafei Praliaskouski) - #6073, #6074, Stabilize geography LRS endpoint interpolation and pole centroid regressions on 32-bit systems (Darafei Praliaskouski) - #6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL @@ -133,8 +154,6 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - GH-888, [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input handling for SFCGAL < 2.2 (Darafei Praliaskouski) - - #2808, Clarify postgis_full_version() output when installed component - scripts are newer than core scripts (Darafei Praliaskouski) - #3179, Mark truncated libpgcommon PostgreSQL messages instead of silently dropping the tail (Darafei Praliaskouski) - #6003, Avoid size_t formats in liblwgeom logging/error wrappers for @@ -145,20 +164,9 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed short DE-9IM patterns (Darafei Praliaskouski) - GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei Praliaskouski) - - Build PostgreSQL extension modules with `-fno-semantic-interposition` when - available so LTO can optimize same-DSO calls to exported PostGIS - entry points directly instead of routing through the module PLT; in - a local PostgreSQL 18 `pgbench` microbenchmark over 100k four-point - groups this reduced `ST_Collect` aggregate latency by about 4% - (Darafei Praliaskouski) - - #5973, Install PostGIS utilities under `pg_config --bindir` by default - and document `pg_config`-derived install paths more accurately - (Darafei Praliaskouski) - #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid size exceeds their extent (Darafei Praliaskouski) - #5959, Prevent histogram target overflow when analysing massive tables (Darafei Praliaskouski) - - GH-901, Stop loader upgrade helper from marking postgis_tiger_geocoder - for extension upgrade (Darafei Praliaskouski) - #6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei Praliaskouski) - GH-895, Qualify pg_class lookup during SRID/PROJ validation @@ -169,18 +177,6 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei Praliaskouski) - - #5645, Docs: keep code operators ("=>") intact in translated manuals - by enforcing verbatim CSS (Darafei Praliaskouski) - - #5593, Docs: render manual images with GraphicsMagick without temporary files, - enabling parallel builds, keeping ImageMagick fallbacks working, and - documenting the generator workflow for contributors (Darafei Praliaskouski) - - #1408, Docs: flatten transparent manual images onto white backgrounds for - PDF builds while keeping HTML images transparent (Darafei Praliaskouski) - - [fuzzers] Centralize OSS-Fuzz build/dependency logic in PostGIS scripts, - prefer requested CXX over pg_config --cc for internal C++ checks, and - make fuzzer linking/runtime dependency packaging portable - (Darafei Praliaskouski) - - GH-848, CG_AlphaShape now returns a MultiPolygon (Jean Felder) - Flatgeobuf schema mismatch vulnerability (NeuroWinter) - #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) - #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN diff --git a/doc/po/templates/postgis-manual.pot b/doc/po/templates/postgis-manual.pot index 9336fecfc..a411023e1 100644 --- a/doc/po/templates/postgis-manual.pot +++ b/doc/po/templates/postgis-manual.pot @@ -35639,21 +35639,21 @@ msgstr "" #. Tag: title #, no-c-format -msgid "PostGIS 3.7.0beta1" +msgid "PostGIS 3.7.0alpha1" msgstr "" -#. Tag: para +#. Tag: subtitle #, no-c-format -msgid "2026/06/xx" +msgid "2026/07/05" msgstr "" #. Tag: para #, no-c-format msgid "" -"This version requires GEOS 3.10 or higher. PostgreSQL 14-19beta1 required. " -"Proj 6.1+ required. To take advantage of all features postgis extension " -"features, GEOS 3.15+ is needed. To take advantage of all postgis_sfcgal " -"extension features SFCGAL 2.2+ is needed." +"This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. " +"To take advantage of all features postgis extension features, GEOS 3.15+ is " +"needed. To take advantage of all postgis_sfcgal extension features SFCGAL " +"2.3+ is needed." msgstr "" #. Tag: title @@ -35663,7 +35663,64 @@ msgstr "" #. Tag: para #, no-c-format -msgid "Place holder" +msgid "" +"#5688, " +"[topology] topology building functions now interpret tolerance 0 (old " +"default) to really mean 0 and want -1 (new default) to mean "use " +"topology precision" (Sandro Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6024, " +"Remove support for PostgreSQL 12 and 13 (Regina Obe)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6040, " +"ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6053, " +"[address_standardizer] Extension removed and moved to https://github.com/postgis/" +"address_standardizer (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6052, " +"[tiger_geocoder] Extension removed and moved to https://git.osgeo.org/postgis/" +"postgis_tiger_geocoder (Regina Obe)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6079, " +"Remove support for GEOS < 3.10 (Sandro Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#1793, " +"Remove ST_MemCollect aggregate (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-848, " +"CG_AlphaShape now returns a MultiPolygon (Jean Felder)" msgstr "" #. Tag: title @@ -35671,6 +35728,662 @@ msgstr "" msgid "New Features" msgstr "" +#. Tag: para +#, no-c-format +msgid "" +"#1124, " +"#2935, " +"#3033, " +"#4658, " +"#4659, " +"[loader] Rework loader arguments: shp2pgsql can create UNLOGGED tables and " +"choose the feature id column name, shp2pgsql --drop-table can emit DROP " +"TABLE before prepare output, raster2pgsql/shp2pgsql expose loader actions as " +"long options, both loaders accept long aliases for existing options, and" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"-if-not-exists makes creation actions idempotent (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4208, Add " +"single-geometry variants of ST_MaxDistance and ST_LongestLine (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"[topology] FindVertexSegmentPairsBelowDistance function (Sandro Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"ST_CoverageEdges, returns MultiLinestring of distinct shared edges in " +"polygonal coverage (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "ST_MinimumSpanningTree, window function to calculate MST (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5993, " +"[topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6001, " +"support MultiLineString in ST_MakeLine (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2858, " +"ST_MMin and ST_MMax (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5941, " +"[raster] Support GDT_Float16 pixel type (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5992, " +"Optimize GiST index for repeated edge subdivision in topology (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5702, " +"Allow the compiler to detect the parallelism -flto=auto (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4798, " +"ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5950, " +"Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4332, " +"Clarify the scope of several Function Reference categories (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4222, " +"[raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5109, " +"Document the meaning of topology.next_left_edge and topology.next_right_edge " +"links (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5889, " +"[topology] Include representative locations in topology build errors " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2614, Use " +"GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6022, " +"Document ST_AsMVTGeom tile-coordinate simplification (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-839, " +"ST_Multi support for TIN and surfaces (Lo?c Bartoletti)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4398, Add " +"ST_CatmullSmoothing smoothes but retains original vertices (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4560, " +"ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#1291, " +"ST_MakePolygon support for curved rings (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GT-270, Add NURBSCurve (Lo?c Bartoletti)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2863, Add " +"ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"[fuzzers] Centralize OSS-Fuzz build/dependency logic in PostGIS scripts, " +"prefer requested CXX over pg_config --cc for internal C++ checks, and make " +"fuzzer linking/runtime dependency packaging portable (Darafei Praliaskouski)" +msgstr "" + +#. Tag: title +#, no-c-format +msgid "Enhancements" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2045, " +"pgsql2shp query dumps no longer require temporary table privileges (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#1577, " +"[loader] Report unsupported .zip archive input before trying to open " +"shapefile sidecar files (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#3158, " +"Move geometry and geography typmod bit helpers out of the public liblwgeom " +"header (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4678, " +"[raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2116, " +"[raster] Add ST_Value nearest-neighbor boundary options (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2804, " +"#4315, " +"[raster] Support two-argument ST_MapAlgebra callbacks and pass callback call " +"data as actual arguments (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2898, " +"Document SQL function cost tiers for contributors" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6062, " +"[topology] Stop using recursive snapping, for improved robustness (Sandro " +"Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6065, " +"Improved winding order computation robustness for rings having collapsed " +"elements (Sandro Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#3743, " +"#4385, " +"[raster loader] Document raster2pgsql -s FROM_SRID:SRID reprojection support " +"and clarify index creation timing for append loads (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2137, " +"[raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4749, Use " +"point-in-polygon predicate fast paths for point-only GeometryCollections " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5532, " +"Validate the manual against DocBook XMLSchema in check-xml (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6087, Add " +"a repository-owned CI status checker and static dashboard generator (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2807, " +"[raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2832, " +"[raster] Avoid padding single-tile raster2pgsql overviews when padding is " +"not requested (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2623, " +"Generate a pgsql2shp GID field when exporting geometry-only shapefiles " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2850, " +"Preserve pgsql2shp numeric precision and scale in DBF metadata (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2386, Add " +"raster2pgsql man page (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"Build PostgreSQL extension modules with `-fno-semantic-interposition` when " +"available so LTO can optimize same-DSO calls to exported PostGIS entry " +"points directly instead of routing through the module PLT; in a local " +"PostgreSQL 18 `pgbench` microbenchmark over 100k four-point groups this " +"reduced `ST_Collect` aggregate latency by about 4% (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5973, " +"Install PostGIS utilities under `pg_config --bindir` by default and document " +"`pg_config`-derived install paths more accurately (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2808, " +"Clarify postgis_full_version() output when installed component scripts are " +"newer than core scripts (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5593, " +"Docs: render manual images with GraphicsMagick without temporary files, " +"enabling parallel builds, keeping ImageMagick fallbacks working, and " +"documenting the generator workflow for contributors (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5645, " +"Docs: keep code operators ("=>") intact in translated manuals " +"by enforcing verbatim CSS (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#1408, " +"Docs: flatten transparent manual images onto white backgrounds for PDF " +"builds while keeping HTML images transparent (Darafei Praliaskouski)" +msgstr "" + +#. Tag: title +#, no-c-format +msgid "Bug Fixes" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4616, " +"Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2838, " +"Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6083, " +"Pass configured dependency include paths to fuzzer smoke builds (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#3103, Add " +"regression coverage for exact-schema find_srid and geometry_columns lookups " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#1705, " +"Infer constraint metadata for direct view and materialized view geometry " +"columns (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6038, " +"Avoid stale relation lookups in geometry_columns after topology objects are " +"dropped (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5655, " +"[doc] Skip XML validation during `make check` when xsltproc is unavailable " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5487, " +"Improve error detail for repeated upgrades after an incomplete deprecated-" +"function cleanup (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-899, " +"[raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5975, " +"Initialize skipped union-find cluster ids deterministically (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5904, " +"[topology] Avoid MinGW format warnings when logging topology ids (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-885, " +"[topology] Avoid GMP overflow in ring orientation for very large finite " +"coordinates (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6073, " +"#6074, " +"Stabilize geography LRS endpoint interpolation and pole centroid regressions " +"on 32-bit systems (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6082, Fix " +"Japanese PDF build by avoiding non-ASCII arrows in SQL program listings " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-888, " +"[sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input " +"handling for SFCGAL < 2.2 (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#3179, " +"Mark truncated libpgcommon PostgreSQL messages instead of silently dropping " +"the tail (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6003, " +"Avoid size_t formats in liblwgeom logging/error wrappers for MinGW builds " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-886, " +"ST_ClusterRelateWin validates NULL relate matrices before detoasting them " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-889, " +"ST_Relate pattern inversion avoids out-of-bounds access on short DE-9IM " +"patterns (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-890, " +"Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5948, " +"[topology] Prevent MakeTopologyPrecise from erasing edges when grid size " +"exceeds their extent (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5959, " +"Prevent histogram target overflow when analysing massive tables (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6080, " +"Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-895, " +"Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4828, " +"geometry_columns handles NOT VALID SRID checks without errors (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6048, " +"[raster] ST_Clip no longer crashes when clipping sparse band selections " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-894, " +"[raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, " +"GDAL credential redaction, and Python GDAL compatibility (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "Flatgeobuf schema mismatch vulnerability (NeuroWinter)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5899, " +"pg_upgrade issue for non-standard geography SRID (Paul Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2583, " +"Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei " +"Praliaskouski)" +msgstr "" + #. Tag: title #, no-c-format msgid "Reporting Problems" diff --git a/doc/release_notes.xml b/doc/release_notes.xml index 7336bf631..d46b71987 100644 --- a/doc/release_notes.xml +++ b/doc/release_notes.xml @@ -2,19 +2,112 @@ Appendix Release Notes -
- PostGIS 3.7.0beta1 - 2026/06/xx - This version requires GEOS 3.10 or higher. PostgreSQL 14-19beta1 required. Proj 6.1+ required. -To take advantage of all features postgis extension features, GEOS 3.15+ is needed. -To take advantage of all postgis_sfcgal extension features SFCGAL 2.2+ is needed. - - Breaking Changes - Place holder - - - New Features - Place holder - -
+
+ PostGIS 3.7.0alpha1 + 2026/07/05 + This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed. + + Breaking Changes + #5688, [topology] topology building functions now interpret tolerance 0 (old default) to really mean 0 and want -1 (new default) to mean "use topology precision" (Sandro Santilli) + #6024, Remove support for PostgreSQL 12 and 13 (Regina Obe) + #6040, ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey) + #6053, [address_standardizer] Extension removed and moved to https://github.com/postgis/address_standardizer (Paul Ramsey) + #6052, [tiger_geocoder] Extension removed and moved to https://git.osgeo.org/postgis/postgis_tiger_geocoder (Regina Obe) + #6079, Remove support for GEOS < 3.10 (Sandro Santilli) + #1793, Remove ST_MemCollect aggregate (Darafei Praliaskouski) + GH-848, CG_AlphaShape now returns a MultiPolygon (Jean Felder) + + + New Features + #1124, #2935, #3033, #4658, #4659, [loader] Rework loader arguments: shp2pgsql can create UNLOGGED tables and choose the feature id column name, shp2pgsql --drop-table can emit DROP TABLE before prepare output, raster2pgsql/shp2pgsql expose loader actions as long options, both loaders accept long aliases for existing options, and + -if-not-exists makes creation actions idempotent (Darafei Praliaskouski) + #4208, Add single-geometry variants of ST_MaxDistance and ST_LongestLine (Darafei Praliaskouski) + [topology] FindVertexSegmentPairsBelowDistance function (Sandro Santilli) + ST_CoverageEdges, returns MultiLinestring of distinct shared edges in polygonal coverage (Paul Ramsey) + ST_MinimumSpanningTree, window function to calculate MST (Paul Ramsey) + #5993, [topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro Santilli) + #6001, support MultiLineString in ST_MakeLine (Paul Ramsey) + #2858, ST_MMin and ST_MMax (Paul Ramsey) + #5941, [raster] Support GDT_Float16 pixel type (Darafei Praliaskouski) + #5992, Optimize GiST index for repeated edge subdivision in topology (Darafei Praliaskouski) + #5702, Allow the compiler to detect the parallelism -flto=auto (Darafei Praliaskouski) + #4798, ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski) + #5950, Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei Praliaskouski) + #4332, Clarify the scope of several Function Reference categories (Darafei Praliaskouski) + #4222, [raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei Praliaskouski) + #5109, Document the meaning of topology.next_left_edge and topology.next_right_edge links (Darafei Praliaskouski) + #5889, [topology] Include representative locations in topology build errors (Darafei Praliaskouski) + #2614, Use GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul Ramsey) + #6022, Document ST_AsMVTGeom tile-coordinate simplification (Darafei Praliaskouski) + GH-839, ST_Multi support for TIN and surfaces (Lo?c Bartoletti) + #4398, Add ST_CatmullSmoothing smoothes but retains original vertices (Paul Ramsey) + #4560, ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul Ramsey) + #1291, ST_MakePolygon support for curved rings (Darafei Praliaskouski) + GT-270, Add NURBSCurve (Lo?c Bartoletti) + #2863, Add ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei Praliaskouski) + [fuzzers] Centralize OSS-Fuzz build/dependency logic in PostGIS scripts, prefer requested CXX over pg_config --cc for internal C++ checks, and make fuzzer linking/runtime dependency packaging portable (Darafei Praliaskouski) + + + Enhancements + #2045, pgsql2shp query dumps no longer require temporary table privileges (Darafei Praliaskouski) + #1577, [loader] Report unsupported .zip archive input before trying to open shapefile sidecar files (Darafei Praliaskouski) + #3158, Move geometry and geography typmod bit helpers out of the public liblwgeom header (Darafei Praliaskouski) + #4678, [raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski) + #2116, [raster] Add ST_Value nearest-neighbor boundary options (Darafei Praliaskouski) + #2804, #4315, [raster] Support two-argument ST_MapAlgebra callbacks and pass callback call data as actual arguments (Darafei Praliaskouski) + #2898, Document SQL function cost tiers for contributors + #6062, [topology] Stop using recursive snapping, for improved robustness (Sandro Santilli) + #6065, Improved winding order computation robustness for rings having collapsed elements (Sandro Santilli) + #3743, #4385, [raster loader] Document raster2pgsql -s FROM_SRID:SRID reprojection support and clarify index creation timing for append loads (Darafei Praliaskouski) + #2137, [raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei Praliaskouski) + #4749, Use point-in-polygon predicate fast paths for point-only GeometryCollections (Darafei Praliaskouski) + #5532, Validate the manual against DocBook XMLSchema in check-xml (Darafei Praliaskouski) + #6087, Add a repository-owned CI status checker and static dashboard generator (Darafei Praliaskouski) + #2807, [raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei Praliaskouski) + #2832, [raster] Avoid padding single-tile raster2pgsql overviews when padding is not requested (Darafei Praliaskouski) + #2623, Generate a pgsql2shp GID field when exporting geometry-only shapefiles (Darafei Praliaskouski) + #2850, Preserve pgsql2shp numeric precision and scale in DBF metadata (Darafei Praliaskouski) + #2386, Add raster2pgsql man page (Darafei Praliaskouski) + Build PostgreSQL extension modules with `-fno-semantic-interposition` when available so LTO can optimize same-DSO calls to exported PostGIS entry points directly instead of routing through the module PLT; in a local PostgreSQL 18 `pgbench` microbenchmark over 100k four-point groups this reduced `ST_Collect` aggregate latency by about 4% (Darafei Praliaskouski) + #5973, Install PostGIS utilities under `pg_config --bindir` by default and document `pg_config`-derived install paths more accurately (Darafei Praliaskouski) + #2808, Clarify postgis_full_version() output when installed component scripts are newer than core scripts (Darafei Praliaskouski) + #5593, Docs: render manual images with GraphicsMagick without temporary files, enabling parallel builds, keeping ImageMagick fallbacks working, and documenting the generator workflow for contributors (Darafei Praliaskouski) + #5645, Docs: keep code operators ("=>") intact in translated manuals by enforcing verbatim CSS (Darafei Praliaskouski) + #1408, Docs: flatten transparent manual images onto white backgrounds for PDF builds while keeping HTML images transparent (Darafei Praliaskouski) + + + Bug Fixes + #4616, Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski) + #2838, Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski) + Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei Praliaskouski) + #6083, Pass configured dependency include paths to fuzzer smoke builds (Darafei Praliaskouski) + #3103, Add regression coverage for exact-schema find_srid and geometry_columns lookups (Darafei Praliaskouski) + #1705, Infer constraint metadata for direct view and materialized view geometry columns (Darafei Praliaskouski) + #6038, Avoid stale relation lookups in geometry_columns after topology objects are dropped (Darafei Praliaskouski) + #5655, [doc] Skip XML validation during `make check` when xsltproc is unavailable (Darafei Praliaskouski) + #5487, Improve error detail for repeated upgrades after an incomplete deprecated-function cleanup (Darafei Praliaskouski) + GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks (Darafei Praliaskouski) + #5975, Initialize skipped union-find cluster ids deterministically (Darafei Praliaskouski) + #5904, [topology] Avoid MinGW format warnings when logging topology ids (Darafei Praliaskouski) + GH-885, [topology] Avoid GMP overflow in ring orientation for very large finite coordinates (Darafei Praliaskouski) + #6073, #6074, Stabilize geography LRS endpoint interpolation and pole centroid regressions on 32-bit systems (Darafei Praliaskouski) + #6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program listings (Darafei Praliaskouski) + GH-888, [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input handling for SFCGAL < 2.2 (Darafei Praliaskouski) + #3179, Mark truncated libpgcommon PostgreSQL messages instead of silently dropping the tail (Darafei Praliaskouski) + #6003, Avoid size_t formats in liblwgeom logging/error wrappers for MinGW builds (Darafei Praliaskouski) + GH-886, ST_ClusterRelateWin validates NULL relate matrices before detoasting them (Darafei Praliaskouski) + GH-889, ST_Relate pattern inversion avoids out-of-bounds access on short DE-9IM patterns (Darafei Praliaskouski) + GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei Praliaskouski) + #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid size exceeds their extent (Darafei Praliaskouski) + #5959, Prevent histogram target overflow when analysing massive tables (Darafei Praliaskouski) + #6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei Praliaskouski) + GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) + #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) + #6048, [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) + GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei Praliaskouski) + Flatgeobuf schema mismatch vulnerability (NeuroWinter) + #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) + #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei Praliaskouski) + +
----------------------------------------------------------------------- Summary of changes: NEWS | 62 ++- doc/po/templates/postgis-manual.pot | 729 +++++++++++++++++++++++++++++++++++- doc/release_notes.xml | 123 +++++- 3 files changed, 858 insertions(+), 56 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Sun Jul 5 00:24:32 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 5 Jul 2026 00:24:32 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-725-g81bc61980 Message-ID: <20260705072433.23E9A1B10E7@trac.osgeo.org> 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 81bc619802fb3622f6f4c4d6b928dffef80d7531 (commit) from b4d45a08fccbc7a41d6c47f943dc5a7436a29cda (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 81bc619802fb3622f6f4c4d6b928dffef80d7531 Author: Regina Obe Date: Sun Jul 5 03:24:26 2026 -0400 Fix xml links diff --git a/doc/po/templates/postgis-manual.pot b/doc/po/templates/postgis-manual.pot index a411023e1..579904315 100644 --- a/doc/po/templates/postgis-manual.pot +++ b/doc/po/templates/postgis-manual.pot @@ -35664,8 +35664,8 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#5688, " -"[topology] topology building functions now interpret tolerance 0 (old " +"#5688, [topology] topology building functions now interpret tolerance 0 (old " "default) to really mean 0 and want -1 (new default) to mean "use " "topology precision" (Sandro Santilli)" msgstr "" @@ -35673,54 +35673,54 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#6024, " -"Remove support for PostgreSQL 12 and 13 (Regina Obe)" +"#6024, Remove support for PostgreSQL 12 and 13 (Regina Obe)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6040, " -"ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey)" +"#6040, ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6053, " -"[address_standardizer] Extension removed and moved to https://github.com/postgis/" -"address_standardizer (Paul Ramsey)" +"#6053, [address_standardizer] Extension removed and moved to https://github.com/" +"postgis/address_standardizer (Paul Ramsey)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6052, " -"[tiger_geocoder] Extension removed and moved to https://git.osgeo.org/postgis/" -"postgis_tiger_geocoder (Regina Obe)" +"#6052, [tiger_geocoder] Extension removed and moved to https://git." +"osgeo.org/postgis/postgis_tiger_geocoder (Regina Obe)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6079, " -"Remove support for GEOS < 3.10 (Sandro Santilli)" +"#6079, Remove support for GEOS < 3.10 (Sandro Santilli)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#1793, " -"Remove ST_MemCollect aggregate (Darafei Praliaskouski)" +"#1793, Remove ST_MemCollect aggregate (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"GH-848, " -"CG_AlphaShape now returns a MultiPolygon (Jean Felder)" +"GH-848, CG_AlphaShape now returns a MultiPolygon (Jean Felder)" msgstr "" #. Tag: title @@ -35731,15 +35731,16 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#1124, " -"#2935, " -"#3033, " -"#4658, " -"#4659, " -"[loader] Rework loader arguments: shp2pgsql can create UNLOGGED tables and " -"choose the feature id column name, shp2pgsql --drop-table can emit DROP " -"TABLE before prepare output, raster2pgsql/shp2pgsql expose loader actions as " -"long options, both loaders accept long aliases for existing options, and" +"#1124, #2935, #3033, #4658, #4659, [loader] Rework loader " +"arguments: shp2pgsql can create UNLOGGED tables and choose the feature id " +"column name, shp2pgsql --drop-table can emit DROP TABLE before prepare " +"output, raster2pgsql/shp2pgsql expose loader actions as long options, both " +"loaders accept long aliases for existing options, and" msgstr "" #. Tag: para @@ -35751,9 +35752,9 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#4208, Add " -"single-geometry variants of ST_MaxDistance and ST_LongestLine (Darafei " -"Praliaskouski)" +"#4208, Add single-geometry variants of ST_MaxDistance and ST_LongestLine " +"(Darafei Praliaskouski)" msgstr "" #. Tag: para @@ -35777,151 +35778,157 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#5993, " -"[topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro Santilli)" +"#5993, [topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro " +"Santilli)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6001, " -"support MultiLineString in ST_MakeLine (Paul Ramsey)" +"#6001, support MultiLineString in ST_MakeLine (Paul Ramsey)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2858, " -"ST_MMin and ST_MMax (Paul Ramsey)" +"#2858, ST_MMin and ST_MMax (Paul Ramsey)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5941, " -"[raster] Support GDT_Float16 pixel type (Darafei Praliaskouski)" +"#5941, [raster] Support GDT_Float16 pixel type (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5992, " -"Optimize GiST index for repeated edge subdivision in topology (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5702, " -"Allow the compiler to detect the parallelism -flto=auto (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4798, " -"ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5950, " -"Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4332, " -"Clarify the scope of several Function Reference categories (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4222, " -"[raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5109, " -"Document the meaning of topology.next_left_edge and topology.next_right_edge " -"links (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5889, " -"[topology] Include representative locations in topology build errors " +"#5992, Optimize GiST index for repeated edge subdivision in topology " "(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2614, Use " -"GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul Ramsey)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6022, " -"Document ST_AsMVTGeom tile-coordinate simplification (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-839, " -"ST_Multi support for TIN and surfaces (Lo?c Bartoletti)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4398, Add " -"ST_CatmullSmoothing smoothes but retains original vertices (Paul Ramsey)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4560, " -"ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul Ramsey)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#1291, " -"ST_MakePolygon support for curved rings (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GT-270, Add NURBSCurve (Lo?c Bartoletti)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#2863, Add " -"ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei " +"#5702, Allow the compiler to detect the parallelism -flto=auto (Darafei " "Praliaskouski)" msgstr "" +#. Tag: para +#, no-c-format +msgid "" +"#4798, ST_AsGeoJSON warns about duplicate property keys (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5950, Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4332, Clarify the scope of several Function Reference categories (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4222, [raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5109, Document the meaning of topology.next_left_edge and topology." +"next_right_edge links (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5889, [topology] Include representative locations in topology build errors " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2614, Use GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul " +"Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6022, Document ST_AsMVTGeom tile-coordinate simplification (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-839, ST_Multi support for TIN and surfaces (Lo?c Bartoletti)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4398, Add ST_CatmullSmoothing smoothes but retains original vertices (Paul " +"Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4560, ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul " +"Ramsey)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#1291, ST_MakePolygon support for curved rings (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GT-270, Add NURBSCurve (Lo?c Bartoletti)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2863, Add ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers " +"(Darafei Praliaskouski)" +msgstr "" + #. Tag: para #, no-c-format msgid "" @@ -35938,152 +35945,155 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#2045, " -"pgsql2shp query dumps no longer require temporary table privileges (Darafei " -"Praliaskouski)" +"#2045, pgsql2shp query dumps no longer require temporary table privileges " +"(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#1577, " -"[loader] Report unsupported .zip archive input before trying to open " +"#1577, [loader] Report unsupported .zip archive input before trying to open " "shapefile sidecar files (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#3158, " -"Move geometry and geography typmod bit helpers out of the public liblwgeom " -"header (Darafei Praliaskouski)" +"#3158, Move geometry and geography typmod bit helpers out of the public " +"liblwgeom header (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#4678, " -"[raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#2116, " -"[raster] Add ST_Value nearest-neighbor boundary options (Darafei " +"#4678, [raster] Move st_sum4ma neighborhood callback to C (Darafei " "Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2804, " -"#4315, " -"[raster] Support two-argument ST_MapAlgebra callbacks and pass callback call " -"data as actual arguments (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#2898, " -"Document SQL function cost tiers for contributors" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6062, " -"[topology] Stop using recursive snapping, for improved robustness (Sandro " -"Santilli)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6065, " -"Improved winding order computation robustness for rings having collapsed " -"elements (Sandro Santilli)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#3743, " -"#4385, " -"[raster loader] Document raster2pgsql -s FROM_SRID:SRID reprojection support " -"and clarify index creation timing for append loads (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#2137, " -"[raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei " +"#2116, [raster] Add ST_Value nearest-neighbor boundary options (Darafei " "Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#4749, Use " -"point-in-polygon predicate fast paths for point-only GeometryCollections " +"#2804, #4315, [raster] Support two-argument ST_MapAlgebra " +"callbacks and pass callback call data as actual arguments (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2898, Document SQL function cost tiers for contributors" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6062, [topology] Stop using recursive snapping, for improved robustness " +"(Sandro Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6065, Improved winding order computation robustness for rings having " +"collapsed elements (Sandro Santilli)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#3743, #4385, [raster loader] Document raster2pgsql -s " +"FROM_SRID:SRID reprojection support and clarify index creation timing for " +"append loads (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2137, [raster] Reuse matching source raster overviews in raster2pgsql -l " "(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5532, " -"Validate the manual against DocBook XMLSchema in check-xml (Darafei " +"#4749, Use point-in-polygon predicate fast paths for point-only " +"GeometryCollections (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5532, Validate the manual against DocBook XMLSchema in check-xml (Darafei " "Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6087, Add " -"a repository-owned CI status checker and static dashboard generator (Darafei " -"Praliaskouski)" +"#6087, Add a repository-owned CI status checker and static dashboard " +"generator (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2807, " -"[raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#2832, " -"[raster] Avoid padding single-tile raster2pgsql overviews when padding is " -"not requested (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#2623, " -"Generate a pgsql2shp GID field when exporting geometry-only shapefiles " +"#2807, [raster] Preserve missing NODATA values in ST_MapAlgebra outputs " "(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2850, " -"Preserve pgsql2shp numeric precision and scale in DBF metadata (Darafei " -"Praliaskouski)" +"#2832, [raster] Avoid padding single-tile raster2pgsql overviews when " +"padding is not requested (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2386, Add " -"raster2pgsql man page (Darafei Praliaskouski)" +"#2623, Generate a pgsql2shp GID field when exporting geometry-only " +"shapefiles (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2850, Preserve pgsql2shp numeric precision and scale in DBF metadata " +"(Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#2386, Add raster2pgsql man page (Darafei Praliaskouski)" msgstr "" #. Tag: para @@ -36099,42 +36109,43 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#5973, " -"Install PostGIS utilities under `pg_config --bindir` by default and document " -"`pg_config`-derived install paths more accurately (Darafei Praliaskouski)" +"#5973, Install PostGIS utilities under `pg_config --bindir` by default and " +"document `pg_config`-derived install paths more accurately (Darafei " +"Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2808, " -"Clarify postgis_full_version() output when installed component scripts are " -"newer than core scripts (Darafei Praliaskouski)" +"#2808, Clarify postgis_full_version() output when installed component " +"scripts are newer than core scripts (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5593, " -"Docs: render manual images with GraphicsMagick without temporary files, " -"enabling parallel builds, keeping ImageMagick fallbacks working, and " +"#5593, Docs: render manual images with GraphicsMagick without temporary " +"files, enabling parallel builds, keeping ImageMagick fallbacks working, and " "documenting the generator workflow for contributors (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5645, " -"Docs: keep code operators ("=>") intact in translated manuals " -"by enforcing verbatim CSS (Darafei Praliaskouski)" +"#5645, Docs: keep code operators ("=>") intact in translated " +"manuals by enforcing verbatim CSS (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#1408, " -"Docs: flatten transparent manual images onto white backgrounds for PDF " -"builds while keeping HTML images transparent (Darafei Praliaskouski)" +"#1408, Docs: flatten transparent manual images onto white backgrounds for " +"PDF builds while keeping HTML images transparent (Darafei Praliaskouski)" msgstr "" #. Tag: title @@ -36145,15 +36156,17 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#4616, " -"Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski)" +"#4616, Detect pgsql2shp query keywords case-insensitively (Darafei " +"Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2838, " -"Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski)" +"#2838, Emit valid X3D Coordinate nodes for 2D polygon output (Darafei " +"Praliaskouski)" msgstr "" #. Tag: para @@ -36166,201 +36179,202 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#6083, " -"Pass configured dependency include paths to fuzzer smoke builds (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#3103, Add " -"regression coverage for exact-schema find_srid and geometry_columns lookups " +"#6083, Pass configured dependency include paths to fuzzer smoke builds " "(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#1705, " -"Infer constraint metadata for direct view and materialized view geometry " -"columns (Darafei Praliaskouski)" +"#3103, Add regression coverage for exact-schema find_srid and " +"geometry_columns lookups (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6038, " -"Avoid stale relation lookups in geometry_columns after topology objects are " -"dropped (Darafei Praliaskouski)" +"#1705, Infer constraint metadata for direct view and materialized view " +"geometry columns (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5655, " -"[doc] Skip XML validation during `make check` when xsltproc is unavailable " -"(Darafei Praliaskouski)" +"#6038, Avoid stale relation lookups in geometry_columns after topology " +"objects are dropped (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5487, " -"Improve error detail for repeated upgrades after an incomplete deprecated-" -"function cleanup (Darafei Praliaskouski)" +"#5655, [doc] Skip XML validation during `make check` when xsltproc is " +"unavailable (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"GH-899, " -"[raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks " -"(Darafei Praliaskouski)" +"#5487, Improve error detail for repeated upgrades after an incomplete " +"deprecated-function cleanup (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5975, " -"Initialize skipped union-find cluster ids deterministically (Darafei " +"GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL progress " +"callbacks (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5975, Initialize skipped union-find cluster ids deterministically (Darafei " "Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#5904, " -"[topology] Avoid MinGW format warnings when logging topology ids (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-885, " -"[topology] Avoid GMP overflow in ring orientation for very large finite " -"coordinates (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6073, " -"#6074, " -"Stabilize geography LRS endpoint interpolation and pole centroid regressions " -"on 32-bit systems (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6082, Fix " -"Japanese PDF build by avoiding non-ASCII arrows in SQL program listings " +"#5904, [topology] Avoid MinGW format warnings when logging topology ids " "(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"GH-888, " -"[sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input " -"handling for SFCGAL < 2.2 (Darafei Praliaskouski)" +"GH-885, [topology] Avoid GMP overflow in ring orientation for very large " +"finite coordinates (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#3179, " -"Mark truncated libpgcommon PostgreSQL messages instead of silently dropping " -"the tail (Darafei Praliaskouski)" +"#6073, #6074, Stabilize geography LRS endpoint interpolation " +"and pole centroid regressions on 32-bit systems (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#6003, " -"Avoid size_t formats in liblwgeom logging/error wrappers for MinGW builds " +"#6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program " +"listings (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-888, [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-" +"input handling for SFCGAL < 2.2 (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#3179, Mark truncated libpgcommon PostgreSQL messages instead of silently " +"dropping the tail (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#6003, Avoid size_t formats in liblwgeom logging/error wrappers for MinGW " +"builds (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-886, ST_ClusterRelateWin validates NULL relate matrices before detoasting " +"them (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-889, ST_Relate pattern inversion avoids out-of-bounds access on short " +"DE-9IM patterns (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid " +"size exceeds their extent (Darafei Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#5959, Prevent histogram target overflow when analysing massive tables " "(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"GH-886, " -"ST_ClusterRelateWin validates NULL relate matrices before detoasting them " +"#6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei " +"Praliaskouski)" +msgstr "" + +#. Tag: para +#, no-c-format +msgid "" +"#4828, geometry_columns handles NOT VALID SRID checks without errors " "(Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"GH-889, " -"ST_Relate pattern inversion avoids out-of-bounds access on short DE-9IM " -"patterns (Darafei Praliaskouski)" +"#6048, [raster] ST_Clip no longer crashes when clipping sparse band " +"selections (Darafei Praliaskouski)" msgstr "" #. Tag: para #, no-c-format msgid "" -"GH-890, " -"Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5948, " -"[topology] Prevent MakeTopologyPrecise from erasing edges when grid size " -"exceeds their extent (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5959, " -"Prevent histogram target overflow when analysing massive tables (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6080, " -"Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-895, " -"Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4828, " -"geometry_columns handles NOT VALID SRID checks without errors (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6048, " -"[raster] ST_Clip no longer crashes when clipping sparse band selections " -"(Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-894, " -"[raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, " -"GDAL credential redaction, and Python GDAL compatibility (Darafei " +"GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement " +"cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei " "Praliaskouski)" msgstr "" @@ -36372,16 +36386,16 @@ msgstr "" #. Tag: para #, no-c-format msgid "" -"#5899, " -"pg_upgrade issue for non-standard geography SRID (Paul Ramsey)" +"#5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey)" msgstr "" #. Tag: para #, no-c-format msgid "" -"#2583, " -"Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei " -"Praliaskouski)" +"#2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN " +"(Darafei Praliaskouski)" msgstr "" #. Tag: title diff --git a/doc/release_notes.xml b/doc/release_notes.xml index d46b71987..a0580a808 100644 --- a/doc/release_notes.xml +++ b/doc/release_notes.xml @@ -6,108 +6,108 @@ PostGIS 3.7.0alpha1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed. - + Breaking Changes - #5688, [topology] topology building functions now interpret tolerance 0 (old default) to really mean 0 and want -1 (new default) to mean "use topology precision" (Sandro Santilli) - #6024, Remove support for PostgreSQL 12 and 13 (Regina Obe) - #6040, ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey) - #6053, [address_standardizer] Extension removed and moved to https://github.com/postgis/address_standardizer (Paul Ramsey) - #6052, [tiger_geocoder] Extension removed and moved to https://git.osgeo.org/postgis/postgis_tiger_geocoder (Regina Obe) - #6079, Remove support for GEOS < 3.10 (Sandro Santilli) - #1793, Remove ST_MemCollect aggregate (Darafei Praliaskouski) - GH-848, CG_AlphaShape now returns a MultiPolygon (Jean Felder) + #5688, [topology] topology building functions now interpret tolerance 0 (old default) to really mean 0 and want -1 (new default) to mean "use topology precision" (Sandro Santilli) + #6024, Remove support for PostgreSQL 12 and 13 (Regina Obe) + #6040, ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey) + #6053, [address_standardizer] Extension removed and moved to https://github.com/postgis/address_standardizer (Paul Ramsey) + #6052, [tiger_geocoder] Extension removed and moved to https://git.osgeo.org/postgis/postgis_tiger_geocoder (Regina Obe) + #6079, Remove support for GEOS < 3.10 (Sandro Santilli) + #1793, Remove ST_MemCollect aggregate (Darafei Praliaskouski) + GH-848, CG_AlphaShape now returns a MultiPolygon (Jean Felder) New Features - #1124, #2935, #3033, #4658, #4659, [loader] Rework loader arguments: shp2pgsql can create UNLOGGED tables and choose the feature id column name, shp2pgsql --drop-table can emit DROP TABLE before prepare output, raster2pgsql/shp2pgsql expose loader actions as long options, both loaders accept long aliases for existing options, and + #1124, #2935, #3033, #4658, #4659, [loader] Rework loader arguments: shp2pgsql can create UNLOGGED tables and choose the feature id column name, shp2pgsql --drop-table can emit DROP TABLE before prepare output, raster2pgsql/shp2pgsql expose loader actions as long options, both loaders accept long aliases for existing options, and -if-not-exists makes creation actions idempotent (Darafei Praliaskouski) - #4208, Add single-geometry variants of ST_MaxDistance and ST_LongestLine (Darafei Praliaskouski) + #4208, Add single-geometry variants of ST_MaxDistance and ST_LongestLine (Darafei Praliaskouski) [topology] FindVertexSegmentPairsBelowDistance function (Sandro Santilli) ST_CoverageEdges, returns MultiLinestring of distinct shared edges in polygonal coverage (Paul Ramsey) ST_MinimumSpanningTree, window function to calculate MST (Paul Ramsey) - #5993, [topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro Santilli) - #6001, support MultiLineString in ST_MakeLine (Paul Ramsey) - #2858, ST_MMin and ST_MMax (Paul Ramsey) - #5941, [raster] Support GDT_Float16 pixel type (Darafei Praliaskouski) - #5992, Optimize GiST index for repeated edge subdivision in topology (Darafei Praliaskouski) - #5702, Allow the compiler to detect the parallelism -flto=auto (Darafei Praliaskouski) - #4798, ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski) - #5950, Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei Praliaskouski) - #4332, Clarify the scope of several Function Reference categories (Darafei Praliaskouski) - #4222, [raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei Praliaskouski) - #5109, Document the meaning of topology.next_left_edge and topology.next_right_edge links (Darafei Praliaskouski) - #5889, [topology] Include representative locations in topology build errors (Darafei Praliaskouski) - #2614, Use GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul Ramsey) - #6022, Document ST_AsMVTGeom tile-coordinate simplification (Darafei Praliaskouski) - GH-839, ST_Multi support for TIN and surfaces (Lo?c Bartoletti) - #4398, Add ST_CatmullSmoothing smoothes but retains original vertices (Paul Ramsey) - #4560, ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul Ramsey) - #1291, ST_MakePolygon support for curved rings (Darafei Praliaskouski) - GT-270, Add NURBSCurve (Lo?c Bartoletti) - #2863, Add ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei Praliaskouski) + #5993, [topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro Santilli) + #6001, support MultiLineString in ST_MakeLine (Paul Ramsey) + #2858, ST_MMin and ST_MMax (Paul Ramsey) + #5941, [raster] Support GDT_Float16 pixel type (Darafei Praliaskouski) + #5992, Optimize GiST index for repeated edge subdivision in topology (Darafei Praliaskouski) + #5702, Allow the compiler to detect the parallelism -flto=auto (Darafei Praliaskouski) + #4798, ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski) + #5950, Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei Praliaskouski) + #4332, Clarify the scope of several Function Reference categories (Darafei Praliaskouski) + #4222, [raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei Praliaskouski) + #5109, Document the meaning of topology.next_left_edge and topology.next_right_edge links (Darafei Praliaskouski) + #5889, [topology] Include representative locations in topology build errors (Darafei Praliaskouski) + #2614, Use GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul Ramsey) + #6022, Document ST_AsMVTGeom tile-coordinate simplification (Darafei Praliaskouski) + GH-839, ST_Multi support for TIN and surfaces (Lo?c Bartoletti) + #4398, Add ST_CatmullSmoothing smoothes but retains original vertices (Paul Ramsey) + #4560, ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul Ramsey) + #1291, ST_MakePolygon support for curved rings (Darafei Praliaskouski) + GT-270, Add NURBSCurve (Lo?c Bartoletti) + #2863, Add ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei Praliaskouski) [fuzzers] Centralize OSS-Fuzz build/dependency logic in PostGIS scripts, prefer requested CXX over pg_config --cc for internal C++ checks, and make fuzzer linking/runtime dependency packaging portable (Darafei Praliaskouski) Enhancements - #2045, pgsql2shp query dumps no longer require temporary table privileges (Darafei Praliaskouski) - #1577, [loader] Report unsupported .zip archive input before trying to open shapefile sidecar files (Darafei Praliaskouski) - #3158, Move geometry and geography typmod bit helpers out of the public liblwgeom header (Darafei Praliaskouski) - #4678, [raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski) - #2116, [raster] Add ST_Value nearest-neighbor boundary options (Darafei Praliaskouski) - #2804, #4315, [raster] Support two-argument ST_MapAlgebra callbacks and pass callback call data as actual arguments (Darafei Praliaskouski) - #2898, Document SQL function cost tiers for contributors - #6062, [topology] Stop using recursive snapping, for improved robustness (Sandro Santilli) - #6065, Improved winding order computation robustness for rings having collapsed elements (Sandro Santilli) - #3743, #4385, [raster loader] Document raster2pgsql -s FROM_SRID:SRID reprojection support and clarify index creation timing for append loads (Darafei Praliaskouski) - #2137, [raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei Praliaskouski) - #4749, Use point-in-polygon predicate fast paths for point-only GeometryCollections (Darafei Praliaskouski) - #5532, Validate the manual against DocBook XMLSchema in check-xml (Darafei Praliaskouski) - #6087, Add a repository-owned CI status checker and static dashboard generator (Darafei Praliaskouski) - #2807, [raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei Praliaskouski) - #2832, [raster] Avoid padding single-tile raster2pgsql overviews when padding is not requested (Darafei Praliaskouski) - #2623, Generate a pgsql2shp GID field when exporting geometry-only shapefiles (Darafei Praliaskouski) - #2850, Preserve pgsql2shp numeric precision and scale in DBF metadata (Darafei Praliaskouski) - #2386, Add raster2pgsql man page (Darafei Praliaskouski) + #2045, pgsql2shp query dumps no longer require temporary table privileges (Darafei Praliaskouski) + #1577, [loader] Report unsupported .zip archive input before trying to open shapefile sidecar files (Darafei Praliaskouski) + #3158, Move geometry and geography typmod bit helpers out of the public liblwgeom header (Darafei Praliaskouski) + #4678, [raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski) + #2116, [raster] Add ST_Value nearest-neighbor boundary options (Darafei Praliaskouski) + #2804, #4315, [raster] Support two-argument ST_MapAlgebra callbacks and pass callback call data as actual arguments (Darafei Praliaskouski) + #2898, Document SQL function cost tiers for contributors + #6062, [topology] Stop using recursive snapping, for improved robustness (Sandro Santilli) + #6065, Improved winding order computation robustness for rings having collapsed elements (Sandro Santilli) + #3743, #4385, [raster loader] Document raster2pgsql -s FROM_SRID:SRID reprojection support and clarify index creation timing for append loads (Darafei Praliaskouski) + #2137, [raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei Praliaskouski) + #4749, Use point-in-polygon predicate fast paths for point-only GeometryCollections (Darafei Praliaskouski) + #5532, Validate the manual against DocBook XMLSchema in check-xml (Darafei Praliaskouski) + #6087, Add a repository-owned CI status checker and static dashboard generator (Darafei Praliaskouski) + #2807, [raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei Praliaskouski) + #2832, [raster] Avoid padding single-tile raster2pgsql overviews when padding is not requested (Darafei Praliaskouski) + #2623, Generate a pgsql2shp GID field when exporting geometry-only shapefiles (Darafei Praliaskouski) + #2850, Preserve pgsql2shp numeric precision and scale in DBF metadata (Darafei Praliaskouski) + #2386, Add raster2pgsql man page (Darafei Praliaskouski) Build PostgreSQL extension modules with `-fno-semantic-interposition` when available so LTO can optimize same-DSO calls to exported PostGIS entry points directly instead of routing through the module PLT; in a local PostgreSQL 18 `pgbench` microbenchmark over 100k four-point groups this reduced `ST_Collect` aggregate latency by about 4% (Darafei Praliaskouski) - #5973, Install PostGIS utilities under `pg_config --bindir` by default and document `pg_config`-derived install paths more accurately (Darafei Praliaskouski) - #2808, Clarify postgis_full_version() output when installed component scripts are newer than core scripts (Darafei Praliaskouski) - #5593, Docs: render manual images with GraphicsMagick without temporary files, enabling parallel builds, keeping ImageMagick fallbacks working, and documenting the generator workflow for contributors (Darafei Praliaskouski) - #5645, Docs: keep code operators ("=>") intact in translated manuals by enforcing verbatim CSS (Darafei Praliaskouski) - #1408, Docs: flatten transparent manual images onto white backgrounds for PDF builds while keeping HTML images transparent (Darafei Praliaskouski) + #5973, Install PostGIS utilities under `pg_config --bindir` by default and document `pg_config`-derived install paths more accurately (Darafei Praliaskouski) + #2808, Clarify postgis_full_version() output when installed component scripts are newer than core scripts (Darafei Praliaskouski) + #5593, Docs: render manual images with GraphicsMagick without temporary files, enabling parallel builds, keeping ImageMagick fallbacks working, and documenting the generator workflow for contributors (Darafei Praliaskouski) + #5645, Docs: keep code operators ("=>") intact in translated manuals by enforcing verbatim CSS (Darafei Praliaskouski) + #1408, Docs: flatten transparent manual images onto white backgrounds for PDF builds while keeping HTML images transparent (Darafei Praliaskouski) Bug Fixes - #4616, Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski) - #2838, Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski) + #4616, Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski) + #2838, Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski) Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei Praliaskouski) - #6083, Pass configured dependency include paths to fuzzer smoke builds (Darafei Praliaskouski) - #3103, Add regression coverage for exact-schema find_srid and geometry_columns lookups (Darafei Praliaskouski) - #1705, Infer constraint metadata for direct view and materialized view geometry columns (Darafei Praliaskouski) - #6038, Avoid stale relation lookups in geometry_columns after topology objects are dropped (Darafei Praliaskouski) - #5655, [doc] Skip XML validation during `make check` when xsltproc is unavailable (Darafei Praliaskouski) - #5487, Improve error detail for repeated upgrades after an incomplete deprecated-function cleanup (Darafei Praliaskouski) - GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks (Darafei Praliaskouski) - #5975, Initialize skipped union-find cluster ids deterministically (Darafei Praliaskouski) - #5904, [topology] Avoid MinGW format warnings when logging topology ids (Darafei Praliaskouski) - GH-885, [topology] Avoid GMP overflow in ring orientation for very large finite coordinates (Darafei Praliaskouski) - #6073, #6074, Stabilize geography LRS endpoint interpolation and pole centroid regressions on 32-bit systems (Darafei Praliaskouski) - #6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program listings (Darafei Praliaskouski) - GH-888, [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input handling for SFCGAL < 2.2 (Darafei Praliaskouski) - #3179, Mark truncated libpgcommon PostgreSQL messages instead of silently dropping the tail (Darafei Praliaskouski) - #6003, Avoid size_t formats in liblwgeom logging/error wrappers for MinGW builds (Darafei Praliaskouski) - GH-886, ST_ClusterRelateWin validates NULL relate matrices before detoasting them (Darafei Praliaskouski) - GH-889, ST_Relate pattern inversion avoids out-of-bounds access on short DE-9IM patterns (Darafei Praliaskouski) - GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei Praliaskouski) - #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid size exceeds their extent (Darafei Praliaskouski) - #5959, Prevent histogram target overflow when analysing massive tables (Darafei Praliaskouski) - #6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei Praliaskouski) - GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) - #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) - #6048, [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) - GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei Praliaskouski) + #6083, Pass configured dependency include paths to fuzzer smoke builds (Darafei Praliaskouski) + #3103, Add regression coverage for exact-schema find_srid and geometry_columns lookups (Darafei Praliaskouski) + #1705, Infer constraint metadata for direct view and materialized view geometry columns (Darafei Praliaskouski) + #6038, Avoid stale relation lookups in geometry_columns after topology objects are dropped (Darafei Praliaskouski) + #5655, [doc] Skip XML validation during `make check` when xsltproc is unavailable (Darafei Praliaskouski) + #5487, Improve error detail for repeated upgrades after an incomplete deprecated-function cleanup (Darafei Praliaskouski) + GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks (Darafei Praliaskouski) + #5975, Initialize skipped union-find cluster ids deterministically (Darafei Praliaskouski) + #5904, [topology] Avoid MinGW format warnings when logging topology ids (Darafei Praliaskouski) + GH-885, [topology] Avoid GMP overflow in ring orientation for very large finite coordinates (Darafei Praliaskouski) + #6073, #6074, Stabilize geography LRS endpoint interpolation and pole centroid regressions on 32-bit systems (Darafei Praliaskouski) + #6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program listings (Darafei Praliaskouski) + GH-888, [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input handling for SFCGAL < 2.2 (Darafei Praliaskouski) + #3179, Mark truncated libpgcommon PostgreSQL messages instead of silently dropping the tail (Darafei Praliaskouski) + #6003, Avoid size_t formats in liblwgeom logging/error wrappers for MinGW builds (Darafei Praliaskouski) + GH-886, ST_ClusterRelateWin validates NULL relate matrices before detoasting them (Darafei Praliaskouski) + GH-889, ST_Relate pattern inversion avoids out-of-bounds access on short DE-9IM patterns (Darafei Praliaskouski) + GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei Praliaskouski) + #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid size exceeds their extent (Darafei Praliaskouski) + #5959, Prevent histogram target overflow when analysing massive tables (Darafei Praliaskouski) + #6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei Praliaskouski) + GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) + #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) + #6048, [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) + GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei Praliaskouski) Flatgeobuf schema mismatch vulnerability (NeuroWinter) - #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) - #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei Praliaskouski) + #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) + #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei Praliaskouski) ----------------------------------------------------------------------- Summary of changes: doc/po/templates/postgis-manual.pot | 464 +++++++++++++++++++----------------- doc/release_notes.xml | 168 ++++++------- 2 files changed, 323 insertions(+), 309 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Sun Jul 5 00:34:33 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 5 Jul 2026 00:34:33 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.6.0rc2-727-g2445672ee Message-ID: <20260705073433.45B941B2A03@trac.osgeo.org> 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 2445672ee87a7995453159c2f1d3937c5ed29417 (commit) from c4dada563897ffc85bd2b9c0420db90e3f5c51e7 (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 2445672ee87a7995453159c2f1d3937c5ed29417 Author: Regina Obe Date: Sun Jul 5 03:27:03 2026 -0400 Fix id element diff --git a/doc/release_notes.xml b/doc/release_notes.xml index a0580a808..0e1e56558 100644 --- a/doc/release_notes.xml +++ b/doc/release_notes.xml @@ -2,7 +2,7 @@ Appendix Release Notes -
+
PostGIS 3.7.0alpha1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed. ----------------------------------------------------------------------- Summary of changes: doc/release_notes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- PostGIS From git at osgeo.org Sun Jul 5 01:38:26 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 5 Jul 2026 01:38:26 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-1-g54ed1c6a3 Message-ID: <20260705083826.B29DE1B2566@trac.osgeo.org> 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 54ed1c6a383d71cb013c801ee2b375b74df2c313 (commit) from 2445672ee87a7995453159c2f1d3937c5ed29417 (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 54ed1c6a383d71cb013c801ee2b375b74df2c313 Author: Regina Obe Date: Sun Jul 5 04:38:19 2026 -0400 Flip back to 3.7.0dev diff --git a/Version.config b/Version.config index e20f00112..dbd16a87f 100644 --- a/Version.config +++ b/Version.config @@ -5,7 +5,7 @@ POSTGIS_MAJOR_VERSION=3 POSTGIS_MINOR_VERSION=7 -POSTGIS_MICRO_VERSION=0alpha1 +POSTGIS_MICRO_VERSION=0dev # Liblwgeom interface versioning, reset to 0:0:0 (cur:age:rev) # when changing POSTGIS_MINOR_VERSION diff --git a/extensions/upgradeable_versions.mk b/extensions/upgradeable_versions.mk index 28ac089dc..8755a861c 100644 --- a/extensions/upgradeable_versions.mk +++ b/extensions/upgradeable_versions.mk @@ -128,4 +128,4 @@ UPGRADEABLE_VERSIONS = \ 3.6.2 \ 3.6.3 \ 3.6.4 \ - 3.7.0dev + 3.7.0alpha1 ----------------------------------------------------------------------- Summary of changes: Version.config | 2 +- extensions/upgradeable_versions.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Sun Jul 5 14:22:05 2026 From: trac at osgeo.org (PostGIS) Date: Sun, 05 Jul 2026 21:22:05 -0000 Subject: [PostGIS] #6091: berrie64 ailing on xml module not found Message-ID: <046.b9fcedc065576ed009cf96054fa64722@osgeo.org> #6091: berrie64 ailing on xml module not found --------------------------+--------------------------- Reporter: robe | Owner: robe Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: QA/buildbots | Version: master Keywords: | --------------------------+--------------------------- Berrie64 is failing on garden test {{{ 07:08:34 File "/home/jenkins/workspace/PostGIS_Worker_Run/label/berrie64/54ed1c6a383d71cb013c801ee2b375b74df2c313/regress/../utils/test_postgis_exampletest.py", line 5, in 07:08:34 from postgis_exampletest import ExampleTester, parse_source_example 07:08:34 File "/home/jenkins/workspace/PostGIS_Worker_Run/label/berrie64/54ed1c6a383d71cb013c801ee2b375b74df2c313/utils/postgis_exampletest.py", line 8, in 07:08:34 from lxml import etree }}} Looks like she just needs a python module install to run the postgis example tests. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Sun Jul 5 14:43:35 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 5 Jul 2026 14:43:35 -0700 (PDT) Subject: [SCM] postgis.net branch website updated. clarity-final-189-g274fef0 Message-ID: <20260705214338.23D4AA992@trac.osgeo.org> 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.net". The branch, website has been updated via 274fef0fc9fdceddb40510fa99d4093062142f77 (commit) from 8d7838eeda67e8481e5218795de3c389909980f9 (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 274fef0fc9fdceddb40510fa99d4093062142f77 Author: Regina Obe Date: Sun Jul 5 17:43:25 2026 -0400 Release of PostGIS 3.7.0alpha1 diff --git a/config.toml b/config.toml index 67b82f7..f0d2e8e 100644 --- a/config.toml +++ b/config.toml @@ -166,7 +166,7 @@ enableRobotsTXT = true [params.postgis.releases.dev] minor = "3.7" dev = "3.7.0dev" - tag = "3.7.0dev" + tag = "3.7.0alpha1" is_dev = true [params.postgis.releases.36] minor = "3.6" diff --git a/content/news/2026/07-05_postgis-3.7.0alpha1.md b/content/news/2026/07-05_postgis-3.7.0alpha1.md new file mode 100644 index 0000000..58d23b2 --- /dev/null +++ b/content/news/2026/07-05_postgis-3.7.0alpha1.md @@ -0,0 +1,166 @@ +--- +title: PostGIS 3.7.0alpha1 +layout: post +category: news +tags: [release, 3.7] +author: Regina Obe +thumbnail: +date: "2026-07-05" +--- + +The PostGIS Team is pleased to release PostGIS 3.7.0alpha1! +Best Served with [PostgreSQL 19 Beta1](https://www.postgresql.org/about/news/postgresql-19-beta-1-released-3313/) +and [GEOS 3.15](https://github.com/libgeos/geos/) which will be released soon. + +This version requires PostgreSQL 14 - 19beta1, GEOS 3.10 or higher, and Proj 6.1+. +To take advantage of all features, GEOS 3.15+ is needed. +To take advantage of all SFCGAL features SFCGAL 2.3.0+ is needed. + +### 3.7.0alpha1 + +* [source download]({{< loc "postgis.release_source">}}/postgis-3.7.0alpha1.tar.gz) [md5]({{< loc "postgis.dev_download">}}/postgis-3.7.0alpha1.tar.gz.md5) +* [NEWS](https://git.osgeo.org/postgis/postgis/raw/tag/3.7.0alpha1/NEWS) +* HTML Online [en]({{< loc "site.root">}}docs/manual-3.7/en/) [ja]({{< loc "site.root">}}docs/manual-3.7/ja/) [zh_Hans]({{< loc "site.root">}}docs/manual-3.7/zh_Hans/) [fr]({{< loc "site.root">}}docs/manual-3.7/fr/) +* PDF docs: [en]({{< loc "postgis.dev_download">}}/postgis-3.6-en.pdf) [ja]({{< loc "postgis.release_docs">}}/postgis-3.6-ja.pdf), [zh_Hans]({{< loc "postgis.dev_download">}}/postgis-3.6-zh_Hans.pdf), [fr]({{< loc "postgis.dev_download">}}/postgis-3.6-fr.pdf) + +* Cheat Sheets: + * postgis: [en]({{< loc "site.root">}}docs/manual-3.7/postgis_cheatsheet-en.html) [ja]({{< loc "site.root">}}docs/manual-3.7/postgis_cheatsheet-ja.html) [zh_Hans]({{< loc "site.root">}}docs/manual-3.7/postgis_cheatsheet-zh_Hans.html) [fr]({{< loc "site.root">}}docs/manual-3.7/postgis_cheatsheet-fr.html) + * postgis_raster: [en]({{< loc "site.root">}}docs/manual-3.7/raster_cheatsheet-en.html) [ja]({{< loc "site.root">}}docs/manual-3.7/raster_cheatsheet-ja.html) [zh_Hans]({{< loc "site.root">}}docs/manual-3.7/raster_cheatsheet-zh_Hans.html) [fr]({{< loc "site.root">}}docs/manual-3.7/raster_cheatsheet-fr.html) + * postgis_topology: [en]({{< loc "site.root">}}docs/manual-3.7/topology_cheatsheet-en.html) [ja]({{< loc "site.root">}}docs/manual-3.7/topology_cheatsheet-ja.html) [zh_Hans]({{< loc "site.root">}}docs/manual-3.7/topology_cheatsheet-zh_Hans.html) [fr]({{< loc "site.root">}}docs/manual-3.7/topology_cheatsheet-fr.html) + * postgis_sfcgal: [en]({{< loc "site.root">}}docs/manual-3.7/sfcgal_cheatsheet-en.html) [ja]({{< loc "site.root">}}docs/manual-3.7/sfcgal_cheatsheet-ja.html) [zh_Hans]({{< loc "site.root">}}docs/manual-3.7/sfcgal_cheatsheet-zh_Hans.html) [fr]({{< loc "site.root">}}docs/manual-3.7/sfcgal_cheatsheet-fr.html) + +This release is an alpha of a major release, it includes bug fixes since PostGIS 3.6.4 and new features. + + +There are many new features, enhancements, and bug fixes we will not be back-porting to older versions. +We especially want to highlight breaking changes which may impact upgrade or use. + +## Breaking Changes + +* [#5688](https://trac.osgeo.org/postgis/ticket/5688), [topology] topology building functions now interpret tolerance 0 (old default) to really mean 0 and want -1 (new default) to mean "use topology precision" (Sandro Santilli) +* [#6024](https://trac.osgeo.org/postgis/ticket/6024), Remove support for PostgreSQL 12 and 13 (Regina Obe) +* [#6040](https://trac.osgeo.org/postgis/ticket/6040), ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey) +* [#6053](https://trac.osgeo.org/postgis/ticket/6053), [address_standardizer] Extension removed and moved to [https://github.com/postgis/address_standardizer](https://github.com/postgis/address_standardizer) (Paul Ramsey) +* [#6052](https://trac.osgeo.org/postgis/ticket/6052), [tiger_geocoder] Extension removed and moved to [https://git.osgeo.org/postgis/postgis_tiger_geocoder](https://git.osgeo.org/postgis/postgis_tiger_geocoder) (Regina Obe) +* [#6079](https://trac.osgeo.org/postgis/ticket/6079), Remove support for GEOS < 3.10 (Sandro Santilli) +* [#1793](https://trac.osgeo.org/postgis/ticket/1793), Remove ST_MemCollect aggregate (Darafei Praliaskouski) +* [GH-848](https://github.com/postgis/postgis/pull/848), CG_AlphaShape now returns a MultiPolygon (Jean Felder) + + +### Upgrading + +After installing the binaries or after running pg_upgrade: + +For PostGIS 3 series +do below which will upgrade all your postgis extensions. +```postgres +SELECT postgis_extensions_upgrade(); +``` + + +For PostGIS 2 series: + +```postgres +ALTER EXTENSION postgis UPDATE; +SELECT postgis_extensions_upgrade(); +SELECT postgis_extensions_upgrade(); +``` + + +## New Features + +* [#1124](https://trac.osgeo.org/postgis/ticket/1124), [#2935](https://trac.osgeo.org/postgis/ticket/2935), [#3033](https://trac.osgeo.org/postgis/ticket/3033), [#4658](https://trac.osgeo.org/postgis/ticket/4658), [#4659](https://trac.osgeo.org/postgis/ticket/4659), [loader] Rework loader arguments: shp2pgsql can create UNLOGGED tables and choose the feature id column name, shp2pgsql --drop-table can emit DROP TABLE before prepare output, raster2pgsql/shp2pgsql expose loader actions as long options, both loaders accept long aliases for existing options, and + -if-not-exists makes creation actions idempotent (Darafei Praliaskouski) +* [#4208](https://trac.osgeo.org/postgis/ticket/4208), Add single-geometry variants of ST_MaxDistance and ST_LongestLine (Darafei Praliaskouski) +* [topology] FindVertexSegmentPairsBelowDistance function (Sandro Santilli) +* ST_CoverageEdges, returns MultiLinestring of distinct shared edges in polygonal coverage (Paul Ramsey) +* ST_MinimumSpanningTree, window function to calculate MST (Paul Ramsey) +* [#5993](https://trac.osgeo.org/postgis/ticket/5993), [topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro Santilli) +* [#6001](https://trac.osgeo.org/postgis/ticket/6001), support MultiLineString in ST_MakeLine (Paul Ramsey) +* [#2858](https://trac.osgeo.org/postgis/ticket/2858), ST_MMin and ST_MMax (Paul Ramsey) +* [#5941](https://trac.osgeo.org/postgis/ticket/5941), [raster] Support GDT_Float16 pixel type (Darafei Praliaskouski) +* [#5992](https://trac.osgeo.org/postgis/ticket/5992), Optimize GiST index for repeated edge subdivision in topology (Darafei Praliaskouski) +* [#5702](https://trac.osgeo.org/postgis/ticket/5702), Allow the compiler to detect the parallelism -flto=auto (Darafei Praliaskouski) +* [#4798](https://trac.osgeo.org/postgis/ticket/4798), ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski) +* [#5950](https://trac.osgeo.org/postgis/ticket/5950), Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei Praliaskouski) +* [#4332](https://trac.osgeo.org/postgis/ticket/4332), Clarify the scope of several Function Reference categories (Darafei Praliaskouski) +* [#4222](https://trac.osgeo.org/postgis/ticket/4222), [raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei Praliaskouski) +* [#5109](https://trac.osgeo.org/postgis/ticket/5109), Document the meaning of topology.next_left_edge and topology.next_right_edge links (Darafei Praliaskouski) +* [#5889](https://trac.osgeo.org/postgis/ticket/5889), [topology] Include representative locations in topology build errors (Darafei Praliaskouski) +* [#2614](https://trac.osgeo.org/postgis/ticket/2614), Use GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul Ramsey) +* [#6022](https://trac.osgeo.org/postgis/ticket/6022), Document ST_AsMVTGeom tile-coordinate simplification (Darafei Praliaskouski) +* [GH-839](https://github.com/postgis/postgis/pull/839), ST_Multi support for TIN and surfaces (Lo?c Bartoletti) +* [#4398](https://trac.osgeo.org/postgis/ticket/4398), Add ST_CatmullSmoothing smoothes but retains original vertices (Paul Ramsey) +* [#4560](https://trac.osgeo.org/postgis/ticket/4560), ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul Ramsey) +* [#1291](https://trac.osgeo.org/postgis/ticket/1291), ST_MakePolygon support for curved rings (Darafei Praliaskouski) +* [GT-270](https://gitea.osgeo.org/postgis/postgis/pulls/270), Add NURBSCurve (Lo?c Bartoletti) +* [#2863](https://trac.osgeo.org/postgis/ticket/2863), Add ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei Praliaskouski) +* [fuzzers] Centralize OSS-Fuzz build/dependency logic in PostGIS scripts, prefer requested CXX over pg_config --cc for internal C++ checks, and make fuzzer linking/runtime dependency packaging portable (Darafei Praliaskouski) + +## Enhancements +* [#2045](https://trac.osgeo.org/postgis/ticket/2045), pgsql2shp query dumps no longer require temporary table privileges (Darafei Praliaskouski) +* [#1577](https://trac.osgeo.org/postgis/ticket/1577), [loader] Report unsupported .zip archive input before trying to open shapefile sidecar files (Darafei Praliaskouski) +* [#3158](https://trac.osgeo.org/postgis/ticket/3158), Move geometry and geography typmod bit helpers out of the public liblwgeom header (Darafei Praliaskouski) +* [#4678](https://trac.osgeo.org/postgis/ticket/4678), [raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski) +* [#2116](https://trac.osgeo.org/postgis/ticket/2116), [raster] Add ST_Value nearest-neighbor boundary options (Darafei Praliaskouski) +* [#2804](https://trac.osgeo.org/postgis/ticket/2804), [#4315](https://trac.osgeo.org/postgis/ticket/4315), [raster] Support two-argument ST_MapAlgebra callbacks and pass callback call data as actual arguments (Darafei Praliaskouski) +* [#2898](https://trac.osgeo.org/postgis/ticket/2898), Document SQL function cost tiers for contributors +* [#6062](https://trac.osgeo.org/postgis/ticket/6062), [topology] Stop using recursive snapping, for improved robustness (Sandro Santilli) +* [#6065](https://trac.osgeo.org/postgis/ticket/6065), Improved winding order computation robustness for rings having collapsed elements (Sandro Santilli) +* [#3743](https://trac.osgeo.org/postgis/ticket/3743), [#4385](https://trac.osgeo.org/postgis/ticket/4385), [raster loader] Document raster2pgsql -s FROM_SRID:SRID reprojection support and clarify index creation timing for append loads (Darafei Praliaskouski) +* [#2137](https://trac.osgeo.org/postgis/ticket/2137), [raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei Praliaskouski) +* [#4749](https://trac.osgeo.org/postgis/ticket/4749), Use point-in-polygon predicate fast paths for point-only GeometryCollections (Darafei Praliaskouski) +* [#5532](https://trac.osgeo.org/postgis/ticket/5532), Validate the manual against DocBook XMLSchema in check-xml (Darafei Praliaskouski) +* [#6087](https://trac.osgeo.org/postgis/ticket/6087), Add a repository-owned CI status checker and static dashboard generator (Darafei Praliaskouski) +* [#2807](https://trac.osgeo.org/postgis/ticket/2807), [raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei Praliaskouski) +* [#2832](https://trac.osgeo.org/postgis/ticket/2832), [raster] Avoid padding single-tile raster2pgsql overviews when padding is not requested (Darafei Praliaskouski) +* [#2623](https://trac.osgeo.org/postgis/ticket/2623), Generate a pgsql2shp GID field when exporting geometry-only shapefiles (Darafei Praliaskouski) +* [#2850](https://trac.osgeo.org/postgis/ticket/2850), Preserve pgsql2shp numeric precision and scale in DBF metadata (Darafei Praliaskouski) +* [#2386](https://trac.osgeo.org/postgis/ticket/2386), Add raster2pgsql man page (Darafei Praliaskouski) +* Build PostgreSQL extension modules with `-fno-semantic-interposition` when available so LTO can optimize same-DSO calls to exported PostGIS entry points directly instead of routing through the module PLT; in a local PostgreSQL 18 `pgbench` microbenchmark over 100k four-point groups this reduced `ST_Collect` aggregate latency by about 4% (Darafei Praliaskouski) +* [#5973](https://trac.osgeo.org/postgis/ticket/5973), Install PostGIS utilities under `pg_config --bindir` by default and document `pg_config`-derived install paths more accurately (Darafei Praliaskouski) +* [#2808](https://trac.osgeo.org/postgis/ticket/2808), Clarify postgis_full_version() output when installed component scripts are newer than core scripts (Darafei Praliaskouski) +* [#5593](https://trac.osgeo.org/postgis/ticket/5593), Docs: render manual images with GraphicsMagick without temporary files, enabling parallel builds, keeping ImageMagick fallbacks working, and documenting the generator workflow for contributors (Darafei Praliaskouski) +* [#5645](https://trac.osgeo.org/postgis/ticket/5645), Docs: keep code operators ("=>") intact in translated manuals by enforcing verbatim CSS (Darafei Praliaskouski) +* [#1408](https://trac.osgeo.org/postgis/ticket/1408), Docs: flatten transparent manual images onto white backgrounds for PDF builds while keeping HTML images transparent (Darafei Praliaskouski) + +## Bug Fixes +* [#4616](https://trac.osgeo.org/postgis/ticket/4616), Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski) +* [#2838](https://trac.osgeo.org/postgis/ticket/2838), Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski) +* Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei Praliaskouski) +* [#6083](https://trac.osgeo.org/postgis/ticket/6083), Pass configured dependency include paths to fuzzer smoke builds (Darafei Praliaskouski) +* [#3103](https://trac.osgeo.org/postgis/ticket/3103), Add regression coverage for exact-schema find_srid and geometry_columns lookups (Darafei Praliaskouski) +* [#1705](https://trac.osgeo.org/postgis/ticket/1705), Infer constraint metadata for direct view and materialized view geometry columns (Darafei Praliaskouski) +* [#6038](https://trac.osgeo.org/postgis/ticket/6038), Avoid stale relation lookups in geometry_columns after topology objects are dropped (Darafei Praliaskouski) +* [#5655](https://trac.osgeo.org/postgis/ticket/5655), [doc] Skip XML validation during `make check` when xsltproc is unavailable (Darafei Praliaskouski) +* [#5487](https://trac.osgeo.org/postgis/ticket/5487), Improve error detail for repeated upgrades after an incomplete deprecated-function cleanup (Darafei Praliaskouski) +* [GH-899](https://github.com/postgis/postgis/pull/899), [raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks (Darafei Praliaskouski) +* [#5975](https://trac.osgeo.org/postgis/ticket/5975), Initialize skipped union-find cluster ids deterministically (Darafei Praliaskouski) +* [#5904](https://trac.osgeo.org/postgis/ticket/5904), [topology] Avoid MinGW format warnings when logging topology ids (Darafei Praliaskouski) +* [GH-885](https://github.com/postgis/postgis/pull/885), [topology] Avoid GMP overflow in ring orientation for very large finite coordinates (Darafei Praliaskouski) +* [#6073](https://trac.osgeo.org/postgis/ticket/6073), [#6074](https://trac.osgeo.org/postgis/ticket/6074), Stabilize geography LRS endpoint interpolation and pole centroid regressions on 32-bit systems (Darafei Praliaskouski) +* [#6082](https://trac.osgeo.org/postgis/ticket/6082), Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program listings (Darafei Praliaskouski) +* [GH-888](https://github.com/postgis/postgis/pull/888), [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input handling for SFCGAL < 2.2 (Darafei Praliaskouski) +* [#3179](https://trac.osgeo.org/postgis/ticket/3179), Mark truncated libpgcommon PostgreSQL messages instead of silently dropping the tail (Darafei Praliaskouski) +* [#6003](https://trac.osgeo.org/postgis/ticket/6003), Avoid size_t formats in liblwgeom logging/error wrappers for MinGW builds (Darafei Praliaskouski) +* [GH-886](https://github.com/postgis/postgis/pull/886), ST_ClusterRelateWin validates NULL relate matrices before detoasting them (Darafei Praliaskouski) +* [GH-889](https://github.com/postgis/postgis/pull/889), ST_Relate pattern inversion avoids out-of-bounds access on short DE-9IM patterns (Darafei Praliaskouski) +* [GH-890](https://github.com/postgis/postgis/pull/890), Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei Praliaskouski) +* [#5948](https://trac.osgeo.org/postgis/ticket/5948), [topology] Prevent MakeTopologyPrecise from erasing edges when grid size exceeds their extent (Darafei Praliaskouski) +* [#5959](https://trac.osgeo.org/postgis/ticket/5959), Prevent histogram target overflow when analysing massive tables (Darafei Praliaskouski) +* [#6080](https://trac.osgeo.org/postgis/ticket/6080), Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei Praliaskouski) +* [GH-895](https://github.com/postgis/postgis/pull/895), Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) +* [#4828](https://trac.osgeo.org/postgis/ticket/4828), geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) +* [#6048](https://trac.osgeo.org/postgis/ticket/6048), [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) +* [GH-894](https://github.com/postgis/postgis/pull/894), [raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei Praliaskouski) +* Flatgeobuf schema mismatch vulnerability (NeuroWinter) +* [#5899](https://trac.osgeo.org/postgis/ticket/5899), pg_upgrade issue for non-standard geography SRID (Paul Ramsey) +* [#2583](https://trac.osgeo.org/postgis/ticket/2583), Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei Praliaskouski) + + +If you come across any issues, feel free to report via our [ticket tracker](https://trac.osgeo.org/postgis) +or [mailing list](https://lists.osgeo.org/listinfo/postgis-users) with details + +View all [tickets for 3.7.0alpha1 milestone][1]. + +[1]: https://trac.osgeo.org/postgis/query?status=assigned&status=closed&milestone=PostGIS+3.7.0&milestone=PostGIS+3.6.3 ----------------------------------------------------------------------- Summary of changes: config.toml | 2 +- content/news/2026/07-05_postgis-3.7.0alpha1.md | 166 +++++++++++++++++++++++++ 2 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 content/news/2026/07-05_postgis-3.7.0alpha1.md hooks/post-receive -- postgis.net From git at osgeo.org Mon Jul 6 01:39:19 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 01:39:19 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-2-g9b4d142f5 Message-ID: <20260706083919.6F4D8CC62@trac.osgeo.org> 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 9b4d142f5b771557dcc19f10473f2553a3b16b3a (commit) from 54ed1c6a383d71cb013c801ee2b375b74df2c313 (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 9b4d142f5b771557dcc19f10473f2553a3b16b3a Author: Teramoto Ikuhiro Date: Mon Jul 6 08:38:24 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 91.0% (5531 of 6077 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 94fd1e3a0..e2b361281 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-01 10:39+0000\n" +"PO-Revision-Date: 2026-07-06 08:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -1584,6 +1584,9 @@ msgid "" "topology.topoelement. The domain requires a two-element array, " "so the dimension check fails." msgstr "" +"?????3????? topology.topoelement???????????" +"??????????????2????????????????????????" +"?" #. Tag: para #, no-c-format @@ -1613,12 +1616,12 @@ msgstr "" #. Tag: para #, no-c-format msgid "This is the more verbose equivalent." -msgstr "" +msgstr "???????????????????????" #. Tag: para #, no-c-format msgid "This example uses the array aggregate function packaged with topology." -msgstr "" +msgstr "??????????????????????????????" #. Tag: para #, no-c-format @@ -1719,6 +1722,9 @@ msgid "" "topology_name and schema_name would be " "different." msgstr "" +"??????ma_topo???????????????????" +"????????????????????????topology_name?schema_name ???????" #. Tag: para #, no-c-format @@ -1915,12 +1921,12 @@ msgstr "Availability: 2.3.0" #, no-c-format msgid "" "This query returns no records because the feature is already registered." -msgstr "" +msgstr "??????????????????????????????????" #. Tag: para #, no-c-format msgid "Rebuild the topology layer catalog." -msgstr "" +msgstr "???????????????????????" #. Tag: refpurpose #, no-c-format @@ -2821,12 +2827,12 @@ msgstr "" #. Tag: para #, no-c-format msgid "Populate the topology." -msgstr "" +msgstr "????????????" #. Tag: para #, no-c-format msgid "Create the tables and topogeometries." -msgstr "" +msgstr "????????????????????" #. Tag: para #, no-c-format @@ -3460,12 +3466,12 @@ msgstr "" #. Tag: para #, no-c-format msgid "Add an edge to split." -msgstr "" +msgstr "?????????????????" #. Tag: para #, no-c-format msgid "Split the edge with a new node." -msgstr "" +msgstr "?????????????????" #. Tag: para #, no-c-format @@ -3578,12 +3584,12 @@ msgstr "" #. Tag: para #, no-c-format msgid "Add an isolated node with no face." -msgstr "" +msgstr "?????????????????????" #. Tag: para #, no-c-format msgid "Move the new node." -msgstr "" +msgstr "??????????????" #. Tag: refpurpose #, no-c-format @@ -3635,7 +3641,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Split the new edge." -msgstr "" +msgstr "?????????????" #. Tag: refpurpose #, no-c-format @@ -3668,7 +3674,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Remove an isolated node with no face." -msgstr "" +msgstr "???????????????????????" #. Tag: refpurpose #, no-c-format @@ -3691,7 +3697,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Remove an isolated edge with no face." -msgstr "" +msgstr "?????????????????????" #. Tag: title #, no-c-format @@ -3755,7 +3761,7 @@ msgstr "??????????????? #. Tag: para #, no-c-format msgid "This query errors because two or more edges are found." -msgstr "" +msgstr "????????????????????????????????" #. Tag: para #, no-c-format @@ -3811,7 +3817,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This query errors because two or more faces are found." -msgstr "" +msgstr "?????????????????????????????????" #. Tag: para #, no-c-format @@ -3886,7 +3892,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This query errors because the tolerance matches two or more nodes." -msgstr "" +msgstr "???????????????????????????????????" #. Tag: para #, no-c-format @@ -4008,7 +4014,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This query returns the edges that bound face 1." -msgstr "" +msgstr "???????1?????????????????????" #. Tag: para #, no-c-format @@ -4017,6 +4023,9 @@ msgid "" "that bound face 1. Use if only the " "geometry and sequence are needed." msgstr "" +"????????1???????????????????????????" +"???????????????????????????????????????" #. Tag: para #, no-c-format @@ -4051,7 +4060,7 @@ msgstr "" msgid "" "This query returns the WKT of the polygon added with ." -msgstr "" +msgstr "??????? ??????????WKT??????" #. Tag: refpurpose #, no-c-format @@ -4329,6 +4338,8 @@ msgid "" "This query errors because the edge intersects an existing edge away from the " "endpoints." msgstr "" +"????????????????????????????????????" +"?????????" #. Tag: para #, no-c-format @@ -4421,11 +4432,14 @@ msgid "" "iterator. This query only works for polygons with fewer than 10000 points " "because of the maximum value in generate_series." msgstr "" +"??generate_series??????????????????" +"??????????? generate_series???????" +"10000????????????????????????" #. Tag: para #, no-c-format msgid "Then add the face." -msgstr "" +msgstr "???????????????" #. Tag: refpurpose #, no-c-format @@ -4604,7 +4618,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Create the topogeometry column." -msgstr "" +msgstr "??????????????????" #. Tag: para #, no-c-format @@ -4618,6 +4632,8 @@ msgid "" "The world is rarely perfect, so this version allows some error. It counts a " "face if 50 percent of it falls within the expected block group boundary." msgstr "" +"?????????????????????????????????????" +"50%???????????????????????????????????" #. Tag: para #, no-c-format @@ -4726,39 +4742,39 @@ msgstr "????????????????????" #. Tag: para #, no-c-format msgid "Create the topology without allowing any tolerance." -msgstr "" +msgstr "????????????????????" #. Tag: para #, no-c-format msgid "Create a new table." -msgstr "" +msgstr "??????????????" #. Tag: para #, no-c-format msgid "Add a topogeometry column to the new table." -msgstr "" +msgstr "??????????????????????????" #. Tag: para #, no-c-format msgid "Use the new layer identifier to populate the topogeometry column." -msgstr "" +msgstr "?????????????????????????????????" #. Tag: para #, no-c-format msgid "Verify what happened." -msgstr "" +msgstr "??????????????" #. Tag: para #, no-c-format msgid "Shrink all TopoGeometry polygons by 10 meters." -msgstr "" +msgstr "???TopoGeometry?????10???????????" #. Tag: para #, no-c-format msgid "" "Find faces that are left without any TopoGeometry reference after the shrink " "operation." -msgstr "" +msgstr "??????TopoGeometry??????????????????" #. Tag: para #, no-c-format @@ -4811,12 +4827,12 @@ msgstr "" #. Tag: para #, no-c-format msgid "Return the TopoElement representation of each topogeometry." -msgstr "" +msgstr "????????????TopoElement????????" #. Tag: para #, no-c-format msgid "Use a cast to aggregate topogeometries into a TopoElementArray." -msgstr "" +msgstr "????????????????TopoElementArray???????" #. Tag: para #, no-c-format @@ -4879,7 +4895,7 @@ msgstr "Availability: 2.3" #. Tag: para #, no-c-format msgid "Add edge 5 to TopoGeometry tg." -msgstr "" +msgstr "5?????TopoGeometry tg???????" #. Tag: para #, no-c-format @@ -4903,7 +4919,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Remove face 43 from TopoGeometry tg." -msgstr "" +msgstr "43??????TopoGeometry tg????????" #. Tag: refpurpose #, no-c-format @@ -5213,12 +5229,12 @@ msgstr "Enhanced: 2.2.1 ????????????????" #. Tag: para #, no-c-format msgid "Create a temporary edge map for the TopoJSON output." -msgstr "" +msgstr "TopoJSON????????????????????" #. Tag: para #, no-c-format msgid "Build the TopoJSON header, objects, arcs, and footer." -msgstr "" +msgstr "TopoJSON????????????????????????????" #. Tag: title #, no-c-format @@ -5272,6 +5288,8 @@ msgid "" "The following example uses the nei_topo table created in " "the examples." msgstr "" +"?????nei_topo???????????????? ???????????" #. Tag: para #, no-c-format @@ -5830,6 +5848,10 @@ msgid "" "download from https://gmplib.org/." msgstr "" +"GNU????????????? (Multiple Precision Arithmetic Library, libgmp)" +"?PostGIS?????????????????????GMP?https://gmplib.org/????????" +"?????" #. Tag: para #, no-c-format @@ -5888,6 +5910,10 @@ msgid "" "xlink:href=\"https://sfcgal.gitlab.io/sfcgal/\">https://sfcgal.gitlab.io/" "sfcgal/." msgstr "" +"SFCGAL, 1.4.1??????????????????????2.3????????" +"SFCGAL??PostGIS?????2???3??????????????????????????https://sfcgal.gitlab.io/sfcgal/?" #. Tag: para #, no-c-format @@ -9048,12 +9074,12 @@ msgstr "???????????????????????" #. Tag: para #, no-c-format msgid "This example uses a 3D polygon." -msgstr "" +msgstr "?????3???????????????" #. Tag: para #, no-c-format msgid "This example uses a 3D MultiLineString." -msgstr "" +msgstr "?????3??????????????????????" #. Tag: para #, no-c-format @@ -9127,7 +9153,7 @@ msgstr "&M_support;" #, no-c-format msgid "" "This example returns the minimum X coordinate of a buffer around a point." -msgstr "" +msgstr "???????????????????????minimum X?????????" #. Tag: para #, no-c-format @@ -9277,12 +9303,12 @@ msgstr "?????????TIN??????" #. Tag: para #, no-c-format msgid "This example breaks a PolyhedralSurface into its faces." -msgstr "" +msgstr "??????????????????????????" #. Tag: para #, no-c-format msgid "This example uses a TIN geometry." -msgstr "" +msgstr "?????TIN????????????" #. Tag: para #, no-c-format @@ -9373,12 +9399,12 @@ msgstr "?????" #. Tag: para #, no-c-format msgid "This example uses a cube represented as a PolyhedralSurface." -msgstr "" +msgstr "???????????????????????????" #. Tag: para #, no-c-format msgid "This example uses a Triangle geometry." -msgstr "" +msgstr "?????TRIANGLE????????????" #. Tag: para #, no-c-format @@ -9501,6 +9527,10 @@ msgid "" "linkend=\"ST_Dump\"/> to extract polygon elements from polygonal geometries: " "ST_DumpRings((ST_Dump(geom)).geom )" msgstr "" +"???POLYGON???????????????MULTIPOLYGON?????????" +"???????????????????????????????: ST_DumpRings((ST_Dump(geom)).geom )" #. Tag: para #, no-c-format @@ -9532,7 +9562,7 @@ msgstr "" #, no-c-format msgid "" "Returns the last point of a LineString, CircularLineString, or NURBSCurve." -msgstr "" +msgstr "LINESTRING, CIRCULARLINESTRING, NURMSCURVE ??????????????" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 114 ++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 42 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 02:53:10 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 02:53:10 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-14-gd7a16bb43 Message-ID: <20260706095311.A65C9D45E@trac.osgeo.org> 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 d7a16bb43295c653e86c69ae5eeace3661587ca3 (commit) via 408572b681512693cadc9ce9e00d3f090bbb66d9 (commit) via ff20f053438d1c082f05bc5834a44eca083aa7bb (commit) via c0521bcc74cd4168f495909c4fa31a1cc4cd956e (commit) via 0e16d8991f1356c0b735d6ab3046e036a7e08740 (commit) via 5336ccf1fe35d63672357a11f0082f4b70c0bbf8 (commit) via 5124ad4a50a4a914e4b188240997ee3f06e258d7 (commit) via 6fff4b58bbf6b671fdb34a0bbaa70d1f8ab11b2c (commit) via 6ea8421662ed55c8b895e1a6e4d4ef3edefde4c6 (commit) via 8a03193ebc452f335c0f51c26dbdbb53b1a15904 (commit) via d9525f032bba08eefdce60e55f333c101dace23d (commit) via 9000ef67ed38616b10e06d8da7bd012f9d866aa0 (commit) from 9b4d142f5b771557dcc19f10473f2553a3b16b3a (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 d7a16bb43295c653e86c69ae5eeace3661587ca3 Author: Darafei Praliaskouski Date: Mon Jul 6 13:46:12 2026 +0400 NEWS for GH-897 References https://github.com/postgis/postgis/pull/1143 References https://github.com/postgis/postgis/pull/1147 References https://github.com/postgis/postgis/pull/1148 References https://github.com/postgis/postgis/pull/1149 References https://github.com/postgis/postgis/pull/1153 diff --git a/NEWS b/NEWS index c4a2ebec8..6fda3ea30 100644 --- a/NEWS +++ b/NEWS @@ -171,6 +171,9 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) + - GH-897, [topology] Harden topology helper functions and + maintenance SQL against identifier, tolerance, bigint, and cleanup + regressions (Darafei Praliaskouski) - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate ring-orientation precision regressions (Darafei Praliaskouski) - #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) commit 408572b681512693cadc9ce9e00d3f090bbb66d9 Author: Darafei Praliaskouski Date: Fri Jun 19 14:52:46 2026 +0400 liblwgeom: preserve scaled area subtraction tails (cherry picked from commit 04ea138387f71044c700ceb28ec0719a7b3ef71c) Closes https://github.com/postgis/postgis/pull/898 diff --git a/liblwgeom/cunit/cu_ptarray.c b/liblwgeom/cunit/cu_ptarray.c index 933a5ca4f..f616a5928 100644 --- a/liblwgeom/cunit/cu_ptarray.c +++ b/liblwgeom/cunit/cu_ptarray.c @@ -479,6 +479,29 @@ static void test_ptarray_signed_area(void) CU_ASSERT(area < 6e99); CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); lwline_free(line); + + /* Detect residual tails after scaled determinant cancellation. */ + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(3e120 1.0000000000000002e220," + "3e155 -1e-50,3e155 -1.0000000000000003e140," + "3e120 1.0000000000000002e220)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(isfinite(area)); + CU_ASSERT(area > 1e295); + CU_ASSERT(area < 2e295); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); + lwline_free(line); + + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(3e120 1.0000000000000002e220," + "3e155 -1.0000000000000003e140,3e155 -1e-50," + "3e120 1.0000000000000002e220)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(isfinite(area)); + CU_ASSERT(area < -1e295); + CU_ASSERT(area > -2e295); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); + lwline_free(line); } static void test_ptarray_contains_point(void) diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index 036bfd950..ce7632769 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -67,6 +67,15 @@ ptarray_signed_area_add(double *sum, double *compensation, double value) *sum = t; } +static inline void +ptarray_signed_area_add_abs_or_infinite(double *sum, double value) +{ + if (isfinite(value)) + *sum += fabs(value); + else + *sum = INFINITY; +} + static inline void ptarray_signed_area_two_sum(double a, double b, double *sum, double *err) { @@ -1370,21 +1379,57 @@ ptarray_signed_area(const POINTARRAY *pa) */ if (isfinite(detleft) && isfinite(detright) && isfinite(det)) { + ptarray_signed_area_expansion residual = {0}; + double tail_abs = 0.0; + double subtract_roundoff; + double left_roundoff; + double right_roundoff; + double ax_byerr, axerr_by, axerr_byerr; + double ay_bxerr, ayerr_bx, ayerr_bxerr; + b = det - detleft; - err = (detleft - (det - b)) - (detright + b); - err += fma(ax, by, -detleft) - fma(ay, bx, -detright); + subtract_roundoff = (detleft - (det - b)) - (detright + b); + left_roundoff = fma(ax, by, -detleft); + right_roundoff = fma(ay, bx, -detright); + ptarray_signed_area_expansion_add(&residual, subtract_roundoff); + ptarray_signed_area_expansion_add(&residual, left_roundoff); + ptarray_signed_area_expansion_add(&residual, -right_roundoff); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, subtract_roundoff); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, left_roundoff); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, right_roundoff); /* * The origin shift itself can round away unit-scale * offsets beside 1e16-scale coordinates. Include the * low-order subtraction terms in the determinant so the - * compensated sum still sees their signed area. + * compensated sum still sees their signed area. Use an + * expansion so opposite large low-order products do not + * erase a smaller residual before cancellation is tested. */ - err += (ax * byerr + axerr * by) + axerr * byerr; - err -= (ay * bxerr + ayerr * bx) + ayerr * bxerr; + ax_byerr = ax * byerr; + axerr_by = axerr * by; + axerr_byerr = axerr * byerr; + ay_bxerr = ay * bxerr; + ayerr_bx = ayerr * bx; + ayerr_bxerr = ayerr * bxerr; + ptarray_signed_area_expansion_add_product(&residual, ax, byerr, 1.0); + ptarray_signed_area_expansion_add_product(&residual, axerr, by, 1.0); + ptarray_signed_area_expansion_add_product(&residual, axerr, byerr, 1.0); + ptarray_signed_area_expansion_add_product(&residual, ay, bxerr, -1.0); + ptarray_signed_area_expansion_add_product(&residual, ayerr, bx, -1.0); + ptarray_signed_area_expansion_add_product(&residual, ayerr, bxerr, -1.0); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, ax_byerr); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, axerr_by); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, axerr_byerr); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, ay_bxerr); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, ayerr_bx); + ptarray_signed_area_add_abs_or_infinite(&tail_abs, ayerr_bxerr); + err = ptarray_signed_area_expansion_sum(&residual); + if (!isfinite(err)) + err = 0.0; if (scaled_term) - scaled_tail_abs_sum += fabs(err); + scaled_tail_abs_sum += tail_abs; else - tail_abs_sum += fabs(err); + tail_abs_sum += tail_abs; } ptarray_signed_area_add(active_sum, active_compensation, det); diff --git a/regress/core/orientation.sql b/regress/core/orientation.sql index 54a71e855..f8f3d2af9 100644 --- a/regress/core/orientation.sql +++ b/regress/core/orientation.sql @@ -99,3 +99,8 @@ SELECT '439', ST_Area('POLYGON ((1.9029580275885475e-13 2.1370106480605854e-89, SELECT '440', ST_IsPolygonCW( 'POLYGON ((1.9029580275885475e47 2.1370106480605854e-29, 2.5163957753386382e-33 -3.002966181933756e69, 4.77621563620871e-15 -1e-40, -3.7953949389104665e134 -1e260, -2.0800734986321869 2.051992028072436e5, 3.38586824330807e133 -7.962294473171359e134, 1.9029580275885475e47 2.1370106480605854e-29))'); SELECT '441', ST_IsPolygonCCW('POLYGON ((1.9029580275885475e47 2.1370106480605854e-29, 2.5163957753386382e-33 -3.002966181933756e69, 4.77621563620871e-15 -1e-40, -3.7953949389104665e134 -1e260, -2.0800734986321869 2.051992028072436e5, 3.38586824330807e133 -7.962294473171359e134, 1.9029580275885475e47 2.1370106480605854e-29))'); SELECT '442', ST_Area('POLYGON ((1.9029580275885475e47 2.1370106480605854e-29, 2.5163957753386382e-33 -3.002966181933756e69, 4.77621563620871e-15 -1e-40, -3.7953949389104665e134 -1e260, -2.0800734986321869 2.051992028072436e5, 3.38586824330807e133 -7.962294473171359e134, 1.9029580275885475e47 2.1370106480605854e-29))') > 1e260; + +-- Scaled subtraction-tail residual after grouped product-tail cancellation +SELECT '443', ST_IsPolygonCW( 'POLYGON ((3e120 1.0000000000000002e220, 3e155 -1e-50, 3e155 -1.0000000000000003e140, 3e120 1.0000000000000002e220))'); +SELECT '444', ST_IsPolygonCCW('POLYGON ((3e120 1.0000000000000002e220, 3e155 -1e-50, 3e155 -1.0000000000000003e140, 3e120 1.0000000000000002e220))'); +SELECT '445', ST_Area('POLYGON ((3e120 1.0000000000000002e220, 3e155 -1e-50, 3e155 -1.0000000000000003e140, 3e120 1.0000000000000002e220))') > 1e295; diff --git a/regress/core/orientation_expected b/regress/core/orientation_expected index 060a96b4f..1d918cede 100644 --- a/regress/core/orientation_expected +++ b/regress/core/orientation_expected @@ -58,3 +58,6 @@ 440|t 441|f 442|t +443|t +444|f +445|t commit ff20f053438d1c082f05bc5834a44eca083aa7bb Author: Darafei Praliaskouski Date: Fri Jun 19 14:22:34 2026 +0400 liblwgeom: preserve scaled area residual tails (cherry picked from commit 89811473e6cbd8bb6cdfff34ecdb6fec9e2ed928) diff --git a/liblwgeom/cunit/cu_ptarray.c b/liblwgeom/cunit/cu_ptarray.c index c8cac7dad..933a5ca4f 100644 --- a/liblwgeom/cunit/cu_ptarray.c +++ b/liblwgeom/cunit/cu_ptarray.c @@ -382,6 +382,35 @@ static void test_ptarray_signed_area(void) CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); lwline_free(line); + /* Preserve residual tails when scaled large product tails cancel. */ + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(1.9029580275885475e47 2.1370106480605854e-29," + "2.5163957753386382e-33 -3.002966181933756e69," + "4.77621563620871e-15 -1e-40," + "-3.7953949389104665e134 -1e260," + "-2.0800734986321869 2.051992028072436e5," + "3.38586824330807e133 -7.962294473171359e134," + "1.9029580275885475e47 2.1370106480605854e-29)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area > 1e260); + CU_ASSERT(area < 2e260); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); + lwline_free(line); + + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(1.9029580275885475e47 2.1370106480605854e-29," + "3.38586824330807e133 -7.962294473171359e134," + "-2.0800734986321869 2.051992028072436e5," + "-3.7953949389104665e134 -1e260," + "4.77621563620871e-15 -1e-40," + "2.5163957753386382e-33 -3.002966181933756e69," + "1.9029580275885475e47 2.1370106480605854e-29)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area < -1e260); + CU_ASSERT(area > -2e260); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); + lwline_free(line); + /* Preserve product tails when determinant products nearly cancel. */ line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10000000000000276 10000000000000280," diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index 681f1a79d..036bfd950 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -174,7 +174,7 @@ ptarray_signed_area_product_exponent(double a, double b) } static double -ptarray_signed_area_exact(const POINTARRAY *pa) +ptarray_signed_area_exact(const POINTARRAY *pa, int coordinate_scale) { const POINT2D *P1 = getPoint2d_cp(pa, 0); const POINT2D *P2 = getPoint2d_cp(pa, 1); @@ -193,6 +193,17 @@ ptarray_signed_area_exact(const POINTARRAY *pa) ptarray_signed_area_two_diff(P2->y, y0, &ay, &ayerr); ptarray_signed_area_two_diff(P3->x, x0, &bx, &bxerr); ptarray_signed_area_two_diff(P3->y, y0, &by, &byerr); + if (coordinate_scale > 0) + { + ax = ldexp(ax, -coordinate_scale); + ay = ldexp(ay, -coordinate_scale); + bx = ldexp(bx, -coordinate_scale); + by = ldexp(by, -coordinate_scale); + axerr = ldexp(axerr, -coordinate_scale); + ayerr = ldexp(ayerr, -coordinate_scale); + bxerr = ldexp(bxerr, -coordinate_scale); + byerr = ldexp(byerr, -coordinate_scale); + } ptarray_signed_area_expansion_add_product(&expansion, ax, by, 1.0); ptarray_signed_area_expansion_add_product(&expansion, ax, byerr, 1.0); @@ -206,7 +217,7 @@ ptarray_signed_area_exact(const POINTARRAY *pa) P2 = P3; } - return -ptarray_signed_area_expansion_sum(&expansion) / 2.0; + return -ldexp(ptarray_signed_area_expansion_sum(&expansion), 2 * coordinate_scale) / 2.0; } int @@ -1267,8 +1278,12 @@ ptarray_signed_area(const POINTARRAY *pa) double scaled_tail_compensation = 0.0; double det_abs_sum = 0.0; double tail_abs_sum = 0.0; + double scaled_det_abs_sum = 0.0; + double scaled_tail_abs_sum = 0.0; double x0, y0; int area_scale = 0; + int unscaled_cancelled; + int scaled_cancelled; uint32_t i; if (! pa || pa->npoints < 3 ) @@ -1314,6 +1329,7 @@ ptarray_signed_area(const POINTARRAY *pa) double *active_compensation = &compensation; double *active_tail_sum = &tail_sum; double *active_tail_compensation = &tail_compensation; + int scaled_term = LW_FALSE; P3 = getPoint2d_cp(pa, i); ptarray_signed_area_two_diff(P2->x, x0, &ax, &axerr); @@ -1338,6 +1354,7 @@ ptarray_signed_area(const POINTARRAY *pa) active_compensation = &scaled_compensation; active_tail_sum = &scaled_tail_sum; active_tail_compensation = &scaled_tail_compensation; + scaled_term = LW_TRUE; detleft = ax * by; detright = ay * bx; det = detleft - detright; @@ -1364,12 +1381,20 @@ ptarray_signed_area(const POINTARRAY *pa) */ err += (ax * byerr + axerr * by) + axerr * byerr; err -= (ay * bxerr + ayerr * bx) + ayerr * bxerr; - tail_abs_sum += fabs(err); + if (scaled_term) + scaled_tail_abs_sum += fabs(err); + else + tail_abs_sum += fabs(err); } ptarray_signed_area_add(active_sum, active_compensation, det); if (isfinite(det)) - det_abs_sum += fabs(det); + { + if (scaled_term) + scaled_det_abs_sum += fabs(det); + else + det_abs_sum += fabs(det); + } /* * Keep determinant tails in a separate compensated stream. If * they are folded into the main determinant stream immediately, @@ -1391,9 +1416,12 @@ ptarray_signed_area(const POINTARRAY *pa) } if (tail_sum != 0.0 && isfinite(tail_sum)) ptarray_signed_area_add(&sum, &compensation, tail_sum); - if (area_scale == 0 && tail_abs_sum > 0.0 && fabs(sum) < FP_MAX(det_abs_sum, tail_abs_sum) * 1e-12) + unscaled_cancelled = tail_abs_sum > 0.0 && fabs(sum) < FP_MAX(det_abs_sum, tail_abs_sum) * 1e-12; + scaled_cancelled = scaled_tail_abs_sum > 0.0 && + fabs(scaled_sum + scaled_tail_sum) < FP_MAX(scaled_det_abs_sum, scaled_tail_abs_sum) * 1e-12; + if (unscaled_cancelled || scaled_cancelled) { - double exact_area = ptarray_signed_area_exact(pa); + double exact_area = ptarray_signed_area_exact(pa, scaled_cancelled ? area_scale : 0); if (isfinite(exact_area)) return exact_area; } diff --git a/regress/core/orientation.sql b/regress/core/orientation.sql index a21fe4972..54a71e855 100644 --- a/regress/core/orientation.sql +++ b/regress/core/orientation.sql @@ -94,3 +94,8 @@ SELECT '436', ST_IsPolygonCCW('POLYGON ((0 0, 10000000000000000 1, 1 1, 10000000 SELECT '437', ST_IsPolygonCW( 'POLYGON ((1.9029580275885475e-13 2.1370106480605854e-89, 2.5163957753386382e-93 -3002966181.933756, 4.77621563620871e-75 -1e-100, -3.7953949389104665e74 -1e200, -2.0800734986321869e-60 2.051992028072436e-55, 3.38586824330807e73 -7.962294473171359e74, 1.9029580275885475e-13 2.1370106480605854e-89))'); SELECT '438', ST_IsPolygonCCW('POLYGON ((1.9029580275885475e-13 2.1370106480605854e-89, 2.5163957753386382e-93 -3002966181.933756, 4.77621563620871e-75 -1e-100, -3.7953949389104665e74 -1e200, -2.0800734986321869e-60 2.051992028072436e-55, 3.38586824330807e73 -7.962294473171359e74, 1.9029580275885475e-13 2.1370106480605854e-89))'); SELECT '439', ST_Area('POLYGON ((1.9029580275885475e-13 2.1370106480605854e-89, 2.5163957753386382e-93 -3002966181.933756, 4.77621563620871e-75 -1e-100, -3.7953949389104665e74 -1e200, -2.0800734986321869e-60 2.051992028072436e-55, 3.38586824330807e73 -7.962294473171359e74, 1.9029580275885475e-13 2.1370106480605854e-89))') > 1e140; + +-- Scaled large product tail cancellation with a smaller residual tail +SELECT '440', ST_IsPolygonCW( 'POLYGON ((1.9029580275885475e47 2.1370106480605854e-29, 2.5163957753386382e-33 -3.002966181933756e69, 4.77621563620871e-15 -1e-40, -3.7953949389104665e134 -1e260, -2.0800734986321869 2.051992028072436e5, 3.38586824330807e133 -7.962294473171359e134, 1.9029580275885475e47 2.1370106480605854e-29))'); +SELECT '441', ST_IsPolygonCCW('POLYGON ((1.9029580275885475e47 2.1370106480605854e-29, 2.5163957753386382e-33 -3.002966181933756e69, 4.77621563620871e-15 -1e-40, -3.7953949389104665e134 -1e260, -2.0800734986321869 2.051992028072436e5, 3.38586824330807e133 -7.962294473171359e134, 1.9029580275885475e47 2.1370106480605854e-29))'); +SELECT '442', ST_Area('POLYGON ((1.9029580275885475e47 2.1370106480605854e-29, 2.5163957753386382e-33 -3.002966181933756e69, 4.77621563620871e-15 -1e-40, -3.7953949389104665e134 -1e260, -2.0800734986321869 2.051992028072436e5, 3.38586824330807e133 -7.962294473171359e134, 1.9029580275885475e47 2.1370106480605854e-29))') > 1e260; diff --git a/regress/core/orientation_expected b/regress/core/orientation_expected index 8d93fa66d..060a96b4f 100644 --- a/regress/core/orientation_expected +++ b/regress/core/orientation_expected @@ -55,3 +55,6 @@ 437|t 438|f 439|t +440|t +441|f +442|t commit c0521bcc74cd4168f495909c4fa31a1cc4cd956e Author: Darafei Praliaskouski Date: Fri Jun 19 13:46:14 2026 +0400 liblwgeom: preserve signed area residual tails (cherry picked from commit b220922f136353eda41cf2e43a56f234c7961168) diff --git a/liblwgeom/cunit/cu_ptarray.c b/liblwgeom/cunit/cu_ptarray.c index d8c82f89a..c8cac7dad 100644 --- a/liblwgeom/cunit/cu_ptarray.c +++ b/liblwgeom/cunit/cu_ptarray.c @@ -353,6 +353,35 @@ static void test_ptarray_signed_area(void) CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); lwline_free(line); + /* Preserve residual tails when large product tails cancel. */ + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(1.9029580275885475e-13 2.1370106480605854e-89," + "2.5163957753386382e-93 -3002966181.933756," + "4.77621563620871e-75 -1e-100," + "-3.7953949389104665e74 -1e200," + "-2.0800734986321869e-60 2.051992028072436e-55," + "3.38586824330807e73 -7.962294473171359e74," + "1.9029580275885475e-13 2.1370106480605854e-89)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area > 1e140); + CU_ASSERT(area < 2e140); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); + lwline_free(line); + + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(1.9029580275885475e-13 2.1370106480605854e-89," + "3.38586824330807e73 -7.962294473171359e74," + "-2.0800734986321869e-60 2.051992028072436e-55," + "-3.7953949389104665e74 -1e200," + "4.77621563620871e-75 -1e-100," + "2.5163957753386382e-93 -3002966181.933756," + "1.9029580275885475e-13 2.1370106480605854e-89)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area < -1e140); + CU_ASSERT(area > -2e140); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); + lwline_free(line); + /* Preserve product tails when determinant products nearly cancel. */ line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10000000000000276 10000000000000280," diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index 4942c9dcb..681f1a79d 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -36,6 +36,14 @@ #include "liblwgeom_internal.h" #include "lwgeom_log.h" +#define PTARRAY_SIGNED_AREA_EXPANSION_MAX 4096 + +typedef struct { + uint32_t nterms; + int overflowed; + double terms[PTARRAY_SIGNED_AREA_EXPANSION_MAX]; +} ptarray_signed_area_expansion; + static inline void ptarray_signed_area_add(double *sum, double *compensation, double value) { @@ -59,6 +67,84 @@ ptarray_signed_area_add(double *sum, double *compensation, double value) *sum = t; } +static inline void +ptarray_signed_area_two_sum(double a, double b, double *sum, double *err) +{ + double bvirt, avirt, bround, around; + + *sum = a + b; + bvirt = *sum - a; + avirt = *sum - bvirt; + bround = b - bvirt; + around = a - avirt; + *err = around + bround; +} + +static inline void +ptarray_signed_area_expansion_add(ptarray_signed_area_expansion *expansion, double value) +{ + uint32_t i, n = 0; + double sum, err; + + if (value == 0.0) + return; + if (!isfinite(value) || expansion->overflowed) + { + expansion->overflowed = LW_TRUE; + return; + } + + for (i = 0; i < expansion->nterms; i++) + { + ptarray_signed_area_two_sum(value, expansion->terms[i], &sum, &err); + if (err != 0.0) + { + if (n == PTARRAY_SIGNED_AREA_EXPANSION_MAX) + { + expansion->overflowed = LW_TRUE; + return; + } + expansion->terms[n++] = err; + } + value = sum; + } + + if (value != 0.0) + { + if (n == PTARRAY_SIGNED_AREA_EXPANSION_MAX) + { + expansion->overflowed = LW_TRUE; + return; + } + expansion->terms[n++] = value; + } + expansion->nterms = n; +} + +static inline void +ptarray_signed_area_expansion_add_product(ptarray_signed_area_expansion *expansion, double a, double b, double sign) +{ + double product = a * b; + + ptarray_signed_area_expansion_add(expansion, sign * product); + ptarray_signed_area_expansion_add(expansion, sign * fma(a, b, -product)); +} + +static inline double +ptarray_signed_area_expansion_sum(ptarray_signed_area_expansion *expansion) +{ + double sum = 0.0; + double compensation = 0.0; + uint32_t i; + + if (expansion->overflowed) + return NAN; + + for (i = 0; i < expansion->nterms; i++) + ptarray_signed_area_add(&sum, &compensation, expansion->terms[i]); + return sum; +} + static inline void ptarray_signed_area_two_diff(double a, double b, double *diff, double *err) { @@ -87,6 +173,42 @@ ptarray_signed_area_product_exponent(double a, double b) return ea + eb; } +static double +ptarray_signed_area_exact(const POINTARRAY *pa) +{ + const POINT2D *P1 = getPoint2d_cp(pa, 0); + const POINT2D *P2 = getPoint2d_cp(pa, 1); + const POINT2D *P3; + ptarray_signed_area_expansion expansion = {0}; + double x0 = P1->x; + double y0 = P1->y; + uint32_t i; + + for (i = 2; i < pa->npoints; i++) + { + double ax, ay, bx, by, axerr, ayerr, bxerr, byerr; + P3 = getPoint2d_cp(pa, i); + + ptarray_signed_area_two_diff(P2->x, x0, &ax, &axerr); + ptarray_signed_area_two_diff(P2->y, y0, &ay, &ayerr); + ptarray_signed_area_two_diff(P3->x, x0, &bx, &bxerr); + ptarray_signed_area_two_diff(P3->y, y0, &by, &byerr); + + ptarray_signed_area_expansion_add_product(&expansion, ax, by, 1.0); + ptarray_signed_area_expansion_add_product(&expansion, ax, byerr, 1.0); + ptarray_signed_area_expansion_add_product(&expansion, axerr, by, 1.0); + ptarray_signed_area_expansion_add_product(&expansion, axerr, byerr, 1.0); + ptarray_signed_area_expansion_add_product(&expansion, ay, bx, -1.0); + ptarray_signed_area_expansion_add_product(&expansion, ay, bxerr, -1.0); + ptarray_signed_area_expansion_add_product(&expansion, ayerr, bx, -1.0); + ptarray_signed_area_expansion_add_product(&expansion, ayerr, bxerr, -1.0); + + P2 = P3; + } + + return -ptarray_signed_area_expansion_sum(&expansion) / 2.0; +} + int ptarray_has_z(const POINTARRAY *pa) { @@ -1143,6 +1265,8 @@ ptarray_signed_area(const POINTARRAY *pa) double scaled_compensation = 0.0; double scaled_tail_sum = 0.0; double scaled_tail_compensation = 0.0; + double det_abs_sum = 0.0; + double tail_abs_sum = 0.0; double x0, y0; int area_scale = 0; uint32_t i; @@ -1240,9 +1364,12 @@ ptarray_signed_area(const POINTARRAY *pa) */ err += (ax * byerr + axerr * by) + axerr * byerr; err -= (ay * bxerr + ayerr * bx) + ayerr * bxerr; + tail_abs_sum += fabs(err); } ptarray_signed_area_add(active_sum, active_compensation, det); + if (isfinite(det)) + det_abs_sum += fabs(det); /* * Keep determinant tails in a separate compensated stream. If * they are folded into the main determinant stream immediately, @@ -1264,6 +1391,12 @@ ptarray_signed_area(const POINTARRAY *pa) } if (tail_sum != 0.0 && isfinite(tail_sum)) ptarray_signed_area_add(&sum, &compensation, tail_sum); + if (area_scale == 0 && tail_abs_sum > 0.0 && fabs(sum) < FP_MAX(det_abs_sum, tail_abs_sum) * 1e-12) + { + double exact_area = ptarray_signed_area_exact(pa); + if (isfinite(exact_area)) + return exact_area; + } return -sum / 2.0; } diff --git a/regress/core/orientation.sql b/regress/core/orientation.sql index 725e9e195..a21fe4972 100644 --- a/regress/core/orientation.sql +++ b/regress/core/orientation.sql @@ -89,3 +89,8 @@ SELECT '434', ST_Area('POLYGON ((0 0, 1e300 1e300, 1e-200 0, 0 0))') > 4e99; -- Large determinant cancellation after a small determinant tail SELECT '435', ST_IsPolygonCW( 'POLYGON ((0 0, 10000000000000000 1, 1 1, 10000000000000000 0, 0 0))'); SELECT '436', ST_IsPolygonCCW('POLYGON ((0 0, 10000000000000000 1, 1 1, 10000000000000000 0, 0 0))'); + +-- Large product tail cancellation with a smaller residual tail +SELECT '437', ST_IsPolygonCW( 'POLYGON ((1.9029580275885475e-13 2.1370106480605854e-89, 2.5163957753386382e-93 -3002966181.933756, 4.77621563620871e-75 -1e-100, -3.7953949389104665e74 -1e200, -2.0800734986321869e-60 2.051992028072436e-55, 3.38586824330807e73 -7.962294473171359e74, 1.9029580275885475e-13 2.1370106480605854e-89))'); +SELECT '438', ST_IsPolygonCCW('POLYGON ((1.9029580275885475e-13 2.1370106480605854e-89, 2.5163957753386382e-93 -3002966181.933756, 4.77621563620871e-75 -1e-100, -3.7953949389104665e74 -1e200, -2.0800734986321869e-60 2.051992028072436e-55, 3.38586824330807e73 -7.962294473171359e74, 1.9029580275885475e-13 2.1370106480605854e-89))'); +SELECT '439', ST_Area('POLYGON ((1.9029580275885475e-13 2.1370106480605854e-89, 2.5163957753386382e-93 -3002966181.933756, 4.77621563620871e-75 -1e-100, -3.7953949389104665e74 -1e200, -2.0800734986321869e-60 2.051992028072436e-55, 3.38586824330807e73 -7.962294473171359e74, 1.9029580275885475e-13 2.1370106480605854e-89))') > 1e140; diff --git a/regress/core/orientation_expected b/regress/core/orientation_expected index 8502182ff..8d93fa66d 100644 --- a/regress/core/orientation_expected +++ b/regress/core/orientation_expected @@ -52,3 +52,6 @@ 434|t 435|t 436|f +437|t +438|f +439|t commit 0e16d8991f1356c0b735d6ab3046e036a7e08740 Author: Darafei Praliaskouski Date: Wed Jun 17 00:36:20 2026 +0400 liblwgeom: guard compensated area overflow (cherry picked from commit 0bae360bbefd0d4ce87898d027fe808201ea0a8d) diff --git a/NEWS b/NEWS index 1a7f8db0a..c4a2ebec8 100644 --- a/NEWS +++ b/NEWS @@ -171,6 +171,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) + - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate + ring-orientation precision regressions (Darafei Praliaskouski) - #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) - #6048, [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) diff --git a/liblwgeom/cunit/cu_ptarray.c b/liblwgeom/cunit/cu_ptarray.c index c906d466e..d8c82f89a 100644 --- a/liblwgeom/cunit/cu_ptarray.c +++ b/liblwgeom/cunit/cu_ptarray.c @@ -5,6 +5,7 @@ * * Copyright (C) 2011 Sandro Santilli * Copyright (C) 2008 Paul Ramsey + * Copyright (C) 2026 Darafei Praliaskouski * * This is free software; you can redistribute and/or modify it under * the terms of the GNU General Public Licence. See the COPYING file. @@ -14,6 +15,7 @@ #include #include #include +#include #include "CUnit/Basic.h" #include "CUnit/CUnit.h" @@ -343,6 +345,82 @@ static void test_ptarray_signed_area(void) area = ptarray_signed_area(line->points); ASSERT_DOUBLE_EQUAL_TOLERANCE(area, 0.5, 0.0000001); lwline_free(line); + + /* Preserve determinant tails when later large determinants cancel. */ + line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,10000000000000000 1,1 1,10000000000000000 0,0 0)")); + area = ptarray_signed_area(line->points); + ASSERT_DOUBLE_EQUAL_TOLERANCE(area, 0.5, 0.0000001); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); + lwline_free(line); + + /* Preserve product tails when determinant products nearly cancel. */ + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10000000000000276 10000000000000280," + "59999999999999680 59999999999999672," + "89999999999999360 89999999999999360," + "90000000000000112 90000000000000128," + "90000000000000704 90000000000000704," + "10000000000000276 10000000000000280)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area < 0.0); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); + lwline_free(line); + + /* Preserve subtraction tails when the origin shift hides unit-scale offsets. */ + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(-10000000000000000 -10000000000000000," + "1 -1,1 0,1 1,-1 0," + "-10000000000000000 -10000000000000000)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area < -1e16); + CU_ASSERT(area > -2e16); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); + lwline_free(line); + + /* Overflowed determinants should remain infinite, not poison the sum with NaN. */ + line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,0 1e200,1e200 1e200,1e200 0,0 0)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(isinf(area) && area > 0); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); + lwline_free(line); + + /* Rescale overflowing fan products when the determinant itself is finite. */ + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,1 1e155,1e155 1e155," + "1e155 1.0000000000000001e155," + "1 1.0000000000000001e155,0 0)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(isfinite(area)); + CU_ASSERT(area < -1e294); + CU_ASSERT(area > -2e294); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); + lwline_free(line); + + line = + lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,1 1.0000000000000001e155," + "1e155 1.0000000000000001e155," + "1e155 1e155,1 1e155,0 0)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(isfinite(area)); + CU_ASSERT(area > 1e294); + CU_ASSERT(area < 2e294); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); + lwline_free(line); + + /* Preserve tiny finite products beside unrelated huge coordinates. */ + line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,1e-200 0,1e300 1e300,0 0)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area < -4e99); + CU_ASSERT(area > -6e99); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 1); + lwline_free(line); + + line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,1e300 1e300,1e-200 0,0 0)")); + area = ptarray_signed_area(line->points); + CU_ASSERT(area > 4e99); + CU_ASSERT(area < 6e99); + CU_ASSERT_EQUAL(ptarray_isccw(line->points), 0); + lwline_free(line); } static void test_ptarray_contains_point(void) diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index 4cae95038..4942c9dcb 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -20,19 +20,73 @@ * * Copyright (C) 2012-2021 Sandro Santilli * Copyright (C) 2001-2006 Refractions Research Inc. - * Copyright 2026 Darafei Praliaskouski + * Copyright (C) 2026 Darafei Praliaskouski * **********************************************************************/ #include #include #include +#include +#include +#include #include "../postgis_config.h" /*#define POSTGIS_DEBUG_LEVEL 4*/ #include "liblwgeom_internal.h" #include "lwgeom_log.h" +static inline void +ptarray_signed_area_add(double *sum, double *compensation, double value) +{ + double y, t; + + /* + * Kahan compensation is only valid in finite arithmetic. When a finite + * ring is so large that the determinant overflows, preserve the IEEE + * infinity instead of manufacturing NaN in the compensation term. + */ + if (!isfinite(value) || !isfinite(*sum)) + { + *sum += value; + *compensation = 0.0; + return; + } + + y = value - *compensation; + t = *sum + y; + *compensation = (t - *sum) - y; + *sum = t; +} + +static inline void +ptarray_signed_area_two_diff(double a, double b, double *diff, double *err) +{ + double bvirt, avirt, bround, around; + + *diff = a - b; + bvirt = a - *diff; + avirt = *diff + bvirt; + bround = bvirt - b; + around = a - avirt; + *err = around + bround; +} + +static inline int +ptarray_signed_area_product_exponent(double a, double b) +{ + int ea, eb; + + if (!isfinite(a) || !isfinite(b)) + return DBL_MAX_EXP; + if (a == 0.0 || b == 0.0) + return INT_MIN; + + frexp(fabs(a), &ea); + frexp(fabs(b), &eb); + return ea + eb; +} + int ptarray_has_z(const POINTARRAY *pa) { @@ -1083,7 +1137,14 @@ ptarray_signed_area(const POINTARRAY *pa) const POINT2D *P3; double sum = 0.0; double compensation = 0.0; + double tail_sum = 0.0; + double tail_compensation = 0.0; + double scaled_sum = 0.0; + double scaled_compensation = 0.0; + double scaled_tail_sum = 0.0; + double scaled_tail_compensation = 0.0; double x0, y0; + int area_scale = 0; uint32_t i; if (! pa || pa->npoints < 3 ) @@ -1093,36 +1154,116 @@ ptarray_signed_area(const POINTARRAY *pa) P2 = getPoint2d_cp(pa, 1); x0 = P1->x; y0 = P1->y; + /* + * Use one binary area scale for overflowing fan triangles. Some skinny + * rings have finite total area even though individual fan triangles + * overflow; scaling each overflowing term independently would preserve + * those infinities and still lose the final cancellation. Finite raw + * triangles are kept in the unscaled sum so unrelated tiny determinants do + * not underflow just because another triangle needed scaling. + */ + for (i = 1; i < pa->npoints; i++) + { + double ax, ay, bx, by, axerr, ayerr, bxerr, byerr; + int product_exponent; + P3 = getPoint2d_cp(pa, i); + ptarray_signed_area_two_diff(P2->x, x0, &ax, &axerr); + ptarray_signed_area_two_diff(P2->y, y0, &ay, &ayerr); + ptarray_signed_area_two_diff(P3->x, x0, &bx, &bxerr); + ptarray_signed_area_two_diff(P3->y, y0, &by, &byerr); + product_exponent = + FP_MAX(ptarray_signed_area_product_exponent(ax, by), ptarray_signed_area_product_exponent(ay, bx)); + if (product_exponent > DBL_MAX_EXP - 24) + { + int coordinate_scale = (product_exponent - (DBL_MAX_EXP - 24) + 1) / 2; + area_scale = FP_MAX(area_scale, coordinate_scale); + } + P2 = P3; + } + + P2 = getPoint2d_cp(pa, 1); for ( i = 2; i < pa->npoints; i++ ) { - double ax, ay, bx, by; - double detleft, detright, det, err, b, y, t; + double ax, ay, bx, by, axerr, ayerr, bxerr, byerr; + double detleft, detright, det, err = 0.0, b; + double *active_sum = ∑ + double *active_compensation = &compensation; + double *active_tail_sum = &tail_sum; + double *active_tail_compensation = &tail_compensation; P3 = getPoint2d_cp(pa, i); - ax = P2->x - x0; - ay = P2->y - y0; - bx = P3->x - x0; - by = P3->y - y0; + ptarray_signed_area_two_diff(P2->x, x0, &ax, &axerr); + ptarray_signed_area_two_diff(P2->y, y0, &ay, &ayerr); + ptarray_signed_area_two_diff(P3->x, x0, &bx, &bxerr); + ptarray_signed_area_two_diff(P3->y, y0, &by, &byerr); detleft = ax * by; detright = ay * bx; det = detleft - detright; - b = det - detleft; - err = (detleft - (det - b)) - (detright + b); + if (area_scale > 0 && (!isfinite(detleft) || !isfinite(detright) || !isfinite(det))) + { + ax = ldexp(ax, -area_scale); + ay = ldexp(ay, -area_scale); + bx = ldexp(bx, -area_scale); + by = ldexp(by, -area_scale); + axerr = ldexp(axerr, -area_scale); + ayerr = ldexp(ayerr, -area_scale); + bxerr = ldexp(bxerr, -area_scale); + byerr = ldexp(byerr, -area_scale); + active_sum = &scaled_sum; + active_compensation = &scaled_compensation; + active_tail_sum = &scaled_tail_sum; + active_tail_compensation = &scaled_tail_compensation; + detleft = ax * by; + detright = ay * bx; + det = detleft - detright; + } + /* + * Keep the determinant rounding error, including the product + * tails, and sum it with Kahan compensation. Near-collinear + * large-coordinate rings can otherwise lose the sign in the + * rounded products before the subtraction tail is recovered. + * The error tail is meaningful only for finite products; with + * overflow it can turn an infinite determinant into NaN through + * Inf-Inf cancellation. + */ + if (isfinite(detleft) && isfinite(detright) && isfinite(det)) + { + b = det - detleft; + err = (detleft - (det - b)) - (detright + b); + err += fma(ax, by, -detleft) - fma(ay, bx, -detright); + /* + * The origin shift itself can round away unit-scale + * offsets beside 1e16-scale coordinates. Include the + * low-order subtraction terms in the determinant so the + * compensated sum still sees their signed area. + */ + err += (ax * byerr + axerr * by) + axerr * byerr; + err -= (ay * bxerr + ayerr * bx) + ayerr * bxerr; + } - y = det - compensation; - t = sum + y; - compensation = (t - sum) - y; - sum = t; - - y = err - compensation; - t = sum + y; - compensation = (t - sum) - y; - sum = t; + ptarray_signed_area_add(active_sum, active_compensation, det); + /* + * Keep determinant tails in a separate compensated stream. If + * they are folded into the main determinant stream immediately, + * a later cancellation between large determinants can erase the + * small residual that fixes the exact double-coordinate sign. + */ + ptarray_signed_area_add(active_tail_sum, active_tail_compensation, err); /* Move forwards! */ P2 = P3; } + if (scaled_sum != 0.0) + ptarray_signed_area_add(&sum, &compensation, ldexp(scaled_sum, 2 * area_scale)); + if (scaled_tail_sum != 0.0) + { + double scaled_tail = ldexp(scaled_tail_sum, 2 * area_scale); + if (isfinite(scaled_tail)) + ptarray_signed_area_add(&tail_sum, &tail_compensation, scaled_tail); + } + if (tail_sum != 0.0 && isfinite(tail_sum)) + ptarray_signed_area_add(&sum, &compensation, tail_sum); return -sum / 2.0; } diff --git a/regress/core/orientation.sql b/regress/core/orientation.sql index 1ee927fd5..725e9e195 100644 --- a/regress/core/orientation.sql +++ b/regress/core/orientation.sql @@ -62,3 +62,30 @@ SELECT '416', ST_IsPolygonCCW('MULTIPOLYGON (((0 0, 1 1, 1 0, 0 0)), ((100 0, 10 SELECT '417', ST_IsPolygonCW( 'MULTIPOLYGON (((0 0, 1 0, 1 1, 0 0)), ((100 0, 101 1, 101 0, 100 0)))'); SELECT '418', ST_IsPolygonCCW('MULTIPOLYGON (((0 0, 1 0, 1 1, 0 0)), ((100 0, 101 1, 101 0, 100 0)))'); +-- Near-collinear exterior ring with large coordinates +SELECT '419', ST_IsPolygonCW( 'POLYGON ((10000000000000276 10000000000000280, 59999999999999680 59999999999999672, 89999999999999360 89999999999999360, 90000000000000112 90000000000000128, 90000000000000704 90000000000000704, 10000000000000276 10000000000000280))'); +SELECT '420', ST_IsPolygonCCW('POLYGON ((10000000000000276 10000000000000280, 59999999999999680 59999999999999672, 89999999999999360 89999999999999360, 90000000000000112 90000000000000128, 90000000000000704 90000000000000704, 10000000000000276 10000000000000280))'); + +-- Large origin shift with unit-scale offsets +SELECT '421', ST_IsPolygonCW( 'POLYGON ((-10000000000000000 -10000000000000000, 1 -1, 1 0, 1 1, -1 0, -10000000000000000 -10000000000000000))'); +SELECT '422', ST_IsPolygonCCW('POLYGON ((-10000000000000000 -10000000000000000, 1 -1, 1 0, 1 1, -1 0, -10000000000000000 -10000000000000000))'); + +-- Skinny finite-area ring with individually overflowing fan products +SELECT '423', ST_IsPolygonCW( 'POLYGON ((0 0, 1 1e155, 1e155 1e155, 1e155 1.0000000000000001e155, 1 1.0000000000000001e155, 0 0))'); +SELECT '424', ST_IsPolygonCCW('POLYGON ((0 0, 1 1e155, 1e155 1e155, 1e155 1.0000000000000001e155, 1 1.0000000000000001e155, 0 0))'); +SELECT '425', ST_IsPolygonCW( 'POLYGON ((0 0, 1 1.0000000000000001e155, 1e155 1.0000000000000001e155, 1e155 1e155, 1 1e155, 0 0))'); +SELECT '426', ST_IsPolygonCCW('POLYGON ((0 0, 1 1.0000000000000001e155, 1e155 1.0000000000000001e155, 1e155 1e155, 1 1e155, 0 0))'); +SELECT '427', ST_Area('POLYGON ((0 0, 1 1e155, 1e155 1e155, 1e155 1.0000000000000001e155, 1 1.0000000000000001e155, 0 0))') > 1e294; +SELECT '428', ST_Area('POLYGON ((0 0, 1 1.0000000000000001e155, 1e155 1.0000000000000001e155, 1e155 1e155, 1 1e155, 0 0))') > 1e294; + +-- Tiny finite determinant product beside huge coordinates +SELECT '429', ST_IsPolygonCW( 'POLYGON ((0 0, 1e-200 0, 1e300 1e300, 0 0))'); +SELECT '430', ST_IsPolygonCCW('POLYGON ((0 0, 1e-200 0, 1e300 1e300, 0 0))'); +SELECT '431', ST_Area('POLYGON ((0 0, 1e-200 0, 1e300 1e300, 0 0))') > 4e99; +SELECT '432', ST_IsPolygonCW( 'POLYGON ((0 0, 1e300 1e300, 1e-200 0, 0 0))'); +SELECT '433', ST_IsPolygonCCW('POLYGON ((0 0, 1e300 1e300, 1e-200 0, 0 0))'); +SELECT '434', ST_Area('POLYGON ((0 0, 1e300 1e300, 1e-200 0, 0 0))') > 4e99; + +-- Large determinant cancellation after a small determinant tail +SELECT '435', ST_IsPolygonCW( 'POLYGON ((0 0, 10000000000000000 1, 1 1, 10000000000000000 0, 0 0))'); +SELECT '436', ST_IsPolygonCCW('POLYGON ((0 0, 10000000000000000 1, 1 1, 10000000000000000 0, 0 0))'); diff --git a/regress/core/orientation_expected b/regress/core/orientation_expected index cb8789ff0..8502182ff 100644 --- a/regress/core/orientation_expected +++ b/regress/core/orientation_expected @@ -34,3 +34,21 @@ 416|f 417|f 418|f +419|f +420|t +421|f +422|t +423|f +424|t +425|t +426|f +427|t +428|t +429|f +430|t +431|t +432|t +433|f +434|t +435|t +436|f commit 5336ccf1fe35d63672357a11f0082f4b70c0bbf8 Author: Darafei Praliaskouski Date: Wed Jun 17 00:12:21 2026 +0400 geometry: avoid extended precision area dependency (cherry picked from commit 7162829dbea13fb3acc72bbee2884abf26e09994) diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index 3091efc06..4cae95038 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -1081,9 +1081,9 @@ ptarray_signed_area(const POINTARRAY *pa) const POINT2D *P1; const POINT2D *P2; const POINT2D *P3; - long double sum = 0.0; - double x0; - long double x, y1, y2; + double sum = 0.0; + double compensation = 0.0; + double x0, y0; uint32_t i; if (! pa || pa->npoints < 3 ) @@ -1092,19 +1092,38 @@ ptarray_signed_area(const POINTARRAY *pa) P1 = getPoint2d_cp(pa, 0); P2 = getPoint2d_cp(pa, 1); x0 = P1->x; + y0 = P1->y; for ( i = 2; i < pa->npoints; i++ ) { + double ax, ay, bx, by; + double detleft, detright, det, err, b, y, t; P3 = getPoint2d_cp(pa, i); - x = (long double)P2->x - x0; - y1 = P3->y; - y2 = P1->y; - sum += x * (y2-y1); + + ax = P2->x - x0; + ay = P2->y - y0; + bx = P3->x - x0; + by = P3->y - y0; + + detleft = ax * by; + detright = ay * bx; + det = detleft - detright; + b = det - detleft; + err = (detleft - (det - b)) - (detright + b); + + y = det - compensation; + t = sum + y; + compensation = (t - sum) - y; + sum = t; + + y = err - compensation; + t = sum + y; + compensation = (t - sum) - y; + sum = t; /* Move forwards! */ - P1 = P2; P2 = P3; } - return (double)(sum / 2.0); + return -sum / 2.0; } int commit 5124ad4a50a4a914e4b188240997ee3f06e258d7 Author: Darafei Praliaskouski Date: Tue Jun 16 23:34:07 2026 +0400 geometry: fix planner and precision regressions (cherry picked from commit 2609ea702dd59fcdfa6331530b3eda5fa5f55f69) diff --git a/liblwgeom/cunit/cu_ptarray.c b/liblwgeom/cunit/cu_ptarray.c index 8cf3d8c11..c906d466e 100644 --- a/liblwgeom/cunit/cu_ptarray.c +++ b/liblwgeom/cunit/cu_ptarray.c @@ -338,6 +338,11 @@ static void test_ptarray_signed_area(void) ASSERT_DOUBLE_EQUAL_TOLERANCE(area, -4.0, 0.0000001); lwline_free(line); + /* Preserve small residuals through cancellation in the area sum. */ + line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,10000000000000000 0,1 -1,10000000000000000 -1,0 0)")); + area = ptarray_signed_area(line->points); + ASSERT_DOUBLE_EQUAL_TOLERANCE(area, 0.5, 0.0000001); + lwline_free(line); } static void test_ptarray_contains_point(void) diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index 3baae4da6..3091efc06 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -1081,8 +1081,9 @@ ptarray_signed_area(const POINTARRAY *pa) const POINT2D *P1; const POINT2D *P2; const POINT2D *P3; - double sum = 0.0; - double x0, x, y1, y2; + long double sum = 0.0; + double x0; + long double x, y1, y2; uint32_t i; if (! pa || pa->npoints < 3 ) @@ -1094,7 +1095,7 @@ ptarray_signed_area(const POINTARRAY *pa) for ( i = 2; i < pa->npoints; i++ ) { P3 = getPoint2d_cp(pa, i); - x = P2->x - x0; + x = (long double)P2->x - x0; y1 = P3->y; y2 = P1->y; sum += x * (y2-y1); @@ -1103,7 +1104,7 @@ ptarray_signed_area(const POINTARRAY *pa) P1 = P2; P2 = P3; } - return sum / 2.0; + return (double)(sum / 2.0); } int diff --git a/postgis/gserialized_supportfn.c b/postgis/gserialized_supportfn.c index b6fe6dbba..a7c0e1136 100644 --- a/postgis/gserialized_supportfn.c +++ b/postgis/gserialized_supportfn.c @@ -433,10 +433,16 @@ Datum postgis_index_supportfn(PG_FUNCTION_ARGS) rightdatatype = exprType(rightarg); /* - * Given the index operator family and the arguments and the - * desired strategy number we can now lookup the operator - * we want (usually && or &&&). - */ + * Given the index operator family and the arguments and the + * desired strategy number we can now lookup the operator + * we want (usually && or &&&). ST_DFullyWithin is directional: + * for an index on the first argument, overlap with the expanded + * second argument is the safe lossy condition. The stronger + * contained-by condition is only safe for an index on the second + * argument, which must be covered by the expanded first argument. + */ + if (idxfn.index == ST_DFULLYWITHIN_IDX && req->indexarg == 0) + idxfn.index = ST_DWITHIN_IDX; oproid = get_opfamily_member(opfamilyoid, leftdatatype, rightdatatype, diff --git a/regress/core/tickets.sql b/regress/core/tickets.sql index c8a6e69cb..83f954139 100644 --- a/regress/core/tickets.sql +++ b/regress/core/tickets.sql @@ -1612,9 +1612,11 @@ SELECT '#5747', ST_Length('MULTISURFACE (((0 0, 1 0, 1 1, 0 1, 0 0)), CURVEPOLYG -- #5855 CREATE TEMP TABLE TEST (street text, extent geometry(Polygon,32633)); INSERT INTO test VALUES ('Knosesmauet','0103000020797F0000010000000500000010B2468761BDDFC06390523AA1B0594110B2468761BDDFC030554D9BC3B0594107992AF50799DFC030554D9BC3B0594107992AF50799DFC06390523AA1B0594110B2468761BDDFC06390523AA1B05941'); -SET enable_seqscan=false; CREATE INDEX test_idx ON test USING GIST ( extent ); +-- These checks protect index-support rewrites, so keep sequential scans +-- disabled only around the #5855 queries that must exercise GiST paths. +SET enable_seqscan = off; SELECT '#5855', street FROM test WHERE ST_DFullyWithin( @@ -1623,6 +1625,21 @@ WHERE ST_DFullyWithin( 1700 ); +CREATE TEMP TABLE dfullywithin_indexed_first_arg (id integer, geom geometry); +INSERT INTO dfullywithin_indexed_first_arg +VALUES (1, 'POLYGON((-10 -10,-10 10,10 10,10 -10,-10 -10))'); +CREATE INDEX dfullywithin_indexed_first_arg_gist +ON dfullywithin_indexed_first_arg USING GIST (geom); + +SELECT '#5855.1', id +FROM dfullywithin_indexed_first_arg +WHERE ST_DFullyWithin( + geom, + ST_GeomFromText('POINT(0 0)'), + 0 +); +RESET enable_seqscan; + SELECT '#5876', ST_AsText(ST_AddPoint( 'LINESTRING (1 1, 2 2)'::geometry, 'POINT EMPTY'::geometry), 2); diff --git a/regress/core/tickets_expected b/regress/core/tickets_expected index 639472965..bed2d3302 100644 --- a/regress/core/tickets_expected +++ b/regress/core/tickets_expected @@ -492,6 +492,7 @@ ERROR: Geometry contains invalid coordinates #5686|0 #5747|0 #5855|Knosesmauet +#5855.1|1 #5876|LINESTRING(1 1,2 2) #5082|t public.test5978.shape SRID:4326 TYPE:POINT DIMS:2 commit 6fff4b58bbf6b671fdb34a0bbaa70d1f8ab11b2c Author: Darafei Praliaskouski Date: Mon Jul 6 11:30:38 2026 +0400 topology: preserve large ids from edge wrappers (cherry picked from commit 3553756154863a8eebb1c56af7f56e10ca91f7b6) Closes https://github.com/postgis/postgis/pull/1153 diff --git a/topology/postgis_topology.c b/topology/postgis_topology.c index 4bbf220ae..41491d080 100644 --- a/topology/postgis_topology.c +++ b/topology/postgis_topology.c @@ -4726,7 +4726,7 @@ Datum ST_RemEdgeModFace(PG_FUNCTION_ARGS) { text* toponame_text; char* toponame; - int ret; + LWT_ELEMID ret; LWT_ELEMID node_id; LWT_TOPOLOGY *topo; @@ -4781,7 +4781,7 @@ Datum ST_RemEdgeNewFace(PG_FUNCTION_ARGS) { text* toponame_text; char* toponame; - int ret; + LWT_ELEMID ret; LWT_ELEMID node_id; LWT_TOPOLOGY *topo; @@ -4834,7 +4834,7 @@ Datum ST_ModEdgeHeal(PG_FUNCTION_ARGS) { text* toponame_text; char* toponame; - int ret; + LWT_ELEMID ret; LWT_ELEMID eid1, eid2; LWT_TOPOLOGY *topo; @@ -4888,7 +4888,7 @@ Datum ST_NewEdgeHeal(PG_FUNCTION_ARGS) { text* toponame_text; char* toponame; - int ret; + LWT_ELEMID ret; LWT_ELEMID eid1, eid2; LWT_TOPOLOGY *topo; commit 6ea8421662ed55c8b895e1a6e4d4ef3edefde4c6 Author: Darafei Praliaskouski Date: Mon Jul 6 11:30:02 2026 +0400 topology: fix corrupt column fallback variables (cherry picked from commit 3c6f0e146badc6528c17f7f1a666cf33c71cb694) Closes https://github.com/postgis/postgis/pull/1149 diff --git a/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in index 9c1ca04ec..b385d4686 100644 --- a/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in +++ b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in @@ -72,10 +72,10 @@ WHERE pg_type.typname = 'topogeometry' AND pga.attname = '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); + WHERE l.topology_id = (%3$I).topology_id AND l.layer_id = (%3$I).layer_id AND (%3$I).type <> l.feature_type ', layerSchema, layerTable, layerColumn); EXECUTE var_sql; GET DIAGNOSTICS var_row_count = ROW_COUNT; - 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); + result = result || format('%s rows updated for %s.%s.%s column back to integer id type', var_row_count, layerSchema, layerTable, layerColumn); END IF; RETURN result; END commit 8a03193ebc452f335c0f51c26dbdbb53b1a15904 Author: Darafei Praliaskouski Date: Mon Jul 6 11:27:02 2026 +0400 utils: create upgrade-check tempdir safely (cherry picked from commit e1fc3de47c29025a232738f78da8d330f2281984) Closes https://github.com/postgis/postgis/pull/1148 diff --git a/utils/check_create_upgrade_replaced_function_errors.sh b/utils/check_create_upgrade_replaced_function_errors.sh index caa5d375d..df9ebe224 100644 --- a/utils/check_create_upgrade_replaced_function_errors.sh +++ b/utils/check_create_upgrade_replaced_function_errors.sh @@ -2,11 +2,9 @@ set -e -TMPDIR="${TMPDIR:-/tmp}/check_create_upgrade_replaced_function_errors.$$" +TMPDIR="$(mktemp -d "${TMPDIR:-/tmp}/check_create_upgrade_replaced_function_errors.XXXXXX")" trap 'rm -rf "${TMPDIR}"' EXIT -mkdir -p "${TMPDIR}" - cat > "${TMPDIR}/postgis.sql" <<'SQL' -- INSTALL VERSION: 3.7.0dev -- Availability: 1.0.0 commit d9525f032bba08eefdce60e55f333c101dace23d Author: Darafei Praliaskouski Date: Mon Jul 6 11:26:47 2026 +0400 doc: fix localized EPUB help target (cherry picked from commit af647934be4c73ed3b4a9a0d1553d0094f7d2c75) Closes https://github.com/postgis/postgis/pull/1147 diff --git a/doc/Makefile.in b/doc/Makefile.in index cfeafac25..5288648c6 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -487,7 +487,7 @@ epub-uninstall: rm -f $(DESTDIR)$(docdir)/postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub epub: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub ## Generate postgis--en.epub -pdf-localized: ## Generate a postgis--.epub for supported languages +epub-localized: ## Generate a postgis--.epub for supported languages pdf: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).pdf ## Generate postgis--en.pdf pdf-localized: ## Generate a postgis--.pdf for supported languages commit 9000ef67ed38616b10e06d8da7bd012f9d866aa0 Author: Darafei Praliaskouski Date: Mon Jul 6 11:29:02 2026 +0400 topology: clean up TopoRingIsCCW early returns (cherry picked from commit 770ace4aeb699a2e55885f2893c60ec30eb5c008) Closes https://github.com/postgis/postgis/pull/1143 diff --git a/topology/postgis_topology.c b/topology/postgis_topology.c index 2eb19bb67..4bbf220ae 100644 --- a/topology/postgis_topology.c +++ b/topology/postgis_topology.c @@ -5917,7 +5917,9 @@ Datum TopoRingIsCCW(PG_FUNCTION_ARGS) if ( lwgeom_is_empty(lwgeom) ) { - PG_RETURN_BOOL(false); + lwgeom_free(lwgeom); + PG_FREE_IF_COPY(geom, 0); + PG_RETURN_BOOL(false); } if (lwgeom->type == POLYGONTYPE) @@ -5930,8 +5932,10 @@ Datum TopoRingIsCCW(PG_FUNCTION_ARGS) } else { - lwpgerror("Unsupported geometry type passed to TopoRingIsCCW"); - PG_RETURN_NULL(); + lwgeom_free(lwgeom); + PG_FREE_IF_COPY(geom, 0); + lwpgerror("Unsupported geometry type passed to TopoRingIsCCW"); + PG_RETURN_NULL(); } isCCW = lwt_IsTopoRingCCW(pa); ----------------------------------------------------------------------- Summary of changes: NEWS | 5 + doc/Makefile.in | 2 +- liblwgeom/cunit/cu_ptarray.c | 164 +++++++++ liblwgeom/ptarray.c | 383 ++++++++++++++++++++- postgis/gserialized_supportfn.c | 14 +- regress/core/orientation.sql | 42 +++ regress/core/orientation_expected | 27 ++ regress/core/tickets.sql | 19 +- regress/core/tickets_expected | 1 + topology/postgis_topology.c | 18 +- .../sql/manage/FixCorruptTopoGeometryColumn.sql.in | 4 +- ...heck_create_upgrade_replaced_function_errors.sh | 4 +- 12 files changed, 657 insertions(+), 26 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 03:15:49 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 03:15:49 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-15-g19ed1e124 Message-ID: <20260706101550.2DB87D565@trac.osgeo.org> 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 19ed1e12471723eb21184b1ea64429a219db6534 (commit) from d7a16bb43295c653e86c69ae5eeace3661587ca3 (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 19ed1e12471723eb21184b1ea64429a219db6534 Author: Teramoto Ikuhiro Date: Mon Jul 6 09:40:21 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 91.7% (5577 of 6077 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index e2b361281..bb5dad274 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-06 08:39+0000\n" +"PO-Revision-Date: 2026-07-06 10:15+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -4624,7 +4624,7 @@ msgstr "??????????????????" #, no-c-format msgid "" "Update the column assuming everything is perfectly aligned with the edges." -msgstr "" +msgstr "????????????????????????????" #. Tag: para #, no-c-format @@ -4642,6 +4642,9 @@ msgid "" "faces and edges, cast the topogeometry to a geometry. The resulting " "geometries are aligned with the TIGER street centerlines." msgstr "" +"??????????????????????????????????????" +"??????????????????????????????????????" +"?TIGER????????????????" #. Tag: para #, no-c-format @@ -4960,6 +4963,8 @@ msgid "" "Set an overall TopoGeometry value to be composed of all elements from " "specific TopoGeometry values." msgstr "" +"???????????????????????????????" +"???????????????" #. Tag: para #, no-c-format @@ -9573,6 +9578,11 @@ msgid "" "the input is not a LINESTRING, " "CIRCULARLINESTRING, or NURBSCURVE." msgstr "" +"LINESTRING, CIRCULARLINESTRING, " +"NURBSCURVE ?????????POINT??" +"???????LINESTRING, CIRCULARLINESTRING, NURBSCURVE???????????? " +"NULL??????" #. Tag: para #, no-c-format @@ -9614,7 +9624,7 @@ msgstr "3?????????????????" #. Tag: para #, no-c-format msgid "3D endpoint." -msgstr "" +msgstr "3?????" #. Tag: para #, no-c-format @@ -9624,7 +9634,7 @@ msgstr "CIRCULARSTRING???????" #. Tag: para #, no-c-format msgid "End point of a NURBSCurve" -msgstr "" +msgstr "NURBSCURVE???" #. Tag: para #, no-c-format @@ -9731,7 +9741,7 @@ msgstr "&sqlmm_compliant; SQL-MM 3: 8.2.3, 8.3.3" #. Tag: para #, no-c-format msgid "This example extracts exterior rings from a table of polygons." -msgstr "" +msgstr "?????????????????????????????" #. Tag: para #, no-c-format @@ -9791,12 +9801,12 @@ msgstr "&sqlmm_compliant; SQL-MM 3: 9.1.5" #. Tag: para #, no-c-format msgid "Extracting a subset of points from a 3D multipoint." -msgstr "" +msgstr "3??MULTIPOINT???????????????" #. Tag: para #, no-c-format msgid "Output:" -msgstr "" +msgstr "??:" #. Tag: para #, no-c-format @@ -9970,12 +9980,12 @@ msgstr "??????????" #. Tag: para #, no-c-format msgid "This example uses a cube." -msgstr "" +msgstr "??????????????" #. Tag: para #, no-c-format msgid "This example uses the same cube with one side missing." -msgstr "" +msgstr "????????????????????????????????" #. Tag: refpurpose #, no-c-format @@ -10147,6 +10157,9 @@ msgid "" "ST_EndPoint(g)) and (does not self " "intersect)." msgstr "" +"TRUE????? LINESTRING ? (ST_StartPoint(g) ~= ST_EndPoint(g))?" +"? (?????????)??????" #. Tag: para #, no-c-format @@ -10379,7 +10392,7 @@ msgstr "&sqlmm_compliant; SQL-MM 3: 9.1.4" #. Tag: para #, no-c-format msgid "This example returns 1; prior versions would have returned NULL." -msgstr "" +msgstr "?????1???????????????NULL???????" #. Tag: para #, no-c-format @@ -10417,7 +10430,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example counts the interior rings of a polygon." -msgstr "" +msgstr "????????????????????????" #. Tag: para #, no-c-format @@ -10515,7 +10528,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Extract the 2nd face of the polyhedral surface." -msgstr "" +msgstr "?????????2??????????????" #. Tag: para #, no-c-format @@ -10593,12 +10606,12 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example extracts all POINT geometries from a LineString." -msgstr "" +msgstr "????????LINESTRING?????POINT?????????????" #. Tag: para #, no-c-format msgid "This example uses a CircularString." -msgstr "" +msgstr "?????CIRBULARSTRING??????" #. Tag: refpurpose #, no-c-format @@ -10640,7 +10653,7 @@ msgstr ", " #, no-c-format msgid "" "Returns the first point of a LineString, CircularLineString, or NURBSCurve." -msgstr "" +msgstr "LINESTRING, CIRCULARSTRING, NURBSCURVE ??????????????" #. Tag: para #, no-c-format @@ -10650,6 +10663,10 @@ msgid "" "geometry as a POINT. For other geometries, returns the " "first point in coordinate order." msgstr "" +"LINESTRING, CIRCULARLINESTRING, " +"NURBSCURVE???????????????POINT?????????????????????????????????" +"??????????" #. Tag: para #, no-c-format @@ -10690,7 +10707,7 @@ msgstr "???????????????" #. Tag: para #, no-c-format msgid "Start point of a Point is the Point itself" -msgstr "" +msgstr "??????????????????????" #. Tag: para #, no-c-format @@ -10705,7 +10722,7 @@ msgstr "CIRCULARSTRING???????" #. Tag: para #, no-c-format msgid "Start point of a NURBSCurve" -msgstr "" +msgstr "NURBSCURVE???????" #. Tag: para #, no-c-format @@ -10717,7 +10734,7 @@ msgstr ", " msgid "" "Returns the M coordinate of the first point of a LineString, " "CircularLineString, or NURBSCurve." -msgstr "" +msgstr "LINESTRING, CIRCULARLINESTRING, NURBSCURVE ?????????M???????" #. Tag: para #, no-c-format @@ -10728,38 +10745,43 @@ msgid "" "does not have an M dimension or is not a LINESTRING, " "CIRCULARLINESTRING, or NURBSCURVE." msgstr "" +"LINESTRING, CIRCULARLINESTRING, " +"NURBSCURVE???????????????M????????" +"????????M??????????LINESTRING, " +"CIRCULARLINESTRING, NURBSCURVE?????????" +"????? NULL??????" #. Tag: para #, no-c-format msgid "Start M value of a LineString" -msgstr "" +msgstr "LINESTRING????M?" #. Tag: para #, no-c-format msgid "Start M value of a CircularString" -msgstr "" +msgstr "CIRCULARSTRING????M?" #. Tag: para #, no-c-format msgid "Start M value of a NURBSCurve" -msgstr "" +msgstr "NURBSCURVE????M?" #. Tag: para #, no-c-format msgid "Geometry without M dimension returns NULL" -msgstr "" +msgstr "M?????????????????NULL?????" #. Tag: para -#, no-c-format +#, fuzzy, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: refpurpose #, no-c-format msgid "" "Returns the M coordinate of the last point of a LineString, " "CircularLineString, or NURBSCurve." -msgstr "" +msgstr "LINESTRING, CIRCULARSTRING, NURBSCURVE?????????M???????" #. Tag: para #, no-c-format @@ -10770,33 +10792,38 @@ msgid "" "does not have an M dimension or is not a LINESTRING, " "CIRCULARLINESTRING, or NURBSCURVE." msgstr "" +"LINESTRING, CIRCULARLINESTRING, " +"NURBSCURVE???????????????M???????M?" +"???????LINESTRING, CIRCULARLINESTRING, NURBSCURVE????????????" +"NULL??????" #. Tag: para #, no-c-format msgid "End M value of a LineString" -msgstr "" +msgstr "LINERSTRING????M?" #. Tag: para #, no-c-format msgid "End M value of a CircularString" -msgstr "" +msgstr "CIRCULARRSTRING????M?" #. Tag: para #, no-c-format msgid "End M value of a NURBSCurve" -msgstr "" +msgstr "NURBSCURVE????M?" #. Tag: para -#, no-c-format +#, fuzzy, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: refpurpose #, no-c-format msgid "" "Sets the M coordinate of the first point of a LineString, " "CircularLineString, or NURBSCurve." -msgstr "" +msgstr "LINESTRING, CIRCULARSTRING, NURBSCURVE?????????M????????" #. Tag: para #, no-c-format @@ -10809,38 +10836,44 @@ msgid "" "varname>, CIRCULARLINESTRING, or NURBSCURVE." msgstr "" +"LINESTRING, CIRCULARLINESTRING, " +"NURBSCURVE????????????????????????" +"??M???????????????????????M????????????" +"?M???????? ?????????LINESTRING, " +"CIRCULARLINESTRING, NURBSCURVE????" +"????NULL??????" #. Tag: para #, no-c-format msgid "Set start M value of a LineString" -msgstr "" +msgstr "LINESTRING????M???????" #. Tag: para #, no-c-format msgid "Add M dimension and set start M value" -msgstr "" +msgstr "M?????????M???????" #. Tag: para #, no-c-format msgid "Set start M value of a CircularString" -msgstr "" +msgstr "CIRCULARSTRING????M???????" #. Tag: para #, no-c-format msgid "Set start M value of a NURBSCurve" -msgstr "" +msgstr "NURBSCURVE????M???????" #. Tag: para #, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: refpurpose #, no-c-format msgid "" "Sets the M coordinate of the last point of a LineString, CircularLineString, " "or NURBSCurve." -msgstr "" +msgstr "LINESTRING, CIRCULARSTRING, NURBSCURVE????M????????" #. Tag: para #, no-c-format @@ -10853,31 +10886,37 @@ msgid "" "varname>, CIRCULARLINESTRING, or NURBSCURVE." msgstr "" +"LINESTRING, CIRCULARLINESTRING, " +"NURBSCURVE????????????????????????" +"??M???????????????????????M????????????" +"?M???????? ?????????LINESTRING, " +"CIRCULARLINESTRING, NURBSCURVE????" +"????NULL??????" #. Tag: para #, no-c-format msgid "Set end M value of a LineString" -msgstr "" +msgstr "LINESTRING????M???????" #. Tag: para #, no-c-format msgid "Add M dimension and set end M value" -msgstr "" +msgstr "M?????????M???????" #. Tag: para #, no-c-format msgid "Set end M value of a CircularString" -msgstr "" +msgstr "CIRCULARSTRING????M???????" #. Tag: para #, no-c-format msgid "Set end M value of a NURBSCurve" -msgstr "" +msgstr "NURBSCURVE????M???????" #. Tag: para #, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: refpurpose #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 123 +++++++++++++++++++++++++++++--------------- 1 file changed, 81 insertions(+), 42 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 03:56:14 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 03:56:14 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-16-g333d896e7 Message-ID: <20260706105614.51B61E5AA@trac.osgeo.org> 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 333d896e75c3d61887e80c506f5879fd558b1a2c (commit) from 19ed1e12471723eb21184b1ea64429a219db6534 (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 333d896e75c3d61887e80c506f5879fd558b1a2c Author: Darafei Praliaskouski Date: Mon Jul 6 14:14:20 2026 +0400 NEWS: start 3.7.0beta1 section Closes https://github.com/postgis/postgis/pull/898 Closes https://github.com/postgis/postgis/pull/1143 Closes https://github.com/postgis/postgis/pull/1147 Closes https://github.com/postgis/postgis/pull/1148 Closes https://github.com/postgis/postgis/pull/1149 Closes https://github.com/postgis/postgis/pull/1153 References https://github.com/postgis/postgis/pull/897 diff --git a/NEWS b/NEWS index 6fda3ea30..78ad37d49 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,25 @@ +PostGIS 3.7.0beta1 +2026/xx/xx + +This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. +To take advantage of all features postgis extension features, GEOS 3.15+ is needed. +To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed. + +* Bug Fixes * + + - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate + ring-orientation precision regressions (Darafei Praliaskouski) + - GH-1143, [topology] Clean up TopoRingIsCCW early returns + (Darafei Praliaskouski) + - GH-1147, [doc] Fix localized EPUB help target (Darafei Praliaskouski) + - GH-1148, [utils] Create upgrade-check tempdir safely + (Darafei Praliaskouski) + - GH-1149, [topology] Fix corrupt column fallback variables + (Darafei Praliaskouski) + - GH-1153, [topology] Preserve large ids from edge wrappers + (Darafei Praliaskouski) + + PostGIS 3.7.0alpha1 2026/07/05 @@ -171,11 +193,6 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) - - GH-897, [topology] Harden topology helper functions and - maintenance SQL against identifier, tolerance, bigint, and cleanup - regressions (Darafei Praliaskouski) - - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate - ring-orientation precision regressions (Darafei Praliaskouski) - #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) - #6048, [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) ----------------------------------------------------------------------- Summary of changes: NEWS | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 03:56:16 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 03:56:16 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.5 updated. 3.5.7-55-gaadeecfb5 Message-ID: <20260706105617.06366E477@trac.osgeo.org> 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, stable-3.5 has been updated via aadeecfb513034ce713c51285286d6989096b3d2 (commit) from b775c99ddeeecd32fe68a23cc95963c59c81029d (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 aadeecfb513034ce713c51285286d6989096b3d2 Author: Darafei Praliaskouski Date: Mon Jul 6 14:16:31 2026 +0400 NEWS: start PostGIS 3.5.8 section Closes https://github.com/postgis/postgis/pull/898 References https://github.com/postgis/postgis/pull/897 diff --git a/NEWS b/NEWS index 964e69197..727115c49 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,14 @@ +PostGIS 3.5.8 +2026/xx/xx + +* Bug Fixes * + + - GH-897, [topology] Harden topology helper functions and + maintenance SQL against identifier, tolerance, bigint, and cleanup + regressions (Darafei Praliaskouski) + - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate + ring-orientation precision regressions (Darafei Praliaskouski) + PostGIS 3.5.7 2026/06/10 @@ -28,12 +39,6 @@ PostGIS 3.5.7 GDAL compatibility (Darafei Praliaskouski) - GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) - - GH-897, [topology] Harden topology helper functions and - maintenance SQL against identifier, tolerance, bigint, and cleanup - regressions (Darafei Praliaskouski) - - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate - ring-orientation precision regressions (Darafei Praliaskouski) - PostGIS 3.5.6 2026/04/14 diff --git a/Version.config b/Version.config index 23e465b5d..5d9b2d110 100644 --- a/Version.config +++ b/Version.config @@ -5,7 +5,7 @@ POSTGIS_MAJOR_VERSION=3 POSTGIS_MINOR_VERSION=5 -POSTGIS_MICRO_VERSION=7 +POSTGIS_MICRO_VERSION=8dev # Liblwgeom interface versioning, reset to 0:0:0 (cur:age:rev) # when changing POSTGIS_MINOR_VERSION ----------------------------------------------------------------------- Summary of changes: NEWS | 17 +++++++++++------ Version.config | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 04:14:27 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 04:14:27 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-21-g0936d3fa9 Message-ID: <20260706111427.E5D3C31BB9@trac.osgeo.org> 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 0936d3fa9a7d8e170d4c1806ca522e188f79a681 (commit) via 1983ba2ddbef5128c34ef2f9f6a3542be898209c (commit) via afbfd0120136fea9cfabe7bcb0ccb34ece6e6fc4 (commit) via 12afc1d465c14008848ededffe76aac533e50bc4 (commit) via 425b52962c1d11ff3643da740e6ac7846c3cfce8 (commit) from 333d896e75c3d61887e80c506f5879fd558b1a2c (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 0936d3fa9a7d8e170d4c1806ca522e188f79a681 Author: Darafei Praliaskouski Date: Mon Jul 6 15:04:28 2026 +0400 NEWS: add entries for GH-1146 and GH-1150 References https://github.com/postgis/postgis/pull/1146 References https://github.com/postgis/postgis/pull/1150 diff --git a/NEWS b/NEWS index 78ad37d49..70a3dc001 100644 --- a/NEWS +++ b/NEWS @@ -11,11 +11,15 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed ring-orientation precision regressions (Darafei Praliaskouski) - GH-1143, [topology] Clean up TopoRingIsCCW early returns (Darafei Praliaskouski) + - GH-1146, Reset interrupt callbacks when PostgreSQL clears + cancellation state (Darafei Praliaskouski) - GH-1147, [doc] Fix localized EPUB help target (Darafei Praliaskouski) - GH-1148, [utils] Create upgrade-check tempdir safely (Darafei Praliaskouski) - GH-1149, [topology] Fix corrupt column fallback variables (Darafei Praliaskouski) + - GH-1150, Free polygon orientation inputs in ST_IsPolygonCW/CCW + (Darafei Praliaskouski) - GH-1153, [topology] Preserve large ids from edge wrappers (Darafei Praliaskouski) commit 1983ba2ddbef5128c34ef2f9f6a3542be898209c Merge: afbfd0120 425b52962 Author: Darafei Praliaskouski Date: Mon Jul 6 15:04:16 2026 +0400 Merge pull request https://github.com/postgis/postgis/pull/1150 postgis: free polygon orientation inputs Closes https://github.com/postgis/postgis/pull/1150 commit afbfd0120136fea9cfabe7bcb0ccb34ece6e6fc4 Merge: 333d896e7 12afc1d46 Author: Darafei Praliaskouski Date: Mon Jul 6 15:04:16 2026 +0400 Merge pull request https://github.com/postgis/postgis/pull/1146 postgis: reset interrupt callbacks when clear Closes https://github.com/postgis/postgis/pull/1146 commit 12afc1d465c14008848ededffe76aac533e50bc4 Author: Darafei Praliaskouski Date: Mon Jul 6 11:38:04 2026 +0400 postgis: reset interrupt callbacks when clear diff --git a/postgis/postgis_module.c b/postgis/postgis_module.c index 8d79254ab..29f01423a 100644 --- a/postgis/postgis_module.c +++ b/postgis/postgis_module.c @@ -70,6 +70,10 @@ static void interrupt_geos_callback(void) { GEOS_interruptRequest(); } + else + { + GEOS_interruptCancel(); + } } static void interrupt_liblwgeom_callback(void) @@ -89,6 +93,10 @@ static void interrupt_liblwgeom_callback(void) { lwgeom_request_interrupt(); } + else + { + lwgeom_cancel_interrupt(); + } } /* @@ -139,5 +147,3 @@ _PG_fini(void) { elog(NOTICE, "Goodbye from PostGIS %s", POSTGIS_VERSION); } - - diff --git a/raster/rt_pg/rtpostgis.c b/raster/rt_pg/rtpostgis.c index 663fe8552..76327b197 100644 --- a/raster/rt_pg/rtpostgis.c +++ b/raster/rt_pg/rtpostgis.c @@ -159,6 +159,8 @@ rtpg_interrupt_liblwgeom_callback(void) #endif if (QueryCancelPending || ProcDiePending) lwgeom_request_interrupt(); + else + lwgeom_cancel_interrupt(); } static lwinterrupt_callback *prev_liblwgeom_interrupt_callback = NULL; commit 425b52962c1d11ff3643da740e6ac7846c3cfce8 Author: Darafei Praliaskouski Date: Mon Jul 6 11:29:32 2026 +0400 postgis: free polygon orientation inputs diff --git a/postgis/lwgeom_functions_analytic.c b/postgis/lwgeom_functions_analytic.c index c424ba177..30a21e9aa 100644 --- a/postgis/lwgeom_functions_analytic.c +++ b/postgis/lwgeom_functions_analytic.c @@ -901,12 +901,18 @@ PG_FUNCTION_INFO_V1(ST_IsPolygonCW); Datum ST_IsPolygonCW(PG_FUNCTION_ARGS) { GSERIALIZED* geom; + LWGEOM *lwgeom; + bool is_cw; if (PG_ARGISNULL(0)) PG_RETURN_NULL(); geom = PG_GETARG_GSERIALIZED_P(0); - PG_RETURN_BOOL(lwgeom_has_orientation(lwgeom_from_gserialized(geom), LW_CLOCKWISE)); + lwgeom = lwgeom_from_gserialized(geom); + is_cw = lwgeom_has_orientation(lwgeom, LW_CLOCKWISE); + lwgeom_free(lwgeom); + PG_FREE_IF_COPY(geom, 0); + PG_RETURN_BOOL(is_cw); } /********************************************************************** @@ -919,12 +925,16 @@ PG_FUNCTION_INFO_V1(ST_IsPolygonCCW); Datum ST_IsPolygonCCW(PG_FUNCTION_ARGS) { GSERIALIZED* geom; + LWGEOM *lwgeom; + bool is_ccw; if (PG_ARGISNULL(0)) PG_RETURN_NULL(); geom = PG_GETARG_GSERIALIZED_P(0); - geom = PG_GETARG_GSERIALIZED_P(0); - PG_RETURN_BOOL(lwgeom_has_orientation(lwgeom_from_gserialized(geom), LW_COUNTERCLOCKWISE)); + lwgeom = lwgeom_from_gserialized(geom); + is_ccw = lwgeom_has_orientation(lwgeom, LW_COUNTERCLOCKWISE); + lwgeom_free(lwgeom); + PG_FREE_IF_COPY(geom, 0); + PG_RETURN_BOOL(is_ccw); } - ----------------------------------------------------------------------- Summary of changes: NEWS | 4 ++++ postgis/lwgeom_functions_analytic.c | 18 ++++++++++++++---- postgis/postgis_module.c | 10 ++++++++-- raster/rt_pg/rtpostgis.c | 2 ++ 4 files changed, 28 insertions(+), 6 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 04:14:29 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 04:14:29 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.4 updated. 3.4.6-69-gfc7bbf254 Message-ID: <20260706111429.94C8B3200C@trac.osgeo.org> 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, stable-3.4 has been updated via fc7bbf254d3ab41ee18f5655b0736326b4afabb7 (commit) via 0fd4edaa09a99f7da70cda68c0a3128129cf3f9a (commit) from dba1fd7f05d2213b55d2ef68ee7ca0797640cc89 (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 fc7bbf254d3ab41ee18f5655b0736326b4afabb7 Author: Darafei Praliaskouski Date: Mon Jul 6 15:06:59 2026 +0400 NEWS: add entry for GH-1146 References https://github.com/postgis/postgis/pull/1146 diff --git a/NEWS b/NEWS index b18a92ea7..1f7a18ff1 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ PostGIS 3.4.7 regressions (Darafei Praliaskouski) - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate ring-orientation precision regressions (Darafei Praliaskouski) + - GH-1146, Reset interrupt callbacks when PostgreSQL clears + cancellation state (Darafei Praliaskouski) PostGIS 3.4.6 commit 0fd4edaa09a99f7da70cda68c0a3128129cf3f9a Author: Darafei Praliaskouski Date: Mon Jul 6 15:06:28 2026 +0400 postgis: reset interrupt callbacks when clear Backpatches commit 12afc1d465c14008848ededffe76aac533e50bc4. Closes https://github.com/postgis/postgis/pull/1146 for PostGIS 3.4 diff --git a/postgis/postgis_module.c b/postgis/postgis_module.c index a8b31c52b..56441e79d 100644 --- a/postgis/postgis_module.c +++ b/postgis/postgis_module.c @@ -59,6 +59,8 @@ static void interrupt_geos_callback() */ if (QueryCancelPending || ProcDiePending) GEOS_interruptRequest(); + else + GEOS_interruptCancel(); } static void interrupt_liblwgeom_callback() @@ -74,6 +76,8 @@ static void interrupt_liblwgeom_callback() */ if (QueryCancelPending || ProcDiePending) lwgeom_request_interrupt(); + else + lwgeom_cancel_interrupt(); } /* @@ -128,4 +132,3 @@ _PG_fini(void) } - ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ postgis/postgis_module.c | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 04:14:31 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 04:14:31 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.5 updated. 3.5.7-57-g3566cd10d Message-ID: <20260706111431.652DF30FD9@trac.osgeo.org> 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, stable-3.5 has been updated via 3566cd10d386f1e3364f48314fa0b6cf83168afd (commit) via 06e297d200872fbaf7e44317e4012eac5161be3c (commit) from aadeecfb513034ce713c51285286d6989096b3d2 (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 3566cd10d386f1e3364f48314fa0b6cf83168afd Author: Darafei Praliaskouski Date: Mon Jul 6 15:06:59 2026 +0400 NEWS: add entry for GH-1146 References https://github.com/postgis/postgis/pull/1146 diff --git a/NEWS b/NEWS index 727115c49..49f3f2625 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ PostGIS 3.5.8 regressions (Darafei Praliaskouski) - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate ring-orientation precision regressions (Darafei Praliaskouski) + - GH-1146, Reset interrupt callbacks when PostgreSQL clears + cancellation state (Darafei Praliaskouski) PostGIS 3.5.7 2026/06/10 commit 06e297d200872fbaf7e44317e4012eac5161be3c Author: Darafei Praliaskouski Date: Mon Jul 6 15:06:28 2026 +0400 postgis: reset interrupt callbacks when clear Backpatches commit 12afc1d465c14008848ededffe76aac533e50bc4. Closes https://github.com/postgis/postgis/pull/1146 for PostGIS 3.5 diff --git a/postgis/postgis_module.c b/postgis/postgis_module.c index 74b9aa725..74bbd940f 100644 --- a/postgis/postgis_module.c +++ b/postgis/postgis_module.c @@ -63,6 +63,10 @@ static void interrupt_geos_callback() { GEOS_interruptRequest(); } + else + { + GEOS_interruptCancel(); + } } static void interrupt_liblwgeom_callback() @@ -82,6 +86,10 @@ static void interrupt_liblwgeom_callback() { lwgeom_request_interrupt(); } + else + { + lwgeom_cancel_interrupt(); + } } /* @@ -133,4 +141,3 @@ _PG_fini(void) elog(NOTICE, "Goodbye from PostGIS %s", POSTGIS_VERSION); } - ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ postgis/postgis_module.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 04:14:33 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 04:14:33 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.6 updated. 3.6.4-60-g057a15def Message-ID: <20260706111433.4D5C730FDC@trac.osgeo.org> 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, stable-3.6 has been updated via 057a15defab7d9a348efd5ecca6110869b85600d (commit) via 88eaf6a6739500b7a5726aeb307ce3ac97cf2e79 (commit) from 576aec90e7439210d6cf817bbf4b5f15ca038730 (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 057a15defab7d9a348efd5ecca6110869b85600d Author: Darafei Praliaskouski Date: Mon Jul 6 15:06:59 2026 +0400 NEWS: add entry for GH-1146 References https://github.com/postgis/postgis/pull/1146 diff --git a/NEWS b/NEWS index 433781369..3a478b3bb 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,8 @@ PostGIS 3.6.5 regressions (Darafei Praliaskouski) - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate ring-orientation precision regressions (Darafei Praliaskouski) +- GH-1146, Reset interrupt callbacks when PostgreSQL clears + cancellation state (Darafei Praliaskouski) PostGIS 3.6.4 commit 88eaf6a6739500b7a5726aeb307ce3ac97cf2e79 Author: Darafei Praliaskouski Date: Mon Jul 6 15:06:28 2026 +0400 postgis: reset interrupt callbacks when clear Backpatches commit 12afc1d465c14008848ededffe76aac533e50bc4. Closes https://github.com/postgis/postgis/pull/1146 for PostGIS 3.6 diff --git a/postgis/postgis_module.c b/postgis/postgis_module.c index ae8a6a907..9d8148d0c 100644 --- a/postgis/postgis_module.c +++ b/postgis/postgis_module.c @@ -63,6 +63,10 @@ static void interrupt_geos_callback(void) { GEOS_interruptRequest(); } + else + { + GEOS_interruptCancel(); + } } static void interrupt_liblwgeom_callback(void) @@ -82,6 +86,10 @@ static void interrupt_liblwgeom_callback(void) { lwgeom_request_interrupt(); } + else + { + lwgeom_cancel_interrupt(); + } } /* @@ -133,4 +141,3 @@ _PG_fini(void) elog(NOTICE, "Goodbye from PostGIS %s", POSTGIS_VERSION); } - ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ postgis/postgis_module.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 07:20:28 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 07:20:28 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-22-g94d592651 Message-ID: <20260706142028.F34E532C2B@trac.osgeo.org> 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 94d592651c46e41b56eddb68c98fe19a8ace0fe6 (commit) from 0936d3fa9a7d8e170d4c1806ca522e188f79a681 (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 94d592651c46e41b56eddb68c98fe19a8ace0fe6 Author: Darafei Praliaskouski Date: Mon Jul 6 17:41:03 2026 +0400 utils: reject duplicate NEWS release headings diff --git a/utils/check_news.sh b/utils/check_news.sh index c8f769beb..ed7f85096 100755 --- a/utils/check_news.sh +++ b/utils/check_news.sh @@ -38,6 +38,15 @@ fi cd ${RD} +# Check that release headings are unique. Rebase mistakes can otherwise +# turn the previous release section into a second copy of the current one. +duplicate_release=$(grep '^PostGIS [0-9]' NEWS | sort | uniq -d | head -1) +if test -n "${duplicate_release}"; then + echo "FAIL: NEWS file has duplicate release heading: ${duplicate_release}" + exit 1 +fi +echo "PASS: NEWS file release headings are unique" + # Extract dates from NEWS file and check they # are sorted correctly pdate=$(date '+%Y/%m/%d') # most recent timestamp ----------------------------------------------------------------------- Summary of changes: utils/check_news.sh | 9 +++++++++ 1 file changed, 9 insertions(+) hooks/post-receive -- PostGIS From trac at osgeo.org Mon Jul 6 07:59:03 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 14:59:03 -0000 Subject: [PostGIS] #6092: fuzzingengine doesn't use hardening CPPFLAGS Message-ID: <050.1eadcb4a210f33c3ffa615f0a9525312@osgeo.org> #6092: fuzzingengine doesn't use hardening CPPFLAGS ----------------------------+--------------------------- Reporter: Bas Couwenberg | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: build | Version: master Keywords: | ----------------------------+--------------------------- The blhc CI job failed for the Debian package build: {{{ 5635:CPPFLAGS missing (-D_FORTIFY_SOURCE=2): cc -g -O2 -Werror=implicit- function-declaration -ffile-prefix-map=/build/package/package=. -fstack- protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o fuzzingengine.o /build/package/package/fuzzers/fuzzingengine.c }}} https://salsa.debian.org/debian-gis-team/postgis/-/jobs/9911778 The attached patch fixes the issue by using `CPPFLAGS` in addition to `CFLAGS`. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 07:59:12 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 14:59:12 -0000 Subject: [PostGIS] #6092: fuzzingengine doesn't use hardening CPPFLAGS In-Reply-To: <050.1eadcb4a210f33c3ffa615f0a9525312@osgeo.org> References: <050.1eadcb4a210f33c3ffa615f0a9525312@osgeo.org> Message-ID: <065.77977ede9fadfa1027c0862beded9fea@osgeo.org> #6092: fuzzingengine doesn't use hardening CPPFLAGS -----------------------------+--------------------------- Reporter: Bas Couwenberg | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: build | Version: master Resolution: | Keywords: -----------------------------+--------------------------- Changes (by Bas Couwenberg): * Attachment "hardening.patch" added. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 09:26:43 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 16:26:43 -0000 Subject: [PostGIS] #6093: Fails to build on ppc64el (error: detected recursion whilst expanding macro =?utf-8?b?4oCYdmVjdG9y4oCZKQ==?= Message-ID: <050.0cf0ce9cdffc66ce4e3bd572c5ee4542@osgeo.org> #6093: Fails to build on ppc64el (error: detected recursion whilst expanding macro ?vector?) ----------------------------+--------------------------- Reporter: Bas Couwenberg | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: build | Version: master Keywords: | ----------------------------+--------------------------- The Debian package build failed on ppc64el: {{{ In file included from postgis.sql.in:7346: postgis_nurbs.sql.in:7: error: detected recursion whilst expanding macro ?vector? 7 | -- knots: Optional knot vector defining parameter space (NULL for uniform clamped spacing) postgis_nurbs.sql.in:9: error: detected recursion whilst expanding macro ?vector? 9 | -- Note: Knot vector must have (npoints + degree + 1) elements and be non-decreasing postgis_nurbs.sql.in:61: error: detected recursion whilst expanding macro ?vector? 61 | -- Extracts the knot vector defining parameter space make[3]: *** [Makefile:245: postgis.sql] Error 1 }}} Full buildlogs: [https://buildd.debian.org/status/fetch.php?pkg=postgis&arch=ppc64el&ver=3.7.0%7Ealpha1%2Bdfsg-1%7Eexp1&stamp=1783348698&raw=0 1] [https://buildd.debian.org/status/fetch.php?pkg=postgis&arch=ppc64el&ver=3.7.0%7Ealpha1%2Bdfsg-1%7Eexp1&stamp=1783352634&raw=0 2] -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 10:11:20 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 17:11:20 -0000 Subject: [PostGIS] #4616: pgsql2shp issues with user defined queries In-Reply-To: <052.7aaf4baec1f3c83aeb98df70338bb5d0@osgeo.org> References: <052.7aaf4baec1f3c83aeb98df70338bb5d0@osgeo.org> Message-ID: <067.39be2683a43518e387317b6f48bef1be@osgeo.org> #4616: pgsql2shp issues with user defined queries ----------------------------------+--------------------------- Reporter: Algunenano | Owner: robe Type: enhancement | Status: closed Priority: medium | Milestone: PostGIS 3.7.0 Component: utils/loader-dumper | Version: master Resolution: fixed | Keywords: ----------------------------------+--------------------------- Changes (by robe): * milestone: PostGIS Fund Me => PostGIS 3.7.0 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 10:20:39 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 17:20:39 -0000 Subject: [PostGIS] #5899: pg_upgrade fails restore geography because spatial_ref_sys does not exist In-Reply-To: <046.7db8fae173ff95d3422792441e5a0a68@osgeo.org> References: <046.7db8fae173ff95d3422792441e5a0a68@osgeo.org> Message-ID: <061.15b860408bde79c34ecd6452009b4ca5@osgeo.org> #5899: pg_upgrade fails restore geography because spatial_ref_sys does not exist ----------------------+---------------------------- Reporter: robe | Owner: pramsey Type: defect | Status: closed Priority: medium | Milestone: PostGIS 3.2.10 Component: postgis | Version: 3.4.x Resolution: fixed | Keywords: ----------------------+---------------------------- Changes (by robe): * milestone: PostGIS 3.7.0 => PostGIS 3.2.10 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 10:24:21 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 17:24:21 -0000 Subject: [PostGIS] #6048: postgis_raster crashes in rt_band_set_pixel due to NULL band pointer during ST_Clip operation In-Reply-To: <048.750ab04d7888c92a08ff4b0ad22cd50a@osgeo.org> References: <048.750ab04d7888c92a08ff4b0ad22cd50a@osgeo.org> Message-ID: <063.f3a0d1c9cdee47f01a891557702c8dfd@osgeo.org> #6048: postgis_raster crashes in rt_band_set_pixel due to NULL band pointer during ST_Clip operation ---------------------+--------------------------- Reporter: maxmli | Owner: robe Type: defect | Status: reopened Priority: medium | Milestone: PostGIS 3.6.5 Component: raster | Version: master Resolution: | Keywords: ---------------------+--------------------------- Changes (by robe): * milestone: PostGIS 3.7.0 => PostGIS 3.6.5 * resolution: fixed => * status: closed => reopened Comment: I don't think this was ever backported to 3.6 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 10:25:32 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 17:25:32 -0000 Subject: [PostGIS] #6048: postgis_raster crashes in rt_band_set_pixel due to NULL band pointer during ST_Clip operation In-Reply-To: <048.750ab04d7888c92a08ff4b0ad22cd50a@osgeo.org> References: <048.750ab04d7888c92a08ff4b0ad22cd50a@osgeo.org> Message-ID: <063.d528f77452f03803d9de5d07196b6053@osgeo.org> #6048: postgis_raster crashes in rt_band_set_pixel due to NULL band pointer during ST_Clip operation ---------------------+--------------------------- Reporter: maxmli | Owner: robe Type: defect | Status: closed Priority: medium | Milestone: PostGIS 3.7.0 Component: raster | Version: master Resolution: fixed | Keywords: ---------------------+--------------------------- Changes (by robe): * milestone: PostGIS 3.6.5 => PostGIS 3.7.0 * resolution: => fixed * status: reopened => closed Comment: sorry wasn't the one I wanted to reopen - lets leave this at 3.7 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 10:27:39 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 17:27:39 -0000 Subject: [PostGIS] #5948: MakeTopologyPrecise can turn edges into EMPTY In-Reply-To: <046.ff13cd901ab704460e3ce4da8b8b63f8@osgeo.org> References: <046.ff13cd901ab704460e3ce4da8b8b63f8@osgeo.org> Message-ID: <061.8267a89c28d259f07fc3e3624239fe9b@osgeo.org> #5948: MakeTopologyPrecise can turn edges into EMPTY -----------------------+--------------------------- Reporter: strk | Owner: strk Type: defect | Status: reopened Priority: blocker | Milestone: PostGIS 3.6.5 Component: topology | Version: master Resolution: | Keywords: -----------------------+--------------------------- Changes (by robe): * milestone: PostGIS 3.6.2 => PostGIS 3.6.5 * resolution: fixed => * status: closed => reopened Comment: this was never backported, probably should be. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Mon Jul 6 10:28:35 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 10:28:35 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-23-g39d98a215 Message-ID: <20260706172835.46A9F334DD@trac.osgeo.org> 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 39d98a2153db982791d5da551795acc11a7b646f (commit) from 94d592651c46e41b56eddb68c98fe19a8ace0fe6 (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 39d98a2153db982791d5da551795acc11a7b646f Author: Regina Obe Date: Mon Jul 6 13:28:27 2026 -0400 Cleanup bugfixes section and move some to enhancements or remove diff --git a/NEWS b/NEWS index 70a3dc001..088a507c1 100644 --- a/NEWS +++ b/NEWS @@ -24,8 +24,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) -PostGIS 3.7.0alpha1 -2026/07/05 +PostGIS 3.7.0dev +2026/xx/xx This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. @@ -144,37 +144,31 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed by enforcing verbatim CSS (Darafei Praliaskouski) - #1408, Docs: flatten transparent manual images onto white backgrounds for PDF builds while keeping HTML images transparent (Darafei Praliaskouski) + - #2838, Emit valid X3D Coordinate nodes for 2D polygon output + (Darafei Praliaskouski) + - #1705, Infer constraint metadata for direct view and materialized view + geometry columns (Darafei Praliaskouski) + - GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL + progress callbacks (Darafei Praliaskouski) + - #6073, #6074, Stabilize geography LRS endpoint interpolation and pole + centroid regressions on 32-bit systems (Darafei Praliaskouski) + - #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN + (Darafei Praliaskouski) * Bug Fixes * - #4616, Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski) - - #2838, Emit valid X3D Coordinate nodes for 2D polygon output - (Darafei Praliaskouski) - Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei Praliaskouski) - - #6083, Pass configured dependency include paths to fuzzer smoke builds - (Darafei Praliaskouski) - - #3103, Add regression coverage for exact-schema find_srid and - geometry_columns lookups (Darafei Praliaskouski) - - #1705, Infer constraint metadata for direct view and materialized view - geometry columns (Darafei Praliaskouski) - #6038, Avoid stale relation lookups in geometry_columns after topology objects are dropped (Darafei Praliaskouski) - - #5655, [doc] Skip XML validation during `make check` when xsltproc is - unavailable (Darafei Praliaskouski) - #5487, Improve error detail for repeated upgrades after an incomplete deprecated-function cleanup (Darafei Praliaskouski) - - GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL - progress callbacks (Darafei Praliaskouski) - #5975, Initialize skipped union-find cluster ids deterministically (Darafei Praliaskouski) - #5904, [topology] Avoid MinGW format warnings when logging topology ids (Darafei Praliaskouski) - - GH-885, [topology] Avoid GMP overflow in ring orientation for very large - finite coordinates (Darafei Praliaskouski) - - #6073, #6074, Stabilize geography LRS endpoint interpolation and pole - centroid regressions on 32-bit systems (Darafei Praliaskouski) - #6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program listings (Darafei Praliaskouski) - GH-888, [sfcgal] Avoid stale detoasted geometry access in @@ -190,23 +184,15 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed short DE-9IM patterns (Darafei Praliaskouski) - GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei Praliaskouski) - - #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when - grid size exceeds their extent (Darafei Praliaskouski) - #5959, Prevent histogram target overflow when analysing massive tables (Darafei Praliaskouski) - #6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei Praliaskouski) - - GH-895, Qualify pg_class lookup during SRID/PROJ validation - (Darafei Praliaskouski) - #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) - #6048, [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) - GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei Praliaskouski) - - Flatgeobuf schema mismatch vulnerability (NeuroWinter) - - #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) - - #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN - (Darafei Praliaskouski) PostGIS 3.6.0 ----------------------------------------------------------------------- Summary of changes: NEWS | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 10:32:27 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 10:32:27 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.6 updated. 3.6.4-61-gae1c72fa7 Message-ID: <20260706173228.20C4E33B79@trac.osgeo.org> 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, stable-3.6 has been updated via ae1c72fa7c510767dff7be53ce0653170b7876a1 (commit) from 057a15defab7d9a348efd5ecca6110869b85600d (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 ae1c72fa7c510767dff7be53ce0653170b7876a1 Author: Darafei Praliaskouski Date: Sun Nov 30 00:26:34 2025 +0400 Guard in MakeTopologyPrecise to prevent EMPTY edges Closes #5948 for PostGIS 3.6.5 diff --git a/NEWS b/NEWS index 3a478b3bb..0dbd1265e 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ PostGIS 3.6.5 ring-orientation precision regressions (Darafei Praliaskouski) - GH-1146, Reset interrupt callbacks when PostgreSQL clears cancellation state (Darafei Praliaskouski) +- #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when + grid size exceeds their extent (Darafei Praliaskouski) PostGIS 3.6.4 diff --git a/doc/extras_topology.xml b/doc/extras_topology.xml index 833ad2ca1..bdcfe70b4 100644 --- a/doc/extras_topology.xml +++ b/doc/extras_topology.xml @@ -1103,6 +1103,13 @@ parameter, optionally limiting the operation to the objects intersecting the area specified by the bbox parameter. + +Using a gridSize larger than the smallest edge extent +raises an exception rather than collapsing the edge into an empty +geometry. This safeguards adjacent topological relationships by +preventing precision snapping from removing primitives altogether. + + Snapping could make the topology invalid, so it is recommended to diff --git a/topology/sql/manage/MakeTopologyPrecise.sql.in b/topology/sql/manage/MakeTopologyPrecise.sql.in index e66eea2fb..3906e0cfb 100644 --- a/topology/sql/manage/MakeTopologyPrecise.sql.in +++ b/topology/sql/manage/MakeTopologyPrecise.sql.in @@ -28,6 +28,7 @@ DECLARE dataBox GEOMETRY; dataMagnitude FLOAT8; minGridSize FLOAT8; + minEdgeExtent FLOAT8; BEGIN topo := findTopology(toponame); IF topo.id IS NULL THEN @@ -73,6 +74,29 @@ BEGIN -- TODO: recursively grow working bbox to include all edges connected -- to all endpoints of edges intersecting it ? + -- + -- Guard against snapping a whole edge to a single grid point. + -- With a grid size wider than the smallest edge extent every vertex would + -- quantize to the same coordinate, producing EMPTY geometries and breaking + -- the topology. Raising early keeps the caller in control of a safer grid + -- selection. + -- + sql := format( + $$ +SELECT min(greatest( + abs(ST_XMax(geom) - ST_XMin(geom)), + abs(ST_YMax(geom) - ST_YMin(geom)) + )) +FROM %1$I.edge_data +WHERE ($1 IS NULL OR geom && $1) + $$, topo.name + ); + EXECUTE sql USING bbox INTO minEdgeExtent; + + IF minEdgeExtent IS NOT NULL AND gridSize > minEdgeExtent THEN + RAISE EXCEPTION 'Grid size % exceeds smallest edge extent % and would erase edges', gridSize, minEdgeExtent; + END IF; + sql := format( $$ UPDATE %1$I.edge_data diff --git a/topology/test/regress/maketopologyprecise.sql b/topology/test/regress/maketopologyprecise.sql index 84234cd25..f76b535be 100644 --- a/topology/test/regress/maketopologyprecise.sql +++ b/topology/test/regress/maketopologyprecise.sql @@ -11,6 +11,12 @@ SELECT 'prec5', 'e', edge_id, ST_AsEWKT(geom) FROM topo.edge ORDER BY edge_id; SET client_min_messages TO WARNING; +-- A tiny topology exercises the guard against collapsing edges into EMPTY. +SELECT NULL FROM topology.CreateTopology('tiny'); +SELECT NULL FROM topology.TopoGeo_addLineString('tiny', 'LINESTRING(0 0, 1 0)'); +SELECT topology.MakeTopologyPrecise('tiny', gridSize => 5); +SELECT NULL FROM topology.DropTopology('tiny'); + -- TODO: test bbox limited made-precise topology -- Cleanup diff --git a/topology/test/regress/maketopologyprecise_expected b/topology/test/regress/maketopologyprecise_expected index 2aad628f6..f3e132dad 100644 --- a/topology/test/regress/maketopologyprecise_expected +++ b/topology/test/regress/maketopologyprecise_expected @@ -3,3 +3,4 @@ NOTICE: Every vertex is precise in an empty topology ERROR: Presence of max ordinate value 1002003008 requires a minimum grid size of 3.60721082879999e-6 start|e|1|LINESTRING(123456789 0.1,6 -1002003004) prec5|e|1|LINESTRING(123456790 0,5 -1002003005) +ERROR: Grid size 5 exceeds smallest edge extent 1 and would erase edges ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ doc/extras_topology.xml | 7 +++++++ topology/sql/manage/MakeTopologyPrecise.sql.in | 24 ++++++++++++++++++++++ topology/test/regress/maketopologyprecise.sql | 6 ++++++ topology/test/regress/maketopologyprecise_expected | 1 + 5 files changed, 40 insertions(+) hooks/post-receive -- PostGIS From trac at osgeo.org Mon Jul 6 10:32:29 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 17:32:29 -0000 Subject: [PostGIS] #5948: MakeTopologyPrecise can turn edges into EMPTY In-Reply-To: <046.ff13cd901ab704460e3ce4da8b8b63f8@osgeo.org> References: <046.ff13cd901ab704460e3ce4da8b8b63f8@osgeo.org> Message-ID: <061.730b335b8dc9cd0bff91478ceaca86a4@osgeo.org> #5948: MakeTopologyPrecise can turn edges into EMPTY -----------------------+--------------------------- Reporter: strk | Owner: strk Type: defect | Status: closed Priority: blocker | Milestone: PostGIS 3.6.5 Component: topology | Version: master Resolution: fixed | Keywords: -----------------------+--------------------------- Changes (by Regina Obe ): * resolution: => fixed * status: reopened => closed Comment: In [changeset:"ae1c72fa7c510767dff7be53ce0653170b7876a1/git" ae1c72f/git]: {{{#!CommitTicketReference repository="git" revision="ae1c72fa7c510767dff7be53ce0653170b7876a1" Guard in MakeTopologyPrecise to prevent EMPTY edges Closes #5948 for PostGIS 3.6.5 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Mon Jul 6 13:03:19 2026 From: trac at osgeo.org (PostGIS) Date: Mon, 06 Jul 2026 20:03:19 -0000 Subject: [PostGIS] #6094: downgrade error on berrie64 when standard conforming strings off Message-ID: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> #6094: downgrade error on berrie64 when standard conforming strings off ---------------------+--------------------------- Reporter: robe | Owner: strk Type: defect | Status: new Priority: blocker | Milestone: PostGIS 3.6.5 Component: upgrade | Version: 3.6.x Keywords: | ---------------------+--------------------------- I thought we don't even try testing downgrades or do we to make sure they fail? Getting this on berrie64 {{{ 14:31:48 Testing postgis_topology extension downgrade 3.6.4dev--3.5.8dev with standard-conforming-strings off 14:31:51 FAIL: postgis_topology extension downgrade 3.6.4dev--3.5.8dev with standard-conforming-strings off gave some other error: 14:31:51 RAISE DEBUG 'Creating function %', postgis_upgrade_info_func_code; 14:31:51 EXECUTE postgis_upgrade_info_func_code; 14:31:51 END }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Mon Jul 6 18:39:15 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 18:39:15 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-24-g63fc8a281 Message-ID: <20260707013915.A2C1036D66@trac.osgeo.org> 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 63fc8a2816977488a225b5b3776bf716b849775b (commit) from 39d98a2153db982791d5da551795acc11a7b646f (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 63fc8a2816977488a225b5b3776bf716b849775b Author: Teramoto Ikuhiro Date: Tue Jul 7 00:52:26 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 92.4% (5617 of 6077 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index bb5dad274..00391607b 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-06 10:15+0000\n" +"PO-Revision-Date: 2026-07-07 01:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -11138,7 +11138,7 @@ msgstr ", , " #. Tag: refpurpose #, no-c-format msgid "Checks if a geometry has a Z dimension." -msgstr "??????Z??????????????????" +msgstr "??????Z?????????????????" #. Tag: para #, no-c-format @@ -11147,8 +11147,8 @@ msgid "" "If the geometry has a Z dimension, it returns true; otherwise, it returns " "false." msgstr "" -"????????Z??????????????????????????????" -"??Z???????????TRUE?????????????FALSE??????" +"????????Z??????????????????????????????" +"Z???????????TRUE?????????????FALSE??????" #. Tag: para #, no-c-format @@ -11171,7 +11171,7 @@ msgstr "" #. Tag: refpurpose #, no-c-format msgid "Checks if a geometry has an M (measure) dimension." -msgstr "??????M??????????????????" +msgstr "??????M?????????????????" #. Tag: para #, no-c-format @@ -11180,8 +11180,8 @@ msgid "" "boolean value. If the geometry has an M dimension, it returns true; " "otherwise, it returns false." msgstr "" -"????????M??????????????????????????????" -"??M???????????TRUE?????????????FALSE??????" +"????????M??????????????????????????????" +"M???????????TRUE?????????????FALSE??????" #. Tag: para #, no-c-format @@ -11203,7 +11203,7 @@ msgstr "" #. Tag: refpurpose #, no-c-format msgid "Returns the control points of a NURBS curve as a MULTIPOINT geometry." -msgstr "" +msgstr "NURBS????????MULTIPOINT??????" #. Tag: para #, no-c-format @@ -11212,6 +11212,8 @@ msgid "" "MULTIPOINT geometry. Control points define the control polygon that " "influences the shape of the NURBS curve." msgstr "" +"NURBS????????????MULTIPOINT??????????NURMS??????" +"???????????????????" #. Tag: para #, no-c-format @@ -11219,6 +11221,8 @@ msgid "" "The function raises an error if the input is not a NURBS curve. Returns NULL " "if the input is NULL." msgstr "" +"???NURBS??????????????????????NULL?????NULL??" +"????" #. Tag: para #, no-c-format @@ -11228,23 +11232,24 @@ msgstr "Availability: 3.7.0" #. Tag: para #, no-c-format msgid "This example extracts control points from a NURBS curve." -msgstr "" +msgstr "?????NURBS??????????????" #. Tag: para #, no-c-format msgid "This example counts the control points." -msgstr "" +msgstr "???????????????" #. Tag: para #, no-c-format msgid "" ", , " msgstr "" +", , " #. Tag: refpurpose #, no-c-format msgid "Returns the polynomial degree of a NURBS curve." -msgstr "" +msgstr "NURBS??????????????" #. Tag: para #, no-c-format @@ -11253,26 +11258,29 @@ msgid "" "determines the curve's smoothness and flexibility. Higher degrees produce " "smoother curves but require more control points." msgstr "" +"NURBS????????????????????????????????????" +"??????????????????????????????????????" +"???" #. Tag: para #, no-c-format msgid "This example returns the degree of a NURBS curve." -msgstr "" +msgstr "?????NURBS???????????" #. Tag: para #, no-c-format msgid "This example checks whether a NURBS curve is cubic." -msgstr "" +msgstr "?????NURBS???3???????????" #. Tag: para #, no-c-format msgid ", " -msgstr "" +msgstr ", " #. Tag: refpurpose #, no-c-format msgid "Returns the weight array of a rational NURBS curve." -msgstr "" +msgstr "??NURBS?????????????" #. Tag: para #, no-c-format @@ -11282,23 +11290,26 @@ msgid "" "curve shape. Higher weights pull the curve closer to the corresponding " "control point." msgstr "" +"??NURBS??????????????????????????????????" +"??????????????????????????????????????" +"????????" #. Tag: para #, no-c-format msgid "" "Returns NULL if the curve has no weights (non-rational B-spline) or if the " "input is NULL. Raises an error if the input is not a NURBS curve." -msgstr "" +msgstr "?????????? (???B??????????)??NULL??????" #. Tag: para #, no-c-format msgid "This example returns weights from a rational NURBS curve." -msgstr "" +msgstr "???????NURBS????????????" #. Tag: para #, no-c-format msgid "This example checks the weights of a non-rational curve." -msgstr "" +msgstr "???????????????????" #. Tag: para #, no-c-format @@ -11306,11 +11317,13 @@ msgid "" ", , " msgstr "" +", , " #. Tag: refpurpose #, no-c-format msgid "Returns the knot vector of a NURBS curve." -msgstr "" +msgstr "NURBS?????????? (knot vector)??????" #. Tag: para #, no-c-format @@ -11320,6 +11333,9 @@ msgid "" "how the control points affect the curve. It must be a non-decreasing " "sequence with length equal to (number of control points + degree + 1)." msgstr "" +"NURBS?????????? (knot vector)??????????????????" +"??????????????????????????????????????" +"????????????? (????+??+1)????????????????" #. Tag: para #, no-c-format @@ -11327,28 +11343,33 @@ msgid "" "Returns NULL if the curve uses the default uniform clamped knot vector or if " "the input is NULL. Raises an error if the input is not a NURBS curve." msgstr "" +"???????????????????????????????NULL?????" +"NULL?????????NURBS???????????????????" #. Tag: para #, no-c-format msgid "" "This example returns knots from a NURBS curve with a custom knot vector." -msgstr "" +msgstr "??????????????????NURBS?????????????????" #. Tag: para -#, no-c-format +#, fuzzy, no-c-format msgid "This example checks the knots of a curve using the default knot vector." msgstr "" +"??????????????????????????????????????" +"?" #. Tag: para #, no-c-format msgid "" ", , " msgstr "" +", , " #. Tag: refpurpose #, no-c-format msgid "Returns the number of control points in a NURBS curve." -msgstr "" +msgstr "NURBS???????????????" #. Tag: para #, no-c-format @@ -11356,6 +11377,8 @@ msgid "" "Returns the number of control points in a NURBS curve. The number of control " "points must be at least (degree + 1) for a valid NURBS curve." msgstr "" +"NURBS??????????????????NURBS?????????????? " +"(??+1)??????" #. Tag: para #, no-c-format @@ -11363,27 +11386,29 @@ msgid "" "Raises an error if the input is not a NURBS curve. Returns NULL if the input " "is NULL." msgstr "" +"???NURBS??????????????????????NULL?????NULL??" +"????" #. Tag: para #, no-c-format msgid "This example returns the number of control points." -msgstr "" +msgstr "???????????????" #. Tag: para #, no-c-format msgid "" "This example verifies that a curve has enough control points for its degree." -msgstr "" +msgstr "??????????????????????????????????" #. Tag: para #, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: refpurpose #, no-c-format msgid "Checks if a NURBS curve is rational (has weights)." -msgstr "" +msgstr "NURBS???????? (?????)???????" #. Tag: para #, no-c-format @@ -11391,6 +11416,8 @@ msgid "" "Returns TRUE if the NURBS curve has weights assigned to its control points " "(rational NURBS), FALSE if it uses uniform weights (non-rational B-spline)." msgstr "" +"NURBS?????????????????????????TRUE?????????" +"??????????? (???B????????)??FALSE??????" #. Tag: para #, no-c-format @@ -11399,26 +11426,28 @@ msgid "" "through variable weights. Non-rational B-splines use uniform weights and are " "a special case of NURBS curves." msgstr "" +"??NURBS??????????????????????????????????" +"B???????????????????NURBS???????????" #. Tag: para #, no-c-format msgid "This example checks whether a curve is rational." -msgstr "" +msgstr "???????????????????????" #. Tag: para #, no-c-format msgid "This example checks a non-rational curve." -msgstr "" +msgstr "?????????????????" #. Tag: para #, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: refpurpose #, no-c-format msgid "Checks if a geometry is a NURBS curve." -msgstr "" +msgstr "???????NURBS???????????????" #. Tag: para #, no-c-format @@ -11427,21 +11456,23 @@ msgid "" "function can be used to test geometry types before applying NURBS-specific " "functions." msgstr "" +"???????NURBS?????????TRUE??????????FALSE?????" +"??????NURBS??????????????????????????????" #. Tag: para #, no-c-format msgid "Returns NULL if the input is NULL." -msgstr "" +msgstr "???NULL?????NULL??????" #. Tag: para #, no-c-format msgid "This example checks whether a geometry is a NURBS curve." -msgstr "" +msgstr "????????????NURBS????????????" #. Tag: para #, no-c-format msgid "This example tests a regular LineString." -msgstr "" +msgstr "????????LINESTRING??????" #. Tag: para #, no-c-format @@ -11449,6 +11480,8 @@ msgid "" ", , " msgstr "" +", , " #. Tag: refpurpose #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 99 ++++++++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 33 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Mon Jul 6 20:39:16 2026 From: git at osgeo.org (git at osgeo.org) Date: Mon, 6 Jul 2026 20:39:16 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-25-g642a42d90 Message-ID: <20260707033916.F2C4537DDA@trac.osgeo.org> 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 642a42d9056248081dc124de07d1987667277ce8 (commit) from 63fc8a2816977488a225b5b3776bf716b849775b (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 642a42d9056248081dc124de07d1987667277ce8 Author: Teramoto Ikuhiro Date: Tue Jul 7 02:42:16 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 92.6% (5631 of 6077 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 00391607b..999f2d60a 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-07 01:39+0000\n" +"PO-Revision-Date: 2026-07-07 03:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -11484,11 +11484,11 @@ msgstr "" "linkend=\"ST_NurbsCurveIsRational\"/>" #. Tag: refpurpose -#, no-c-format +#, fuzzy, no-c-format msgid "" "Evaluates a NURBS curve at a specific parameter value and returns the " "resulting point." -msgstr "" +msgstr "NURBS???????????????????????????????" #. Tag: para #, no-c-format @@ -11498,6 +11498,9 @@ msgid "" "ranges from 0.0 (start of curve) to 1.0 (end of curve), though the actual " "range depends on the knot vector." msgstr "" +"NURBS??????????????????????????????POINT" +"?????????????????????? 0.0 (?????)??1.0 (???" +"??)??????????????????????????????" #. Tag: para #, no-c-format @@ -11505,26 +11508,28 @@ msgid "" "Raises an error if the input is not a NURBS curve or if evaluation fails. " "Returns NULL if either input is NULL." msgstr "" +"???NURBS????????????????????????????????" +"NULL?????NULL??????" #. Tag: para #, no-c-format msgid "This example returns the midpoint of a NURBS curve." -msgstr "" +msgstr "?????NURBS????????????" #. Tag: para #, no-c-format msgid "This example samples multiple points along a curve." -msgstr "" +msgstr "????????????????????????" #. Tag: para #, no-c-format msgid ", " -msgstr "" +msgstr ", " #. Tag: refpurpose #, no-c-format msgid "Converts a NURBS curve to a LINESTRING by uniform sampling." -msgstr "" +msgstr "????????NURBS???LINESTRING???????" #. Tag: para #, no-c-format @@ -11534,6 +11539,8 @@ msgid "" "parameter values and the resulting points are connected with straight line " "segments." msgstr "" +"NURBS?????????????LINESTRING????????????????" +"?????????????????????????????????" #. Tag: para #, no-c-format @@ -11542,29 +11549,32 @@ msgid "" "of line segments in the output (default: 32, range: 2-10000). Higher values " "produce smoother approximations but increase geometry complexity." msgstr "" +"????????num_segments???????????????" +"?? (?????: 32, ??????: 2-10000)????????????????" +"???????????????????????????????????" #. Tag: para #, no-c-format msgid "" "This example converts a NURBS curve to a LineString using the default " "quality." -msgstr "" +msgstr "?????NURBS???????????LINESTRING???????" #. Tag: para #, no-c-format msgid "This example creates a high-quality approximation with 64 segments." -msgstr "" +msgstr "????????64??????????????" #. Tag: para #, no-c-format msgid "" "This example creates a lower-quality, faster approximation with 16 segments." -msgstr "" +msgstr "????????16??????????????" #. Tag: para #, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: title #, no-c-format @@ -11795,14 +11805,14 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example expands a 3D box by 10 meters." -msgstr "" +msgstr "?????3???????10m??????" #. Tag: para #, no-c-format msgid "" "This example renders the text representation of a 10-meter expanded box " "around a point geometry." -msgstr "" +msgstr "????????????????10m???????????????????" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Tue Jul 7 01:32:24 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 01:32:24 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-31-gfabbc2cc3 Message-ID: <20260707083225.38008191386@trac.osgeo.org> 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 fabbc2cc36bd515fc8299597c2ad2af74deffff0 (commit) via 12d4908ee624b5add8ef9ad8012dc6a7a023bffc (commit) via 80c2372aa4d03414276596f74167db9212f7bc72 (commit) via b277b71697392b450884f07f1db2c673431203b2 (commit) via e994aef350aacc5f9558fc47a7fa9f6dfb5c759e (commit) via a09a9f3a75eea082f7d2484965bc4faea312724a (commit) from 642a42d9056248081dc124de07d1987667277ce8 (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 fabbc2cc36bd515fc8299597c2ad2af74deffff0 Author: Darafei Praliaskouski Date: Tue Jul 7 12:15:39 2026 +0400 topology: quote TotalTopologySize regclasses safely Closes https://github.com/postgis/postgis/pull/1154 diff --git a/NEWS b/NEWS index 1526ecf5c..15ac2f4d8 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed TopoGeometry construction (Darafei Praliaskouski) - GH-1152, [topology] Enforce max edge limits from reported TopoGeo_AddLinestring edge creation (Darafei Praliaskouski) + - GH-1154, [topology] Quote TotalTopologySize catalog regclasses + safely (Darafei Praliaskouski) PostGIS 3.7.0dev diff --git a/topology/sql/manage/TotalTopologySize.sql.in b/topology/sql/manage/TotalTopologySize.sql.in index d68989c97..09166180b 100644 --- a/topology/sql/manage/TotalTopologySize.sql.in +++ b/topology/sql/manage/TotalTopologySize.sql.in @@ -24,12 +24,15 @@ BEGIN sql := format( $$ SELECT -pg_catalog.pg_total_relation_size('%1$I.edge_data') + -pg_catalog.pg_total_relation_size('%1$I.node') + -pg_catalog.pg_total_relation_size('%1$I.face') + -pg_catalog.pg_total_relation_size('%1$I.relation') +pg_catalog.pg_total_relation_size(%1$L) + +pg_catalog.pg_total_relation_size(%2$L) + +pg_catalog.pg_total_relation_size(%3$L) + +pg_catalog.pg_total_relation_size(%4$L) $$, - toponame + format('%I.edge_data', toponame), + format('%I.node', toponame), + format('%I.face', toponame), + format('%I.relation', toponame) ); EXECUTE sql INTO total_size; commit 12d4908ee624b5add8ef9ad8012dc6a7a023bffc Author: Darafei Praliaskouski Date: Tue Jul 7 12:15:08 2026 +0400 topology: count created edges for max edge limits Closes https://github.com/postgis/postgis/pull/1152 diff --git a/NEWS b/NEWS index 82807a98d..1526ecf5c 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed segment counts (Darafei Praliaskouski) - GH-1151, [topology] Preserve exact zero tolerance in TopoGeometry construction (Darafei Praliaskouski) + - GH-1152, [topology] Enforce max edge limits from reported + TopoGeo_AddLinestring edge creation (Darafei Praliaskouski) PostGIS 3.7.0dev diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c index 92681813e..815711980 100644 --- a/liblwgeom/topo/lwgeom_topo.c +++ b/liblwgeom/topo/lwgeom_topo.c @@ -7683,23 +7683,23 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, forward = -1; /* will be set to either 0 or 1 if the edge already existed */ id = _lwt_AddLineEdge( topo, lwgeom_as_lwline(g), tol, handleFaceSplit, &forward, &edgeNewEdges ); - num_new_edges += edgeNewEdges; - /* if forward is still == -1 this was NOT an existing edge ? */ - if ( forward == -1 ) - { - ++num_new_edges; - } - - LWDEBUGF(1, "_lwt_AddLineEdge returned %" LWTFMT_ELEMID - " (forward ? %d), reported to create %d new edges (total new edges: %d)", - id, forward, edgeNewEdges, num_new_edges); - if ( id < 0 ) + if (id < 0) { lwgeom_free(noded); lwfree(ids); return NULL; } + num_new_edges += edgeNewEdges; + + LWDEBUGF(1, + "_lwt_AddLineEdge returned %" LWTFMT_ELEMID + " (forward ? %d), reported to create %d new edges (total new edges: %d)", + id, + forward, + edgeNewEdges, + num_new_edges); + if ( maxNewEdges >= 0 && num_new_edges > maxNewEdges ) { lwgeom_free(noded); commit 80c2372aa4d03414276596f74167db9212f7bc72 Author: Darafei Praliaskouski Date: Tue Jul 7 12:14:35 2026 +0400 topology: preserve zero tolerance semantics Closes https://github.com/postgis/postgis/pull/1151 diff --git a/NEWS b/NEWS index f8ae406d1..82807a98d 100644 --- a/NEWS +++ b/NEWS @@ -28,6 +28,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - GH-1141, [liblwgeom] Reject overflowing NURBS linearization segment counts (Darafei Praliaskouski) + - GH-1151, [topology] Preserve exact zero tolerance in + TopoGeometry construction (Darafei Praliaskouski) PostGIS 3.7.0dev diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c index c7bfe1cee..92681813e 100644 --- a/liblwgeom/topo/lwgeom_topo.c +++ b/liblwgeom/topo/lwgeom_topo.c @@ -7106,6 +7106,7 @@ _lwt_AddLineEdge( LWT_TOPOLOGY* topo, LWLINE* edge, double tol, uint64_t nn, i; int moved=0, mm; int pointSplitEdges = -666; + double endpoint_tol; if ( numNewEdges ) *numNewEdges = 0; @@ -7118,9 +7119,8 @@ _lwt_AddLineEdge( LWT_TOPOLOGY* topo, LWLINE* edge, double tol, lwnotice("Empty component of noded line"); return 0; /* must be empty */ } - nid[0] = _lwt_AddPoint( topo, start_point, - _lwt_minTolerance(lwpoint_as_lwgeom(start_point)), - handleFaceSplit, &mm, &pointSplitEdges ); + endpoint_tol = tol == 0.0 ? 0.0 : _lwt_minTolerance(lwpoint_as_lwgeom(start_point)); + nid[0] = _lwt_AddPoint(topo, start_point, endpoint_tol, handleFaceSplit, &mm, &pointSplitEdges); lwpoint_free(start_point); /* too late if lwt_AddPoint calls lwerror */ if ( nid[0] == -1 ) return -1; /* lwerror should have been called */ if ( numNewEdges ) *numNewEdges += pointSplitEdges; @@ -7135,9 +7135,8 @@ _lwt_AddLineEdge( LWT_TOPOLOGY* topo, LWLINE* edge, double tol, "after successfully getting first point !?"); return -1; } - nid[1] = _lwt_AddPoint( topo, end_point, - _lwt_minTolerance(lwpoint_as_lwgeom(end_point)), - handleFaceSplit, &mm, &pointSplitEdges ); + endpoint_tol = tol == 0.0 ? 0.0 : _lwt_minTolerance(lwpoint_as_lwgeom(end_point)); + nid[1] = _lwt_AddPoint(topo, end_point, endpoint_tol, handleFaceSplit, &mm, &pointSplitEdges); lwpoint_free(end_point); /* too late if lwt_AddPoint calls lwerror */ if ( nid[1] == -1 ) return -1; /* lwerror should have been called */ if ( numNewEdges ) *numNewEdges += pointSplitEdges; diff --git a/topology/postgis_topology.c b/topology/postgis_topology.c index 41491d080..907c88dca 100644 --- a/topology/postgis_topology.c +++ b/topology/postgis_topology.c @@ -4965,7 +4965,7 @@ Datum GetNodeByPoint(PG_FUNCTION_ARGS) } tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { PG_FREE_IF_COPY(geom, 1); lwpgerror("Tolerance must be -1 or >=0 "); @@ -5035,7 +5035,7 @@ Datum GetEdgeByPoint(PG_FUNCTION_ARGS) } tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { PG_FREE_IF_COPY(geom, 1); lwpgerror("Tolerance must be -1 or >=0 "); @@ -5107,7 +5107,7 @@ Datum GetFaceByPoint(PG_FUNCTION_ARGS) } tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { PG_FREE_IF_COPY(geom, 1); lwpgerror("Tolerance must be -1 or >=0 "); @@ -5188,7 +5188,7 @@ Datum TopoGeo_AddPoint(PG_FUNCTION_ARGS) } tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { PG_FREE_IF_COPY(geom, 1); lwpgerror("Tolerance must be -1 or >=0 "); @@ -5299,7 +5299,7 @@ Datum TopoGeo_AddLinestring(PG_FUNCTION_ARGS) } tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { lwgeom_free(lwgeom); PG_FREE_IF_COPY(geom, 1); @@ -5419,7 +5419,7 @@ Datum TopoGeo_AddLinestringNoFace(PG_FUNCTION_ARGS) } tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { PG_FREE_IF_COPY(geom, 1); lwpgerror("Tolerance must be -1 or >=0 "); @@ -5510,7 +5510,7 @@ Datum TopoGeo_AddPolygon(PG_FUNCTION_ARGS) } tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { PG_FREE_IF_COPY(geom, 1); lwpgerror("Tolerance must be -1 or >=0 "); @@ -5860,7 +5860,7 @@ Datum TopoGeo_LoadGeometry(PG_FUNCTION_ARGS) geom = PG_GETARG_GSERIALIZED_P(1); tol = PG_GETARG_FLOAT8(2); - if ( tol < -1 ) + if (tol < -1 || (tol < 0 && tol != -1)) { PG_FREE_IF_COPY(geom, 1); lwpgerror("Tolerance must be -1 or >=0 "); diff --git a/topology/sql/topogeometry/totopogeom.sql.in b/topology/sql/topogeometry/totopogeom.sql.in index f943028bd..58d6e94de 100644 --- a/topology/sql/topogeometry/totopogeom.sql.in +++ b/topology/sql/topogeometry/totopogeom.sql.in @@ -156,8 +156,8 @@ BEGIN alayer := layer_id(tg); atopology := topology_info.name; - -- Get tolerance, if 0 was given - tolerance := COALESCE( NULLIF(atolerance, 0), topology._st_mintolerance(topology_info.name, ageom) ); + -- Preserve exact and automatic tolerance semantics for each dumped component. + tolerance := atolerance; -- Get layer information BEGIN commit b277b71697392b450884f07f1db2c673431203b2 Author: Darafei Praliaskouski Date: Tue Jul 7 12:14:04 2026 +0400 liblwgeom: reject overflowing NURBS segment counts Closes https://github.com/postgis/postgis/pull/1141 diff --git a/NEWS b/NEWS index 7b06489fe..f8ae406d1 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed proximity helper (Darafei Praliaskouski) - GH-1140, [liblwgeom] Cap NURBS WKT knot multiplicity (Darafei Praliaskouski) + - GH-1141, [liblwgeom] Reject overflowing NURBS linearization + segment counts (Darafei Praliaskouski) PostGIS 3.7.0dev diff --git a/liblwgeom/lwstroke.c b/liblwgeom/lwstroke.c index 1e7cf6618..a6395a2fd 100644 --- a/liblwgeom/lwstroke.c +++ b/liblwgeom/lwstroke.c @@ -899,6 +899,7 @@ lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, int flags) { uint32_t num_segments; + const double max_segments = (double)UINT32_MAX - 1.0; LWDEBUG(2, "lwnurbscurve_linearize called."); @@ -926,13 +927,13 @@ lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, } num_segments = (uint32_t)(tol * 4); break; - case LW_LINEARIZE_TOLERANCE_TYPE_MAX_DEVIATION: - { + case LW_LINEARIZE_TOLERANCE_TYPE_MAX_DEVIATION: { GBOX box; double width = 0.0; double height = 0.0; double depth = 0.0; double diagonal = 0.0; + double segments_required; if (!curve->points || curve->points->npoints == 0) return lwnurbscurve_to_linestring(curve, NURBS_MIN_LINEARIZE_SEGMENTS); @@ -946,16 +947,17 @@ lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, diagonal = sqrt(width * width + height * height + depth * depth); } - if (diagonal > tol * UINT32_MAX) + segments_required = diagonal / tol; + if (!isfinite(segments_required) || segments_required > max_segments) { lwerror("%s: max deviation is too small, got %.15g", __func__, tol); return NULL; } - num_segments = diagonal > 0.0 ? (uint32_t)ceil(diagonal / tol) : NURBS_MIN_LINEARIZE_SEGMENTS; + num_segments = diagonal > 0.0 ? (uint32_t)ceil(segments_required) : NURBS_MIN_LINEARIZE_SEGMENTS; break; } case LW_LINEARIZE_TOLERANCE_TYPE_MAX_ANGLE: - if (tol < (2.0 * M_PI) / UINT32_MAX) + if (tol < (2.0 * M_PI) / max_segments) { lwerror("%s: max angle is too small, got %.15g", __func__, tol); return NULL; commit e994aef350aacc5f9558fc47a7fa9f6dfb5c759e Author: Darafei Praliaskouski Date: Tue Jul 7 12:13:30 2026 +0400 liblwgeom: cap NURBS WKT knot multiplicity Closes https://github.com/postgis/postgis/pull/1140 diff --git a/NEWS b/NEWS index 22f579b9e..7b06489fe 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - GH-1139, [topology] Preserve large edge ids from vertex-segment proximity helper (Darafei Praliaskouski) + - GH-1140, [liblwgeom] Cap NURBS WKT knot multiplicity + (Darafei Praliaskouski) PostGIS 3.7.0dev diff --git a/liblwgeom/lwin_wkt_parse.c b/liblwgeom/lwin_wkt_parse.c index d6e0c8b60..83fec3dec 100644 --- a/liblwgeom/lwin_wkt_parse.c +++ b/liblwgeom/lwin_wkt_parse.c @@ -189,6 +189,8 @@ int lwgeom_parse_wkt(LWGEOM_PARSER_RESULT *parser_result, const char *wktstr, in #define WKT_ERROR() { if ( global_parser_result.errcode != 0 ) { YYERROR; } } +#define WKT_NURBS_MAX_KNOT_COUNT 10000 + struct WKT_NURBS_CONTROLPOINTS { POINTARRAY *points; @@ -304,6 +306,7 @@ wkt_parser_knot_list_add_repeated(POINTARRAY *knots, double value, double multip uint32_t repeat_count; if (!isfinite(value) || !isfinite(multiplicity) || multiplicity < 1.0 || + multiplicity > WKT_NURBS_MAX_KNOT_COUNT || fabs(multiplicity - round(multiplicity)) >= 1e-10) { if (knots) @@ -313,6 +316,13 @@ wkt_parser_knot_list_add_repeated(POINTARRAY *knots, double value, double multip } repeat_count = (uint32_t)round(multiplicity); + if (knots && knots->npoints > WKT_NURBS_MAX_KNOT_COUNT - repeat_count) + { + ptarray_free(knots); + SET_PARSER_ERROR(PARSER_ERROR_OTHER); + return NULL; + } + for (uint32_t i = 0; i < repeat_count; i++) { POINT knot = wkt_parser_coord_2(value, 0); @@ -324,7 +334,7 @@ wkt_parser_knot_list_add_repeated(POINTARRAY *knots, double value, double multip } -#line 328 "lwin_wkt_parse.c" +#line 338 "lwin_wkt_parse.c" # ifndef YY_CAST # ifdef __cplusplus @@ -824,23 +834,23 @@ static const yytype_int8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 377, 377, 379, 383, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 401, 403, 405, 407, 411, 413, 417, 419, 421, 423, - 427, 429, 431, 433, 435, 437, 441, 443, 445, 447, - 451, 453, 455, 457, 461, 463, 465, 467, 471, 473, - 477, 479, 483, 485, 487, 489, 493, 495, 499, 502, - 504, 506, 508, 512, 514, 518, 519, 520, 521, 522, - 525, 527, 531, 533, 537, 540, 543, 545, 547, 549, - 553, 555, 557, 559, 561, 563, 565, 567, 571, 573, - 575, 577, 581, 583, 585, 587, 589, 591, 593, 595, - 597, 599, 603, 605, 607, 609, 613, 615, 619, 621, - 623, 625, 629, 631, 633, 635, 639, 641, 645, 647, - 651, 653, 655, 657, 661, 665, 667, 669, 671, 675, - 677, 681, 683, 685, 689, 691, 693, 695, 699, 701, - 705, 707, 709, 713, 715, 719, 728, 738, 740, 743, - 745, 748, 750, 754, 756, 761, 766, 768, 773, 775, - 780, 785, 793, 798 + 0, 387, 387, 389, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 411, 413, 415, 417, 421, 423, 427, 429, 431, 433, + 437, 439, 441, 443, 445, 447, 451, 453, 455, 457, + 461, 463, 465, 467, 471, 473, 475, 477, 481, 483, + 487, 489, 493, 495, 497, 499, 503, 505, 509, 512, + 514, 516, 518, 522, 524, 528, 529, 530, 531, 532, + 535, 537, 541, 543, 547, 550, 553, 555, 557, 559, + 563, 565, 567, 569, 571, 573, 575, 577, 581, 583, + 585, 587, 591, 593, 595, 597, 599, 601, 603, 605, + 607, 609, 613, 615, 617, 619, 623, 625, 629, 631, + 633, 635, 639, 641, 643, 645, 649, 651, 655, 657, + 661, 663, 665, 667, 671, 675, 677, 679, 681, 685, + 687, 691, 693, 695, 699, 701, 703, 705, 709, 711, + 715, 717, 719, 723, 725, 729, 738, 748, 750, 753, + 755, 758, 760, 764, 766, 771, 776, 778, 783, 785, + 790, 795, 803, 808 }; #endif @@ -1471,261 +1481,261 @@ yydestruct (const char *yymsg, switch (yykind) { case YYSYMBOL_geometry_no_srid: /* geometry_no_srid */ -#line 353 "lwin_wkt_parse.y" +#line 363 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1477 "lwin_wkt_parse.c" +#line 1487 "lwin_wkt_parse.c" break; case YYSYMBOL_geometrycollection: /* geometrycollection */ -#line 354 "lwin_wkt_parse.y" +#line 364 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1483 "lwin_wkt_parse.c" +#line 1493 "lwin_wkt_parse.c" break; case YYSYMBOL_geometry_list: /* geometry_list */ -#line 355 "lwin_wkt_parse.y" +#line 365 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1489 "lwin_wkt_parse.c" +#line 1499 "lwin_wkt_parse.c" break; case YYSYMBOL_multisurface: /* multisurface */ -#line 362 "lwin_wkt_parse.y" +#line 372 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1495 "lwin_wkt_parse.c" +#line 1505 "lwin_wkt_parse.c" break; case YYSYMBOL_surface_list: /* surface_list */ -#line 340 "lwin_wkt_parse.y" +#line 350 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1501 "lwin_wkt_parse.c" +#line 1511 "lwin_wkt_parse.c" break; case YYSYMBOL_tin: /* tin */ -#line 370 "lwin_wkt_parse.y" +#line 380 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1507 "lwin_wkt_parse.c" +#line 1517 "lwin_wkt_parse.c" break; case YYSYMBOL_polyhedralsurface: /* polyhedralsurface */ -#line 368 "lwin_wkt_parse.y" +#line 378 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1513 "lwin_wkt_parse.c" +#line 1523 "lwin_wkt_parse.c" break; case YYSYMBOL_multipolygon: /* multipolygon */ -#line 361 "lwin_wkt_parse.y" +#line 371 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1519 "lwin_wkt_parse.c" +#line 1529 "lwin_wkt_parse.c" break; case YYSYMBOL_polygon_list: /* polygon_list */ -#line 341 "lwin_wkt_parse.y" +#line 351 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1525 "lwin_wkt_parse.c" +#line 1535 "lwin_wkt_parse.c" break; case YYSYMBOL_patch_list: /* patch_list */ -#line 342 "lwin_wkt_parse.y" +#line 352 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1531 "lwin_wkt_parse.c" +#line 1541 "lwin_wkt_parse.c" break; case YYSYMBOL_polygon: /* polygon */ -#line 365 "lwin_wkt_parse.y" +#line 375 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1537 "lwin_wkt_parse.c" +#line 1547 "lwin_wkt_parse.c" break; case YYSYMBOL_polygon_untagged: /* polygon_untagged */ -#line 367 "lwin_wkt_parse.y" +#line 377 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1543 "lwin_wkt_parse.c" +#line 1553 "lwin_wkt_parse.c" break; case YYSYMBOL_patch: /* patch */ -#line 366 "lwin_wkt_parse.y" +#line 376 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1549 "lwin_wkt_parse.c" +#line 1559 "lwin_wkt_parse.c" break; case YYSYMBOL_curvepolygon: /* curvepolygon */ -#line 351 "lwin_wkt_parse.y" +#line 361 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1555 "lwin_wkt_parse.c" +#line 1565 "lwin_wkt_parse.c" break; case YYSYMBOL_curvering_list: /* curvering_list */ -#line 338 "lwin_wkt_parse.y" +#line 348 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1561 "lwin_wkt_parse.c" +#line 1571 "lwin_wkt_parse.c" break; case YYSYMBOL_curvering: /* curvering */ -#line 352 "lwin_wkt_parse.y" +#line 362 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1567 "lwin_wkt_parse.c" +#line 1577 "lwin_wkt_parse.c" break; case YYSYMBOL_patchring_list: /* patchring_list */ -#line 348 "lwin_wkt_parse.y" +#line 358 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1573 "lwin_wkt_parse.c" +#line 1583 "lwin_wkt_parse.c" break; case YYSYMBOL_ring_list: /* ring_list */ -#line 347 "lwin_wkt_parse.y" +#line 357 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1579 "lwin_wkt_parse.c" +#line 1589 "lwin_wkt_parse.c" break; case YYSYMBOL_patchring: /* patchring */ -#line 332 "lwin_wkt_parse.y" +#line 342 "lwin_wkt_parse.y" { ptarray_free(((*yyvaluep).ptarrayvalue)); } -#line 1585 "lwin_wkt_parse.c" +#line 1595 "lwin_wkt_parse.c" break; case YYSYMBOL_ring: /* ring */ -#line 331 "lwin_wkt_parse.y" +#line 341 "lwin_wkt_parse.y" { ptarray_free(((*yyvaluep).ptarrayvalue)); } -#line 1591 "lwin_wkt_parse.c" +#line 1601 "lwin_wkt_parse.c" break; case YYSYMBOL_compoundcurve: /* compoundcurve */ -#line 350 "lwin_wkt_parse.y" +#line 360 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1597 "lwin_wkt_parse.c" +#line 1607 "lwin_wkt_parse.c" break; case YYSYMBOL_compound_list: /* compound_list */ -#line 346 "lwin_wkt_parse.y" +#line 356 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1603 "lwin_wkt_parse.c" +#line 1613 "lwin_wkt_parse.c" break; case YYSYMBOL_multicurve: /* multicurve */ -#line 358 "lwin_wkt_parse.y" +#line 368 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1609 "lwin_wkt_parse.c" +#line 1619 "lwin_wkt_parse.c" break; case YYSYMBOL_curve_list: /* curve_list */ -#line 345 "lwin_wkt_parse.y" +#line 355 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1615 "lwin_wkt_parse.c" +#line 1625 "lwin_wkt_parse.c" break; case YYSYMBOL_multilinestring: /* multilinestring */ -#line 359 "lwin_wkt_parse.y" +#line 369 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1621 "lwin_wkt_parse.c" +#line 1631 "lwin_wkt_parse.c" break; case YYSYMBOL_linestring_list: /* linestring_list */ -#line 344 "lwin_wkt_parse.y" +#line 354 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1627 "lwin_wkt_parse.c" +#line 1637 "lwin_wkt_parse.c" break; case YYSYMBOL_circularstring: /* circularstring */ -#line 349 "lwin_wkt_parse.y" +#line 359 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1633 "lwin_wkt_parse.c" +#line 1643 "lwin_wkt_parse.c" break; case YYSYMBOL_linestring: /* linestring */ -#line 356 "lwin_wkt_parse.y" +#line 366 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1639 "lwin_wkt_parse.c" +#line 1649 "lwin_wkt_parse.c" break; case YYSYMBOL_linestring_untagged: /* linestring_untagged */ -#line 357 "lwin_wkt_parse.y" +#line 367 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1645 "lwin_wkt_parse.c" +#line 1655 "lwin_wkt_parse.c" break; case YYSYMBOL_triangle_list: /* triangle_list */ -#line 339 "lwin_wkt_parse.y" +#line 349 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1651 "lwin_wkt_parse.c" +#line 1661 "lwin_wkt_parse.c" break; case YYSYMBOL_triangle: /* triangle */ -#line 371 "lwin_wkt_parse.y" +#line 381 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1657 "lwin_wkt_parse.c" +#line 1667 "lwin_wkt_parse.c" break; case YYSYMBOL_triangle_untagged: /* triangle_untagged */ -#line 372 "lwin_wkt_parse.y" +#line 382 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1663 "lwin_wkt_parse.c" +#line 1673 "lwin_wkt_parse.c" break; case YYSYMBOL_multipoint: /* multipoint */ -#line 360 "lwin_wkt_parse.y" +#line 370 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1669 "lwin_wkt_parse.c" +#line 1679 "lwin_wkt_parse.c" break; case YYSYMBOL_point_list: /* point_list */ -#line 343 "lwin_wkt_parse.y" +#line 353 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1675 "lwin_wkt_parse.c" +#line 1685 "lwin_wkt_parse.c" break; case YYSYMBOL_point_untagged: /* point_untagged */ -#line 364 "lwin_wkt_parse.y" +#line 374 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1681 "lwin_wkt_parse.c" +#line 1691 "lwin_wkt_parse.c" break; case YYSYMBOL_point: /* point */ -#line 363 "lwin_wkt_parse.y" +#line 373 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1687 "lwin_wkt_parse.c" +#line 1697 "lwin_wkt_parse.c" break; case YYSYMBOL_ptarray: /* ptarray */ -#line 330 "lwin_wkt_parse.y" +#line 340 "lwin_wkt_parse.y" { ptarray_free(((*yyvaluep).ptarrayvalue)); } -#line 1693 "lwin_wkt_parse.c" +#line 1703 "lwin_wkt_parse.c" break; case YYSYMBOL_nurbscurve: /* nurbscurve */ -#line 369 "lwin_wkt_parse.y" +#line 379 "lwin_wkt_parse.y" { lwgeom_free(((*yyvaluep).geometryvalue)); } -#line 1699 "lwin_wkt_parse.c" +#line 1709 "lwin_wkt_parse.c" break; case YYSYMBOL_iso_controlpoint: /* iso_controlpoint */ -#line 336 "lwin_wkt_parse.y" +#line 346 "lwin_wkt_parse.y" { wkt_parser_nurbs_controlpoints_free(((*yyvaluep).nurbscontrolpointsvalue)); } -#line 1705 "lwin_wkt_parse.c" +#line 1715 "lwin_wkt_parse.c" break; case YYSYMBOL_iso_controlpoint_list: /* iso_controlpoint_list */ -#line 337 "lwin_wkt_parse.y" +#line 347 "lwin_wkt_parse.y" { wkt_parser_nurbs_controlpoints_free(((*yyvaluep).nurbscontrolpointsvalue)); } -#line 1711 "lwin_wkt_parse.c" +#line 1721 "lwin_wkt_parse.c" break; case YYSYMBOL_iso_knot_list: /* iso_knot_list */ -#line 335 "lwin_wkt_parse.y" +#line 345 "lwin_wkt_parse.y" { ptarray_free(((*yyvaluep).ptarrayvalue)); } -#line 1717 "lwin_wkt_parse.c" +#line 1727 "lwin_wkt_parse.c" break; case YYSYMBOL_weight_list: /* weight_list */ -#line 333 "lwin_wkt_parse.y" +#line 343 "lwin_wkt_parse.y" { ptarray_free(((*yyvaluep).ptarrayvalue)); } -#line 1723 "lwin_wkt_parse.c" +#line 1733 "lwin_wkt_parse.c" break; case YYSYMBOL_knot_list: /* knot_list */ -#line 334 "lwin_wkt_parse.y" +#line 344 "lwin_wkt_parse.y" { ptarray_free(((*yyvaluep).ptarrayvalue)); } -#line 1729 "lwin_wkt_parse.c" +#line 1739 "lwin_wkt_parse.c" break; default: @@ -2018,865 +2028,865 @@ yyreduce: switch (yyn) { case 2: /* geometry: geometry_no_srid */ -#line 378 "lwin_wkt_parse.y" +#line 388 "lwin_wkt_parse.y" { wkt_parser_geometry_new((yyvsp[0].geometryvalue), SRID_UNKNOWN); WKT_ERROR(); } -#line 2024 "lwin_wkt_parse.c" +#line 2034 "lwin_wkt_parse.c" break; case 3: /* geometry: SRID_TOK SEMICOLON_TOK geometry_no_srid */ -#line 380 "lwin_wkt_parse.y" +#line 390 "lwin_wkt_parse.y" { wkt_parser_geometry_new((yyvsp[0].geometryvalue), (yyvsp[-2].integervalue)); WKT_ERROR(); } -#line 2030 "lwin_wkt_parse.c" +#line 2040 "lwin_wkt_parse.c" break; case 4: /* geometry_no_srid: point */ -#line 383 "lwin_wkt_parse.y" +#line 393 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2036 "lwin_wkt_parse.c" +#line 2046 "lwin_wkt_parse.c" break; case 5: /* geometry_no_srid: linestring */ -#line 384 "lwin_wkt_parse.y" +#line 394 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2042 "lwin_wkt_parse.c" +#line 2052 "lwin_wkt_parse.c" break; case 6: /* geometry_no_srid: circularstring */ -#line 385 "lwin_wkt_parse.y" +#line 395 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2048 "lwin_wkt_parse.c" +#line 2058 "lwin_wkt_parse.c" break; case 7: /* geometry_no_srid: compoundcurve */ -#line 386 "lwin_wkt_parse.y" +#line 396 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2054 "lwin_wkt_parse.c" +#line 2064 "lwin_wkt_parse.c" break; case 8: /* geometry_no_srid: polygon */ -#line 387 "lwin_wkt_parse.y" +#line 397 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2060 "lwin_wkt_parse.c" +#line 2070 "lwin_wkt_parse.c" break; case 9: /* geometry_no_srid: curvepolygon */ -#line 388 "lwin_wkt_parse.y" +#line 398 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2066 "lwin_wkt_parse.c" +#line 2076 "lwin_wkt_parse.c" break; case 10: /* geometry_no_srid: multipoint */ -#line 389 "lwin_wkt_parse.y" +#line 399 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2072 "lwin_wkt_parse.c" +#line 2082 "lwin_wkt_parse.c" break; case 11: /* geometry_no_srid: multilinestring */ -#line 390 "lwin_wkt_parse.y" +#line 400 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2078 "lwin_wkt_parse.c" +#line 2088 "lwin_wkt_parse.c" break; case 12: /* geometry_no_srid: multipolygon */ -#line 391 "lwin_wkt_parse.y" +#line 401 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2084 "lwin_wkt_parse.c" +#line 2094 "lwin_wkt_parse.c" break; case 13: /* geometry_no_srid: multisurface */ -#line 392 "lwin_wkt_parse.y" +#line 402 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2090 "lwin_wkt_parse.c" +#line 2100 "lwin_wkt_parse.c" break; case 14: /* geometry_no_srid: multicurve */ -#line 393 "lwin_wkt_parse.y" +#line 403 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2096 "lwin_wkt_parse.c" +#line 2106 "lwin_wkt_parse.c" break; case 15: /* geometry_no_srid: tin */ -#line 394 "lwin_wkt_parse.y" +#line 404 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2102 "lwin_wkt_parse.c" +#line 2112 "lwin_wkt_parse.c" break; case 16: /* geometry_no_srid: polyhedralsurface */ -#line 395 "lwin_wkt_parse.y" +#line 405 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2108 "lwin_wkt_parse.c" +#line 2118 "lwin_wkt_parse.c" break; case 17: /* geometry_no_srid: triangle */ -#line 396 "lwin_wkt_parse.y" +#line 406 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2114 "lwin_wkt_parse.c" +#line 2124 "lwin_wkt_parse.c" break; case 18: /* geometry_no_srid: nurbscurve */ -#line 397 "lwin_wkt_parse.y" +#line 407 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2120 "lwin_wkt_parse.c" +#line 2130 "lwin_wkt_parse.c" break; case 19: /* geometry_no_srid: geometrycollection */ -#line 398 "lwin_wkt_parse.y" +#line 408 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2126 "lwin_wkt_parse.c" +#line 2136 "lwin_wkt_parse.c" break; case 20: /* geometrycollection: COLLECTION_TOK LBRACKET_TOK geometry_list RBRACKET_TOK */ -#line 402 "lwin_wkt_parse.y" +#line 412 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(COLLECTIONTYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2132 "lwin_wkt_parse.c" +#line 2142 "lwin_wkt_parse.c" break; case 21: /* geometrycollection: COLLECTION_TOK DIMENSIONALITY_TOK LBRACKET_TOK geometry_list RBRACKET_TOK */ -#line 404 "lwin_wkt_parse.y" +#line 414 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(COLLECTIONTYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2138 "lwin_wkt_parse.c" +#line 2148 "lwin_wkt_parse.c" break; case 22: /* geometrycollection: COLLECTION_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 406 "lwin_wkt_parse.y" +#line 416 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(COLLECTIONTYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2144 "lwin_wkt_parse.c" +#line 2154 "lwin_wkt_parse.c" break; case 23: /* geometrycollection: COLLECTION_TOK EMPTY_TOK */ -#line 408 "lwin_wkt_parse.y" +#line 418 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(COLLECTIONTYPE, NULL, NULL); WKT_ERROR(); } -#line 2150 "lwin_wkt_parse.c" +#line 2160 "lwin_wkt_parse.c" break; case 24: /* geometry_list: geometry_list COMMA_TOK geometry_no_srid */ -#line 412 "lwin_wkt_parse.y" +#line 422 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2156 "lwin_wkt_parse.c" +#line 2166 "lwin_wkt_parse.c" break; case 25: /* geometry_list: geometry_no_srid */ -#line 414 "lwin_wkt_parse.y" +#line 424 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2162 "lwin_wkt_parse.c" +#line 2172 "lwin_wkt_parse.c" break; case 26: /* multisurface: MSURFACE_TOK LBRACKET_TOK surface_list RBRACKET_TOK */ -#line 418 "lwin_wkt_parse.y" +#line 428 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTISURFACETYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2168 "lwin_wkt_parse.c" +#line 2178 "lwin_wkt_parse.c" break; case 27: /* multisurface: MSURFACE_TOK DIMENSIONALITY_TOK LBRACKET_TOK surface_list RBRACKET_TOK */ -#line 420 "lwin_wkt_parse.y" +#line 430 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTISURFACETYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2174 "lwin_wkt_parse.c" +#line 2184 "lwin_wkt_parse.c" break; case 28: /* multisurface: MSURFACE_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 422 "lwin_wkt_parse.y" +#line 432 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTISURFACETYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2180 "lwin_wkt_parse.c" +#line 2190 "lwin_wkt_parse.c" break; case 29: /* multisurface: MSURFACE_TOK EMPTY_TOK */ -#line 424 "lwin_wkt_parse.y" +#line 434 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTISURFACETYPE, NULL, NULL); WKT_ERROR(); } -#line 2186 "lwin_wkt_parse.c" +#line 2196 "lwin_wkt_parse.c" break; case 30: /* surface_list: surface_list COMMA_TOK polygon */ -#line 428 "lwin_wkt_parse.y" +#line 438 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2192 "lwin_wkt_parse.c" +#line 2202 "lwin_wkt_parse.c" break; case 31: /* surface_list: surface_list COMMA_TOK curvepolygon */ -#line 430 "lwin_wkt_parse.y" +#line 440 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2198 "lwin_wkt_parse.c" +#line 2208 "lwin_wkt_parse.c" break; case 32: /* surface_list: surface_list COMMA_TOK polygon_untagged */ -#line 432 "lwin_wkt_parse.y" +#line 442 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2204 "lwin_wkt_parse.c" +#line 2214 "lwin_wkt_parse.c" break; case 33: /* surface_list: polygon */ -#line 434 "lwin_wkt_parse.y" +#line 444 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2210 "lwin_wkt_parse.c" +#line 2220 "lwin_wkt_parse.c" break; case 34: /* surface_list: curvepolygon */ -#line 436 "lwin_wkt_parse.y" +#line 446 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2216 "lwin_wkt_parse.c" +#line 2226 "lwin_wkt_parse.c" break; case 35: /* surface_list: polygon_untagged */ -#line 438 "lwin_wkt_parse.y" +#line 448 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2222 "lwin_wkt_parse.c" +#line 2232 "lwin_wkt_parse.c" break; case 36: /* tin: TIN_TOK LBRACKET_TOK triangle_list RBRACKET_TOK */ -#line 442 "lwin_wkt_parse.y" +#line 452 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(TINTYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2228 "lwin_wkt_parse.c" +#line 2238 "lwin_wkt_parse.c" break; case 37: /* tin: TIN_TOK DIMENSIONALITY_TOK LBRACKET_TOK triangle_list RBRACKET_TOK */ -#line 444 "lwin_wkt_parse.y" +#line 454 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(TINTYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2234 "lwin_wkt_parse.c" +#line 2244 "lwin_wkt_parse.c" break; case 38: /* tin: TIN_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 446 "lwin_wkt_parse.y" +#line 456 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(TINTYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2240 "lwin_wkt_parse.c" +#line 2250 "lwin_wkt_parse.c" break; case 39: /* tin: TIN_TOK EMPTY_TOK */ -#line 448 "lwin_wkt_parse.y" +#line 458 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(TINTYPE, NULL, NULL); WKT_ERROR(); } -#line 2246 "lwin_wkt_parse.c" +#line 2256 "lwin_wkt_parse.c" break; case 40: /* polyhedralsurface: POLYHEDRALSURFACE_TOK LBRACKET_TOK patch_list RBRACKET_TOK */ -#line 452 "lwin_wkt_parse.y" +#line 462 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(POLYHEDRALSURFACETYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2252 "lwin_wkt_parse.c" +#line 2262 "lwin_wkt_parse.c" break; case 41: /* polyhedralsurface: POLYHEDRALSURFACE_TOK DIMENSIONALITY_TOK LBRACKET_TOK patch_list RBRACKET_TOK */ -#line 454 "lwin_wkt_parse.y" +#line 464 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(POLYHEDRALSURFACETYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2258 "lwin_wkt_parse.c" +#line 2268 "lwin_wkt_parse.c" break; case 42: /* polyhedralsurface: POLYHEDRALSURFACE_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 456 "lwin_wkt_parse.y" +#line 466 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(POLYHEDRALSURFACETYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2264 "lwin_wkt_parse.c" +#line 2274 "lwin_wkt_parse.c" break; case 43: /* polyhedralsurface: POLYHEDRALSURFACE_TOK EMPTY_TOK */ -#line 458 "lwin_wkt_parse.y" +#line 468 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(POLYHEDRALSURFACETYPE, NULL, NULL); WKT_ERROR(); } -#line 2270 "lwin_wkt_parse.c" +#line 2280 "lwin_wkt_parse.c" break; case 44: /* multipolygon: MPOLYGON_TOK LBRACKET_TOK polygon_list RBRACKET_TOK */ -#line 462 "lwin_wkt_parse.y" +#line 472 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOLYGONTYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2276 "lwin_wkt_parse.c" +#line 2286 "lwin_wkt_parse.c" break; case 45: /* multipolygon: MPOLYGON_TOK DIMENSIONALITY_TOK LBRACKET_TOK polygon_list RBRACKET_TOK */ -#line 464 "lwin_wkt_parse.y" +#line 474 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOLYGONTYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2282 "lwin_wkt_parse.c" +#line 2292 "lwin_wkt_parse.c" break; case 46: /* multipolygon: MPOLYGON_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 466 "lwin_wkt_parse.y" +#line 476 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOLYGONTYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2288 "lwin_wkt_parse.c" +#line 2298 "lwin_wkt_parse.c" break; case 47: /* multipolygon: MPOLYGON_TOK EMPTY_TOK */ -#line 468 "lwin_wkt_parse.y" +#line 478 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOLYGONTYPE, NULL, NULL); WKT_ERROR(); } -#line 2294 "lwin_wkt_parse.c" +#line 2304 "lwin_wkt_parse.c" break; case 48: /* polygon_list: polygon_list COMMA_TOK polygon_untagged */ -#line 472 "lwin_wkt_parse.y" +#line 482 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2300 "lwin_wkt_parse.c" +#line 2310 "lwin_wkt_parse.c" break; case 49: /* polygon_list: polygon_untagged */ -#line 474 "lwin_wkt_parse.y" +#line 484 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2306 "lwin_wkt_parse.c" +#line 2316 "lwin_wkt_parse.c" break; case 50: /* patch_list: patch_list COMMA_TOK patch */ -#line 478 "lwin_wkt_parse.y" +#line 488 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2312 "lwin_wkt_parse.c" +#line 2322 "lwin_wkt_parse.c" break; case 51: /* patch_list: patch */ -#line 480 "lwin_wkt_parse.y" +#line 490 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2318 "lwin_wkt_parse.c" +#line 2328 "lwin_wkt_parse.c" break; case 52: /* polygon: POLYGON_TOK LBRACKET_TOK ring_list RBRACKET_TOK */ -#line 484 "lwin_wkt_parse.y" +#line 494 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_finalize((yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2324 "lwin_wkt_parse.c" +#line 2334 "lwin_wkt_parse.c" break; case 53: /* polygon: POLYGON_TOK DIMENSIONALITY_TOK LBRACKET_TOK ring_list RBRACKET_TOK */ -#line 486 "lwin_wkt_parse.y" +#line 496 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_finalize((yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2330 "lwin_wkt_parse.c" +#line 2340 "lwin_wkt_parse.c" break; case 54: /* polygon: POLYGON_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 488 "lwin_wkt_parse.y" +#line 498 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_finalize(NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2336 "lwin_wkt_parse.c" +#line 2346 "lwin_wkt_parse.c" break; case 55: /* polygon: POLYGON_TOK EMPTY_TOK */ -#line 490 "lwin_wkt_parse.y" +#line 500 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_finalize(NULL, NULL); WKT_ERROR(); } -#line 2342 "lwin_wkt_parse.c" +#line 2352 "lwin_wkt_parse.c" break; case 56: /* polygon_untagged: LBRACKET_TOK ring_list RBRACKET_TOK */ -#line 494 "lwin_wkt_parse.y" +#line 504 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[-1].geometryvalue); } -#line 2348 "lwin_wkt_parse.c" +#line 2358 "lwin_wkt_parse.c" break; case 57: /* polygon_untagged: EMPTY_TOK */ -#line 496 "lwin_wkt_parse.y" +#line 506 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_finalize(NULL, NULL); WKT_ERROR(); } -#line 2354 "lwin_wkt_parse.c" +#line 2364 "lwin_wkt_parse.c" break; case 58: /* patch: LBRACKET_TOK patchring_list RBRACKET_TOK */ -#line 499 "lwin_wkt_parse.y" +#line 509 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[-1].geometryvalue); } -#line 2360 "lwin_wkt_parse.c" +#line 2370 "lwin_wkt_parse.c" break; case 59: /* curvepolygon: CURVEPOLYGON_TOK LBRACKET_TOK curvering_list RBRACKET_TOK */ -#line 503 "lwin_wkt_parse.y" +#line 513 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_curvepolygon_finalize((yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2366 "lwin_wkt_parse.c" +#line 2376 "lwin_wkt_parse.c" break; case 60: /* curvepolygon: CURVEPOLYGON_TOK DIMENSIONALITY_TOK LBRACKET_TOK curvering_list RBRACKET_TOK */ -#line 505 "lwin_wkt_parse.y" +#line 515 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_curvepolygon_finalize((yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2372 "lwin_wkt_parse.c" +#line 2382 "lwin_wkt_parse.c" break; case 61: /* curvepolygon: CURVEPOLYGON_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 507 "lwin_wkt_parse.y" +#line 517 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_curvepolygon_finalize(NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2378 "lwin_wkt_parse.c" +#line 2388 "lwin_wkt_parse.c" break; case 62: /* curvepolygon: CURVEPOLYGON_TOK EMPTY_TOK */ -#line 509 "lwin_wkt_parse.y" +#line 519 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_curvepolygon_finalize(NULL, NULL); WKT_ERROR(); } -#line 2384 "lwin_wkt_parse.c" +#line 2394 "lwin_wkt_parse.c" break; case 63: /* curvering_list: curvering_list COMMA_TOK curvering */ -#line 513 "lwin_wkt_parse.y" +#line 523 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_curvepolygon_add_ring((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2390 "lwin_wkt_parse.c" +#line 2400 "lwin_wkt_parse.c" break; case 64: /* curvering_list: curvering */ -#line 515 "lwin_wkt_parse.y" +#line 525 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_curvepolygon_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2396 "lwin_wkt_parse.c" +#line 2406 "lwin_wkt_parse.c" break; case 65: /* curvering: linestring_untagged */ -#line 518 "lwin_wkt_parse.y" +#line 528 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2402 "lwin_wkt_parse.c" +#line 2412 "lwin_wkt_parse.c" break; case 66: /* curvering: linestring */ -#line 519 "lwin_wkt_parse.y" +#line 529 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2408 "lwin_wkt_parse.c" +#line 2418 "lwin_wkt_parse.c" break; case 67: /* curvering: compoundcurve */ -#line 520 "lwin_wkt_parse.y" +#line 530 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2414 "lwin_wkt_parse.c" +#line 2424 "lwin_wkt_parse.c" break; case 68: /* curvering: nurbscurve */ -#line 521 "lwin_wkt_parse.y" +#line 531 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2420 "lwin_wkt_parse.c" +#line 2430 "lwin_wkt_parse.c" break; case 69: /* curvering: circularstring */ -#line 522 "lwin_wkt_parse.y" +#line 532 "lwin_wkt_parse.y" { (yyval.geometryvalue) = (yyvsp[0].geometryvalue); } -#line 2426 "lwin_wkt_parse.c" +#line 2436 "lwin_wkt_parse.c" break; case 70: /* patchring_list: patchring_list COMMA_TOK patchring */ -#line 526 "lwin_wkt_parse.y" +#line 536 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_add_ring((yyvsp[-2].geometryvalue),(yyvsp[0].ptarrayvalue),'Z'); WKT_ERROR(); } -#line 2432 "lwin_wkt_parse.c" +#line 2442 "lwin_wkt_parse.c" break; case 71: /* patchring_list: patchring */ -#line 528 "lwin_wkt_parse.y" +#line 538 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_new((yyvsp[0].ptarrayvalue),'Z'); WKT_ERROR(); } -#line 2438 "lwin_wkt_parse.c" +#line 2448 "lwin_wkt_parse.c" break; case 72: /* ring_list: ring_list COMMA_TOK ring */ -#line 532 "lwin_wkt_parse.y" +#line 542 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_add_ring((yyvsp[-2].geometryvalue),(yyvsp[0].ptarrayvalue),'2'); WKT_ERROR(); } -#line 2444 "lwin_wkt_parse.c" +#line 2454 "lwin_wkt_parse.c" break; case 73: /* ring_list: ring */ -#line 534 "lwin_wkt_parse.y" +#line 544 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_polygon_new((yyvsp[0].ptarrayvalue),'2'); WKT_ERROR(); } -#line 2450 "lwin_wkt_parse.c" +#line 2460 "lwin_wkt_parse.c" break; case 74: /* patchring: LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 537 "lwin_wkt_parse.y" +#line 547 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = (yyvsp[-1].ptarrayvalue); } -#line 2456 "lwin_wkt_parse.c" +#line 2466 "lwin_wkt_parse.c" break; case 75: /* ring: LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 540 "lwin_wkt_parse.y" +#line 550 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = (yyvsp[-1].ptarrayvalue); } -#line 2462 "lwin_wkt_parse.c" +#line 2472 "lwin_wkt_parse.c" break; case 76: /* compoundcurve: COMPOUNDCURVE_TOK LBRACKET_TOK compound_list RBRACKET_TOK */ -#line 544 "lwin_wkt_parse.y" +#line 554 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_finalize((yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2468 "lwin_wkt_parse.c" +#line 2478 "lwin_wkt_parse.c" break; case 77: /* compoundcurve: COMPOUNDCURVE_TOK DIMENSIONALITY_TOK LBRACKET_TOK compound_list RBRACKET_TOK */ -#line 546 "lwin_wkt_parse.y" +#line 556 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_finalize((yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2474 "lwin_wkt_parse.c" +#line 2484 "lwin_wkt_parse.c" break; case 78: /* compoundcurve: COMPOUNDCURVE_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 548 "lwin_wkt_parse.y" +#line 558 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_finalize(NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2480 "lwin_wkt_parse.c" +#line 2490 "lwin_wkt_parse.c" break; case 79: /* compoundcurve: COMPOUNDCURVE_TOK EMPTY_TOK */ -#line 550 "lwin_wkt_parse.y" +#line 560 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_finalize(NULL, NULL); WKT_ERROR(); } -#line 2486 "lwin_wkt_parse.c" +#line 2496 "lwin_wkt_parse.c" break; case 80: /* compound_list: compound_list COMMA_TOK circularstring */ -#line 554 "lwin_wkt_parse.y" +#line 564 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2492 "lwin_wkt_parse.c" +#line 2502 "lwin_wkt_parse.c" break; case 81: /* compound_list: compound_list COMMA_TOK nurbscurve */ -#line 556 "lwin_wkt_parse.y" +#line 566 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2498 "lwin_wkt_parse.c" +#line 2508 "lwin_wkt_parse.c" break; case 82: /* compound_list: compound_list COMMA_TOK linestring */ -#line 558 "lwin_wkt_parse.y" +#line 568 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2504 "lwin_wkt_parse.c" +#line 2514 "lwin_wkt_parse.c" break; case 83: /* compound_list: compound_list COMMA_TOK linestring_untagged */ -#line 560 "lwin_wkt_parse.y" +#line 570 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2510 "lwin_wkt_parse.c" +#line 2520 "lwin_wkt_parse.c" break; case 84: /* compound_list: circularstring */ -#line 562 "lwin_wkt_parse.y" +#line 572 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2516 "lwin_wkt_parse.c" +#line 2526 "lwin_wkt_parse.c" break; case 85: /* compound_list: nurbscurve */ -#line 564 "lwin_wkt_parse.y" +#line 574 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2522 "lwin_wkt_parse.c" +#line 2532 "lwin_wkt_parse.c" break; case 86: /* compound_list: linestring */ -#line 566 "lwin_wkt_parse.y" +#line 576 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2528 "lwin_wkt_parse.c" +#line 2538 "lwin_wkt_parse.c" break; case 87: /* compound_list: linestring_untagged */ -#line 568 "lwin_wkt_parse.y" +#line 578 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_compound_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2534 "lwin_wkt_parse.c" +#line 2544 "lwin_wkt_parse.c" break; case 88: /* multicurve: MCURVE_TOK LBRACKET_TOK curve_list RBRACKET_TOK */ -#line 572 "lwin_wkt_parse.y" +#line 582 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTICURVETYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2540 "lwin_wkt_parse.c" +#line 2550 "lwin_wkt_parse.c" break; case 89: /* multicurve: MCURVE_TOK DIMENSIONALITY_TOK LBRACKET_TOK curve_list RBRACKET_TOK */ -#line 574 "lwin_wkt_parse.y" +#line 584 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTICURVETYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2546 "lwin_wkt_parse.c" +#line 2556 "lwin_wkt_parse.c" break; case 90: /* multicurve: MCURVE_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 576 "lwin_wkt_parse.y" +#line 586 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTICURVETYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2552 "lwin_wkt_parse.c" +#line 2562 "lwin_wkt_parse.c" break; case 91: /* multicurve: MCURVE_TOK EMPTY_TOK */ -#line 578 "lwin_wkt_parse.y" +#line 588 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTICURVETYPE, NULL, NULL); WKT_ERROR(); } -#line 2558 "lwin_wkt_parse.c" +#line 2568 "lwin_wkt_parse.c" break; case 92: /* curve_list: curve_list COMMA_TOK circularstring */ -#line 582 "lwin_wkt_parse.y" +#line 592 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2564 "lwin_wkt_parse.c" +#line 2574 "lwin_wkt_parse.c" break; case 93: /* curve_list: curve_list COMMA_TOK compoundcurve */ -#line 584 "lwin_wkt_parse.y" +#line 594 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2570 "lwin_wkt_parse.c" +#line 2580 "lwin_wkt_parse.c" break; case 94: /* curve_list: curve_list COMMA_TOK nurbscurve */ -#line 586 "lwin_wkt_parse.y" +#line 596 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2576 "lwin_wkt_parse.c" +#line 2586 "lwin_wkt_parse.c" break; case 95: /* curve_list: curve_list COMMA_TOK linestring */ -#line 588 "lwin_wkt_parse.y" +#line 598 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2582 "lwin_wkt_parse.c" +#line 2592 "lwin_wkt_parse.c" break; case 96: /* curve_list: curve_list COMMA_TOK linestring_untagged */ -#line 590 "lwin_wkt_parse.y" +#line 600 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2588 "lwin_wkt_parse.c" +#line 2598 "lwin_wkt_parse.c" break; case 97: /* curve_list: circularstring */ -#line 592 "lwin_wkt_parse.y" +#line 602 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2594 "lwin_wkt_parse.c" +#line 2604 "lwin_wkt_parse.c" break; case 98: /* curve_list: compoundcurve */ -#line 594 "lwin_wkt_parse.y" +#line 604 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2600 "lwin_wkt_parse.c" +#line 2610 "lwin_wkt_parse.c" break; case 99: /* curve_list: nurbscurve */ -#line 596 "lwin_wkt_parse.y" +#line 606 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2606 "lwin_wkt_parse.c" +#line 2616 "lwin_wkt_parse.c" break; case 100: /* curve_list: linestring */ -#line 598 "lwin_wkt_parse.y" +#line 608 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2612 "lwin_wkt_parse.c" +#line 2622 "lwin_wkt_parse.c" break; case 101: /* curve_list: linestring_untagged */ -#line 600 "lwin_wkt_parse.y" +#line 610 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2618 "lwin_wkt_parse.c" +#line 2628 "lwin_wkt_parse.c" break; case 102: /* multilinestring: MLINESTRING_TOK LBRACKET_TOK linestring_list RBRACKET_TOK */ -#line 604 "lwin_wkt_parse.y" +#line 614 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTILINETYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2624 "lwin_wkt_parse.c" +#line 2634 "lwin_wkt_parse.c" break; case 103: /* multilinestring: MLINESTRING_TOK DIMENSIONALITY_TOK LBRACKET_TOK linestring_list RBRACKET_TOK */ -#line 606 "lwin_wkt_parse.y" +#line 616 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTILINETYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2630 "lwin_wkt_parse.c" +#line 2640 "lwin_wkt_parse.c" break; case 104: /* multilinestring: MLINESTRING_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 608 "lwin_wkt_parse.y" +#line 618 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTILINETYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2636 "lwin_wkt_parse.c" +#line 2646 "lwin_wkt_parse.c" break; case 105: /* multilinestring: MLINESTRING_TOK EMPTY_TOK */ -#line 610 "lwin_wkt_parse.y" +#line 620 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTILINETYPE, NULL, NULL); WKT_ERROR(); } -#line 2642 "lwin_wkt_parse.c" +#line 2652 "lwin_wkt_parse.c" break; case 106: /* linestring_list: linestring_list COMMA_TOK linestring_untagged */ -#line 614 "lwin_wkt_parse.y" +#line 624 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2648 "lwin_wkt_parse.c" +#line 2658 "lwin_wkt_parse.c" break; case 107: /* linestring_list: linestring_untagged */ -#line 616 "lwin_wkt_parse.y" +#line 626 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2654 "lwin_wkt_parse.c" +#line 2664 "lwin_wkt_parse.c" break; case 108: /* circularstring: CIRCULARSTRING_TOK LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 620 "lwin_wkt_parse.y" +#line 630 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_circularstring_new((yyvsp[-1].ptarrayvalue), NULL); WKT_ERROR(); } -#line 2660 "lwin_wkt_parse.c" +#line 2670 "lwin_wkt_parse.c" break; case 109: /* circularstring: CIRCULARSTRING_TOK DIMENSIONALITY_TOK LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 622 "lwin_wkt_parse.y" +#line 632 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_circularstring_new((yyvsp[-1].ptarrayvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2666 "lwin_wkt_parse.c" +#line 2676 "lwin_wkt_parse.c" break; case 110: /* circularstring: CIRCULARSTRING_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 624 "lwin_wkt_parse.y" +#line 634 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_circularstring_new(NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2672 "lwin_wkt_parse.c" +#line 2682 "lwin_wkt_parse.c" break; case 111: /* circularstring: CIRCULARSTRING_TOK EMPTY_TOK */ -#line 626 "lwin_wkt_parse.y" +#line 636 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_circularstring_new(NULL, NULL); WKT_ERROR(); } -#line 2678 "lwin_wkt_parse.c" +#line 2688 "lwin_wkt_parse.c" break; case 112: /* linestring: LINESTRING_TOK LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 630 "lwin_wkt_parse.y" +#line 640 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_linestring_new((yyvsp[-1].ptarrayvalue), NULL); WKT_ERROR(); } -#line 2684 "lwin_wkt_parse.c" +#line 2694 "lwin_wkt_parse.c" break; case 113: /* linestring: LINESTRING_TOK DIMENSIONALITY_TOK LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 632 "lwin_wkt_parse.y" +#line 642 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_linestring_new((yyvsp[-1].ptarrayvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2690 "lwin_wkt_parse.c" +#line 2700 "lwin_wkt_parse.c" break; case 114: /* linestring: LINESTRING_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 634 "lwin_wkt_parse.y" +#line 644 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_linestring_new(NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2696 "lwin_wkt_parse.c" +#line 2706 "lwin_wkt_parse.c" break; case 115: /* linestring: LINESTRING_TOK EMPTY_TOK */ -#line 636 "lwin_wkt_parse.y" +#line 646 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_linestring_new(NULL, NULL); WKT_ERROR(); } -#line 2702 "lwin_wkt_parse.c" +#line 2712 "lwin_wkt_parse.c" break; case 116: /* linestring_untagged: LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 640 "lwin_wkt_parse.y" +#line 650 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_linestring_new((yyvsp[-1].ptarrayvalue), NULL); WKT_ERROR(); } -#line 2708 "lwin_wkt_parse.c" +#line 2718 "lwin_wkt_parse.c" break; case 117: /* linestring_untagged: EMPTY_TOK */ -#line 642 "lwin_wkt_parse.y" +#line 652 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_linestring_new(NULL, NULL); WKT_ERROR(); } -#line 2714 "lwin_wkt_parse.c" +#line 2724 "lwin_wkt_parse.c" break; case 118: /* triangle_list: triangle_list COMMA_TOK triangle_untagged */ -#line 646 "lwin_wkt_parse.y" +#line 656 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2720 "lwin_wkt_parse.c" +#line 2730 "lwin_wkt_parse.c" break; case 119: /* triangle_list: triangle_untagged */ -#line 648 "lwin_wkt_parse.y" +#line 658 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2726 "lwin_wkt_parse.c" +#line 2736 "lwin_wkt_parse.c" break; case 120: /* triangle: TRIANGLE_TOK LBRACKET_TOK LBRACKET_TOK ptarray RBRACKET_TOK RBRACKET_TOK */ -#line 652 "lwin_wkt_parse.y" +#line 662 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_triangle_new((yyvsp[-2].ptarrayvalue), NULL); WKT_ERROR(); } -#line 2732 "lwin_wkt_parse.c" +#line 2742 "lwin_wkt_parse.c" break; case 121: /* triangle: TRIANGLE_TOK DIMENSIONALITY_TOK LBRACKET_TOK LBRACKET_TOK ptarray RBRACKET_TOK RBRACKET_TOK */ -#line 654 "lwin_wkt_parse.y" +#line 664 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_triangle_new((yyvsp[-2].ptarrayvalue), (yyvsp[-5].stringvalue)); WKT_ERROR(); } -#line 2738 "lwin_wkt_parse.c" +#line 2748 "lwin_wkt_parse.c" break; case 122: /* triangle: TRIANGLE_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 656 "lwin_wkt_parse.y" +#line 666 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_triangle_new(NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2744 "lwin_wkt_parse.c" +#line 2754 "lwin_wkt_parse.c" break; case 123: /* triangle: TRIANGLE_TOK EMPTY_TOK */ -#line 658 "lwin_wkt_parse.y" +#line 668 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_triangle_new(NULL, NULL); WKT_ERROR(); } -#line 2750 "lwin_wkt_parse.c" +#line 2760 "lwin_wkt_parse.c" break; case 124: /* triangle_untagged: LBRACKET_TOK LBRACKET_TOK ptarray RBRACKET_TOK RBRACKET_TOK */ -#line 662 "lwin_wkt_parse.y" +#line 672 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_triangle_new((yyvsp[-2].ptarrayvalue), NULL); WKT_ERROR(); } -#line 2756 "lwin_wkt_parse.c" +#line 2766 "lwin_wkt_parse.c" break; case 125: /* multipoint: MPOINT_TOK LBRACKET_TOK point_list RBRACKET_TOK */ -#line 666 "lwin_wkt_parse.y" +#line 676 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOINTTYPE, (yyvsp[-1].geometryvalue), NULL); WKT_ERROR(); } -#line 2762 "lwin_wkt_parse.c" +#line 2772 "lwin_wkt_parse.c" break; case 126: /* multipoint: MPOINT_TOK DIMENSIONALITY_TOK LBRACKET_TOK point_list RBRACKET_TOK */ -#line 668 "lwin_wkt_parse.y" +#line 678 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOINTTYPE, (yyvsp[-1].geometryvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2768 "lwin_wkt_parse.c" +#line 2778 "lwin_wkt_parse.c" break; case 127: /* multipoint: MPOINT_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 670 "lwin_wkt_parse.y" +#line 680 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOINTTYPE, NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2774 "lwin_wkt_parse.c" +#line 2784 "lwin_wkt_parse.c" break; case 128: /* multipoint: MPOINT_TOK EMPTY_TOK */ -#line 672 "lwin_wkt_parse.y" +#line 682 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_finalize(MULTIPOINTTYPE, NULL, NULL); WKT_ERROR(); } -#line 2780 "lwin_wkt_parse.c" +#line 2790 "lwin_wkt_parse.c" break; case 129: /* point_list: point_list COMMA_TOK point_untagged */ -#line 676 "lwin_wkt_parse.y" +#line 686 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_add_geom((yyvsp[-2].geometryvalue),(yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2786 "lwin_wkt_parse.c" +#line 2796 "lwin_wkt_parse.c" break; case 130: /* point_list: point_untagged */ -#line 678 "lwin_wkt_parse.y" +#line 688 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_collection_new((yyvsp[0].geometryvalue)); WKT_ERROR(); } -#line 2792 "lwin_wkt_parse.c" +#line 2802 "lwin_wkt_parse.c" break; case 131: /* point_untagged: coordinate */ -#line 682 "lwin_wkt_parse.y" +#line 692 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_point_new(wkt_parser_ptarray_new((yyvsp[0].coordinatevalue)),NULL); WKT_ERROR(); } -#line 2798 "lwin_wkt_parse.c" +#line 2808 "lwin_wkt_parse.c" break; case 132: /* point_untagged: LBRACKET_TOK coordinate RBRACKET_TOK */ -#line 684 "lwin_wkt_parse.y" +#line 694 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_point_new(wkt_parser_ptarray_new((yyvsp[-1].coordinatevalue)),NULL); WKT_ERROR(); } -#line 2804 "lwin_wkt_parse.c" +#line 2814 "lwin_wkt_parse.c" break; case 133: /* point_untagged: EMPTY_TOK */ -#line 686 "lwin_wkt_parse.y" +#line 696 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_point_new(NULL, NULL); WKT_ERROR(); } -#line 2810 "lwin_wkt_parse.c" +#line 2820 "lwin_wkt_parse.c" break; case 134: /* point: POINT_TOK LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 690 "lwin_wkt_parse.y" +#line 700 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_point_new((yyvsp[-1].ptarrayvalue), NULL); WKT_ERROR(); } -#line 2816 "lwin_wkt_parse.c" +#line 2826 "lwin_wkt_parse.c" break; case 135: /* point: POINT_TOK DIMENSIONALITY_TOK LBRACKET_TOK ptarray RBRACKET_TOK */ -#line 692 "lwin_wkt_parse.y" +#line 702 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_point_new((yyvsp[-1].ptarrayvalue), (yyvsp[-3].stringvalue)); WKT_ERROR(); } -#line 2822 "lwin_wkt_parse.c" +#line 2832 "lwin_wkt_parse.c" break; case 136: /* point: POINT_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 694 "lwin_wkt_parse.y" +#line 704 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_point_new(NULL, (yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2828 "lwin_wkt_parse.c" +#line 2838 "lwin_wkt_parse.c" break; case 137: /* point: POINT_TOK EMPTY_TOK */ -#line 696 "lwin_wkt_parse.y" +#line 706 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_point_new(NULL,NULL); WKT_ERROR(); } -#line 2834 "lwin_wkt_parse.c" +#line 2844 "lwin_wkt_parse.c" break; case 138: /* ptarray: ptarray COMMA_TOK coordinate */ -#line 700 "lwin_wkt_parse.y" +#line 710 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_ptarray_add_coord((yyvsp[-2].ptarrayvalue), (yyvsp[0].coordinatevalue)); WKT_ERROR(); } -#line 2840 "lwin_wkt_parse.c" +#line 2850 "lwin_wkt_parse.c" break; case 139: /* ptarray: coordinate */ -#line 702 "lwin_wkt_parse.y" +#line 712 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_ptarray_new((yyvsp[0].coordinatevalue)); WKT_ERROR(); } -#line 2846 "lwin_wkt_parse.c" +#line 2856 "lwin_wkt_parse.c" break; case 140: /* coordinate: DOUBLE_TOK DOUBLE_TOK */ -#line 706 "lwin_wkt_parse.y" +#line 716 "lwin_wkt_parse.y" { (yyval.coordinatevalue) = wkt_parser_coord_2((yyvsp[-1].doublevalue), (yyvsp[0].doublevalue)); WKT_ERROR(); } -#line 2852 "lwin_wkt_parse.c" +#line 2862 "lwin_wkt_parse.c" break; case 141: /* coordinate: DOUBLE_TOK DOUBLE_TOK DOUBLE_TOK */ -#line 708 "lwin_wkt_parse.y" +#line 718 "lwin_wkt_parse.y" { (yyval.coordinatevalue) = wkt_parser_coord_3((yyvsp[-2].doublevalue), (yyvsp[-1].doublevalue), (yyvsp[0].doublevalue)); WKT_ERROR(); } -#line 2858 "lwin_wkt_parse.c" +#line 2868 "lwin_wkt_parse.c" break; case 142: /* coordinate: DOUBLE_TOK DOUBLE_TOK DOUBLE_TOK DOUBLE_TOK */ -#line 710 "lwin_wkt_parse.y" +#line 720 "lwin_wkt_parse.y" { (yyval.coordinatevalue) = wkt_parser_coord_4((yyvsp[-3].doublevalue), (yyvsp[-2].doublevalue), (yyvsp[-1].doublevalue), (yyvsp[0].doublevalue)); WKT_ERROR(); } -#line 2864 "lwin_wkt_parse.c" +#line 2874 "lwin_wkt_parse.c" break; case 143: /* opt_dimensionality: DIMENSIONALITY_TOK */ -#line 714 "lwin_wkt_parse.y" +#line 724 "lwin_wkt_parse.y" { (yyval.stringvalue) = (yyvsp[0].stringvalue); } -#line 2870 "lwin_wkt_parse.c" +#line 2880 "lwin_wkt_parse.c" break; case 144: /* opt_dimensionality: %empty */ -#line 715 "lwin_wkt_parse.y" +#line 725 "lwin_wkt_parse.y" { (yyval.stringvalue) = NULL; } -#line 2876 "lwin_wkt_parse.c" +#line 2886 "lwin_wkt_parse.c" break; case 145: /* nurbscurve: NURBSCURVE_TOK LBRACKET_TOK DEGREE_TOK DOUBLE_TOK COMMA_TOK CONTROLPOINTS_TOK opt_dimensionality LBRACKET_TOK iso_controlpoint_list RBRACKET_TOK COMMA_TOK KNOTS_TOK LBRACKET_TOK iso_knot_list RBRACKET_TOK RBRACKET_TOK */ -#line 720 "lwin_wkt_parse.y" +#line 730 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-12].doublevalue), (yyvsp[-7].nurbscontrolpointsvalue)->points, (yyvsp[-7].nurbscontrolpointsvalue)->weights, (yyvsp[-2].ptarrayvalue), wkt_parser_nurbscurve_iso_dimensionality(NULL, (yyvsp[-9].stringvalue))); @@ -2885,11 +2895,11 @@ yyreduce: wkt_parser_nurbs_controlpoints_free((yyvsp[-7].nurbscontrolpointsvalue)); WKT_ERROR(); } -#line 2889 "lwin_wkt_parse.c" +#line 2899 "lwin_wkt_parse.c" break; case 146: /* nurbscurve: NURBSCURVE_TOK DIMENSIONALITY_TOK LBRACKET_TOK DEGREE_TOK DOUBLE_TOK COMMA_TOK CONTROLPOINTS_TOK opt_dimensionality LBRACKET_TOK iso_controlpoint_list RBRACKET_TOK COMMA_TOK KNOTS_TOK LBRACKET_TOK iso_knot_list RBRACKET_TOK RBRACKET_TOK */ -#line 729 "lwin_wkt_parse.y" +#line 739 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-12].doublevalue), (yyvsp[-7].nurbscontrolpointsvalue)->points, (yyvsp[-7].nurbscontrolpointsvalue)->weights, (yyvsp[-2].ptarrayvalue), wkt_parser_nurbscurve_iso_dimensionality((yyvsp[-15].stringvalue), (yyvsp[-9].stringvalue))); @@ -2898,125 +2908,125 @@ yyreduce: wkt_parser_nurbs_controlpoints_free((yyvsp[-7].nurbscontrolpointsvalue)); WKT_ERROR(); } -#line 2902 "lwin_wkt_parse.c" +#line 2912 "lwin_wkt_parse.c" break; case 147: /* nurbscurve: NURBSCURVE_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK LBRACKET_TOK ptarray RBRACKET_TOK COMMA_TOK LBRACKET_TOK weight_list RBRACKET_TOK COMMA_TOK LBRACKET_TOK knot_list RBRACKET_TOK RBRACKET_TOK */ -#line 739 "lwin_wkt_parse.y" +#line 749 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-13].doublevalue), (yyvsp[-10].ptarrayvalue), (yyvsp[-6].ptarrayvalue), (yyvsp[-2].ptarrayvalue), NULL); WKT_ERROR(); } -#line 2908 "lwin_wkt_parse.c" +#line 2918 "lwin_wkt_parse.c" break; case 148: /* nurbscurve: NURBSCURVE_TOK DIMENSIONALITY_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK LBRACKET_TOK ptarray RBRACKET_TOK COMMA_TOK LBRACKET_TOK weight_list RBRACKET_TOK COMMA_TOK LBRACKET_TOK knot_list RBRACKET_TOK RBRACKET_TOK */ -#line 741 "lwin_wkt_parse.y" +#line 751 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-13].doublevalue), (yyvsp[-10].ptarrayvalue), (yyvsp[-6].ptarrayvalue), (yyvsp[-2].ptarrayvalue), (yyvsp[-15].stringvalue)); WKT_ERROR(); } -#line 2914 "lwin_wkt_parse.c" +#line 2924 "lwin_wkt_parse.c" break; case 149: /* nurbscurve: NURBSCURVE_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK LBRACKET_TOK ptarray RBRACKET_TOK COMMA_TOK LBRACKET_TOK weight_list RBRACKET_TOK RBRACKET_TOK */ -#line 744 "lwin_wkt_parse.y" +#line 754 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-9].doublevalue), (yyvsp[-6].ptarrayvalue), (yyvsp[-2].ptarrayvalue), NULL, NULL); WKT_ERROR(); } -#line 2920 "lwin_wkt_parse.c" +#line 2930 "lwin_wkt_parse.c" break; case 150: /* nurbscurve: NURBSCURVE_TOK DIMENSIONALITY_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK LBRACKET_TOK ptarray RBRACKET_TOK COMMA_TOK LBRACKET_TOK weight_list RBRACKET_TOK RBRACKET_TOK */ -#line 746 "lwin_wkt_parse.y" +#line 756 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-9].doublevalue), (yyvsp[-6].ptarrayvalue), (yyvsp[-2].ptarrayvalue), NULL, (yyvsp[-11].stringvalue)); WKT_ERROR(); } -#line 2926 "lwin_wkt_parse.c" +#line 2936 "lwin_wkt_parse.c" break; case 151: /* nurbscurve: NURBSCURVE_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK LBRACKET_TOK ptarray RBRACKET_TOK RBRACKET_TOK */ -#line 749 "lwin_wkt_parse.y" +#line 759 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-5].doublevalue), (yyvsp[-2].ptarrayvalue), NULL, NULL, NULL); WKT_ERROR(); } -#line 2932 "lwin_wkt_parse.c" +#line 2942 "lwin_wkt_parse.c" break; case 152: /* nurbscurve: NURBSCURVE_TOK DIMENSIONALITY_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK LBRACKET_TOK ptarray RBRACKET_TOK RBRACKET_TOK */ -#line 751 "lwin_wkt_parse.y" +#line 761 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_new((yyvsp[-5].doublevalue), (yyvsp[-2].ptarrayvalue), NULL, NULL, (yyvsp[-7].stringvalue)); WKT_ERROR(); } -#line 2938 "lwin_wkt_parse.c" +#line 2948 "lwin_wkt_parse.c" break; case 153: /* nurbscurve: NURBSCURVE_TOK DIMENSIONALITY_TOK EMPTY_TOK */ -#line 755 "lwin_wkt_parse.y" +#line 765 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_empty((yyvsp[-1].stringvalue)); WKT_ERROR(); } -#line 2944 "lwin_wkt_parse.c" +#line 2954 "lwin_wkt_parse.c" break; case 154: /* nurbscurve: NURBSCURVE_TOK EMPTY_TOK */ -#line 757 "lwin_wkt_parse.y" +#line 767 "lwin_wkt_parse.y" { (yyval.geometryvalue) = wkt_parser_nurbscurve_empty(NULL); WKT_ERROR(); } -#line 2950 "lwin_wkt_parse.c" +#line 2960 "lwin_wkt_parse.c" break; case 155: /* iso_controlpoint: NURBSPOINT_TOK LBRACKET_TOK WEIGHTEDPOINT_TOK opt_dimensionality LBRACKET_TOK coordinate RBRACKET_TOK COMMA_TOK WEIGHT_TOK DOUBLE_TOK RBRACKET_TOK */ -#line 762 "lwin_wkt_parse.y" +#line 772 "lwin_wkt_parse.y" { (yyval.nurbscontrolpointsvalue) = wkt_parser_nurbs_controlpoints_new((yyvsp[-5].coordinatevalue), (yyvsp[-1].doublevalue), (yyvsp[-7].stringvalue)); WKT_ERROR(); } -#line 2956 "lwin_wkt_parse.c" +#line 2966 "lwin_wkt_parse.c" break; case 156: /* iso_controlpoint_list: iso_controlpoint_list COMMA_TOK iso_controlpoint */ -#line 767 "lwin_wkt_parse.y" +#line 777 "lwin_wkt_parse.y" { (yyval.nurbscontrolpointsvalue) = wkt_parser_nurbs_controlpoints_add((yyvsp[-2].nurbscontrolpointsvalue), (yyvsp[0].nurbscontrolpointsvalue)); WKT_ERROR(); } -#line 2962 "lwin_wkt_parse.c" +#line 2972 "lwin_wkt_parse.c" break; case 157: /* iso_controlpoint_list: iso_controlpoint */ -#line 769 "lwin_wkt_parse.y" +#line 779 "lwin_wkt_parse.y" { (yyval.nurbscontrolpointsvalue) = (yyvsp[0].nurbscontrolpointsvalue); } -#line 2968 "lwin_wkt_parse.c" +#line 2978 "lwin_wkt_parse.c" break; case 158: /* iso_knot_list: iso_knot_list COMMA_TOK KNOT_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK DOUBLE_TOK RBRACKET_TOK */ -#line 774 "lwin_wkt_parse.y" +#line 784 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_knot_list_add_repeated((yyvsp[-7].ptarrayvalue), (yyvsp[-3].doublevalue), (yyvsp[-1].doublevalue)); WKT_ERROR(); } -#line 2974 "lwin_wkt_parse.c" +#line 2984 "lwin_wkt_parse.c" break; case 159: /* iso_knot_list: KNOT_TOK LBRACKET_TOK DOUBLE_TOK COMMA_TOK DOUBLE_TOK RBRACKET_TOK */ -#line 776 "lwin_wkt_parse.y" +#line 786 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_knot_list_add_repeated(NULL, (yyvsp[-3].doublevalue), (yyvsp[-1].doublevalue)); WKT_ERROR(); } -#line 2980 "lwin_wkt_parse.c" +#line 2990 "lwin_wkt_parse.c" break; case 160: /* weight_list: weight_list COMMA_TOK DOUBLE_TOK */ -#line 781 "lwin_wkt_parse.y" +#line 791 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_ptarray_add_coord((yyvsp[-2].ptarrayvalue), wkt_parser_coord_2((yyvsp[0].doublevalue), 0)); WKT_ERROR(); } -#line 2989 "lwin_wkt_parse.c" +#line 2999 "lwin_wkt_parse.c" break; case 161: /* weight_list: DOUBLE_TOK */ -#line 786 "lwin_wkt_parse.y" +#line 796 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_ptarray_new(wkt_parser_coord_2((yyvsp[0].doublevalue), 0)); WKT_ERROR(); } -#line 2998 "lwin_wkt_parse.c" +#line 3008 "lwin_wkt_parse.c" break; case 162: /* knot_list: knot_list COMMA_TOK DOUBLE_TOK */ -#line 794 "lwin_wkt_parse.y" +#line 804 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_ptarray_add_coord((yyvsp[-2].ptarrayvalue), wkt_parser_coord_2((yyvsp[0].doublevalue), 0)); WKT_ERROR(); } -#line 3007 "lwin_wkt_parse.c" +#line 3017 "lwin_wkt_parse.c" break; case 163: /* knot_list: DOUBLE_TOK */ -#line 799 "lwin_wkt_parse.y" +#line 809 "lwin_wkt_parse.y" { (yyval.ptarrayvalue) = wkt_parser_ptarray_new(wkt_parser_coord_2((yyvsp[0].doublevalue), 0)); WKT_ERROR(); } -#line 3016 "lwin_wkt_parse.c" +#line 3026 "lwin_wkt_parse.c" break; -#line 3020 "lwin_wkt_parse.c" +#line 3030 "lwin_wkt_parse.c" default: break; } diff --git a/liblwgeom/lwin_wkt_parse.h b/liblwgeom/lwin_wkt_parse.h index 2724e0a1c..3108ea75d 100644 --- a/liblwgeom/lwin_wkt_parse.h +++ b/liblwgeom/lwin_wkt_parse.h @@ -45,7 +45,7 @@ extern int wkt_yydebug; #endif /* "%code requires" blocks. */ -#line 250 "lwin_wkt_parse.y" +#line 260 "lwin_wkt_parse.y" typedef struct WKT_NURBS_CONTROLPOINTS WKT_NURBS_CONTROLPOINTS; @@ -99,7 +99,7 @@ typedef struct WKT_NURBS_CONTROLPOINTS WKT_NURBS_CONTROLPOINTS; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 256 "lwin_wkt_parse.y" +#line 266 "lwin_wkt_parse.y" int integervalue; double doublevalue; diff --git a/liblwgeom/lwin_wkt_parse.y b/liblwgeom/lwin_wkt_parse.y index 8e7b1cbe4..15471ba9b 100644 --- a/liblwgeom/lwin_wkt_parse.y +++ b/liblwgeom/lwin_wkt_parse.y @@ -111,6 +111,8 @@ int lwgeom_parse_wkt(LWGEOM_PARSER_RESULT *parser_result, const char *wktstr, in #define WKT_ERROR() { if ( global_parser_result.errcode != 0 ) { YYERROR; } } +#define WKT_NURBS_MAX_KNOT_COUNT 10000 + struct WKT_NURBS_CONTROLPOINTS { POINTARRAY *points; @@ -226,6 +228,7 @@ wkt_parser_knot_list_add_repeated(POINTARRAY *knots, double value, double multip uint32_t repeat_count; if (!isfinite(value) || !isfinite(multiplicity) || multiplicity < 1.0 || + multiplicity > WKT_NURBS_MAX_KNOT_COUNT || fabs(multiplicity - round(multiplicity)) >= 1e-10) { if (knots) @@ -235,6 +238,13 @@ wkt_parser_knot_list_add_repeated(POINTARRAY *knots, double value, double multip } repeat_count = (uint32_t)round(multiplicity); + if (knots && knots->npoints > WKT_NURBS_MAX_KNOT_COUNT - repeat_count) + { + ptarray_free(knots); + SET_PARSER_ERROR(PARSER_ERROR_OTHER); + return NULL; + } + for (uint32_t i = 0; i < repeat_count; i++) { POINT knot = wkt_parser_coord_2(value, 0); diff --git a/regress/core/nurbs_wkt.sql b/regress/core/nurbs_wkt.sql index d12078848..b1d4902ce 100644 --- a/regress/core/nurbs_wkt.sql +++ b/regress/core/nurbs_wkt.sql @@ -57,3 +57,5 @@ SELECT 56, ST_AsEWKT(ST_GeomFromText('NURBSCURVE(DEGREE 2, CONTROLPOINTS (NURBSP SELECT 57, ST_AsText(ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10), (1, 1), (0, 0, 1, 1))')); SELECT 58, ST_AsText(ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (1, 2, 1), (0, 0, 0, 1, 1, 1))')); SELECT 59, ST_AsText(ST_GeomFromText('NURBSCURVE Z(3, (0 0 0, 3 10 3, 7 10 7, 10 0 10), (1, 1.5, 1.5, 1), (0, 0, 0, 0, 1, 1, 1, 1))')); +SELECT 60, ST_GeomFromText('NURBSCURVE(DEGREE 2, CONTROLPOINTS (NURBSPOINT(WEIGHTEDPOINT(0 0), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0), WEIGHT 1)), KNOTS (KNOT(0,10001)))'); +SELECT 61, ST_GeomFromText('NURBSCURVE(DEGREE 2, CONTROLPOINTS (NURBSPOINT(WEIGHTEDPOINT(0 0), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0), WEIGHT 1)), KNOTS (KNOT(0,6000), KNOT(1,6000)))'); diff --git a/regress/core/nurbs_wkt_expected b/regress/core/nurbs_wkt_expected index 3e1aa47ba..1b85d711b 100644 --- a/regress/core/nurbs_wkt_expected +++ b/regress/core/nurbs_wkt_expected @@ -57,3 +57,5 @@ 57|NURBSCURVE(DEGREE 1,CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1),NURBSPOINT(WEIGHTEDPOINT(10 10),WEIGHT 1)),KNOTS (KNOT(0,2),KNOT(1,2))) 58|NURBSCURVE(DEGREE 2,CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1),NURBSPOINT(WEIGHTEDPOINT(5 10),WEIGHT 2),NURBSPOINT(WEIGHTEDPOINT(10 0),WEIGHT 1)),KNOTS (KNOT(0,3),KNOT(1,3))) 59|NURBSCURVE Z (DEGREE 3,CONTROLPOINTS Z (NURBSPOINT(WEIGHTEDPOINT Z (0 0 0),WEIGHT 1),NURBSPOINT(WEIGHTEDPOINT Z (3 10 3),WEIGHT 1.5),NURBSPOINT(WEIGHTEDPOINT Z (7 10 7),WEIGHT 1.5),NURBSPOINT(WEIGHTEDPOINT Z (10 0 10),WEIGHT 1)),KNOTS (KNOT(0,4),KNOT(1,4))) +ERROR: parse error - invalid geometry +ERROR: parse error - invalid geometry commit a09a9f3a75eea082f7d2484965bc4faea312724a Author: Darafei Praliaskouski Date: Tue Jul 7 12:12:43 2026 +0400 topology: return large edge ids from proximity helper Closes https://github.com/postgis/postgis/pull/1139 diff --git a/NEWS b/NEWS index 088a507c1..22f579b9e 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - GH-1153, [topology] Preserve large ids from edge wrappers (Darafei Praliaskouski) + - GH-1139, [topology] Preserve large edge ids from vertex-segment + proximity helper (Darafei Praliaskouski) PostGIS 3.7.0dev diff --git a/topology/sql/query/FindVertexSegmentPairsBelowDistance.sql.in b/topology/sql/query/FindVertexSegmentPairsBelowDistance.sql.in index 8d5096235..4383b484c 100644 --- a/topology/sql/query/FindVertexSegmentPairsBelowDistance.sql.in +++ b/topology/sql/query/FindVertexSegmentPairsBelowDistance.sql.in @@ -9,16 +9,16 @@ -- WHERE edge_id = v.vert_edge; -- CREATE OR REPLACE FUNCTION topology.findVertexSegmentPairsBelowDistance(toponame varchar, tolerance float8) -RETURNS TABLE (seg_edge int, segno int, vert_edge int, vertno int, vert_geom geometry) +RETURNS TABLE (seg_edge bigint, segno int, vert_edge bigint, vertno int, vert_geom geometry) AS $BODY$ DECLARE sql text; BEGIN sql := format($$ SELECT - e1.edge_id seg_edge, + e1.edge_id::bigint seg_edge, s.path[1] segno, - e2.edge_id vert_edge, + e2.edge_id::bigint vert_edge, p.path[1] vertno, p.geom vert_geom FROM diff --git a/topology/topology_before_upgrade.sql.in b/topology/topology_before_upgrade.sql.in index 6c66266ac..4265264ac 100644 --- a/topology/topology_before_upgrade.sql.in +++ b/topology/topology_before_upgrade.sql.in @@ -46,3 +46,18 @@ SELECT _postgis_topology_upgrade_domain_type('topoelement','integer[]','bigint[] SELECT _postgis_topology_upgrade_domain_type('topoelementarray','integer[][]','bigint[][]','3.6.0'); SELECT _postgis_add_column_to_table('topology.topology', 'useslargeids', 'BOOLEAN', true, 'false','3.6.0'); +-- 3.7.0 +-- Return edge identifiers as bigint instead of integer +DO $postgis_upgrade$ +DECLARE + old_result text; +BEGIN + old_result := pg_get_function_result('topology.findVertexSegmentPairsBelowDistance(varchar, float8)'::regprocedure); + IF old_result LIKE '%seg_edge integer%' AND old_result LIKE '%vert_edge integer%' THEN + PERFORM _postgis_drop_function_by_signature('topology.findVertexSegmentPairsBelowDistance(varchar, float8)', '3.7.0'); + END IF; +EXCEPTION + WHEN undefined_function THEN + NULL; +END +$postgis_upgrade$; ----------------------------------------------------------------------- Summary of changes: NEWS | 12 + liblwgeom/lwin_wkt_parse.c | 868 +++++++++++---------- liblwgeom/lwin_wkt_parse.h | 4 +- liblwgeom/lwin_wkt_parse.y | 10 + liblwgeom/lwstroke.c | 12 +- liblwgeom/topo/lwgeom_topo.c | 33 +- regress/core/nurbs_wkt.sql | 2 + regress/core/nurbs_wkt_expected | 2 + topology/postgis_topology.c | 16 +- topology/sql/manage/TotalTopologySize.sql.in | 13 +- .../FindVertexSegmentPairsBelowDistance.sql.in | 6 +- topology/sql/topogeometry/totopogeom.sql.in | 4 +- topology/topology_before_upgrade.sql.in | 15 + 13 files changed, 526 insertions(+), 471 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Tue Jul 7 04:12:46 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:12:46 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-32-ga5411841b Message-ID: <20260707111246.E6D08195042@trac.osgeo.org> 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 a5411841bd4b063d4c7ca6e371e14eaae61af85a (commit) from fabbc2cc36bd515fc8299597c2ad2af74deffff0 (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 a5411841bd4b063d4c7ca6e371e14eaae61af85a Author: Darafei Praliaskouski Date: Tue Jul 7 15:07:59 2026 +0400 upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.7 Closes https://github.com/postgis/postgis/pull/1158 diff --git a/NEWS b/NEWS index 15ac2f4d8..e3e6a72a6 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed * Bug Fixes * + - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks + with standard_conforming_strings off (Darafei Praliaskouski) - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate ring-orientation precision regressions (Darafei Praliaskouski) - GH-1143, [topology] Clean up TopoRingIsCCW early returns diff --git a/utils/create_upgrade.pl b/utils/create_upgrade.pl index b10ecc61e..22d24a52d 100644 --- a/utils/create_upgrade.pl +++ b/utils/create_upgrade.pl @@ -1028,11 +1028,11 @@ BEGIN ) SELECT upgraded as scripts_upgraded, installed as scripts_installed, - pg_catalog.substring(upgraded, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(upgraded, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(upgraded, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(upgraded, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_to_num, - pg_catalog.substring(installed, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(installed, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(installed, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(installed, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_from_num, installed ~ 'dev|alpha|beta' as version_from_isdev ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ utils/create_upgrade.pl | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 04:12:54 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 11:12:54 -0000 Subject: [PostGIS] #6094: downgrade error on berrie64 when standard conforming strings off In-Reply-To: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> References: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> Message-ID: <061.9ff9c87d502c85e53f11b76737f36394@osgeo.org> #6094: downgrade error on berrie64 when standard conforming strings off ----------------------+--------------------------- Reporter: robe | Owner: strk Type: defect | Status: closed Priority: blocker | Milestone: PostGIS 3.6.5 Component: upgrade | Version: 3.6.x Resolution: fixed | Keywords: ----------------------+--------------------------- Changes (by Darafei Praliaskouski ): * resolution: => fixed * status: new => closed Comment: In [changeset:"a5411841bd4b063d4c7ca6e371e14eaae61af85a/git" a541184/git]: {{{#!CommitTicketReference repository="git" revision="a5411841bd4b063d4c7ca6e371e14eaae61af85a" upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.7 Closes https://github.com/postgis/postgis/pull/1158 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 04:12:55 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:12:55 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.2 updated. 3.2.10-62-g2294770eb Message-ID: <20260707111255.4E81E1957CB@trac.osgeo.org> 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, stable-3.2 has been updated via 2294770eb30ed519d5030f085a19826d034e9dd1 (commit) from 15dea64b4c6e3f2de45fe59c856625d4ce4771a2 (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 2294770eb30ed519d5030f085a19826d034e9dd1 Author: Darafei Praliaskouski Date: Tue Jul 7 15:09:07 2026 +0400 upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by postgis_proc_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.2 Closes https://github.com/postgis/postgis/pull/1158 diff --git a/NEWS b/NEWS index 8c9af9a35..833e39991 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PostGIS 3.2.11 * Bug Fixes * + - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks + with standard_conforming_strings off (Darafei Praliaskouski) - #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) - Flatgeobuf schema mismatch vulnerability (NeuroWinter) - #5989, CurvePolygon distance corner case (Paul Ramsey) diff --git a/utils/postgis_proc_upgrade.pl b/utils/postgis_proc_upgrade.pl index a75a06587..b26125cd7 100755 --- a/utils/postgis_proc_upgrade.pl +++ b/utils/postgis_proc_upgrade.pl @@ -728,7 +728,7 @@ BEGIN new_ver_int := pg_catalog.string_to_array( pg_catalog.regexp_replace( new_scripts, - '[^\d.].*', + E'[^\\d.].*', '' ), '.' @@ -741,7 +741,7 @@ BEGIN old_ver_int := pg_catalog.string_to_array( pg_catalog.regexp_replace( old_scripts, - '[^\d.].*', + E'[^\\d.].*', '' ), '.' @@ -777,11 +777,11 @@ BEGIN ) SELECT upgraded as scripts_upgraded, installed as scripts_installed, - pg_catalog.substring(upgraded, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(upgraded, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(upgraded, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(upgraded, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_to_num, - pg_catalog.substring(installed, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(installed, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(installed, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(installed, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_from_num, installed ~ 'dev|alpha|beta' as version_from_isdev @@ -816,4 +816,3 @@ BEGIN END $$ LANGUAGE 'plpgsql'; - ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ utils/postgis_proc_upgrade.pl | 13 ++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 04:12:58 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 11:12:58 -0000 Subject: [PostGIS] #6094: downgrade error on berrie64 when standard conforming strings off In-Reply-To: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> References: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> Message-ID: <061.b2629c0c3b955cb38748e0216d77ca8b@osgeo.org> #6094: downgrade error on berrie64 when standard conforming strings off ----------------------+--------------------------- Reporter: robe | Owner: strk Type: defect | Status: closed Priority: blocker | Milestone: PostGIS 3.6.5 Component: upgrade | Version: 3.6.x Resolution: fixed | Keywords: ----------------------+--------------------------- Comment (by Darafei Praliaskouski ): In [changeset:"2294770eb30ed519d5030f085a19826d034e9dd1/git" 2294770/git]: {{{#!CommitTicketReference repository="git" revision="2294770eb30ed519d5030f085a19826d034e9dd1" upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by postgis_proc_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.2 Closes https://github.com/postgis/postgis/pull/1158 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 04:12:59 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:12:59 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.3 updated. 3.3.10-65-g4fd8c0d8b Message-ID: <20260707111300.5A32E19564C@trac.osgeo.org> 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, stable-3.3 has been updated via 4fd8c0d8bb0809d8fb7606374be0333ea36b81b3 (commit) from be89ff7b319e4cc797420c01e4a5e0bf42af4b34 (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 4fd8c0d8bb0809d8fb7606374be0333ea36b81b3 Author: Darafei Praliaskouski Date: Tue Jul 7 15:08:00 2026 +0400 upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.3 Closes https://github.com/postgis/postgis/pull/1158 diff --git a/NEWS b/NEWS index db43d02e9..435449872 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PostGIS 3.3.11 * Bug Fixes and Enhancements * + - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks + with standard_conforming_strings off (Darafei Praliaskouski) - Flatgeobuf schema mismatch vulnerability (NeuroWinter) - #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) - #5916, ST_Split hang with very large ordinates (Paul Ramsey) diff --git a/utils/create_upgrade.pl b/utils/create_upgrade.pl index f6c702484..f7c17b302 100755 --- a/utils/create_upgrade.pl +++ b/utils/create_upgrade.pl @@ -819,11 +819,11 @@ BEGIN ) SELECT upgraded as scripts_upgraded, installed as scripts_installed, - pg_catalog.substring(upgraded, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(upgraded, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(upgraded, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(upgraded, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_to_num, - pg_catalog.substring(installed, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(installed, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(installed, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(installed, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_from_num, installed ~ 'dev|alpha|beta' as version_from_isdev ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ utils/create_upgrade.pl | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 04:13:02 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 11:13:02 -0000 Subject: [PostGIS] #6094: downgrade error on berrie64 when standard conforming strings off In-Reply-To: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> References: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> Message-ID: <061.acdf90f3642ff0f85a59d5ba2bbbdd9a@osgeo.org> #6094: downgrade error on berrie64 when standard conforming strings off ----------------------+--------------------------- Reporter: robe | Owner: strk Type: defect | Status: closed Priority: blocker | Milestone: PostGIS 3.6.5 Component: upgrade | Version: 3.6.x Resolution: fixed | Keywords: ----------------------+--------------------------- Comment (by Darafei Praliaskouski ): In [changeset:"4fd8c0d8bb0809d8fb7606374be0333ea36b81b3/git" 4fd8c0d/git]: {{{#!CommitTicketReference repository="git" revision="4fd8c0d8bb0809d8fb7606374be0333ea36b81b3" upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.3 Closes https://github.com/postgis/postgis/pull/1158 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 04:13:02 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:13:02 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.4 updated. 3.4.6-70-gd1196f604 Message-ID: <20260707111302.9F9DB1913EB@trac.osgeo.org> 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, stable-3.4 has been updated via d1196f6043de1e608864739e915cc876a44b1ee5 (commit) from fc7bbf254d3ab41ee18f5655b0736326b4afabb7 (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 d1196f6043de1e608864739e915cc876a44b1ee5 Author: Darafei Praliaskouski Date: Tue Jul 7 15:08:00 2026 +0400 upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.4 Closes https://github.com/postgis/postgis/pull/1158 diff --git a/NEWS b/NEWS index 1f7a18ff1..b62241c5d 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PostGIS 3.4.7 * Bug Fixes * + - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks + with standard_conforming_strings off (Darafei Praliaskouski) - #6042, Skip downgrade checks when source extension libraries cannot be loaded in the current dependency environment (Darafei Praliaskouski) diff --git a/utils/create_upgrade.pl b/utils/create_upgrade.pl index a34183ee9..2a4b41bcf 100755 --- a/utils/create_upgrade.pl +++ b/utils/create_upgrade.pl @@ -752,11 +752,11 @@ BEGIN ) SELECT upgraded as scripts_upgraded, installed as scripts_installed, - pg_catalog.substring(upgraded, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(upgraded, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(upgraded, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(upgraded, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_to_num, - pg_catalog.substring(installed, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(installed, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(installed, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(installed, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_from_num, installed ~ 'dev|alpha|beta' as version_from_isdev ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ utils/create_upgrade.pl | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 04:13:04 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 11:13:04 -0000 Subject: [PostGIS] #6094: downgrade error on berrie64 when standard conforming strings off In-Reply-To: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> References: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> Message-ID: <061.0871689221f487b49040cf21ed92eed5@osgeo.org> #6094: downgrade error on berrie64 when standard conforming strings off ----------------------+--------------------------- Reporter: robe | Owner: strk Type: defect | Status: closed Priority: blocker | Milestone: PostGIS 3.6.5 Component: upgrade | Version: 3.6.x Resolution: fixed | Keywords: ----------------------+--------------------------- Comment (by Darafei Praliaskouski ): In [changeset:"d1196f6043de1e608864739e915cc876a44b1ee5/git" d1196f6/git]: {{{#!CommitTicketReference repository="git" revision="d1196f6043de1e608864739e915cc876a44b1ee5" upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.4 Closes https://github.com/postgis/postgis/pull/1158 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 04:13:04 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:13:04 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.5 updated. 3.5.7-58-gddb120471 Message-ID: <20260707111305.0CAA6195B85@trac.osgeo.org> 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, stable-3.5 has been updated via ddb120471d35f068710a411a6c651f03c5983ea9 (commit) from 3566cd10d386f1e3364f48314fa0b6cf83168afd (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 ddb120471d35f068710a411a6c651f03c5983ea9 Author: Darafei Praliaskouski Date: Tue Jul 7 15:08:00 2026 +0400 upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.5 Closes https://github.com/postgis/postgis/pull/1158 diff --git a/NEWS b/NEWS index 49f3f2625..a8b584eb5 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PostGIS 3.5.8 * Bug Fixes * + - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks + with standard_conforming_strings off (Darafei Praliaskouski) - GH-897, [topology] Harden topology helper functions and maintenance SQL against identifier, tolerance, bigint, and cleanup regressions (Darafei Praliaskouski) diff --git a/utils/create_upgrade.pl b/utils/create_upgrade.pl index a34183ee9..2a4b41bcf 100755 --- a/utils/create_upgrade.pl +++ b/utils/create_upgrade.pl @@ -752,11 +752,11 @@ BEGIN ) SELECT upgraded as scripts_upgraded, installed as scripts_installed, - pg_catalog.substring(upgraded, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(upgraded, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(upgraded, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(upgraded, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_to_num, - pg_catalog.substring(installed, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(installed, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(installed, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(installed, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_from_num, installed ~ 'dev|alpha|beta' as version_from_isdev ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ utils/create_upgrade.pl | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 04:13:06 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 11:13:06 -0000 Subject: [PostGIS] #6094: downgrade error on berrie64 when standard conforming strings off In-Reply-To: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> References: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> Message-ID: <061.00930f87e5ada06e910ff67e031d4ea4@osgeo.org> #6094: downgrade error on berrie64 when standard conforming strings off ----------------------+--------------------------- Reporter: robe | Owner: strk Type: defect | Status: closed Priority: blocker | Milestone: PostGIS 3.6.5 Component: upgrade | Version: 3.6.x Resolution: fixed | Keywords: ----------------------+--------------------------- Comment (by Darafei Praliaskouski ): In [changeset:"ddb120471d35f068710a411a6c651f03c5983ea9/git" ddb12047/git]: {{{#!CommitTicketReference repository="git" revision="ddb120471d35f068710a411a6c651f03c5983ea9" upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.5 Closes https://github.com/postgis/postgis/pull/1158 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 04:13:06 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:13:06 -0700 (PDT) Subject: [SCM] PostGIS branch stable-3.6 updated. 3.6.4-62-g8f0265779 Message-ID: <20260707111307.239C8195426@trac.osgeo.org> 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, stable-3.6 has been updated via 8f0265779255ca22f440e383973ce8b6618ef55c (commit) from ae1c72fa7c510767dff7be53ce0653170b7876a1 (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 8f0265779255ca22f440e383973ce8b6618ef55c Author: Darafei Praliaskouski Date: Tue Jul 7 15:07:59 2026 +0400 upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.6 Closes https://github.com/postgis/postgis/pull/1158 diff --git a/NEWS b/NEWS index 0dbd1265e..cecfe2fad 100644 --- a/NEWS +++ b/NEWS @@ -34,6 +34,8 @@ PostGIS 3.6.5 cancellation state (Darafei Praliaskouski) - #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid size exceeds their extent (Darafei Praliaskouski) +- #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks + with standard_conforming_strings off (Darafei Praliaskouski) PostGIS 3.6.4 diff --git a/utils/create_upgrade.pl b/utils/create_upgrade.pl index 38826cfe6..2f55394ed 100644 --- a/utils/create_upgrade.pl +++ b/utils/create_upgrade.pl @@ -1022,11 +1022,11 @@ BEGIN ) SELECT upgraded as scripts_upgraded, installed as scripts_installed, - pg_catalog.substring(upgraded, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(upgraded, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(upgraded, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(upgraded, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_to_num, - pg_catalog.substring(installed, '([0-9]+)\.')::int * 100 + - pg_catalog.substring(installed, '[0-9]+\.([0-9]+)(\.|$)')::int + pg_catalog.substring(installed, E'([0-9]+)\\.')::int * 100 + + pg_catalog.substring(installed, E'[0-9]+\\.([0-9]+)(\\.|$)')::int as version_from_num, installed ~ 'dev|alpha|beta' as version_from_isdev @@ -1062,4 +1062,3 @@ END $$ LANGUAGE 'plpgsql'; - ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ utils/create_upgrade.pl | 9 ++++----- 2 files changed, 6 insertions(+), 5 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 04:13:09 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 11:13:09 -0000 Subject: [PostGIS] #6094: downgrade error on berrie64 when standard conforming strings off In-Reply-To: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> References: <046.7cf646cf6ba5855f6a82943b27f0a4e4@osgeo.org> Message-ID: <061.c77ae348fad0d0bc22d2b15e59875a0a@osgeo.org> #6094: downgrade error on berrie64 when standard conforming strings off ----------------------+--------------------------- Reporter: robe | Owner: strk Type: defect | Status: closed Priority: blocker | Milestone: PostGIS 3.6.5 Component: upgrade | Version: 3.6.x Resolution: fixed | Keywords: ----------------------+--------------------------- Comment (by Darafei Praliaskouski ): In [changeset:"8f0265779255ca22f440e383973ce8b6618ef55c/git" 8f026577/git]: {{{#!CommitTicketReference repository="git" revision="8f0265779255ca22f440e383973ce8b6618ef55c" upgrade: escape version regex literals Use explicit escape string syntax for the version parsing regular expressions emitted by create_upgrade.pl. This keeps downgrade checks quiet and parser-stable when standard_conforming_strings is off. Closes #6094 for PostGIS 3.6 Closes https://github.com/postgis/postgis/pull/1158 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 04:26:43 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:26:43 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-33-gb9cf4e302 Message-ID: <20260707112643.E871C195C10@trac.osgeo.org> 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 b9cf4e3021a3eb9d17d91d02f17b33d930e35bd8 (commit) from a5411841bd4b063d4c7ca6e371e14eaae61af85a (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 b9cf4e3021a3eb9d17d91d02f17b33d930e35bd8 Author: Darafei Praliaskouski Date: Tue Jul 7 15:18:08 2026 +0400 Avoid ppc64el vector macro in NURBS SQL comments The ppc64el toolchain can define vector for AltiVec, which makes the SQL preprocessor try to expand bare comment text while building postgis.sql. Reword the NURBS SQL comments so the preprocessor no longer sees that token. Closes #6093 Closes https://github.com/postgis/postgis/pull/1159 diff --git a/NEWS b/NEWS index e3e6a72a6..854ae49f7 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed * Bug Fixes * + - #6093, Fix SQL generation on ppc64el when NURBS comments are + preprocessed with AltiVec vector macros (Darafei Praliaskouski) - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks with standard_conforming_strings off (Darafei Praliaskouski) - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate diff --git a/postgis/postgis_nurbs.sql.in b/postgis/postgis_nurbs.sql.in index 5ff109521..038417dad 100644 --- a/postgis/postgis_nurbs.sql.in +++ b/postgis/postgis_nurbs.sql.in @@ -4,9 +4,9 @@ -- degree: Polynomial degree (1-10), higher = smoother -- control_points: LINESTRING geometry defining curve shape -- weights: Optional array of positive weights, one per control point (NULL for uniform weights) --- knots: Optional knot vector defining parameter space (NULL for uniform clamped spacing) +-- knots: Optional knot sequence defining parameter space (NULL for uniform clamped spacing) -- Returns: NURBS curve geometry --- Note: Knot vector must have (npoints + degree + 1) elements and be non-decreasing +-- Note: Knot sequence must have (npoints + degree + 1) elements and be non-decreasing -- Examples: -- SELECT ST_MakeNurbsCurve(2, 'LINESTRING(0 0, 5 10, 10 0)'::geometry); -- SELECT ST_MakeNurbsCurve(2, 'LINESTRING(0 0, 5 10, 10 0)'::geometry, ARRAY[1.0, 2.0, 1.0]); @@ -58,7 +58,7 @@ CREATE OR REPLACE FUNCTION ST_Weights(nurbscurve geometry) COST 25; -- ST_Knots(nurbscurve) --- Extracts the knot vector defining parameter space +-- Extracts the knot sequence defining parameter space -- Parameters: -- nurbscurve: Input NURBS curve geometry -- Returns: Array of knot values, NULL for uniform parameterization ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ postgis/postgis_nurbs.sql.in | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 04:26:45 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 11:26:45 -0000 Subject: [PostGIS] #6093: Fails to build on ppc64el (error: detected recursion whilst expanding macro =?utf-8?b?4oCYdmVjdG9y4oCZKQ==?= In-Reply-To: <050.0cf0ce9cdffc66ce4e3bd572c5ee4542@osgeo.org> References: <050.0cf0ce9cdffc66ce4e3bd572c5ee4542@osgeo.org> Message-ID: <065.38f68e3eec07ec06b442edd9c164de3e@osgeo.org> #6093: Fails to build on ppc64el (error: detected recursion whilst expanding macro ?vector?) -----------------------------+--------------------------- Reporter: Bas Couwenberg | Owner: strk Type: defect | Status: closed Priority: medium | Milestone: PostGIS 3.7.0 Component: build | Version: master Resolution: fixed | Keywords: -----------------------------+--------------------------- Changes (by Darafei Praliaskouski ): * resolution: => fixed * status: new => closed Comment: In [changeset:"b9cf4e3021a3eb9d17d91d02f17b33d930e35bd8/git" b9cf4e3/git]: {{{#!CommitTicketReference repository="git" revision="b9cf4e3021a3eb9d17d91d02f17b33d930e35bd8" Avoid ppc64el vector macro in NURBS SQL comments The ppc64el toolchain can define vector for AltiVec, which makes the SQL preprocessor try to expand bare comment text while building postgis.sql. Reword the NURBS SQL comments so the preprocessor no longer sees that token. Closes #6093 Closes https://github.com/postgis/postgis/pull/1159 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 04:50:30 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 04:50:30 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-35-g095edb77f Message-ID: <20260707115031.4CE38195D53@trac.osgeo.org> 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 095edb77fdd46d84ae0fb98405d02c8ba9e41b48 (commit) via 885bb877e2d1016eb6e8127599e4efeca337c221 (commit) from b9cf4e3021a3eb9d17d91d02f17b33d930e35bd8 (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 095edb77fdd46d84ae0fb98405d02c8ba9e41b48 Author: Darafei Praliaskouski Date: Tue Jul 7 13:11:45 2026 +0400 topology: restore local endpoint tolerance for addline Keep GH-1151's public tolerance semantics: an explicit zero tolerance still disables line-body snapping and decimation, while -1 requests automatic topology precision tolerance. When _lwt_AddLine splits a line into noded components, component endpoints can be GEOS-derived intersection points that are microscopically displaced from existing primitives. Add those endpoint nodes with a local machine-scale tolerance derived from each adjacent component segment, then pass the original caller tolerance to the final edge insertion path. This fixes the master regression where direct TopoGeo_AddLineString(..., 0) and toTopoGeom robust add-line cases failed with edge-crosses-node errors after GH-1151. Closes https://github.com/postgis/postgis/pull/1157 References https://github.com/postgis/postgis/pull/1151 diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c index 815711980..b119d5dae 100644 --- a/liblwgeom/topo/lwgeom_topo.c +++ b/liblwgeom/topo/lwgeom_topo.c @@ -6724,7 +6724,8 @@ _lwt_SplitAllEdgesToNewNode(LWT_TOPOLOGY* topo, LWT_ISO_EDGE *edges, uint64_t nu /* TODO: use square distance */ dist = lwgeom_mindistance2d(lwline_as_lwgeom(edges[i].geom), lwpoint_as_lwgeom(point)); LWDEBUGF(1, "Edge %" LWTFMT_ELEMID " distance: %.15g", e->edge_id, dist); - if ( dist >= tol ) continue; + if (dist && dist >= tol) + continue; sorted[j].edge = e; sorted[j++].score = dist; } @@ -6935,6 +6936,8 @@ _lwt_SplitAllEdgesToNewNode(LWT_TOPOLOGY* topo, LWT_ISO_EDGE *edges, uint64_t nu } /* + * @param nodeTol node snapping tolerance, or -1 for automatic computation + * @param edgeTol edge splitting tolerance, or -1 for automatic computation * @param findFace if non-zero the code will determine which face * contains the given point (unless it is known to be NOT * isolated) @@ -6944,8 +6947,13 @@ _lwt_SplitAllEdgesToNewNode(LWT_TOPOLOGY* topo, LWT_ISO_EDGE *edges, uint64_t nu * split by this point. */ static LWT_ELEMID -_lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol, int - findFace, int *moved, int *numSplitEdges) +_lwt_AddPoint(LWT_TOPOLOGY *topo, + LWPOINT *point, + double nodeTol, + double edgeTol, + int findFace, + int *moved, + int *numSplitEdges) { uint64_t num, i; double mindist = FLT_MAX; @@ -6956,9 +6964,11 @@ _lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol, int int flds; LWT_ELEMID id = 0; - /* Get tolerance, if 0 was given */ - if ( tol == -1 ) - tol = _LWT_MINTOLERANCE(topo, pt); + /* Get tolerance, if -1 was given */ + if (nodeTol == -1) + nodeTol = _LWT_MINTOLERANCE(topo, pt); + if (edgeTol == -1) + edgeTol = _LWT_MINTOLERANCE(topo, pt); LWDEBUGG(1, pt, "Adding point"); @@ -6968,7 +6978,7 @@ _lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol, int TODO: use WithinBox2D */ flds = LWT_COL_NODE_NODE_ID | LWT_COL_NODE_GEOM; - nodes = lwt_be_getNodeWithinDistance2D(topo, point, tol, &num, flds, 0); + nodes = lwt_be_getNodeWithinDistance2D(topo, point, nodeTol, &num, flds, 0); if (num == UINT64_MAX) { PGTOPO_BE_ERROR(); @@ -6979,28 +6989,32 @@ _lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol, int if ( num ) { - LWDEBUGF(1, "New point is within %.15g units of %" PRIu64 " nodes", tol, num); - /* Order by distance if there are more than a single return */ - if ( num > 1 ) - {{ - sorted = lwalloc(sizeof(scored_node) * num); - for (i = 0; i < num; ++i) - { - sorted[i].node = nodes + i; - sorted[i].score = lwgeom_mindistance2d(lwpoint_as_lwgeom(nodes[i].geom), pt); - LWDEBUGF( - 1, "Node %" LWTFMT_ELEMID " distance: %.15g", sorted[i].node->node_id, sorted[i].score); - } - qsort(sorted, num, sizeof(scored_node), compare_scored_node); - nodes2 = lwalloc(sizeof(LWT_ISO_NODE) * num); - for (i = 0; i < num; ++i) - { - nodes2[i] = *sorted[i].node; - } - lwfree(sorted); - lwfree(nodes); - nodes = nodes2; - }} + LWDEBUGF(1, "New point is within %.15g units of %" PRIu64 " nodes", nodeTol, num); + /* Order by distance if there are more than a single return */ + if (num > 1) + { + { + sorted = lwalloc(sizeof(scored_node) * num); + for (i = 0; i < num; ++i) + { + sorted[i].node = nodes + i; + sorted[i].score = lwgeom_mindistance2d(lwpoint_as_lwgeom(nodes[i].geom), pt); + LWDEBUGF(1, + "Node %" LWTFMT_ELEMID " distance: %.15g", + sorted[i].node->node_id, + sorted[i].score); + } + qsort(sorted, num, sizeof(scored_node), compare_scored_node); + nodes2 = lwalloc(sizeof(LWT_ISO_NODE) * num); + for (i = 0; i < num; ++i) + { + nodes2[i] = *sorted[i].node; + } + lwfree(sorted); + lwfree(nodes); + nodes = nodes2; + } + } for ( i=0; i= tol ) continue; + if (dist && dist >= nodeTol) + continue; if ( ! id || dist < mindist ) { id = n->node_id; @@ -7033,18 +7048,19 @@ _lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol, int TODO: use WithinBox2D */ flds = LWT_COL_EDGE_ALL; /* EDGE_ID|LWT_COL_EDGE_GEOM;*/ - edges = lwt_be_getEdgeWithinDistance2D(topo, point, tol, &num, flds, 0); + edges = lwt_be_getEdgeWithinDistance2D(topo, point, edgeTol, &num, flds, 0); if (num == UINT64_MAX) { PGTOPO_BE_ERROR(); return -1; } - LWDEBUGF(1, "New point is within %.15g units of %" PRIu64 " edges", tol, num); + LWDEBUGF(1, "New point is within %.15g units of %" PRIu64 " edges", edgeTol, num); if ( num ) { - id = _lwt_SplitAllEdgesToNewNode(topo, edges, num, lwgeom_as_lwpoint(pt), tol, moved); - _lwt_release_edges(edges, num); - if ( numSplitEdges ) *numSplitEdges = num; + id = _lwt_SplitAllEdgesToNewNode(topo, edges, num, lwgeom_as_lwpoint(pt), edgeTol, moved); + _lwt_release_edges(edges, num); + if (numSplitEdges) + *numSplitEdges = num; } if ( id == 0 ) @@ -7068,7 +7084,23 @@ _lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol, int LWT_ELEMID lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol) { - return _lwt_AddPoint(topo, point, tol, 1, NULL, NULL); + return _lwt_AddPoint(topo, point, tol, tol, 1, NULL, NULL); +} + +static double +_lwt_AddLineEndpointRepairTol(LWPOINT *point, int exactNodeSnap) +{ + double tol = _lwt_minTolerance(lwpoint_as_lwgeom(point)); + + /* + * Explicit-zero caller endpoints must not use coordinate-scale repair + * tolerance. Keep only the library-wide floating point tolerance so old + * robust cases with machine-scale drift can still split intended edges. + */ + if (exactNodeSnap && tol > FP_TOLERANCE) + return FP_TOLERANCE; + + return tol; } /* @@ -7090,11 +7122,21 @@ lwt_AddPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol) * the number of new edges resulting from this * incoming new edge, taking into account edges * created due to splitting of existing edges. + * @param startExactNodeSnap if non-zero, insert the start endpoint with + * exact node tolerance. + * @param endExactNodeSnap if non-zero, insert the end endpoint with + * exact node tolerance. * */ static LWT_ELEMID -_lwt_AddLineEdge( LWT_TOPOLOGY* topo, LWLINE* edge, double tol, - int handleFaceSplit, int *forward, int *numNewEdges ) +_lwt_AddLineEdge(LWT_TOPOLOGY *topo, + LWLINE *edge, + double tol, + int startExactNodeSnap, + int endExactNodeSnap, + int handleFaceSplit, + int *forward, + int *numNewEdges) { LWCOLLECTION *col; LWPOINT *start_point, *end_point; @@ -7106,7 +7148,8 @@ _lwt_AddLineEdge( LWT_TOPOLOGY* topo, LWLINE* edge, double tol, uint64_t nn, i; int moved=0, mm; int pointSplitEdges = -666; - double endpoint_tol; + double endpoint_node_tol; + double endpoint_edge_tol; if ( numNewEdges ) *numNewEdges = 0; @@ -7119,8 +7162,19 @@ _lwt_AddLineEdge( LWT_TOPOLOGY* topo, LWLINE* edge, double tol, lwnotice("Empty component of noded line"); return 0; /* must be empty */ } - endpoint_tol = tol == 0.0 ? 0.0 : _lwt_minTolerance(lwpoint_as_lwgeom(start_point)); - nid[0] = _lwt_AddPoint(topo, start_point, endpoint_tol, handleFaceSplit, &mm, &pointSplitEdges); + /* + * Endpoint insertion repairs already-noded components. Original input + * endpoints keep exact node tolerance when the caller requested zero + * line-body tolerance. They still get a bounded edge-repair tolerance so + * machine-scale drift can split an intended existing edge without projecting + * the endpoint to a coordinate-scale nearby edge. Noding-derived endpoints + * use local tolerance for both so GEOS intersection coordinates can rejoin + * existing topology nodes. + */ + endpoint_edge_tol = _lwt_AddLineEndpointRepairTol(start_point, startExactNodeSnap); + endpoint_node_tol = startExactNodeSnap ? 0.0 : endpoint_edge_tol; + nid[0] = + _lwt_AddPoint(topo, start_point, endpoint_node_tol, endpoint_edge_tol, handleFaceSplit, &mm, &pointSplitEdges); lwpoint_free(start_point); /* too late if lwt_AddPoint calls lwerror */ if ( nid[0] == -1 ) return -1; /* lwerror should have been called */ if ( numNewEdges ) *numNewEdges += pointSplitEdges; @@ -7135,8 +7189,9 @@ _lwt_AddLineEdge( LWT_TOPOLOGY* topo, LWLINE* edge, double tol, "after successfully getting first point !?"); return -1; } - endpoint_tol = tol == 0.0 ? 0.0 : _lwt_minTolerance(lwpoint_as_lwgeom(end_point)); - nid[1] = _lwt_AddPoint(topo, end_point, endpoint_tol, handleFaceSplit, &mm, &pointSplitEdges); + endpoint_edge_tol = _lwt_AddLineEndpointRepairTol(end_point, endExactNodeSnap); + endpoint_node_tol = endExactNodeSnap ? 0.0 : endpoint_edge_tol; + nid[1] = _lwt_AddPoint(topo, end_point, endpoint_node_tol, endpoint_edge_tol, handleFaceSplit, &mm, &pointSplitEdges); lwpoint_free(end_point); /* too late if lwt_AddPoint calls lwerror */ if ( nid[1] == -1 ) return -1; /* lwerror should have been called */ if ( numNewEdges ) *numNewEdges += pointSplitEdges; @@ -7342,7 +7397,10 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, GBOX qbox; int forward; int input_was_closed = 0; + int input_tol_was_zero = (tol == 0.0); POINT4D originalStartPoint; + const POINT2D *original_start = NULL; + const POINT2D *original_end = NULL; if ( lwline_is_empty(line) ) { @@ -7356,6 +7414,8 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, getPoint4d_p( line->points, 0, &originalStartPoint); LWDEBUGF(1, "Input line is closed, original point is %g,%g", originalStartPoint.x, originalStartPoint.y); } + original_start = getPoint2d_cp(line->points, 0); + original_end = getPoint2d_cp(line->points, line->points->npoints - 1); *nedges = -1; /* error condition, by default */ @@ -7670,6 +7730,9 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, int edgeNewEdges; LWT_ELEMID id; LWGEOM *g = geoms[i]; + const LWLINE *edge_line = lwgeom_as_lwline(g); + int startExactNodeSnap = 0; + int endExactNodeSnap = 0; g->srid = noded->srid; #if POSTGIS_DEBUG_LEVEL > 0 @@ -7681,8 +7744,17 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, } #endif + if (input_tol_was_zero && edge_line && edge_line->points->npoints > 0) + { + const POINT2D *start = getPoint2d_cp(edge_line->points, 0); + const POINT2D *end = getPoint2d_cp(edge_line->points, edge_line->points->npoints - 1); + startExactNodeSnap = p2d_same(start, original_start) || p2d_same(start, original_end); + endExactNodeSnap = p2d_same(end, original_start) || p2d_same(end, original_end); + } + forward = -1; /* will be set to either 0 or 1 if the edge already existed */ - id = _lwt_AddLineEdge( topo, lwgeom_as_lwline(g), tol, handleFaceSplit, &forward, &edgeNewEdges ); + id = _lwt_AddLineEdge( + topo, lwgeom_as_lwline(g), tol, startExactNodeSnap, endExactNodeSnap, handleFaceSplit, &forward, &edgeNewEdges); if (id < 0) { lwgeom_free(noded); @@ -7743,7 +7815,7 @@ lwt_AddLineNoFace(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges) static void lwt_LoadPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol) { - _lwt_AddPoint(topo, point, tol, 1, NULL, NULL); + _lwt_AddPoint(topo, point, tol, tol, 1, NULL, NULL); } static void diff --git a/topology/test/regress/topogeo_addlinestring.sql b/topology/test/regress/topogeo_addlinestring.sql index 04b63f2e9..5946ceec0 100644 --- a/topology/test/regress/topogeo_addlinestring.sql +++ b/topology/test/regress/topogeo_addlinestring.sql @@ -496,6 +496,41 @@ TopoGeo_addLinestring('b5234', 'LINESTRING(10 10 3, 5 0 0.8)', 0); ROLLBACK; +-- Original endpoints must remain exact with explicit zero tolerance, +-- even where coordinate scale would allow a nearby machine-tolerance snap. +BEGIN; +SELECT NULL FROM topology.createtopology('gh1151_endpoint_zero', 0, 0, FALSE); +SELECT 'gh1151.endpoint-zero.near-node', topology.ST_AddIsoNode('gh1151_endpoint_zero', 0, 'POINT(0 0.000001)'); +SELECT 'gh1151.endpoint-zero.near-end', topology.ST_AddIsoNode('gh1151_endpoint_zero', 0, 'POINT(1000000000 0.000001)'); +SELECT 'gh1151.endpoint-zero.addline', count(*) FROM +TopoGeo_addLinestring('gh1151_endpoint_zero', + 'LINESTRING(0 0, 1000000000 0)', 0); +SELECT 'gh1151.endpoint-zero.start-exact', count(*) FROM gh1151_endpoint_zero.node + WHERE ST_Equals(geom, 'POINT(0 0)'::geometry); +SELECT 'gh1151.endpoint-zero.start-near', count(*) FROM gh1151_endpoint_zero.node + WHERE ST_Equals(geom, 'POINT(0 0.000001)'::geometry); +SELECT 'gh1151.endpoint-zero.end-exact', count(*) FROM gh1151_endpoint_zero.node + WHERE ST_Equals(geom, 'POINT(1000000000 0)'::geometry); +SELECT 'gh1151.endpoint-zero.end-near', count(*) FROM gh1151_endpoint_zero.node + WHERE ST_Equals(geom, 'POINT(1000000000 0.000001)'::geometry); +ROLLBACK; + +-- Original endpoints must also remain exact near existing edges with +-- explicit zero tolerance. +BEGIN; +SELECT NULL FROM topology.createtopology('gh1151_endpoint_zero_edge', 0, 0, FALSE); +SELECT 'gh1151.endpoint-zero-edge.seed', count(*) FROM +TopoGeo_addLinestring('gh1151_endpoint_zero_edge', + 'LINESTRING(999999999 0.000001, 1000000001 0.000001)', 0); +SELECT 'gh1151.endpoint-zero-edge.addline', count(*) FROM +TopoGeo_addLinestring('gh1151_endpoint_zero_edge', + 'LINESTRING(0 0, 1000000000 0)', 0); +SELECT 'gh1151.endpoint-zero-edge.end-exact', count(*) FROM gh1151_endpoint_zero_edge.node + WHERE ST_Equals(geom, 'POINT(1000000000 0)'::geometry); +SELECT 'gh1151.endpoint-zero-edge.end-projected', count(*) FROM gh1151_endpoint_zero_edge.node + WHERE ST_Equals(geom, 'POINT(1000000000 0.000001)'::geometry); +ROLLBACK; + -- See https://trac.osgeo.org/postgis/ticket/5568 BEGIN; SELECT NULL FROM topology.CreateTopology ('t5568'); diff --git a/topology/test/regress/topogeo_addlinestring_expected b/topology/test/regress/topogeo_addlinestring_expected index a698decff..5035a8654 100644 --- a/topology/test/regress/topogeo_addlinestring_expected +++ b/topology/test/regress/topogeo_addlinestring_expected @@ -224,6 +224,17 @@ b5081|dangling_edges|1 b5081|faces|1 b5234.0|1 b5234.1|1 +gh1151.endpoint-zero.near-node|1 +gh1151.endpoint-zero.near-end|2 +gh1151.endpoint-zero.addline|1 +gh1151.endpoint-zero.start-exact|1 +gh1151.endpoint-zero.start-near|1 +gh1151.endpoint-zero.end-exact|1 +gh1151.endpoint-zero.end-near|1 +gh1151.endpoint-zero-edge.seed|1 +gh1151.endpoint-zero-edge.addline|1 +gh1151.endpoint-zero-edge.end-exact|1 +gh1151.endpoint-zero-edge.end-projected|0 t5568|invalidities at start| t5568|invalidities at end| #5993.0|existing-data|1 commit 885bb877e2d1016eb6e8127599e4efeca337c221 Author: Darafei Praliaskouski Date: Tue Jul 7 01:07:40 2026 +0400 ci: test macOS with PostgreSQL 18 The macOS CI job currently installs Homebrew postgresql at 17, which has failed before build/test when its postgres.bki file is missing from the installed prefix. Use postgresql at 18 so the macOS lane exercises a current packaged PostgreSQL version. Closes https://github.com/postgis/postgis/pull/1155 diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index c4ae069c1..67c0cc1d4 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -13,7 +13,7 @@ jobs: name: "macOS" runs-on: macos-latest env: - PG: "17" + PG: "18" HOMEBREW_PREFIX: "/opt/homebrew" CCACHE_DIR: "${{ github.workspace }}/.ccache" CCACHE_MAXSIZE: "1G" ----------------------------------------------------------------------- Summary of changes: .github/workflows/ci-macos.yml | 2 +- liblwgeom/topo/lwgeom_topo.c | 162 +++++++++++++++------ topology/test/regress/topogeo_addlinestring.sql | 35 +++++ .../test/regress/topogeo_addlinestring_expected | 11 ++ 4 files changed, 164 insertions(+), 46 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Tue Jul 7 06:11:45 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 06:11:45 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-36-gd18cd7cf1 Message-ID: <20260707131146.0AF02196829@trac.osgeo.org> 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 d18cd7cf1d202ee9ef0cf03884a9022d77d57ce4 (commit) from 095edb77fdd46d84ae0fb98405d02c8ba9e41b48 (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 d18cd7cf1d202ee9ef0cf03884a9022d77d57ce4 Author: Regina Obe Date: Tue Jul 7 09:10:49 2026 -0400 fuzzingengine doesn't use hardening CPPFLAGS Fix from Bas Couwenberg Closes https://trac.osgeo.org/postgis/ticket/6092 for PostGIS 3.7.0 diff --git a/fuzzers/Makefile b/fuzzers/Makefile index 24968e236..5ab9c0e31 100644 --- a/fuzzers/Makefile +++ b/fuzzers/Makefile @@ -20,7 +20,7 @@ clean: $(RM) -f *.o *.a fuzzingengine.o: $(FUZZER_SRC_DIR)/fuzzingengine.c - $(CC) $(CFLAGS) -c -o $@ $< + $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< dummyfuzzers: fuzzingengine.o mkdir -p "$(FUZZER_OUT)" ----------------------------------------------------------------------- Summary of changes: fuzzers/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 06:13:06 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 13:13:06 -0000 Subject: [PostGIS] #6092: fuzzingengine doesn't use hardening CPPFLAGS In-Reply-To: <050.1eadcb4a210f33c3ffa615f0a9525312@osgeo.org> References: <050.1eadcb4a210f33c3ffa615f0a9525312@osgeo.org> Message-ID: <065.5292bbd23e05a30019c6800fef3b4036@osgeo.org> #6092: fuzzingengine doesn't use hardening CPPFLAGS -----------------------------+--------------------------- Reporter: Bas Couwenberg | Owner: strk Type: defect | Status: closed Priority: medium | Milestone: PostGIS 3.7.0 Component: build | Version: master Resolution: fixed | Keywords: -----------------------------+--------------------------- Changes (by robe): * resolution: => fixed * status: new => closed Comment: closed at [d18cd7cf1/git] -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 08:58:57 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 08:58:57 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-37-ga19393649 Message-ID: <20260707155857.CE6A9197742@trac.osgeo.org> 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 a19393649ecb446aa9f9615fafbe93a9138a44bb (commit) from d18cd7cf1d202ee9ef0cf03884a9022d77d57ce4 (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 a19393649ecb446aa9f9615fafbe93a9138a44bb Author: Regina Obe Date: Tue Jul 7 11:58:04 2026 -0400 Cleanup NEWS Get rid of bug fix section in release_notes Reshuffle and delete some more bug entries in NEWS diff --git a/NEWS b/NEWS index 854ae49f7..7d0d51c8b 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,5 @@ PostGIS 3.7.0beta1 -2026/xx/xx +2026/07/xx This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. @@ -38,6 +38,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed TopoGeo_AddLinestring edge creation (Darafei Praliaskouski) - GH-1154, [topology] Quote TotalTopologySize catalog regclasses safely (Darafei Praliaskouski) + - #6092, [fuzzingengine] fuzzingengine doesn't use hardening CPPFLAGS + (Bas Couwenberg) PostGIS 3.7.0dev @@ -170,11 +172,11 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed centroid regressions on 32-bit systems (Darafei Praliaskouski) - #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei Praliaskouski) + - #4616, Detect pgsql2shp query keywords case-insensitively + (Darafei Praliaskouski) * Bug Fixes * - - #4616, Detect pgsql2shp query keywords case-insensitively - (Darafei Praliaskouski) - Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei Praliaskouski) - #6038, Avoid stale relation lookups in geometry_columns after topology diff --git a/doc/po/templates/postgis-manual.pot b/doc/po/templates/postgis-manual.pot index 579904315..974391698 100644 --- a/doc/po/templates/postgis-manual.pot +++ b/doc/po/templates/postgis-manual.pot @@ -35639,12 +35639,12 @@ msgstr "" #. Tag: title #, no-c-format -msgid "PostGIS 3.7.0alpha1" +msgid "PostGIS 3.7.0" msgstr "" #. Tag: subtitle #, no-c-format -msgid "2026/07/05" +msgid "2026/xx/xx" msgstr "" #. Tag: para @@ -36148,19 +36148,6 @@ msgid "" "PDF builds while keeping HTML images transparent (Darafei Praliaskouski)" msgstr "" -#. Tag: title -#, no-c-format -msgid "Bug Fixes" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4616, Detect pgsql2shp query keywords case-insensitively (Darafei " -"Praliaskouski)" -msgstr "" - #. Tag: para #, no-c-format msgid "" @@ -36169,29 +36156,6 @@ msgid "" "Praliaskouski)" msgstr "" -#. Tag: para -#, no-c-format -msgid "" -"Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6083, Pass configured dependency include paths to fuzzer smoke builds " -"(Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#3103, Add regression coverage for exact-schema find_srid and " -"geometry_columns lookups (Darafei Praliaskouski)" -msgstr "" - #. Tag: para #, no-c-format msgid "" @@ -36200,30 +36164,6 @@ msgid "" "geometry columns (Darafei Praliaskouski)" msgstr "" -#. Tag: para -#, no-c-format -msgid "" -"#6038, Avoid stale relation lookups in geometry_columns after topology " -"objects are dropped (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5655, [doc] Skip XML validation during `make check` when xsltproc is " -"unavailable (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5487, Improve error detail for repeated upgrades after an incomplete " -"deprecated-function cleanup (Darafei Praliaskouski)" -msgstr "" - #. Tag: para #, no-c-format msgid "" @@ -36232,164 +36172,6 @@ msgid "" "callbacks (Darafei Praliaskouski)" msgstr "" -#. Tag: para -#, no-c-format -msgid "" -"#5975, Initialize skipped union-find cluster ids deterministically (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5904, [topology] Avoid MinGW format warnings when logging topology ids " -"(Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-885, [topology] Avoid GMP overflow in ring orientation for very large " -"finite coordinates (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6073, #6074, Stabilize geography LRS endpoint interpolation " -"and pole centroid regressions on 32-bit systems (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program " -"listings (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-888, [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-" -"input handling for SFCGAL < 2.2 (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#3179, Mark truncated libpgcommon PostgreSQL messages instead of silently " -"dropping the tail (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6003, Avoid size_t formats in liblwgeom logging/error wrappers for MinGW " -"builds (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-886, ST_ClusterRelateWin validates NULL relate matrices before detoasting " -"them (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-889, ST_Relate pattern inversion avoids out-of-bounds access on short " -"DE-9IM patterns (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid " -"size exceeds their extent (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5959, Prevent histogram target overflow when analysing massive tables " -"(Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#4828, geometry_columns handles NOT VALID SRID checks without errors " -"(Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#6048, [raster] ST_Clip no longer crashes when clipping sparse band " -"selections (Darafei Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement " -"cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei " -"Praliaskouski)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "Flatgeobuf schema mismatch vulnerability (NeuroWinter)" -msgstr "" - -#. Tag: para -#, no-c-format -msgid "" -"#5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey)" -msgstr "" - #. Tag: para #, no-c-format msgid "" diff --git a/doc/release_notes.xml b/doc/release_notes.xml index 0e1e56558..d996d879d 100644 --- a/doc/release_notes.xml +++ b/doc/release_notes.xml @@ -3,8 +3,8 @@ Appendix Release Notes
- PostGIS 3.7.0alpha1 - 2026/07/05 + PostGIS 3.7.0 + 2026/xx/xx This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed. Breaking Changes @@ -74,39 +74,9 @@ #5593, Docs: render manual images with GraphicsMagick without temporary files, enabling parallel builds, keeping ImageMagick fallbacks working, and documenting the generator workflow for contributors (Darafei Praliaskouski) #5645, Docs: keep code operators ("=>") intact in translated manuals by enforcing verbatim CSS (Darafei Praliaskouski) #1408, Docs: flatten transparent manual images onto white backgrounds for PDF builds while keeping HTML images transparent (Darafei Praliaskouski) - - - Bug Fixes - #4616, Detect pgsql2shp query keywords case-insensitively (Darafei Praliaskouski) #2838, Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski) - Fix WKB and TWKB parser resource exhaustion on malformed input (Darafei Praliaskouski) - #6083, Pass configured dependency include paths to fuzzer smoke builds (Darafei Praliaskouski) - #3103, Add regression coverage for exact-schema find_srid and geometry_columns lookups (Darafei Praliaskouski) #1705, Infer constraint metadata for direct view and materialized view geometry columns (Darafei Praliaskouski) - #6038, Avoid stale relation lookups in geometry_columns after topology objects are dropped (Darafei Praliaskouski) - #5655, [doc] Skip XML validation during `make check` when xsltproc is unavailable (Darafei Praliaskouski) - #5487, Improve error detail for repeated upgrades after an incomplete deprecated-function cleanup (Darafei Praliaskouski) GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks (Darafei Praliaskouski) - #5975, Initialize skipped union-find cluster ids deterministically (Darafei Praliaskouski) - #5904, [topology] Avoid MinGW format warnings when logging topology ids (Darafei Praliaskouski) - GH-885, [topology] Avoid GMP overflow in ring orientation for very large finite coordinates (Darafei Praliaskouski) - #6073, #6074, Stabilize geography LRS endpoint interpolation and pole centroid regressions on 32-bit systems (Darafei Praliaskouski) - #6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL program listings (Darafei Praliaskouski) - GH-888, [sfcgal] Avoid stale detoasted geometry access in CG_Visibility empty-input handling for SFCGAL < 2.2 (Darafei Praliaskouski) - #3179, Mark truncated libpgcommon PostgreSQL messages instead of silently dropping the tail (Darafei Praliaskouski) - #6003, Avoid size_t formats in liblwgeom logging/error wrappers for MinGW builds (Darafei Praliaskouski) - GH-886, ST_ClusterRelateWin validates NULL relate matrices before detoasting them (Darafei Praliaskouski) - GH-889, ST_Relate pattern inversion avoids out-of-bounds access on short DE-9IM patterns (Darafei Praliaskouski) - GH-890, Avoid GIDX BRIN summary merges across mismatched dimensions (Darafei Praliaskouski) - #5948, [topology] Prevent MakeTopologyPrecise from erasing edges when grid size exceeds their extent (Darafei Praliaskouski) - #5959, Prevent histogram target overflow when analysing massive tables (Darafei Praliaskouski) - #6080, Avoid out-of-bounds hex WKB lookup for high-bit input bytes (Darafei Praliaskouski) - GH-895, Qualify pg_class lookup during SRID/PROJ validation (Darafei Praliaskouski) - #4828, geometry_columns handles NOT VALID SRID checks without errors (Darafei Praliaskouski) - #6048, [raster] ST_Clip no longer crashes when clipping sparse band selections (Darafei Praliaskouski) - GH-894, [raster] Fix Float16 import, mixed nodata warping, band replacement cleanup, GDAL credential redaction, and Python GDAL compatibility (Darafei Praliaskouski) - Flatgeobuf schema mismatch vulnerability (NeuroWinter) - #5899, pg_upgrade issue for non-standard geography SRID (Paul Ramsey) #2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei Praliaskouski)
----------------------------------------------------------------------- Summary of changes: NEWS | 8 +- doc/po/templates/postgis-manual.pot | 222 +----------------------------------- doc/release_notes.xml | 34 +----- 3 files changed, 9 insertions(+), 255 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Tue Jul 7 10:45:23 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 10:45:23 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-75-gebf8cdcb2 Message-ID: <20260707174524.811031A3AD0@trac.osgeo.org> 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 ebf8cdcb257bd46e782954066edc604f9a6572d5 (commit) via 978efdc1d7acf9f13cbb2e833ebe97fcce140cdc (commit) via 59b7d32d252997a2504d6e165e3e2d98d67b3b74 (commit) via 64d353f1838f323ce48ce9e54e8ed30fe3a65ad0 (commit) via 2dce9483add1d9e79675e8c28450d105ec1a92ba (commit) via 7447449ee2a733b11d53f11d74eda6c19ae54223 (commit) via 8428350a14b3d5b87a99ea1ae38b2542f385c28d (commit) via d49f1c98c574bb6a1dee95cacfcab91b279f8c8d (commit) via 53fade5b3947f8d1e9e248e6c78c11828a2ec7d7 (commit) via 2a703a9f9eddfb3ecd7013a7cf4aece30e640928 (commit) via 1c6c69b2dd62b0e4c0b839fdf7fd2f43f00c25ec (commit) via ee22ae6aeeac7fbdf18e79871ebef2f3c0cc57df (commit) via 1a5b83202e66768141a4f85126a0f873cce0f930 (commit) via 9c3aa65f054c2db944d1916504e75f12037f69c7 (commit) via bdfcf652a6ea03ea4e8db632ff6841d6ea19d2c7 (commit) via 3b1b7f262663ad99c4daa1623e4a60381bd2860e (commit) via 5de0fe91928943acc8dcef99884782bf453e715d (commit) via d45d6e66d16b6c1e6d160895269db0ef0d7d9855 (commit) via f1fb51cedf07759de2f3a189e14064a4c27a7b45 (commit) via 1dcbdacde703bfbd404aa7d4805d588a8367f474 (commit) via 55ea7230fb35f394051929d53c5f4c58ef393cd7 (commit) via 3b4aeb707e696e9d92d6da4d3fc89a3fd60f2b45 (commit) via e48cae0ad147d669c2688b21ce1d0df219a431cf (commit) via 63fc924b351d61a5911235e081c7ad7fb1b8f0e5 (commit) via 91233df1d245b30edda27a99841bd6b2fe96c89c (commit) via e94600a0847e77a3ad30fb85986b609f096d170a (commit) via 2045b9774fec76e87c758276459c0b1d94632c81 (commit) via 8aa9623d7faf05cd175e08646863811ee9ce36c0 (commit) via 5e3fb509b91046edda39d2202b045550dd81ff35 (commit) via aafa0ec1d4a629b4c8977ba7a9cf6fc36ee04881 (commit) via 62db0d6afd6ef91940ab05cffa3299caa754be11 (commit) via 054d7b8f105b81dc6cf2ab193dc6b42c7e2b1f92 (commit) via 1441d4769078d22574372e2c83448b7831d68262 (commit) via f4130f5ef8c5ea7e34a9f9bacc47ead14fd1079c (commit) via 1382c85d2510098e4917b133c0e0d9030e59e844 (commit) via a55fb44f7f7cd2033c734042558a26f0d0aa1103 (commit) via 06dfb605f3184c6c23c352e0ed37fb785a2da343 (commit) from 7a39dab9d1099ace6e35069bd0df87fd5f64b84f (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 ebf8cdcb257bd46e782954066edc604f9a6572d5 Merge: 978efdc1d 63fc924b3 Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:48 2026 +0400 Merge PR #930: use expanded DocBook input for EPUB diff --cc .github/workflows/ci-macos.yml index 507695a23,c16ad1c0e..67c0cc1d4 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@@ -39,14 -39,14 +39,8 @@@ jobs gdal geos icu4c json-c libpq libxml2 \ proj protobuf-c sfcgal cunit \ docbook docbook-xsl \ -- gettext ++ postgresql@${PG} gettext brew link --force gettext -- HOMEBREW_GITHUB_ACTIONS=1 brew install "postgresql@${PG}" -- pg_version="$(brew info --json=v2 "postgresql@${PG}" | python3 -c 'import json,sys; data=json.load(sys.stdin); print(data["formulae"][0]["installed"][0]["version"])')" -- ln -sfn "${HOMEBREW_PREFIX}/Cellar/postgresql@${PG}/${pg_version}/share/postgresql@${PG}" "${HOMEBREW_PREFIX}/share/postgresql@${PG}" -- if [ ! -f "${HOMEBREW_PREFIX}/var/postgresql@${PG}/PG_VERSION" ]; then -- "${HOMEBREW_PREFIX}/opt/postgresql@${PG}/bin/initdb" --locale=en_US.UTF-8 -E UTF-8 "${HOMEBREW_PREFIX}/var/postgresql@${PG}" -- fi ccache --max-size="${CCACHE_MAXSIZE}" sudo ln -sfn "${HOMEBREW_PREFIX}/opt/postgresql@${PG}/bin/postgres" /usr/local/bin/postgres diff --cc NEWS index 7f2d43cdf,aa7605e8b..4fa4d414c --- a/NEWS +++ b/NEWS @@@ -7,10 -7,6 +7,13 @@@ To take advantage of all postgis_sfcga * Bug Fixes * + - #6093, Fix SQL generation on ppc64el when NURBS comments are + preprocessed with AltiVec vector macros (Darafei Praliaskouski) + - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks + with standard_conforming_strings off (Darafei Praliaskouski) ++ - #5423, Use a DTD-free expanded DocBook input for EPUB builds so ++ out-of-tree builds do not need dbtoepub entity path support ++ (Darafei Praliaskouski) - GH-898, Fix ST_DFullyWithin indexed plans and large-coordinate ring-orientation precision regressions (Darafei Praliaskouski) - GH-1143, [topology] Clean up TopoRingIsCCW early returns @@@ -26,34 -22,10 +29,35 @@@ (Darafei Praliaskouski) - GH-1153, [topology] Preserve large ids from edge wrappers (Darafei Praliaskouski) + - GH-1139, [topology] Preserve large edge ids from vertex-segment + proximity helper (Darafei Praliaskouski) + - GH-1140, [liblwgeom] Cap NURBS WKT knot multiplicity + (Darafei Praliaskouski) + - GH-1141, [liblwgeom] Reject overflowing NURBS linearization + segment counts (Darafei Praliaskouski) + - GH-1151, [topology] Preserve exact zero tolerance in + TopoGeometry construction (Darafei Praliaskouski) + - GH-1152, [topology] Enforce max edge limits from reported + TopoGeo_AddLinestring edge creation (Darafei Praliaskouski) + - GH-1154, [topology] Quote TotalTopologySize catalog regclasses + safely (Darafei Praliaskouski) + - #6092, [fuzzingengine] fuzzingengine doesn't use hardening CPPFLAGS + (Bas Couwenberg) + +* Enhancements * + + - #4749, Use point-in-polygon predicate fast paths for point-only + GeometryCollections, including ST_Disjoint (Darafei Praliaskouski) - - * Enhancements * - + - #3676, Mark geometry and geography btree comparison support functions + as leakproof (Darafei Praliaskouski) ++ - GH-875, Allow ST_OrderingEquals joins to use hash and merge join plans ++ (Darafei Praliaskouski) ++ - #2557, #2805, Document ST_MapAlgebra callback argument ++ signatures and return semantics (Darafei Praliaskouski) -PostGIS 3.7.0alpha1 -2026/07/05 +PostGIS 3.7.0dev +2026/xx/xx This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. commit 978efdc1d7acf9f13cbb2e833ebe97fcce140cdc Merge: 59b7d32d2 55ea7230f Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #911: raster: restore ST_Intersects wrapper inlining commit 59b7d32d252997a2504d6e165e3e2d98d67b3b74 Merge: 64d353f18 91233df1d Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #917: Document map algebra and MVT geometry behavior commit 64d353f1838f323ce48ce9e54e8ed30fe3a65ad0 Merge: 2dce9483a 1382c85d2 Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #878: Clarify standards support in introduction commit 2dce9483add1d9e79675e8c28450d105ec1a92ba Merge: 7447449ee f4130f5ef Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #875: Expose ST_OrderingEquals as planner equality commit 7447449ee2a733b11d53f11d74eda6c19ae54223 Merge: 8428350a1 06dfb605f Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #1112: doc: explain repeated ring point validity commit 8428350a14b3d5b87a99ea1ae38b2542f385c28d Merge: d49f1c98c e48cae0ad Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #1110: postgis: mark btree comparisons leakproof diff --cc NEWS index c4cfbf162,86af0e68a..54d2ae111 --- a/NEWS +++ b/NEWS @@@ -26,29 -22,15 +26,34 @@@ To take advantage of all postgis_sfcga (Darafei Praliaskouski) - GH-1153, [topology] Preserve large ids from edge wrappers (Darafei Praliaskouski) + - GH-1139, [topology] Preserve large edge ids from vertex-segment + proximity helper (Darafei Praliaskouski) + - GH-1140, [liblwgeom] Cap NURBS WKT knot multiplicity + (Darafei Praliaskouski) + - GH-1141, [liblwgeom] Reject overflowing NURBS linearization + segment counts (Darafei Praliaskouski) + - GH-1151, [topology] Preserve exact zero tolerance in + TopoGeometry construction (Darafei Praliaskouski) + - GH-1152, [topology] Enforce max edge limits from reported + TopoGeo_AddLinestring edge creation (Darafei Praliaskouski) + - GH-1154, [topology] Quote TotalTopologySize catalog regclasses + safely (Darafei Praliaskouski) + - #6092, [fuzzingengine] fuzzingengine doesn't use hardening CPPFLAGS + (Bas Couwenberg) + +* Enhancements * + + - #4749, Use point-in-polygon predicate fast paths for point-only + GeometryCollections, including ST_Disjoint (Darafei Praliaskouski) + * Enhancements * + + - #3676, Mark geometry and geography btree comparison support functions + as leakproof (Darafei Praliaskouski) + -PostGIS 3.7.0alpha1 -2026/07/05 +PostGIS 3.7.0dev +2026/xx/xx This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. commit d49f1c98c574bb6a1dee95cacfcab91b279f8c8d Merge: 53fade5b3 3b4aeb707 Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #1074: postgis: fast-path point collection ST_Disjoint diff --cc NEWS index 7d0d51c8b,678b9140f..c4cfbf162 --- a/NEWS +++ b/NEWS @@@ -26,24 -22,15 +26,29 @@@ To take advantage of all postgis_sfcga (Darafei Praliaskouski) - GH-1153, [topology] Preserve large ids from edge wrappers (Darafei Praliaskouski) + - GH-1139, [topology] Preserve large edge ids from vertex-segment + proximity helper (Darafei Praliaskouski) + - GH-1140, [liblwgeom] Cap NURBS WKT knot multiplicity + (Darafei Praliaskouski) + - GH-1141, [liblwgeom] Reject overflowing NURBS linearization + segment counts (Darafei Praliaskouski) + - GH-1151, [topology] Preserve exact zero tolerance in + TopoGeometry construction (Darafei Praliaskouski) + - GH-1152, [topology] Enforce max edge limits from reported + TopoGeo_AddLinestring edge creation (Darafei Praliaskouski) + - GH-1154, [topology] Quote TotalTopologySize catalog regclasses + safely (Darafei Praliaskouski) + - #6092, [fuzzingengine] fuzzingengine doesn't use hardening CPPFLAGS + (Bas Couwenberg) + * Enhancements * + + - #4749, Use point-in-polygon predicate fast paths for point-only + GeometryCollections, including ST_Disjoint (Darafei Praliaskouski) + -PostGIS 3.7.0alpha1 -2026/07/05 +PostGIS 3.7.0dev +2026/xx/xx This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. commit 53fade5b3947f8d1e9e248e6c78c11828a2ec7d7 Merge: 2a703a9f9 1a5b83202 Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #1142: liblwgeom: cap NURBS curve linearization diff --cc liblwgeom/lwstroke.c index a6395a2fd,1d3243339..a2518e691 --- a/liblwgeom/lwstroke.c +++ b/liblwgeom/lwstroke.c @@@ -933,11 -936,7 +936,8 @@@ lwnurbscurve_linearize(const LWNURBSCUR double height = 0.0; double depth = 0.0; double diagonal = 0.0; + double segments_required; - if (!curve->points || curve->points->npoints == 0) - return lwnurbscurve_to_linestring(curve, NURBS_MIN_LINEARIZE_SEGMENTS); - if (ptarray_calculate_gbox_cartesian(curve->points, &box) == LW_SUCCESS) { width = box.xmax - box.xmin; commit 2a703a9f9eddfb3ecd7013a7cf4aece30e640928 Merge: 1c6c69b2d ee22ae6ae Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:43 2026 +0400 Merge PR #1144: liblwgeom: keep TIN dimension cheap commit 1c6c69b2dd62b0e4c0b839fdf7fd2f43f00c25ec Merge: 7a39dab9d d45d6e66d Author: Darafei Praliaskouski Date: Tue Jul 7 21:39:42 2026 +0400 Merge PR #1145: topology: avoid rebuilding unsafe repair indexes commit ee22ae6aeeac7fbdf18e79871ebef2f3c0cc57df Author: Darafei Praliaskouski Date: Tue Jul 7 18:11:27 2026 +0400 liblwgeom: keep 2D solid TIN dimension bounded diff --git a/doc/reference_accessor.xml b/doc/reference_accessor.xml index f430278ab..c72ba1b4f 100644 --- a/doc/reference_accessor.xml +++ b/doc/reference_accessor.xml @@ -349,7 +349,7 @@ SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( A TIN, including a closed TIN surface, is a surface geometry and has dimension 2. Use to make the solid representation - explicit; the resulting solid has dimension 3. Solid geometry + explicit; the resulting 3D solid has dimension 3. Solid geometry semantics, such as volume, are handled separately by the SQL/MM 3D solid functions (SQL-MM IEC 13249-3: 9.1).
diff --git a/liblwgeom/cunit/cu_surface.c b/liblwgeom/cunit/cu_surface.c index 57a458fd8..e85f6b6e7 100644 --- a/liblwgeom/cunit/cu_surface.c +++ b/liblwgeom/cunit/cu_surface.c @@ -449,6 +449,7 @@ surface_dimension(void) check_solid_st_dimension( "TIN(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))", 3); + check_solid_st_dimension("TIN(((0 0,0 1,1 0,0 0)))", 2); } diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 9d461c730..4d3b272b1 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -1636,8 +1636,8 @@ int lwgeom_dimension(const LWGEOM *geom) case MULTIPOLYGONTYPE: return 2; case TINTYPE: - /* A TIN surface is dimension 2 unless it carries an explicit solid flag. */ - return FLAGS_GET_SOLID(geom->flags) ? 3 : 2; + /* A 3D TIN surface is dimension 3 only when explicitly marked solid. */ + return (FLAGS_GET_SOLID(geom->flags) && FLAGS_GET_Z(geom->flags)) ? 3 : 2; case POLYHEDRALSURFACETYPE: { /* A closed polyhedral surface contains a volume. */ diff --git a/sfcgal/regress/regress_sfcgal.sql b/sfcgal/regress/regress_sfcgal.sql index 75e058558..bc3af1e57 100644 --- a/sfcgal/regress/regress_sfcgal.sql +++ b/sfcgal/regress/regress_sfcgal.sql @@ -112,10 +112,12 @@ WITH geom AS ( 'TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,0 0 1,0 0 0)), - ((1 0 0,0 1 0,0 0 1,1 0 0)))'::geometry AS tin + ((1 0 0,0 1 0,0 0 1,1 0 0)))'::geometry AS tin_z, + 'TIN (((0 0,0 1,1 0,0 0)))'::geometry AS tin ) SELECT 'CG_MakeSolid TIN ST_Dimension', - ST_Dimension(tin), + ST_Dimension(tin_z), + ST_Dimension(CG_MakeSolid(tin_z)), ST_Dimension(CG_MakeSolid(tin)) FROM geom; diff --git a/sfcgal/regress/regress_sfcgal_expected b/sfcgal/regress/regress_sfcgal_expected index ad9c11a50..d5c3005a2 100644 --- a/sfcgal/regress/regress_sfcgal_expected +++ b/sfcgal/regress/regress_sfcgal_expected @@ -34,4 +34,4 @@ CG_Difference|MULTILINESTRING((0 0,0.5 0),(0.7 0,1 0)) CG_Union|LINESTRING(-1 0,0.5 0,1 0) CG_Triangulate|TIN(((0.8 0.2,0.2 0.2,1 0,0.8 0.2)),((0.2 0.2,0 0,1 0,0.2 0.2)),((1 1,0.8 0.8,0.8 0.2,1 1)),((0 1,0 0,0.2 0.2,0 1)),((0 1,0.2 0.8,1 1,0 1)),((0 1,0.2 0.2,0.2 0.8,0 1)),((0.2 0.8,0.8 0.8,1 1,0.2 0.8)),((0.2 0.8,0.2 0.2,0.8 0.2,0.2 0.8)),((1 1,0.8 0.2,1 0,1 1)),((0.8 0.8,0.2 0.8,0.8 0.2,0.8 0.8))) CG_IsSolid|t -CG_MakeSolid TIN ST_Dimension|2|3 +CG_MakeSolid TIN ST_Dimension|2|3|2 commit 1a5b83202e66768141a4f85126a0f873cce0f930 Author: Darafei Praliaskouski Date: Tue Jul 7 18:11:01 2026 +0400 liblwgeom: preserve empty NURBS linearization diff --git a/liblwgeom/lwstroke.c b/liblwgeom/lwstroke.c index 6ff6e5b43..1d3243339 100644 --- a/liblwgeom/lwstroke.c +++ b/liblwgeom/lwstroke.c @@ -911,6 +911,9 @@ lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, return NULL; } + if (!curve->points || curve->points->npoints == 0) + return lwnurbscurve_to_linestring(curve, NURBS_MIN_LINEARIZE_SEGMENTS); + switch (tolerance_type) { case LW_LINEARIZE_TOLERANCE_TYPE_SEGS_PER_QUAD: @@ -934,9 +937,6 @@ lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, double depth = 0.0; double diagonal = 0.0; - if (!curve->points || curve->points->npoints == 0) - return lwnurbscurve_to_linestring(curve, NURBS_MIN_LINEARIZE_SEGMENTS); - if (ptarray_calculate_gbox_cartesian(curve->points, &box) == LW_SUCCESS) { width = box.xmax - box.xmin; diff --git a/regress/core/nurbs_eval.sql b/regress/core/nurbs_eval.sql index c74691e1b..975217282 100644 --- a/regress/core/nurbs_eval.sql +++ b/regress/core/nurbs_eval.sql @@ -176,6 +176,11 @@ SELECT 'NURBS_CURVETOLINE_3', ST_Zmflag(ST_CurveToLine('SRID=4326;NURBSCURVE Z EMPTY'::geometry)), ST_SRID(ST_CurveToLine('SRID=4326;NURBSCURVE Z EMPTY'::geometry)); +SELECT 'NURBS_CURVETOLINE_4', + ST_AsEWKT(ST_CurveToLine('SRID=4326;NURBSCURVE Z EMPTY'::geometry, 0.0001, 2)), + ST_Zmflag(ST_CurveToLine('SRID=4326;NURBSCURVE Z EMPTY'::geometry, 0.0001, 2)), + ST_SRID(ST_CurveToLine('SRID=4326;NURBSCURVE Z EMPTY'::geometry, 0.0001, 2)); + SELECT 'NURBS_LENGTH_1', ST_Length('MULTICURVE(NURBSCURVE(2, (0 0, 1 1, 2 0)))'::geometry) > 0; SELECT 'NURBS_CURVEPOLY_1', ST_Contains( diff --git a/regress/core/nurbs_eval_expected b/regress/core/nurbs_eval_expected index 627438a5b..f26ce3ef6 100644 --- a/regress/core/nurbs_eval_expected +++ b/regress/core/nurbs_eval_expected @@ -28,6 +28,7 @@ ERROR: lwnurbscurve_linearize: segs-per-quad is too large, got 2501 ERROR: lwnurbscurve_linearize: requested too many segments, got 22361 ERROR: lwnurbscurve_linearize: requested too many segments, got 62832 NURBS_CURVETOLINE_3|SRID=4326;LINESTRING EMPTY|2|4326 +NURBS_CURVETOLINE_4|SRID=4326;LINESTRING EMPTY|2|4326 NURBS_LENGTH_1|t NURBS_CURVEPOLY_1|t NURBS_CURVEPOLY_2|ST_Polygon commit 9c3aa65f054c2db944d1916504e75f12037f69c7 Author: Darafei Praliaskouski Date: Tue Jul 7 17:53:32 2026 +0400 regress: cover solid TIN dimension semantics diff --git a/doc/reference_accessor.xml b/doc/reference_accessor.xml index 36af0640f..f430278ab 100644 --- a/doc/reference_accessor.xml +++ b/doc/reference_accessor.xml @@ -346,9 +346,8 @@ SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( &sqlmm_compliant; SQL-MM 3: 5.1.2 - follows the SQL-MM topological dimension - contract. A TIN, including a closed TIN surface, - is a surface geometry and has dimension 2. Use + A TIN, including a closed TIN surface, is a + surface geometry and has dimension 2. Use to make the solid representation explicit; the resulting solid has dimension 3. Solid geometry semantics, such as volume, are handled separately by the SQL/MM 3D diff --git a/sfcgal/regress/regress_sfcgal.sql b/sfcgal/regress/regress_sfcgal.sql index 5d35443c2..75e058558 100644 --- a/sfcgal/regress/regress_sfcgal.sql +++ b/sfcgal/regress/regress_sfcgal.sql @@ -107,3 +107,15 @@ SELECT 'CG_IsSolid', CG_IsSolid(geom) FROM solid; +WITH geom AS ( + SELECT + 'TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)), + ((0 0 0,0 1 0,1 0 0,0 0 0)), + ((0 0 0,1 0 0,0 0 1,0 0 0)), + ((1 0 0,0 1 0,0 0 1,1 0 0)))'::geometry AS tin +) +SELECT + 'CG_MakeSolid TIN ST_Dimension', + ST_Dimension(tin), + ST_Dimension(CG_MakeSolid(tin)) +FROM geom; diff --git a/sfcgal/regress/regress_sfcgal_expected b/sfcgal/regress/regress_sfcgal_expected index 261cb63d3..ad9c11a50 100644 --- a/sfcgal/regress/regress_sfcgal_expected +++ b/sfcgal/regress/regress_sfcgal_expected @@ -34,3 +34,4 @@ CG_Difference|MULTILINESTRING((0 0,0.5 0),(0.7 0,1 0)) CG_Union|LINESTRING(-1 0,0.5 0,1 0) CG_Triangulate|TIN(((0.8 0.2,0.2 0.2,1 0,0.8 0.2)),((0.2 0.2,0 0,1 0,0.2 0.2)),((1 1,0.8 0.8,0.8 0.2,1 1)),((0 1,0 0,0.2 0.2,0 1)),((0 1,0.2 0.8,1 1,0 1)),((0 1,0.2 0.2,0.2 0.8,0 1)),((0.2 0.8,0.8 0.8,1 1,0.2 0.8)),((0.2 0.8,0.2 0.2,0.8 0.2,0.2 0.8)),((1 1,0.8 0.2,1 0,1 1)),((0.8 0.8,0.2 0.8,0.8 0.2,0.8 0.8))) CG_IsSolid|t +CG_MakeSolid TIN ST_Dimension|2|3 commit bdfcf652a6ea03ea4e8db632ff6841d6ea19d2c7 Author: Darafei Praliaskouski Date: Tue Jul 7 17:30:49 2026 +0400 liblwgeom: preserve explicit solid TIN dimension diff --git a/doc/reference_accessor.xml b/doc/reference_accessor.xml index 03c2d88bd..36af0640f 100644 --- a/doc/reference_accessor.xml +++ b/doc/reference_accessor.xml @@ -348,10 +348,11 @@ SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( follows the SQL-MM topological dimension contract. A TIN, including a closed TIN surface, - is a surface geometry and has dimension 2. Solid geometry semantics, - such as volume, are handled separately by the SQL/MM 3D solid - functions (SQL-MM IEC 13249-3: 9.1) and by - . + is a surface geometry and has dimension 2. Use + to make the solid representation + explicit; the resulting solid has dimension 3. Solid geometry + semantics, such as volume, are handled separately by the SQL/MM 3D + solid functions (SQL-MM IEC 13249-3: 9.1). Enhanced: 2.0.0 support for Polyhedral surfaces and TINs was introduced. No longer throws an exception if given empty geometry. diff --git a/doc/reference_sfcgal.xml b/doc/reference_sfcgal.xml index 1f4dfe117..7f00975ee 100644 --- a/doc/reference_sfcgal.xml +++ b/doc/reference_sfcgal.xml @@ -319,7 +319,7 @@ CG_Volume - Computes the volume of a 3D solid. If applied to surface geometries, even closed surfaces, returns 0. + Computes the volume of a 3D geometry. Closed surfaces can have non-zero volume. @@ -340,15 +340,14 @@ &P_support; &T_support; &sqlmm_compliant; SQL-MM IEC 13249-3: 9.1 (same as CG_3DVolume) - Closed surface geometries are still surfaces by default. Use - to make the solid representation explicit - before computing volume. + Closed surface geometries can have non-zero volume. Use + when the geometry value itself must carry + the solid flag. Example - A closed polyhedral surface can be converted to a solid with - before computing volume. + A closed polyhedral surface has volume. makes the solid representation explicit. SELECT CG_Volume(geom) As cube_surface_vol, CG_Volume(CG_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), @@ -597,7 +596,7 @@ ST_Volume - Computes the volume of a 3D solid. If applied to surface geometries, even closed surfaces, returns 0. + Computes the volume of a 3D geometry. Closed surfaces can have non-zero volume. @@ -624,15 +623,14 @@ &P_support; &T_support; &sqlmm_compliant; SQL-MM IEC 13249-3: 9.1 (same as ST_3DVolume) - Closed surface geometries are still surfaces by default. Use - to make the solid representation explicit - before computing volume. + Closed surface geometries can have non-zero volume. Use + when the geometry value itself must carry + the solid flag. Example - A closed polyhedral surface can be converted to a solid with - before computing volume. + A closed polyhedral surface has volume. makes the solid representation explicit. SELECT ST_Volume(geom) As cube_surface_vol, ST_Volume(ST_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), diff --git a/liblwgeom/cunit/cu_surface.c b/liblwgeom/cunit/cu_surface.c index 985eb63db..57a458fd8 100644 --- a/liblwgeom/cunit/cu_surface.c +++ b/liblwgeom/cunit/cu_surface.c @@ -404,6 +404,29 @@ check_dimension(char *ewkt, int dim) lwgeom_free(geom); } +static void +check_st_dimension(char *ewkt, int dim) +{ + LWGEOM *geom; + + geom = lwgeom_from_wkt(ewkt, LW_PARSER_CHECK_NONE); + CU_ASSERT_EQUAL(strlen(cu_error_msg), 0); + CU_ASSERT_EQUAL(lwgeom_dimension(geom), dim); + lwgeom_free(geom); +} + +static void +check_solid_st_dimension(char *ewkt, int dim) +{ + LWGEOM *geom; + + geom = lwgeom_from_wkt(ewkt, LW_PARSER_CHECK_NONE); + CU_ASSERT_EQUAL(strlen(cu_error_msg), 0); + FLAGS_SET_SOLID(geom->flags, 1); + CU_ASSERT_EQUAL(lwgeom_dimension(geom), dim); + lwgeom_free(geom); +} + void surface_dimension(void) { @@ -418,6 +441,14 @@ surface_dimension(void) /* Tetrahedron */ check_dimension("POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))", 3); check_dimension("TIN(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))", 3); + + /* ST_Dimension follows surface/solid type semantics. */ + check_st_dimension( + "TIN(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))", + 2); + check_solid_st_dimension( + "TIN(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))", + 3); } diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 4d547c494..9d461c730 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -1636,8 +1636,8 @@ int lwgeom_dimension(const LWGEOM *geom) case MULTIPOLYGONTYPE: return 2; case TINTYPE: - /* A closed TIN surface is not a solid unless cast with MakeSolid. */ - return 2; + /* A TIN surface is dimension 2 unless it carries an explicit solid flag. */ + return FLAGS_GET_SOLID(geom->flags) ? 3 : 2; case POLYHEDRALSURFACETYPE: { /* A closed polyhedral surface contains a volume. */ commit 3b1b7f262663ad99c4daa1623e4a60381bd2860e Author: Darafei Praliaskouski Date: Tue Jul 7 17:21:29 2026 +0400 doc: clarify TIN dimension and solid semantics diff --git a/doc/reference_accessor.xml b/doc/reference_accessor.xml index b021b9bf9..03c2d88bd 100644 --- a/doc/reference_accessor.xml +++ b/doc/reference_accessor.xml @@ -344,6 +344,16 @@ SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( &sqlmm_compliant; SQL-MM 3: 5.1.2 + + + follows the SQL-MM topological dimension + contract. A TIN, including a closed TIN surface, + is a surface geometry and has dimension 2. Solid geometry semantics, + such as volume, are handled separately by the SQL/MM 3D solid + functions (SQL-MM IEC 13249-3: 9.1) and by + . + + Enhanced: 2.0.0 support for Polyhedral surfaces and TINs was introduced. No longer throws an exception if given empty geometry. Prior to 2.0.0, this function throws an exception if used with empty geometry. &P_support; @@ -355,11 +365,13 @@ SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( SELECT ST_Dimension('GEOMETRYCOLLECTION(LINESTRING(1 1,0 0),POINT(0 0))'); 1 + SELECT ST_Dimension('TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))'); +2 See Also - + , , diff --git a/doc/reference_sfcgal.xml b/doc/reference_sfcgal.xml index fedb49dd0..1f4dfe117 100644 --- a/doc/reference_sfcgal.xml +++ b/doc/reference_sfcgal.xml @@ -319,7 +319,7 @@ CG_Volume - Computes the volume of a 3D geometry. Closed surfaces can have non-zero volume. + Computes the volume of a 3D solid. If applied to surface geometries, even closed surfaces, returns 0. @@ -340,11 +340,15 @@ &P_support; &T_support; &sqlmm_compliant; SQL-MM IEC 13249-3: 9.1 (same as CG_3DVolume) + Closed surface geometries are still surfaces by default. Use + to make the solid representation explicit + before computing volume. Example - A closed polyhedral surface has volume. makes the solid representation explicit. + A closed polyhedral surface can be converted to a solid with + before computing volume. SELECT CG_Volume(geom) As cube_surface_vol, CG_Volume(CG_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), @@ -593,7 +597,7 @@ ST_Volume - Computes the volume of a 3D geometry. Closed surfaces can have non-zero volume. + Computes the volume of a 3D solid. If applied to surface geometries, even closed surfaces, returns 0. @@ -620,11 +624,15 @@ &P_support; &T_support; &sqlmm_compliant; SQL-MM IEC 13249-3: 9.1 (same as ST_3DVolume) + Closed surface geometries are still surfaces by default. Use + to make the solid representation explicit + before computing volume. Example - A closed polyhedral surface has volume. makes the solid representation explicit. + A closed polyhedral surface can be converted to a solid with + before computing volume. SELECT ST_Volume(geom) As cube_surface_vol, ST_Volume(ST_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), commit 5de0fe91928943acc8dcef99884782bf453e715d Author: Darafei Praliaskouski Date: Tue Jul 7 17:18:08 2026 +0400 liblwgeom: document TIN dimension semantics diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 1add20cb3..4d547c494 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -1636,6 +1636,7 @@ int lwgeom_dimension(const LWGEOM *geom) case MULTIPOLYGONTYPE: return 2; case TINTYPE: + /* A closed TIN surface is not a solid unless cast with MakeSolid. */ return 2; case POLYHEDRALSURFACETYPE: { @@ -1742,11 +1743,17 @@ static int lwcollection_dimensionality(const LWCOLLECTION *col) * - 0 for points and multipoints, * - 1 for linear/curve types (lines, circular strings, compound/multi-curves, NURBS), * - 2 for polygonal/surface types, - * - 3 for polyhedral surfaces or TINs that are closed (otherwise 2). + * Closure-aware dimensionality used by internal validity/repair checks. + * + * This is intentionally not the same contract as lwgeom_dimension(), which + * backs ST_Dimension. Closed polyhedral surfaces and TINs are reported as 3 + * here so callers that reason about solid-like inputs keep their legacy + * behavior. + * * For COLLECTIONTYPE the result is the maximum dimensionality of its members. * * @param geom Geometry to inspect (must be non-NULL). - * @return The topological dimension (0..3). On unsupported types the function logs an error and returns 0. + * @return The closure-aware dimensionality (0..3). On unsupported types the function logs an error and returns 0. */ extern int lwgeom_dimensionality(const LWGEOM *geom) { diff --git a/regress/core/triangulatedsurface.sql b/regress/core/triangulatedsurface.sql index fe6fab17c..4619ff73b 100644 --- a/regress/core/triangulatedsurface.sql +++ b/regress/core/triangulatedsurface.sql @@ -2,11 +2,11 @@ SELECT 'dimension_01', ST_Dimension('TIN(((0 0,1 1,0 1,0 0)))'::geometry); SELECT 'dimension_02', ST_Dimension('GEOMETRYCOLLECTION(TIN(((0 0,1 1,0 1,0 0))))'::geometry); --- ST_Dimension on 3D: closed +-- ST_Dimension on 3D: closed surface, not solid SELECT 'dimension_03', ST_Dimension('TIN(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))'::geometry); SELECT 'dimension_04', ST_Dimension('GEOMETRYCOLLECTION(TIN(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0))))'::geometry); --- ST_Dimension on 4D: closed +-- ST_Dimension on 4D: closed surface, not solid SELECT 'dimension_05', ST_Dimension('TIN(((0 0 0 0,0 0 1 0,0 1 0 2,0 0 0 0)),((0 0 0 0,0 1 0 0,1 0 0 4,0 0 0 0)),((0 0 0 0,1 0 0 0,0 0 1 6,0 0 0 0)),((1 0 0 0,0 1 0 0,0 0 1 0,1 0 0 0)))'::geometry); SELECT 'dimension_06', ST_Dimension('GEOMETRYCOLLECTION(TIN(((0 0 0 0,0 0 1 0,0 1 0 2,0 0 0 0)),((0 0 0 0,0 1 0 0,1 0 0 4,0 0 0 0)),((0 0 0 0,1 0 0 0,0 0 1 6,0 0 0 0)),((1 0 0 0,0 1 0 0,0 0 1 0,1 0 0 0))))'::geometry); commit d45d6e66d16b6c1e6d160895269db0ef0d7d9855 Author: Darafei Praliaskouski Date: Mon Jul 6 11:37:12 2026 +0400 topology: avoid rebuilding unsafe repair indexes diff --git a/doc/extras_topology.xml b/doc/extras_topology.xml index f059d3d7d..875cc95e0 100644 --- a/doc/extras_topology.xml +++ b/doc/extras_topology.xml @@ -563,6 +563,7 @@ Rename a topology from topo_stage to topo_prod + The function refuses to process tables with expression or partial indexes; drop or rebuild those indexes manually around the repair. Availability: 3.6.1 diff --git a/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in index b385d4686..203318379 100644 --- a/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in +++ b/topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in @@ -21,6 +21,33 @@ $$ DECLARE var_sql text; var_row_count bigint; result text; var_create_index_sql text; var_drop_index_sql text; BEGIN result = ''; + EXECUTE format('LOCK TABLE %1$I.%2$I IN SHARE ROW EXCLUSIVE MODE', layerSchema, layerTable); + + IF EXISTS ( + SELECT 1 + FROM pg_catalog.pg_inherits inherited + JOIN pg_catalog.pg_class tbl ON tbl.oid = inherited.inhparent + JOIN pg_catalog.pg_namespace nsp ON nsp.oid = tbl.relnamespace + WHERE nsp.nspname = layerSchema + AND tbl.relname = layerTable + ) THEN + RAISE EXCEPTION 'Cannot safely repair %.% while inheritance or partition child tables exist; repair each table separately', + layerSchema, layerTable; + END IF; + + IF EXISTS ( + SELECT 1 + FROM pg_catalog.pg_index i + JOIN pg_catalog.pg_class tbl ON tbl.oid = i.indrelid + JOIN pg_catalog.pg_namespace nsp ON nsp.oid = tbl.relnamespace + WHERE nsp.nspname = layerSchema + AND tbl.relname = layerTable + AND (i.indexprs IS NOT NULL OR i.indpred IS NOT NULL) + ) THEN + RAISE EXCEPTION 'Cannot safely repair %.% while expression or partial indexes exist; drop or rebuild those indexes manually', + layerSchema, layerTable; + END IF; + -- 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 @@ -31,12 +58,27 @@ 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 || ')%'); + -- generate scripts for plain indexes that directly include the column + IF EXISTS ( + SELECT 1 + FROM pg_catalog.pg_index i + JOIN pg_catalog.pg_class tbl ON tbl.oid = i.indrelid + JOIN pg_catalog.pg_namespace nsp ON nsp.oid = tbl.relnamespace + JOIN pg_catalog.pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = ANY(string_to_array(i.indkey::text, ' ')::int2[]) + WHERE nsp.nspname = layerSchema + AND tbl.relname = layerTable + AND att.attname = layerColumn + ) THEN + SELECT string_agg(pg_catalog.pg_get_indexdef(i.indexrelid), ';'), + string_agg('DROP INDEX ' || i.indexrelid::regclass::text, ';') + INTO var_create_index_sql, var_drop_index_sql + FROM pg_catalog.pg_index i + JOIN pg_catalog.pg_class tbl ON tbl.oid = i.indrelid + JOIN pg_catalog.pg_namespace nsp ON nsp.oid = tbl.relnamespace + JOIN pg_catalog.pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = ANY(string_to_array(i.indkey::text, ' ')::int2[]) + WHERE nsp.nspname = layerSchema + AND tbl.relname = layerTable + AND att.attname = layerColumn; END IF; IF var_drop_index_sql > '' THEN @@ -44,7 +86,7 @@ WHERE pg_type.typname = 'topogeometry' AND pga.attname = 'id' END IF; -- correct any corrupt topogeometries and fix - var_sql = format('UPDATE %1$I.%2$I + var_sql = format('UPDATE ONLY %1$I.%2$I SET %3$I = ( (%3$I).topology_id, @@ -63,7 +105,7 @@ WHERE pg_type.typname = 'topogeometry' AND pga.attname = 'id' 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 + var_sql = format('UPDATE ONLY %1$I.%2$I SET %3$I = ( (%3$I).topology_id, diff --git a/topology/test/regress/hooks/hook-after-upgrade-topology.sql b/topology/test/regress/hooks/hook-after-upgrade-topology.sql index c9b25bb51..3030dc731 100644 --- a/topology/test/regress/hooks/hook-after-upgrade-topology.sql +++ b/topology/test/regress/hooks/hook-after-upgrade-topology.sql @@ -1,6 +1,7 @@ SELECT * FROM topology.layer; \d upgrade_test.feature -- https://trac.osgeo.org/postgis/ticket/5983 +DROP INDEX upgrade_test.upgrade_test_feature_tg_id_idx; SELECT topology.FixCorruptTopoGeometryColumn(schema_name, table_name, feature_column) FROM topology.layer; @@ -22,4 +23,3 @@ INSERT INTO upgrade_test.domain_test values ( SELECT topology.DropTopology('upgrade_test'); SELECT topology.DropTopology('upgrade_test_copy'); - diff --git a/topology/test/regress/hooks/hook-before-upgrade-topology.sql b/topology/test/regress/hooks/hook-before-upgrade-topology.sql index fc2ffb1e8..ca6e94cee 100644 --- a/topology/test/regress/hooks/hook-before-upgrade-topology.sql +++ b/topology/test/regress/hooks/hook-before-upgrade-topology.sql @@ -4,7 +4,7 @@ SELECT topology.createTopology('upgrade_test'); CREATE TABLE upgrade_test.feature(id serial primary key); SELECT topology.AddTopoGeometryColumn('upgrade_test', 'upgrade_test', 'feature', 'tg', 'linear'); INSERT INTO upgrade_test.feature(tg) SELECT topology.toTopoGeom('LINESTRING(0 0, 10 0)', 'upgrade_test', 1); -CREATE INDEX ON upgrade_test.feature ( id(tg) ); +CREATE INDEX upgrade_test_feature_tg_id_idx ON upgrade_test.feature ( id(tg) ); -- Create some TopoGeometry data CREATE TABLE upgrade_test.domain_test(a topology.topoelement, b topology.topoelementarray); @@ -12,4 +12,3 @@ INSERT INTO upgrade_test.domain_test values ( '{1,2}'::topology.topoelement, '{{2,3}}'::topology.topoelementarray ); - commit f1fb51cedf07759de2f3a189e14064a4c27a7b45 Author: Darafei Praliaskouski Date: Mon Jul 6 11:36:20 2026 +0400 liblwgeom: keep TIN dimension cheap diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 158508a73..1add20cb3 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -1636,11 +1636,7 @@ int lwgeom_dimension(const LWGEOM *geom) case MULTIPOLYGONTYPE: return 2; case TINTYPE: - { - /* A closed tin surface contains a volume. */ - int closed = lwtin_is_closed((LWTIN*)geom); - return ( closed ? 3 : 2 ); - } + return 2; case POLYHEDRALSURFACETYPE: { /* A closed polyhedral surface contains a volume. */ diff --git a/regress/core/triangulatedsurface_expected b/regress/core/triangulatedsurface_expected index 5c8722d2e..e09a72230 100644 --- a/regress/core/triangulatedsurface_expected +++ b/regress/core/triangulatedsurface_expected @@ -1,9 +1,9 @@ dimension_01|2 dimension_02|2 -dimension_03|3 -dimension_04|3 -dimension_05|3 -dimension_06|3 +dimension_03|2 +dimension_04|2 +dimension_05|2 +dimension_06|2 dimension_07|2 dimension_08|2 numpatches_01|0 commit 1dcbdacde703bfbd404aa7d4805d588a8367f474 Author: Darafei Praliaskouski Date: Mon Jul 6 11:35:31 2026 +0400 liblwgeom: cap NURBS curve linearization diff --git a/liblwgeom/lwstroke.c b/liblwgeom/lwstroke.c index 1e7cf6618..6ff6e5b43 100644 --- a/liblwgeom/lwstroke.c +++ b/liblwgeom/lwstroke.c @@ -48,7 +48,7 @@ LWGEOM* lwgeom_unstroke(const LWGEOM *geom); static LWLINE* lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, LW_LINEARIZE_TOLERANCE_TYPE tolerance_type, int flags); #define NURBS_MIN_LINEARIZE_SEGMENTS 8 - +#define NURBS_MAX_LINEARIZE_SEGMENTS 10000 /* * Determines (recursively in the case of collections) whether the geometry @@ -919,7 +919,7 @@ lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, lwerror("%s: segs-per-quad must be an integer, got %.15g", __func__, tol); return NULL; } - if (tol > ((double)UINT32_MAX / 4.0)) + if (tol > ((double)NURBS_MAX_LINEARIZE_SEGMENTS / 4.0)) { lwerror("%s: segs-per-quad is too large, got %.15g", __func__, tol); return NULL; @@ -969,6 +969,11 @@ lwnurbscurve_linearize(const LWNURBSCURVE *curve, double tol, if (num_segments < NURBS_MIN_LINEARIZE_SEGMENTS) num_segments = NURBS_MIN_LINEARIZE_SEGMENTS; + if (num_segments > NURBS_MAX_LINEARIZE_SEGMENTS) + { + lwerror("%s: requested too many segments, got %u", __func__, (unsigned int)num_segments); + return NULL; + } (void)flags; /* Currently unused for NURBS linearization */ diff --git a/regress/core/nurbs_eval.sql b/regress/core/nurbs_eval.sql index df430b3b7..c74691e1b 100644 --- a/regress/core/nurbs_eval.sql +++ b/regress/core/nurbs_eval.sql @@ -162,6 +162,15 @@ SELECT 'NURBS_CURVETOLINE_TOLERANCE_2', ST_GeometryType(ST_CurveToLine('NURBSCURVE(2, (0 0, 1 1, 2 0))'::geometry, 0.01, 2)), ST_NPoints(ST_CurveToLine('NURBSCURVE(2, (0 0, 1 1, 2 0))'::geometry, 0.01, 2)); +SELECT 'NURBS_CURVETOLINE_SEGMENT_CAP', + ST_CurveToLine('NURBSCURVE(2, (0 0, 1 1, 2 0))'::geometry, 2501, 0); + +SELECT 'NURBS_CURVETOLINE_MAX_DEVIATION_CAP', + ST_CurveToLine('NURBSCURVE(2, (0 0, 1 1, 2 0))'::geometry, 0.0001, 1); + +SELECT 'NURBS_CURVETOLINE_MAX_ANGLE_CAP', + ST_CurveToLine('NURBSCURVE(2, (0 0, 1 1, 2 0))'::geometry, 0.0001, 2); + SELECT 'NURBS_CURVETOLINE_3', ST_AsEWKT(ST_CurveToLine('SRID=4326;NURBSCURVE Z EMPTY'::geometry)), ST_Zmflag(ST_CurveToLine('SRID=4326;NURBSCURVE Z EMPTY'::geometry)), diff --git a/regress/core/nurbs_eval_expected b/regress/core/nurbs_eval_expected index 636a1a825..627438a5b 100644 --- a/regress/core/nurbs_eval_expected +++ b/regress/core/nurbs_eval_expected @@ -24,6 +24,9 @@ NURBS_CURVETOLINE_1|ST_LineString NURBS_CURVETOLINE_2|ST_MultiLineString NURBS_CURVETOLINE_TOLERANCE_1|ST_LineString|225 NURBS_CURVETOLINE_TOLERANCE_2|ST_LineString|630 +ERROR: lwnurbscurve_linearize: segs-per-quad is too large, got 2501 +ERROR: lwnurbscurve_linearize: requested too many segments, got 22361 +ERROR: lwnurbscurve_linearize: requested too many segments, got 62832 NURBS_CURVETOLINE_3|SRID=4326;LINESTRING EMPTY|2|4326 NURBS_LENGTH_1|t NURBS_CURVEPOLY_1|t commit 55ea7230fb35f394051929d53c5f4c58ef393cd7 Author: Darafei Praliaskouski Date: Mon Jul 6 17:51:25 2026 +0400 NEWS: target entry to 3.7.0beta1 diff --git a/NEWS b/NEWS index a72ae6492..70a3dc001 100644 --- a/NEWS +++ b/NEWS @@ -24,7 +24,7 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) -PostGIS 3.7.0beta1 +PostGIS 3.7.0alpha1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. commit 3b4aeb707e696e9d92d6da4d3fc89a3fd60f2b45 Author: Darafei Praliaskouski Date: Mon Jul 6 17:46:32 2026 +0400 NEWS: move entry to 3.7.0beta1 diff --git a/NEWS b/NEWS index af5ae11da..678b9140f 100644 --- a/NEWS +++ b/NEWS @@ -23,8 +23,13 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - GH-1153, [topology] Preserve large ids from edge wrappers (Darafei Praliaskouski) +* Enhancements * -PostGIS 3.7.0beta1 + - #4749, Use point-in-polygon predicate fast paths for point-only + GeometryCollections, including ST_Disjoint (Darafei Praliaskouski) + + +PostGIS 3.7.0alpha1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. @@ -112,7 +117,7 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - #2137, [raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei Praliaskouski) - #4749, Use point-in-polygon predicate fast paths for point-only - GeometryCollections, including ST_Disjoint (Darafei Praliaskouski) + GeometryCollections (Darafei Praliaskouski) - #5532, Validate the manual against DocBook XMLSchema in check-xml (Darafei Praliaskouski) - #6087, Add a repository-owned CI status checker and static dashboard commit e48cae0ad147d669c2688b21ce1d0df219a431cf Author: Darafei Praliaskouski Date: Mon Jul 6 17:45:56 2026 +0400 NEWS: move entry to 3.7.0beta1 diff --git a/NEWS b/NEWS index bc002d3da..86af0e68a 100644 --- a/NEWS +++ b/NEWS @@ -23,8 +23,13 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - GH-1153, [topology] Preserve large ids from edge wrappers (Darafei Praliaskouski) +* Enhancements * -PostGIS 3.7.0beta1 + - #3676, Mark geometry and geography btree comparison support functions + as leakproof (Darafei Praliaskouski) + + +PostGIS 3.7.0alpha1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. @@ -98,8 +103,6 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed public liblwgeom header (Darafei Praliaskouski) - #4678, [raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski) - - #3676, Mark geometry and geography btree comparison support functions - as leakproof (Darafei Praliaskouski) - #2116, [raster] Add ST_Value nearest-neighbor boundary options (Darafei Praliaskouski) - #2804, #4315, [raster] Support two-argument ST_MapAlgebra callbacks commit 63fc924b351d61a5911235e081c7ad7fb1b8f0e5 Author: Darafei Praliaskouski Date: Mon Jul 6 16:03:23 2026 +0400 ci: avoid Homebrew PostgreSQL postinstall initdb diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index c4ae069c1..c16ad1c0e 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -39,8 +39,14 @@ jobs: gdal geos icu4c json-c libpq libxml2 \ proj protobuf-c sfcgal cunit \ docbook docbook-xsl \ - postgresql@${PG} gettext + gettext brew link --force gettext + HOMEBREW_GITHUB_ACTIONS=1 brew install "postgresql@${PG}" + pg_version="$(brew info --json=v2 "postgresql@${PG}" | python3 -c 'import json,sys; data=json.load(sys.stdin); print(data["formulae"][0]["installed"][0]["version"])')" + ln -sfn "${HOMEBREW_PREFIX}/Cellar/postgresql@${PG}/${pg_version}/share/postgresql@${PG}" "${HOMEBREW_PREFIX}/share/postgresql@${PG}" + if [ ! -f "${HOMEBREW_PREFIX}/var/postgresql@${PG}/PG_VERSION" ]; then + "${HOMEBREW_PREFIX}/opt/postgresql@${PG}/bin/initdb" --locale=en_US.UTF-8 -E UTF-8 "${HOMEBREW_PREFIX}/var/postgresql@${PG}" + fi ccache --max-size="${CCACHE_MAXSIZE}" sudo ln -sfn "${HOMEBREW_PREFIX}/opt/postgresql@${PG}/bin/postgres" /usr/local/bin/postgres commit 91233df1d245b30edda27a99841bd6b2fe96c89c Author: Darafei Praliaskouski Date: Mon Jul 6 16:03:07 2026 +0400 ci: avoid Homebrew PostgreSQL postinstall initdb diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index c4ae069c1..c16ad1c0e 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -39,8 +39,14 @@ jobs: gdal geos icu4c json-c libpq libxml2 \ proj protobuf-c sfcgal cunit \ docbook docbook-xsl \ - postgresql@${PG} gettext + gettext brew link --force gettext + HOMEBREW_GITHUB_ACTIONS=1 brew install "postgresql@${PG}" + pg_version="$(brew info --json=v2 "postgresql@${PG}" | python3 -c 'import json,sys; data=json.load(sys.stdin); print(data["formulae"][0]["installed"][0]["version"])')" + ln -sfn "${HOMEBREW_PREFIX}/Cellar/postgresql@${PG}/${pg_version}/share/postgresql@${PG}" "${HOMEBREW_PREFIX}/share/postgresql@${PG}" + if [ ! -f "${HOMEBREW_PREFIX}/var/postgresql@${PG}/PG_VERSION" ]; then + "${HOMEBREW_PREFIX}/opt/postgresql@${PG}/bin/initdb" --locale=en_US.UTF-8 -E UTF-8 "${HOMEBREW_PREFIX}/var/postgresql@${PG}" + fi ccache --max-size="${CCACHE_MAXSIZE}" sudo ln -sfn "${HOMEBREW_PREFIX}/opt/postgresql@${PG}/bin/postgres" /usr/local/bin/postgres commit e94600a0847e77a3ad30fb85986b609f096d170a Author: Darafei Praliaskouski Date: Mon Jul 6 16:02:40 2026 +0400 postgis: maintenance retargets diff --git a/NEWS b/NEWS index 98e588906..bc002d3da 100644 --- a/NEWS +++ b/NEWS @@ -24,7 +24,7 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) -PostGIS 3.7.0alpha1 +PostGIS 3.7.0beta1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. commit 2045b9774fec76e87c758276459c0b1d94632c81 Author: Darafei Praliaskouski Date: Sun Jun 21 16:48:07 2026 +0400 postgis: mark btree comparisons leakproof The geometry and geography btree comparison support functions use serialized-value comparison and hashing without GEOS or GDAL calls. Mark this audited subset LEAKPROOF so security-barrier relations can use these operators more effectively. References #3676 diff --git a/NEWS b/NEWS index 70a3dc001..98e588906 100644 --- a/NEWS +++ b/NEWS @@ -98,6 +98,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed public liblwgeom header (Darafei Praliaskouski) - #4678, [raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski) + - #3676, Mark geometry and geography btree comparison support functions + as leakproof (Darafei Praliaskouski) - #2116, [raster] Add ST_Value nearest-neighbor boundary options (Darafei Praliaskouski) - #2804, #4315, [raster] Support two-argument ST_MapAlgebra callbacks diff --git a/postgis/geography.sql.in b/postgis/geography.sql.in index ced61b8c7..fa4e98b4d 100644 --- a/postgis/geography.sql.in +++ b/postgis/geography.sql.in @@ -313,37 +313,37 @@ CREATE OPERATOR CLASS gist_geography_ops CREATE OR REPLACE FUNCTION geography_lt(geography, geography) RETURNS bool AS 'MODULE_PATHNAME', 'geography_lt' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE; + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF; -- Availability: 1.5.0 CREATE OR REPLACE FUNCTION geography_le(geography, geography) RETURNS bool AS 'MODULE_PATHNAME', 'geography_le' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE; + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF; -- Availability: 1.5.0 CREATE OR REPLACE FUNCTION geography_gt(geography, geography) RETURNS bool AS 'MODULE_PATHNAME', 'geography_gt' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE; + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF; -- Availability: 1.5.0 CREATE OR REPLACE FUNCTION geography_ge(geography, geography) RETURNS bool AS 'MODULE_PATHNAME', 'geography_ge' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE; + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF; -- Availability: 1.5.0 CREATE OR REPLACE FUNCTION geography_eq(geography, geography) RETURNS bool AS 'MODULE_PATHNAME', 'geography_eq' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE; + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF; -- Availability: 1.5.0 CREATE OR REPLACE FUNCTION geography_cmp(geography, geography) RETURNS integer AS 'MODULE_PATHNAME', 'geography_cmp' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE; + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF; -- -- Sorting operators for Btree diff --git a/postgis/postgis.sql.in b/postgis/postgis.sql.in index d4025cda8..9b19145b9 100644 --- a/postgis/postgis.sql.in +++ b/postgis/postgis.sql.in @@ -383,43 +383,43 @@ CREATE TYPE gidx ( CREATE OR REPLACE FUNCTION geometry_lt(geom1 geometry, geom2 geometry) RETURNS bool AS 'MODULE_PATHNAME', 'lwgeom_lt' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF _COST_DEFAULT; CREATE OR REPLACE FUNCTION geometry_le(geom1 geometry, geom2 geometry) RETURNS bool AS 'MODULE_PATHNAME', 'lwgeom_le' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF _COST_DEFAULT; CREATE OR REPLACE FUNCTION geometry_gt(geom1 geometry, geom2 geometry) RETURNS bool AS 'MODULE_PATHNAME', 'lwgeom_gt' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF _COST_DEFAULT; CREATE OR REPLACE FUNCTION geometry_ge(geom1 geometry, geom2 geometry) RETURNS bool AS 'MODULE_PATHNAME', 'lwgeom_ge' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF _COST_DEFAULT; CREATE OR REPLACE FUNCTION geometry_eq(geom1 geometry, geom2 geometry) RETURNS bool AS 'MODULE_PATHNAME', 'lwgeom_eq' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF _COST_DEFAULT; CREATE OR REPLACE FUNCTION geometry_neq(geom1 geometry, geom2 geometry) RETURNS bool AS 'MODULE_PATHNAME', 'lwgeom_neq' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF _COST_DEFAULT; CREATE OR REPLACE FUNCTION geometry_cmp(geom1 geometry, geom2 geometry) RETURNS integer AS 'MODULE_PATHNAME', 'lwgeom_cmp' - LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE LEAKPROOF _COST_DEFAULT; -- Availability: 3.0.0 @@ -494,7 +494,7 @@ CREATE OPERATOR CLASS btree_geometry_ops CREATE OR REPLACE FUNCTION geometry_hash(geometry) RETURNS integer AS 'MODULE_PATHNAME','lwgeom_hash' - LANGUAGE 'c' STRICT IMMUTABLE PARALLEL SAFE; + LANGUAGE 'c' STRICT IMMUTABLE PARALLEL SAFE LEAKPROOF; -- Availability: 2.5.0 CREATE OPERATOR CLASS hash_geometry_ops diff --git a/regress/core/regress.sql b/regress/core/regress.sql index e2a52a7b3..65e13cf5b 100644 --- a/regress/core/regress.sql +++ b/regress/core/regress.sql @@ -379,6 +379,26 @@ WHERE ( AND prosecdef ORDER BY oid; +SELECT 'leakproof_compare_support', count(*) +FROM pg_proc +WHERE oid IN ( + 'geometry_lt(geometry,geometry)'::regprocedure, + 'geometry_le(geometry,geometry)'::regprocedure, + 'geometry_gt(geometry,geometry)'::regprocedure, + 'geometry_ge(geometry,geometry)'::regprocedure, + 'geometry_eq(geometry,geometry)'::regprocedure, + 'geometry_neq(geometry,geometry)'::regprocedure, + 'geometry_cmp(geometry,geometry)'::regprocedure, + 'geometry_hash(geometry)'::regprocedure, + 'geography_lt(geography,geography)'::regprocedure, + 'geography_le(geography,geography)'::regprocedure, + 'geography_gt(geography,geography)'::regprocedure, + 'geography_ge(geography,geography)'::regprocedure, + 'geography_eq(geography,geography)'::regprocedure, + 'geography_cmp(geography,geography)'::regprocedure +) +AND proleakproof; + SELECT 'UNEXPECTED', postgis_full_version() WHERE postgis_full_version() LIKE '%UNPACKAGED%' OR postgis_full_version() LIKE '%need upgrade%'; diff --git a/regress/core/regress_expected b/regress/core/regress_expected index 42a03aaaf..f089a2df3 100644 --- a/regress/core/regress_expected +++ b/regress/core/regress_expected @@ -231,3 +231,4 @@ ERROR: ST_TileEnvelope: Margin must not be less than -50%, margin=-0.510000 314|676 315|0 316|t|LINESTRING(40 8.660254037844387,35 8.660254037844387) +leakproof_compare_support|14 commit 8aa9623d7faf05cd175e08646863811ee9ce36c0 Author: Darafei Praliaskouski Date: Mon Jul 6 16:02:39 2026 +0400 postgis: move NEWS to 3.7.0beta1 diff --git a/NEWS b/NEWS index 70a3dc001..a72ae6492 100644 --- a/NEWS +++ b/NEWS @@ -24,7 +24,7 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) -PostGIS 3.7.0alpha1 +PostGIS 3.7.0beta1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. commit 5e3fb509b91046edda39d2202b045550dd81ff35 Author: Darafei Praliaskouski Date: Wed Jun 17 02:09:09 2026 +0400 raster: lower ST_Intersects wrapper cost Closes #4463 diff --git a/raster/rt_pg/rtpostgis.sql.in b/raster/rt_pg/rtpostgis.sql.in index aa09a7357..e6fe48407 100644 --- a/raster/rt_pg/rtpostgis.sql.in +++ b/raster/rt_pg/rtpostgis.sql.in @@ -164,7 +164,7 @@ CREATE OR REPLACE FUNCTION st_envelope(raster) CREATE OR REPLACE FUNCTION st_convexhull(raster) RETURNS geometry AS 'MODULE_PATHNAME','RASTER_convex_hull' - LANGUAGE 'c' IMMUTABLE STRICT + LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE COST 300; CREATE OR REPLACE FUNCTION st_minconvexhull( @@ -6032,13 +6032,13 @@ CREATE OR REPLACE FUNCTION st_intersects(rast1 raster, nband1 integer, rast2 ras RETURNS boolean AS $$ SELECT $1 OPERATOR(@extschema at .&&) $3 AND CASE WHEN $2 IS NULL OR $4 IS NULL THEN @extschema at ._st_intersects(@extschema at .st_convexhull($1), @extschema at .st_convexhull($3)) ELSE @extschema at ._st_intersects($1, $2, $3, $4) END $$ LANGUAGE 'sql' IMMUTABLE PARALLEL SAFE - COST 1000; + _COST_DEFAULT; CREATE OR REPLACE FUNCTION st_intersects(rast1 raster, rast2 raster) RETURNS boolean AS $$ SELECT @extschema at .st_intersects($1, NULL::integer, $2, NULL::integer) $$ LANGUAGE 'sql' IMMUTABLE PARALLEL SAFE - COST 1000; + _COST_DEFAULT; ----------------------------------------------------------------------- -- ST_Intersects(geometry, raster) @@ -6077,7 +6077,7 @@ CREATE OR REPLACE FUNCTION st_intersects(geom geometry, rast raster, nband integ RETURNS boolean AS $$ SELECT $1 OPERATOR(@extschema at .&&) $2::@extschema at .geometry AND @extschema at ._st_intersects($1, $2, $3); $$ LANGUAGE 'sql' IMMUTABLE PARALLEL SAFE - COST 1000; + _COST_DEFAULT; ----------------------------------------------------------------------- -- ST_Intersects(raster, geometry) @@ -6087,13 +6087,13 @@ CREATE OR REPLACE FUNCTION st_intersects(rast raster, geom geometry, nband integ RETURNS boolean AS $$ SELECT $1::@extschema at .geometry OPERATOR(@extschema at .&&) $2 AND @extschema at ._st_intersects($2, $1, $3) $$ LANGUAGE 'sql' IMMUTABLE PARALLEL SAFE - COST 1000; + _COST_DEFAULT; CREATE OR REPLACE FUNCTION st_intersects(rast raster, nband integer, geom geometry) RETURNS boolean AS $$ SELECT $1::@extschema at .geometry OPERATOR(@extschema at .&&) $3 AND @extschema at ._st_intersects($3, $1, $2) $$ LANGUAGE 'sql' IMMUTABLE PARALLEL SAFE - COST 1000; + _COST_DEFAULT; ----------------------------------------------------------------------- -- ST_Overlaps(raster, raster) diff --git a/raster/test/regress/rt_intersects.sql b/raster/test/regress/rt_intersects.sql index cb0c944cf..fc3f7423e 100644 --- a/raster/test/regress/rt_intersects.sql +++ b/raster/test/regress/rt_intersects.sql @@ -431,5 +431,44 @@ FROM raster_intersects_rast r1 CROSS JOIN raster_intersects_geom g1 WHERE r1.rid = 2; +CREATE INDEX raster_intersects_geom_idx ON raster_intersects_geom USING gist (geom); +ANALYZE raster_intersects_rast (rid); +ANALYZE raster_intersects_geom (geom); +SET enable_seqscan = off; + +CREATE OR REPLACE FUNCTION raster_intersects_plan_has(query text, pattern text) + RETURNS boolean AS $$ + DECLARE + exp text; + BEGIN + IF current_setting('server_version_num')::integer >= 140000 THEN + PERFORM set_config('enable_memoize', 'off', true); + END IF; + + FOR exp IN EXECUTE 'EXPLAIN (COSTS OFF) ' || query LOOP + IF exp ~ pattern THEN + RETURN TRUE; + END IF; + END LOOP; + RETURN FALSE; + END; + $$ LANGUAGE 'plpgsql'; + +SELECT + '#4463.1', + raster_intersects_plan_has( + 'SELECT g1.gid FROM raster_intersects_geom g1 JOIN raster_intersects_rast r1 ON ST_Intersects(g1.geom, r1.rast) WHERE r1.rid = 0', + 'Index Cond: .*geom && .*r1[.]rast.*geometry' + ); + +SELECT + '#4463.2', + raster_intersects_plan_has( + 'SELECT g1.gid FROM raster_intersects_geom g1 JOIN raster_intersects_rast r1 ON ST_Intersects(r1.rast, g1.geom) WHERE r1.rid = 0', + 'Index Cond: .*geom && .*r1[.]rast.*geometry' + ); + +RESET enable_seqscan; +DROP FUNCTION raster_intersects_plan_has(text, text); DROP TABLE IF EXISTS raster_intersects_rast; DROP TABLE IF EXISTS raster_intersects_geom; diff --git a/raster/test/regress/rt_intersects_expected b/raster/test/regress/rt_intersects_expected index ae0ac1723..e3c4ca618 100644 --- a/raster/test/regress/rt_intersects_expected +++ b/raster/test/regress/rt_intersects_expected @@ -234,3 +234,5 @@ 2.6|2|44|ST_MultiPolygon|t 2.6|2|45|ST_MultiPolygon|t 2.6|2|46|ST_MultiPolygon|t +#4463.1|t +#4463.2|t commit aafa0ec1d4a629b4c8977ba7a9cf6fc36ee04881 Author: Darafei Praliaskouski Date: Mon Jul 6 16:01:30 2026 +0400 postgis: maintenance retargets diff --git a/NEWS b/NEWS index 3c8b64a0c..af5ae11da 100644 --- a/NEWS +++ b/NEWS @@ -24,7 +24,7 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) -PostGIS 3.7.0alpha1 +PostGIS 3.7.0beta1 2026/07/05 This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. commit 62db0d6afd6ef91940ab05cffa3299caa754be11 Author: Darafei Praliaskouski Date: Sun Jun 21 01:06:58 2026 +0400 postgis: fast-path point collection ST_Disjoint References #4749 diff --git a/NEWS b/NEWS index 70a3dc001..3c8b64a0c 100644 --- a/NEWS +++ b/NEWS @@ -112,7 +112,7 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - #2137, [raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei Praliaskouski) - #4749, Use point-in-polygon predicate fast paths for point-only - GeometryCollections (Darafei Praliaskouski) + GeometryCollections, including ST_Disjoint (Darafei Praliaskouski) - #5532, Validate the manual against DocBook XMLSchema in check-xml (Darafei Praliaskouski) - #6087, Add a repository-owned CI status checker and static dashboard diff --git a/postgis/lwgeom_geos_predicates.c b/postgis/lwgeom_geos_predicates.c index c400ebca7..670410f4c 100644 --- a/postgis/lwgeom_geos_predicates.c +++ b/postgis/lwgeom_geos_predicates.c @@ -378,6 +378,7 @@ Datum disjoint(PG_FUNCTION_ARGS) int8_t result; GBOX box1, box2; PrepGeomCache *prep_cache; + bool pip_result; gserialized_error_if_srid_mismatch(geom1, geom2, __func__); @@ -398,6 +399,21 @@ Datum disjoint(PG_FUNCTION_ARGS) } } + /* + * Short-circuit 2: if one geometry is polygonal and the other is a + * point or point-only collection, use the IntervalTree PIP fast path. + */ + if (is_point_or_collection(geom1) && is_poly(geom2) && + try_itree_pointlike_pip(fcinfo, geom1, shared_geom2, itree_pip_intersects, &pip_result)) + { + PG_RETURN_BOOL(!pip_result); + } + else if (is_point_or_collection(geom2) && is_poly(geom1) && + try_itree_pointlike_pip(fcinfo, geom2, shared_geom1, itree_pip_intersects, &pip_result)) + { + PG_RETURN_BOOL(!pip_result); + } + initGEOS(lwpgnotice, lwgeom_geos_error); prep_cache = GetPrepGeomCache(fcinfo, shared_geom1, shared_geom2); diff --git a/regress/core/tickets.sql b/regress/core/tickets.sql index 83f954139..cf80a0d25 100644 --- a/regress/core/tickets.sql +++ b/regress/core/tickets.sql @@ -1313,6 +1313,21 @@ SELECT '#4749.intersects', ST_Intersects(poly, pts_outside) FROM g; +WITH g AS ( + SELECT + 'POLYGON((0 0,0 10,10 10,10 0,0 0))'::geometry AS poly, + 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(5 5)),MULTIPOINT((7 7),(8 8)))'::geometry AS pts_inside, + 'GEOMETRYCOLLECTION(POINT(5 5),POINT(0 0))'::geometry AS pts_boundary, + 'GEOMETRYCOLLECTION(POINT(5 5),POINT(11 11))'::geometry AS pts_outside, + 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(-1 -1)),MULTIPOINT((11 11),(12 12)))'::geometry AS pts_disjoint +) +SELECT '#4749.disjoint', + ST_Disjoint(poly, pts_inside), + ST_Disjoint(pts_boundary, poly), + ST_Disjoint(poly, pts_outside), + ST_Disjoint(pts_disjoint, poly) +FROM g; + -- #4299 SELECT '#4299', ST_Disjoint(ST_GeneratePoints(g, 1000), ST_GeneratePoints(g, 1000)) FROM (SELECT 'POLYGON((0 0,1 0,1 1,0 1,0 0))'::geometry AS g) AS f; diff --git a/regress/core/tickets_expected b/regress/core/tickets_expected index bed2d3302..1daac1d93 100644 --- a/regress/core/tickets_expected +++ b/regress/core/tickets_expected @@ -392,6 +392,7 @@ equals213|t #4749.covers|t|t|f #4749.coveredby|t|t|f #4749.intersects|t|t|t +#4749.disjoint|f|f|f|t #4299|t #4304|t|t|t ERROR: BOX3D_construct: args can not be empty points commit 054d7b8f105b81dc6cf2ab193dc6b42c7e2b1f92 Author: Darafei Praliaskouski Date: Thu Jun 18 04:05:54 2026 +0400 doc: use expanded DocBook input for EPUB diff --git a/NEWS b/NEWS index 70a3dc001..aa7605e8b 100644 --- a/NEWS +++ b/NEWS @@ -173,6 +173,11 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed (Darafei Praliaskouski) - GH-885, [topology] Avoid GMP overflow in ring orientation for very large finite coordinates (Darafei Praliaskouski) + - GH-892, Add OSS-Fuzz coverage for TWKB and serialized raster inputs, + including guards for malformed TWKB reads and counts (Darafei Praliaskouski) + - #5423, Use a DTD-free expanded DocBook input for EPUB builds so + out-of-tree builds do not need dbtoepub entity path support + (Darafei Praliaskouski) - #6073, #6074, Stabilize geography LRS endpoint interpolation and pole centroid regressions on 32-bit systems (Darafei Praliaskouski) - #6082, Fix Japanese PDF build by avoiding non-ASCII arrows in SQL diff --git a/doc/Makefile.in b/doc/Makefile.in index 5288648c6..ce02ffa98 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -405,6 +405,9 @@ postgis-out.xml: postgis.xml Makefile $(XML_INPUTS) Makefile $(PERL) -lpe "s'@@LAST_RELEASE_VERSION@@'${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}'g;s'@@POSTGIS_DOWNLOAD_URL@@'${POSTGIS_DOWNLOAD_URL}'g;" $< > $@.in $(XMLLINT) $(XSLTPROC_PATH_OPT) --noent -o $@ $@.in +postgis-out-epub.xml: postgis-out.xml Makefile + $(XMLLINT) $(XSLTPROC_PATH_OPT) --dropdtd -o $@ $< + chunked-html: ## Generate multi-file html in html/postgis-en/ chunked-html: $(html_builddir)/postgis$(DOCSUFFIX)/index.html @@ -465,7 +468,7 @@ pdf-install: postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS pdf-uninstall: rm -f $(DESTDIR)$(docdir)/postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).pdf -postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub: postgis-out.xml images +postgis-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_VERSION}.${POSTGIS_MICRO_VERSION}$(DOCSUFFIX).epub: postgis-out-epub.xml images ifeq ($(DBTOEPUB),) @echo @echo "configure was unable to find the 'dbtoepub' utility program." @@ -526,6 +529,7 @@ cheatsheet-clean: clean: images-clean html-clean pdf-clean epub-clean cheatsheet-clean clean-pot ## Remove generated files except comments rm -f images # work around https://trac.osgeo.org/postgis/ticket/5422 + rm -f postgis-out-epub.xml rm -f $(XML_GENERATED_SOURCES) rm -f postgis-nospecial.xml postgis-nospecial.xml.in rm -f postgis-out.xml postgis-out.xml.in commit 1441d4769078d22574372e2c83448b7831d68262 Author: Darafei Praliaskouski Date: Wed Jun 17 03:13:51 2026 +0400 Document map algebra and MVT geometry behavior diff --git a/NEWS b/NEWS index 70a3dc001..2045e4a8d 100644 --- a/NEWS +++ b/NEWS @@ -69,6 +69,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - #5992, Optimize GiST index for repeated edge subdivision in topology (Darafei Praliaskouski) - #5702, Allow the compiler to detect the parallelism -flto=auto (Darafei Praliaskouski) - #4798, ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski) + - #2557, #2805, Document ST_MapAlgebra callback argument + signatures and return semantics (Darafei Praliaskouski) - #5950, Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei Praliaskouski) - #4332, Clarify the scope of several Function Reference categories (Darafei Praliaskouski) - #4222, [raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei Praliaskouski) diff --git a/doc/reference_raster.xml b/doc/reference_raster.xml index 0992d30f9..c46f28add 100644 --- a/doc/reference_raster.xml +++ b/doc/reference_raster.xml @@ -9886,7 +9886,7 @@ FROM ( The callbackfunc parameter must be the name and signature of an SQL or PL/pgSQL function, cast to a regprocedure. An example PL/pgSQL function example is: -CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], position integer[][], VARIADIC userargs text[]) +CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], pos integer[][], VARIADIC userargs text[]) RETURNS double precision AS $$ BEGIN @@ -9899,6 +9899,10 @@ CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], pos The callbackfunc must have two or three arguments: a 3-dimension double precision array, a 2-dimension integer array and, optionally, a variadic 1-dimension text array. The first argument value is the set of values (as double precision) from all input rasters. The three dimensions (where indexes are 1-based) are: raster #, row y, column x. The second argument position is the set of pixel positions from the output raster and input rasters. The outer dimension (where indexes are 0-based) is the raster #. The position at outer dimension index 0 is the output raster's pixel position. For each outer dimension, there are two elements in the inner dimension for X and Y. The optional third argument userargs is for passing through any user-specified arguments. + + The callback return value is used as the value of the output pixel. If the callback returns NULL, the output pixel is set to NODATA when the output band has a NODATA value. If the output band has no NODATA value, a NULL callback result raises an error. + + Passing a regprocedure argument to a SQL function requires the full function signature to be passed, then cast to a regprocedure type. To pass the above example PL/pgSQL function as an argument, the SQL for the argument is: @@ -9906,7 +9910,7 @@ CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], pos 'sample_callbackfunc(double precision[], integer[], text[])'::regprocedure - Note that the argument contains the name of the function, the types of the function arguments, quotes around the name and argument types, and a cast to a regprocedure. + Note that PostgreSQL array types do not encode dimensions in function signatures, so multidimensional callback arguments are written as double precision[] and integer[] in the regprocedure signature. @@ -10099,8 +10103,7 @@ WITH src AS ( SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -4, 1, -1, 0, 0, 0), 1, '16BUI', 100, 0) AS rast UNION ALL SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -4, 1, -1, 0, 0, 0), 1, '16BUI', 200, 0) AS rast UNION ALL SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -4, 1, -1, 0, 0, 0), 1, '16BUI', 300, 0) AS rast -) -WITH foo AS ( +), foo AS ( SELECT t1.rid, ST_Union(t2.rast) AS rast @@ -10113,8 +10116,9 @@ WITH foo AS ( ), bar AS ( SELECT t1.rid, - ST_MapAlgebra(ARRAY[ROW(t2.rast, 1)]::rastbandarg[], - 'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure, + ST_MapAlgebra( + ARRAY[ROW(t2.rast, 1)]::rastbandarg[], + 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure, '32BUI', 'CUSTOM', t1.rast, 1, 1 commit f4130f5ef8c5ea7e34a9f9bacc47ead14fd1079c Author: Darafei Praliaskouski Date: Thu Jun 11 05:50:11 2026 +0400 Let ST_OrderingEquals expose planner equality ST_OrderingEquals uses the same serialized comparison semantics as the geometry equality operator. Expose that equality to PostgreSQL planning for variable joins so duplicate-detection queries can use ordinary equality join strategies. Keep constant predicates on the existing spatial index support path, reject volatile argument expressions before simplification, and avoid adding bbox equality as a mandatory conjunct because non-finite boxes can make ~= narrower than exact serialized equality. Closes https://github.com/postgis/postgis/pull/875 diff --git a/NEWS b/NEWS index 5f3f75770..3c9d93010 100644 --- a/NEWS +++ b/NEWS @@ -72,6 +72,9 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed - #2804, #4315, [raster] Support two-argument ST_MapAlgebra callbacks and pass callback call data as actual arguments (Darafei Praliaskouski) - #2898, Document SQL function cost tiers for contributors + (Darafei Praliaskouski) + - GH-875, Allow ST_OrderingEquals joins to use hash and merge join plans + (Darafei Praliaskouski) - #6062, [topology] Stop using recursive snapping, for improved robustness (Sandro Santilli) - #6065, Improved winding order computation robustness for rings having collapsed elements (Sandro Santilli) diff --git a/postgis/gserialized_supportfn.c b/postgis/gserialized_supportfn.c index b6fe6dbba..aceb69b9a 100644 --- a/postgis/gserialized_supportfn.c +++ b/postgis/gserialized_supportfn.c @@ -34,6 +34,7 @@ #include "nodes/nodeFuncs.h" #include "nodes/makefuncs.h" #include "optimizer/optimizer.h" +#include "parser/parse_oper.h" #include "parser/parse_func.h" #include "utils/array.h" #include "utils/builtins.h" @@ -328,6 +329,55 @@ Datum postgis_index_supportfn(PG_FUNCTION_ARGS) */ postgis_initialize_cache(); + if (IsA(rawreq, SupportRequestSimplify)) + { + SupportRequestSimplify *req = (SupportRequestSimplify *)rawreq; + FuncExpr *clause = req->fcall; + IndexableFunction idxfn = {NULL, 0, 0, 0, 0}; + + if (needsSpatialIndex(clause->funcid, &idxfn) && idxfn.index == ST_ORDERINGEQUALS_IDX && + list_length(clause->args) == 2) + { + Node *leftarg = linitial(clause->args); + Node *rightarg = lsecond(clause->args); + Oid leftdatatype = exprType(leftarg); + Oid rightdatatype = exprType(rightarg); + Oid eqoproid = InvalidOid; + bool hashable = false; + + if (leftdatatype != rightdatatype) + PG_RETURN_POINTER((Node *)NULL); + + /* Keep constant predicates on the spatial index support path below. */ + if (!contain_var_clause(leftarg) || !contain_var_clause(rightarg)) + PG_RETURN_POINTER((Node *)NULL); + + if (contain_volatile_functions(leftarg) || contain_volatile_functions(rightarg)) + PG_RETURN_POINTER((Node *)NULL); + + /* ST_OrderingEquals uses the same gserialized_cmp equality as the = operator. */ + get_sort_group_operators(leftdatatype, false, true, false, NULL, &eqoproid, NULL, &hashable); + + if (!OidIsValid(eqoproid)) + PG_RETURN_POINTER((Node *)NULL); + + /* + * Do not add a bbox-equality conjunct here. Exact serialized equality can + * match non-finite coordinates that box2df equality rejects, so adding ~= + * would make the simplification narrower than ST_OrderingEquals. + */ + ret = (Node *)make_opclause(eqoproid, + BOOLOID, + false, + (Expr *)leftarg, + (Expr *)rightarg, + InvalidOid, + clause->inputcollid); + + PG_RETURN_POINTER(ret); + } + } + if (IsA(rawreq, SupportRequestSelectivity)) { SupportRequestSelectivity *req = (SupportRequestSelectivity *) rawreq; diff --git a/regress/core/regress_index.sql b/regress/core/regress_index.sql index 59c62f281..09c71254d 100644 --- a/regress/core/regress_index.sql +++ b/regress/core/regress_index.sql @@ -25,6 +25,22 @@ BEGIN END; $$; +CREATE OR REPLACE FUNCTION qplan_has(q text, pattern text) RETURNS boolean +LANGUAGE 'plpgsql' AS +$$ +DECLARE + exp TEXT; +BEGIN + FOR exp IN EXECUTE 'EXPLAIN ' || q + LOOP + IF exp ~ pattern THEN + RETURN true; + END IF; + END LOOP; + RETURN false; +END; +$$; + -- GiST index CREATE INDEX quick_gist on test using gist (the_geom); @@ -113,12 +129,82 @@ SELECT 'expr &&', id, estimate_error( 'select num from test where st_centroid(the_geom) && ' || box, tol ) FROM sample_queries ORDER BY id; +SELECT 'st_orderingequals_idx', + qnodes('select * from test where ST_OrderingEquals(the_geom, ST_MakePoint(0,0))'); + +CREATE TABLE st_orderingequals_volatile_calls (num integer); +INSERT INTO st_orderingequals_volatile_calls VALUES (0); + +CREATE OR REPLACE FUNCTION st_orderingequals_volatile_geom(g geometry) +RETURNS geometry +LANGUAGE 'plpgsql' VOLATILE AS $$ +BEGIN + UPDATE st_orderingequals_volatile_calls SET num = num + 1; + RETURN g; +END; +$$; + +SELECT 'st_orderingequals_volatile_count', count(*) +FROM (VALUES (ST_MakePoint(0,0))) AS q(g) +JOIN test t ON ST_OrderingEquals(st_orderingequals_volatile_geom(t.the_geom), q.g); + +SELECT 'st_orderingequals_volatile', num FROM st_orderingequals_volatile_calls; + +DROP FUNCTION st_orderingequals_volatile_geom(geometry); +DROP TABLE st_orderingequals_volatile_calls; + +CREATE SCHEMA st_orderingequals_search_path; +CREATE FUNCTION st_orderingequals_search_path.geometry_bbox_false(geometry, geometry) +RETURNS boolean +LANGUAGE 'sql' IMMUTABLE AS 'SELECT false'; +CREATE OPERATOR st_orderingequals_search_path.~= ( + LEFTARG = geometry, + RIGHTARG = geometry, + PROCEDURE = st_orderingequals_search_path.geometry_bbox_false, + COMMUTATOR = '~=' +); + +SET search_path = st_orderingequals_search_path, public; +SELECT 'st_orderingequals_qualified_bbox', count(*) +FROM (VALUES (ST_MakePoint(0,0))) AS g1(g) +JOIN (VALUES (ST_MakePoint(0,0))) AS g2(g) + ON ST_OrderingEquals(g1.g, g2.g); +RESET search_path; + +DROP OPERATOR st_orderingequals_search_path.~= (geometry, geometry); +DROP FUNCTION st_orderingequals_search_path.geometry_bbox_false(geometry, geometry); +DROP SCHEMA st_orderingequals_search_path; + +WITH geoms AS (SELECT ST_MakePoint(0, 'NaN'::float8) AS g) +SELECT 'st_orderingequals_nan_bbox', ST_OrderingEquals(g, g), g = g, g ~= g +FROM geoms; + +SELECT 'st_orderingequals_nan_join', count(*) +FROM (VALUES (ST_MakePoint(0, 'NaN'::float8))) AS g1(g) +JOIN (VALUES (ST_MakePoint(0, 'NaN'::float8))) AS g2(g) + ON ST_OrderingEquals(g1.g, g2.g); + +-- ST_OrderingEquals is exact geometry equality, so the planner should see +-- the hash/merge-joinable geometry operator instead of only a function filter. +set enable_nestloop = off; +SELECT 'st_orderingequals_join', + qplan_has( + 'SELECT t1.num FROM test t1, test t2 WHERE t1.num > t2.num AND ST_OrderingEquals(t1.the_geom, t2.the_geom)', + '(Hash|Merge) Join' + ), + qplan_has( + 'SELECT t1.num FROM test t1, test t2 WHERE t1.num > t2.num AND ST_OrderingEquals(t1.the_geom, t2.the_geom)', + 'Nested Loop' + ); +set enable_nestloop = on; + DROP TABLE test; DROP TABLE test_gist_idx_2d; DROP TABLE sample_queries; DROP FUNCTION estimate_error(text, int); +DROP FUNCTION qplan_has(text, text); DROP FUNCTION qnodes(text); set enable_indexscan = on; diff --git a/regress/core/regress_index_expected b/regress/core/regress_index_expected index 69d730748..70952dba5 100644 --- a/regress/core/regress_index_expected +++ b/regress/core/regress_index_expected @@ -22,4 +22,11 @@ expr &&|1|5+-5:true expr &&|2|912+-60:true expr &&|3|12505+-500:true expr &&|4|50000+-600:true +st_orderingequals_idx|Index Scan +st_orderingequals_volatile_count|0 +st_orderingequals_volatile|50000 +st_orderingequals_qualified_bbox|1 +st_orderingequals_nan_bbox|t|t|f +st_orderingequals_nan_join|1 +st_orderingequals_join|t|f _st_sortablehash|0|768602608280535040|768602608280535040 commit 1382c85d2510098e4917b133c0e0d9030e59e844 Author: Darafei Praliaskouski Date: Wed Jun 17 00:18:18 2026 +0400 doc: clarify standards support scope diff --git a/doc/introduction.xml b/doc/introduction.xml index b6da8dfdd..12f92ef9a 100644 --- a/doc/introduction.xml +++ b/doc/introduction.xml @@ -19,19 +19,28 @@
Standards Support - PostGIS implements parts of the - OGC Simple Features Access - and SQL/MM Spatial - standards. The geometry type, the Well-Known Text (WKT) and Well-Known - Binary (WKB) input/output functions, and many spatial accessors, - constructors, predicates, and processing functions follow those standards - where the manual marks them as OGC or SQL/MM compliant. + This manual marks individual functions as compliant with spatial + standards so users can tell which behavior is portable and which behavior is + a PostGIS extension. PostGIS implements the + OGC Simple Features + for SQL model, including the geometry type, Well-Known Text (WKT), + Well-Known Binary (WKB), and the common spatial accessors, constructors, + predicates, and processing functions. PostGIS also implements many + SQL/MM Spatial + types and functions. - PostGIS also includes widely used extensions beyond those standards. - Examples include Extended WKT (EWKT) and Extended WKB (EWKB), SRID metadata - in those extended formats, geography, raster, topology, curved geometry, - polyhedral surface, TIN, and many analysis functions. These extensions are - documented individually, but should not be read as OGC or SQL/MM + PostGIS supports geometry families defined by later standards, + including SQL/MM curved geometry and OGC Simple Features Access 1.2 + PolyhedralSurface, Triangle, and TIN. Support for these geometry families + is function-specific, and each function page documents the supported input + types and conformance level. + + PostGIS also includes widely used extensions and integrations. + Examples of PostGIS extensions include Extended WKT (EWKT), Extended WKB + (EWKB), SRID metadata in those extended formats, geography, and raster. + PostGIS also supports input and output exchange formats defined by other + standards, such as GeoJSON, GML, and KML. These features are documented + individually and should not be read as OGC Simple Features or SQL/MM requirements unless the specific function or format says so. When the implementation intentionally differs from a standard, or when commit a55fb44f7f7cd2033c734042558a26f0d0aa1103 Author: Darafei Praliaskouski Date: Thu Jun 11 09:03:02 2026 +0400 docs: clarify standards support diff --git a/doc/introduction.xml b/doc/introduction.xml index 20999fd59..b6da8dfdd 100644 --- a/doc/introduction.xml +++ b/doc/introduction.xml @@ -16,6 +16,30 @@ surfaces, networks), data source for desktop user interface tools for viewing and editing GIS data, and web-based access tools. +
+ Standards Support + + PostGIS implements parts of the + OGC Simple Features Access + and SQL/MM Spatial + standards. The geometry type, the Well-Known Text (WKT) and Well-Known + Binary (WKB) input/output functions, and many spatial accessors, + constructors, predicates, and processing functions follow those standards + where the manual marks them as OGC or SQL/MM compliant. + + PostGIS also includes widely used extensions beyond those standards. + Examples include Extended WKT (EWKT) and Extended WKB (EWKB), SRID metadata + in those extended formats, geography, raster, topology, curved geometry, + polyhedral surface, TIN, and many analysis functions. These extensions are + documented individually, but should not be read as OGC or SQL/MM + requirements unless the specific function or format says so. + + When the implementation intentionally differs from a standard, or when + a standard leaves behavior ambiguous, the relevant function page describes + the PostGIS behavior. The + chapter summarizes SQL/MM compliance and geometry-type support across + functions. +
Project Steering Committee commit 06dfb605f3184c6c23c352e0ed37fb785a2da343 Author: Darafei Praliaskouski Date: Mon Jun 22 00:12:53 2026 +0400 doc: explain repeated ring point validity Explain why consecutive repeated coordinates in a polygon boundary ring are treated as redundant vertices under the SFS curve model. References https://github.com/postgis/postgis/pull/1017#discussion_r3448971304 References #3425 diff --git a/doc/using_postgis_dataman.xml b/doc/using_postgis_dataman.xml index d5b91fc75..74f6fe1c5 100644 --- a/doc/using_postgis_dataman.xml +++ b/doc/using_postgis_dataman.xml @@ -1091,10 +1091,12 @@ SELECT - Consecutive repeated points in a polygon boundary ring are treated as - redundant vertices, and do not make the polygon invalid. Repeated points - that cause the boundary to self-intersect, self-touch, or collapse - still violate the validity rules. + Consecutive repeated points in a polygon boundary ring do not make the + ring non-simple. Under the SFS curve model, a curve is interpreted by a + continuous parameterization; consecutive equal coordinates are + topologically indistinguishable from a single vertex. PostGIS therefore + treats them as redundant vertices, so they do not make an otherwise valid + polygon invalid. ----------------------------------------------------------------------- Summary of changes: NEWS | 14 ++++ doc/Makefile.in | 6 +- doc/extras_topology.xml | 1 + doc/introduction.xml | 33 +++++++++ doc/reference_accessor.xml | 14 +++- doc/reference_raster.xml | 16 ++-- doc/reference_sfcgal.xml | 6 ++ doc/using_postgis_dataman.xml | 10 ++- liblwgeom/cunit/cu_surface.c | 32 ++++++++ liblwgeom/lwgeom.c | 17 +++-- liblwgeom/lwstroke.c | 15 ++-- postgis/geography.sql.in | 12 +-- postgis/gserialized_supportfn.c | 50 +++++++++++++ postgis/lwgeom_geos_predicates.c | 16 ++++ postgis/postgis.sql.in | 16 ++-- raster/rt_pg/rtpostgis.sql.in | 12 +-- raster/test/regress/rt_intersects.sql | 39 ++++++++++ raster/test/regress/rt_intersects_expected | 2 + regress/core/nurbs_eval.sql | 14 ++++ regress/core/nurbs_eval_expected | 4 + regress/core/regress.sql | 20 +++++ regress/core/regress_expected | 1 + regress/core/regress_index.sql | 86 ++++++++++++++++++++++ regress/core/regress_index_expected | 7 ++ regress/core/tickets.sql | 15 ++++ regress/core/tickets_expected | 1 + regress/core/triangulatedsurface.sql | 4 +- regress/core/triangulatedsurface_expected | 8 +- sfcgal/regress/regress_sfcgal.sql | 14 ++++ sfcgal/regress/regress_sfcgal_expected | 1 + .../sql/manage/FixCorruptTopoGeometryColumn.sql.in | 58 +++++++++++++-- .../regress/hooks/hook-after-upgrade-topology.sql | 2 +- .../regress/hooks/hook-before-upgrade-topology.sql | 3 +- 33 files changed, 488 insertions(+), 61 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Tue Jul 7 10:45:25 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 17:45:25 -0000 Subject: [PostGIS] #3425: Clarify PostGIS handling of repeated points wrt validity in docs In-Reply-To: <049.27893d3152c059cac1666ee83b62d99a@osgeo.org> References: <049.27893d3152c059cac1666ee83b62d99a@osgeo.org> Message-ID: <064.521fe55ddf41f3b91f57c569cb4a460f@osgeo.org> #3425: Clarify PostGIS handling of repeated points wrt validity in docs ----------------------------+------------------------------------------ Reporter: dbaston | Owner: Darafei Praliaskouski Type: enhancement | Status: closed Priority: low | Milestone: PostGIS Fund Me Component: documentation | Version: master Resolution: fixed | Keywords: ----------------------------+------------------------------------------ Comment (by Darafei Praliaskouski ): In [changeset:"06dfb605f3184c6c23c352e0ed37fb785a2da343/git" 06dfb60/git]: {{{#!CommitTicketReference repository="git" revision="06dfb605f3184c6c23c352e0ed37fb785a2da343" doc: explain repeated ring point validity Explain why consecutive repeated coordinates in a polygon boundary ring are treated as redundant vertices under the SFS curve model. References https://github.com/postgis/postgis/pull/1017#discussion_r3448971304 References #3425 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Tue Jul 7 10:45:25 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 17:45:25 -0000 Subject: [PostGIS] #4749: Improve behaviour of spatial predicates with GeometryCollection inputs In-Reply-To: <048.8616200a28b49441d2b561ae439bfc30@osgeo.org> References: <048.8616200a28b49441d2b561ae439bfc30@osgeo.org> Message-ID: <063.dd7da3037851936ffd82176e6c8c3cae@osgeo.org> #4749: Improve behaviour of spatial predicates with GeometryCollection inputs --------------------------+----------------------------- Reporter: mdavis | Owner: pramsey Type: enhancement | Status: new Priority: medium | Milestone: PostGIS Fund Me Component: postgis | Version: 2.5.x -- EOL Resolution: | Keywords: --------------------------+----------------------------- Comment (by Darafei Praliaskouski ): In [changeset:"62db0d6afd6ef91940ab05cffa3299caa754be11/git" 62db0d6a/git]: {{{#!CommitTicketReference repository="git" revision="62db0d6afd6ef91940ab05cffa3299caa754be11" postgis: fast-path point collection ST_Disjoint References #4749 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Tue Jul 7 10:45:25 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 17:45:25 -0000 Subject: [PostGIS] #4463: PostGIS raster ST_Intersects regression with pg12 In-Reply-To: <046.edc47d474781eb1c9280fffc68e39e76@osgeo.org> References: <046.edc47d474781eb1c9280fffc68e39e76@osgeo.org> Message-ID: <061.dbdfd14f570c8acd3aeb84c8081d3b3d@osgeo.org> #4463: PostGIS raster ST_Intersects regression with pg12 ---------------------+----------------------------- Reporter: robe | Owner: robe Type: defect | Status: closed Priority: high | Milestone: PostGIS Fund Me Component: raster | Version: master Resolution: fixed | Keywords: ---------------------+----------------------------- Changes (by Darafei Praliaskouski ): * resolution: => fixed * status: new => closed Comment: In [changeset:"5e3fb509b91046edda39d2202b045550dd81ff35/git" 5e3fb509/git]: {{{#!CommitTicketReference repository="git" revision="5e3fb509b91046edda39d2202b045550dd81ff35" raster: lower ST_Intersects wrapper cost Closes #4463 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Tue Jul 7 10:45:25 2026 From: trac at osgeo.org (PostGIS) Date: Tue, 07 Jul 2026 17:45:25 -0000 Subject: [PostGIS] #3676: Add LEAKPROOF indication in functions In-Reply-To: <046.d29bb0f5310361b8b90bc34f608408d3@osgeo.org> References: <046.d29bb0f5310361b8b90bc34f608408d3@osgeo.org> Message-ID: <061.21a5c200aeff10853aac491b58e12521@osgeo.org> #3676: Add LEAKPROOF indication in functions ----------------------+----------------------------- Reporter: strk | Owner: robe Type: defect | Status: new Priority: low | Milestone: PostGIS Fund Me Component: postgis | Version: master Resolution: | Keywords: ----------------------+----------------------------- Comment (by Darafei Praliaskouski ): In [changeset:"2045b9774fec76e87c758276459c0b1d94632c81/git" 2045b97/git]: {{{#!CommitTicketReference repository="git" revision="2045b9774fec76e87c758276459c0b1d94632c81" postgis: mark btree comparisons leakproof The geometry and geography btree comparison support functions use serialized-value comparison and hashing without GEOS or GDAL calls. Mark this audited subset LEAKPROOF so security-barrier relations can use these operators more effectively. References #3676 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Tue Jul 7 18:39:14 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 18:39:14 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-76-gd5810ebc4 Message-ID: <20260708013915.4614A1A8791@trac.osgeo.org> 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 d5810ebc48c2b239ea1298a42c5e86d95055431b (commit) from ebf8cdcb257bd46e782954066edc604f9a6572d5 (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 d5810ebc48c2b239ea1298a42c5e86d95055431b Author: Teramoto Ikuhiro Date: Wed Jul 8 01:25:34 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 93.7% (5670 of 6049 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 3bc454763..5ab004a47 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-07 03:39+0000\n" +"PO-Revision-Date: 2026-07-08 01:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -11886,7 +11886,7 @@ msgstr "" msgid "" "This example converts the extent back into a geometry and renders its " "extended text representation." -msgstr "" +msgstr "??????????????????????????????????" #. Tag: para #, no-c-format @@ -11915,7 +11915,7 @@ msgstr "Changed: 2.0.0 ??????ST_Extent3D????????? #. Tag: para #, no-c-format msgid "This example returns the extent of several elevated CircularStrings." -msgstr "" +msgstr "??????????CIRCULARSTRING?????????????????" #. Tag: para #, no-c-format @@ -11997,7 +11997,7 @@ msgstr "" msgid "" "Observe THIS DOES NOT WORK because it will try to auto-cast the string " "representation to a BOX3D." -msgstr "" +msgstr "?????BOX3D??????????????*?????*?????????" #. Tag: para #, no-c-format @@ -12160,6 +12160,8 @@ msgstr "" #, no-c-format msgid "Returns the X size of a 2D or 3D bounding box or a geometry." msgstr "" +"2?????3????????????????????????X????????" +"????" #. Tag: para #, no-c-format @@ -12167,6 +12169,9 @@ msgid "" "Returns the X size of a 2D or 3D bounding box or a geometry, computed as " "ST_XMax(aGeomorBox2DorBox3D) - ST_XMin(aGeomorBox2DorBox3D)." msgstr "" +"2?????3????????????????????????X????????" +"???? ST_XMax(aGeomorBox2DorBox3D) - ST_XMin(aGeomorBox2DorBox3D)?????????" #. Tag: para #, no-c-format @@ -12174,11 +12179,15 @@ msgid "" ", , , , " msgstr "" +", , , , " #. Tag: refpurpose #, no-c-format msgid "Returns the Y size of a 2D or 3D bounding box or a geometry." msgstr "" +"2?????3????????????????????????Y????????" +"????" #. Tag: para #, no-c-format @@ -12186,6 +12195,9 @@ msgid "" "Returns the Y size of a 2D or 3D bounding box or a geometry, computed as " "ST_YMax(aGeomorBox2DorBox3D) - ST_YMin(aGeomorBox2DorBox3D)." msgstr "" +"2?????3????????????????????????Y????????" +"???? ST_YMax(aGeomorBox2DorBox3D) - ST_YMin(aGeomorBox2DorBox3D)?????????" #. Tag: para #, no-c-format @@ -12193,11 +12205,15 @@ msgid "" ", , , , " msgstr "" +", , , , " #. Tag: refpurpose #, no-c-format msgid "Returns the Z size of a 2D or 3D bounding box or a geometry." msgstr "" +"2?????3????????????????????????Z????????" +"????" #. Tag: para #, no-c-format @@ -12205,6 +12221,9 @@ msgid "" "Returns the Z size of a 2D or 3D bounding box or a geometry, computed as " "ST_ZMax(aGeomorBox2DorBox3D) - ST_ZMin(aGeomorBox2DorBox3D)." msgstr "" +"2?????3????????????????????????Z????????" +"????ST_ZMax(aGeomorBox2DorBox3D) - ST_ZMin(aGeomorBox2DorBox3D)?????????" #. Tag: para #, no-c-format @@ -12212,6 +12231,8 @@ msgid "" ", , , , " msgstr "" +", , , , " #. Tag: refpurpose #, no-c-format @@ -12222,7 +12243,7 @@ msgstr "??????M???????????" #, no-c-format msgid "" "Returns the M minima of a geometry, or null if the geometry lacks M values." -msgstr "" +msgstr "M???????????M????????NULL??????" #. Tag: para #, no-c-format @@ -12232,17 +12253,21 @@ msgid "" "linkend=\"ST_ZMax\"/>, , " msgstr "" +", , , , , , , " #. Tag: refpurpose #, no-c-format msgid "Returns the M maxima of a geometry." -msgstr "" +msgstr "M???????????" #. Tag: para #, no-c-format msgid "" "Returns the M maxima of a geometry, or null if the geometry lacks M values." -msgstr "" +msgstr "M???????????M????????NULL??????" #. Tag: para #, no-c-format @@ -12252,11 +12277,15 @@ msgid "" "linkend=\"ST_ZMax\"/>, , " msgstr "" +", , , , , , , " #. Tag: refpurpose #, no-c-format msgid "Returns the M size of a geometry." -msgstr "" +msgstr "???????M???????????" #. Tag: para #, no-c-format @@ -12264,6 +12293,8 @@ msgid "" "Returns the M size of a geometry, computed as ST_MMax(geom) - " "ST_MMin(geom), or null if the geometry lacks M values." msgstr "" +"???????M???????????ST_MMax(geom) - ST_MMin(geom)?????????M????????NULL??????" #. Tag: para #, no-c-format @@ -12271,6 +12302,8 @@ msgid "" ", , , , " msgstr "" +", , , , " #. Tag: title #, no-c-format @@ -13182,22 +13215,22 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example creates a point with an unknown SRID." -msgstr "" +msgstr "?????SRID??????????????" #. Tag: para #, no-c-format msgid "This example creates a point in the WGS 84 geodetic CRS." -msgstr "" +msgstr "?????WGS 84??????CRS????????????" #. Tag: para #, no-c-format msgid "This example creates a 3D point with altitude." -msgstr "" +msgstr "?????Z????3?????????????" #. Tag: para #, no-c-format msgid "This example returns the Z coordinate of a point." -msgstr "" +msgstr "??????????Z???????" #. Tag: para #, no-c-format @@ -13273,7 +13306,7 @@ msgstr "" #, no-c-format msgid "" "Creates a Polygon or CurvePolygon from a shell and optional list of holes." -msgstr "" +msgstr "????????????????????????????????" #. Tag: para #, no-c-format @@ -13283,11 +13316,15 @@ msgid "" "CircularStrings, CompoundCurves, or NURBSCurves (rings). If any input ring " "is curved, the result is a CurvePolygon." msgstr "" +"?????????????????????????????????" +"??????????LINESTRING?CIRCULARSTRING?COMPOUNDCURVE?NURBSCURVE??" +"??????????????????????????????????" +"CURVEPOLYGON??????" #. Tag: para #, no-c-format msgid "Variant 1: Accepts one shell ring." -msgstr "" +msgstr "??1: ????????????????" #. Tag: para #, no-c-format @@ -13296,6 +13333,9 @@ msgid "" "array of inner (hole) rings. A geometry array can be constructed using the " "PostgreSQL array_agg(), ARRAY[] or ARRAY() constructs." msgstr "" +"?? 2: ??????????? (?)???" +"??????????????????PostgreSQL?array_agg()?ARRAY[]?ARRAY()" +"?????????????" #. Tag: para #, no-c-format @@ -13311,7 +13351,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Enhanced: 3.7.0 - Support for curved input rings was introduced." -msgstr "" +msgstr "Enhanced: 3.7.0 - ?????????????????????" #. Tag: title #, no-c-format @@ -13345,7 +13385,7 @@ msgstr "M??????????????????????? #. Tag: para #, no-c-format msgid "Create a CurvePolygon from a CircularString shell." -msgstr "" +msgstr "CURVEPOLYGON??CIRCULARSTRING?????????????" #. Tag: title #, no-c-format @@ -14039,6 +14079,8 @@ msgid "" "Creates a NURBS (Non-Uniform Rational B-Spline) curve from control points, " "optional weights, and optional knot vector." msgstr "" +"?????NURBS (?????B?????)???????????????" +"???????????????" #. Tag: para #, no-c-format @@ -14048,6 +14090,9 @@ msgid "" "precise control over curve shape through control points, weights, and knot " "values." msgstr "" +"????????????NURBS (?????B?????)????????????" +"??NURBS??????????????????????????????????" +"?????????????" #. Tag: para #, no-c-format @@ -14055,6 +14100,8 @@ msgid "" "The degree parameter specifies the polynomial degree of " "the curve (must be between 1 and 10). Higher degrees produce smoother curves." msgstr "" +"degree????????????????????? (1?10?" +"???????????)???????????????????" #. Tag: para #, no-c-format @@ -16178,19 +16225,19 @@ msgstr "???: ?????2.0.0?\"ST_Shift_Longitude\"????? #. Tag: para #, no-c-format msgid "This example performs a forward longitude shift on a single point." -msgstr "" +msgstr "????????????????? (180??360??-180??0??)???????" #. Tag: para #, no-c-format msgid "This example performs a reverse longitude shift on a single point." -msgstr "" +msgstr "????????????????? (-180??0???180??360??)???????" #. Tag: para #, no-c-format msgid "" "This example shows that LineStrings are shifted only where coordinates " "require it." -msgstr "" +msgstr "?????LINESTRING?????????????????????" #. Tag: refpurpose #, no-c-format @@ -16229,6 +16276,8 @@ msgid "" "Move all components of the given geometries whose bounding box. Falls " "completely on the left of x=0 to +360." msgstr "" +"??????????????????????????????????????X" +"???????0??360????????????????" #. Tag: refpurpose #, no-c-format @@ -16297,12 +16346,12 @@ msgstr "Availability: 1.1.0 - Z??M????????" #. Tag: para #, no-c-format msgid "This example snaps geometries to a precision grid of 10^-3." -msgstr "" +msgstr "????????????10^3?????????????????" #. Tag: para #, no-c-format msgid "This example snaps a 4D geometry." -msgstr "" +msgstr "?????4?????????????????" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 91 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 21 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Tue Jul 7 20:39:21 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 20:39:21 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-77-gfc946c015 Message-ID: <20260708033921.86B981AA995@trac.osgeo.org> 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 fc946c0151f262c09b647bfc576f0adc6c3a316e (commit) from d5810ebc48c2b239ea1298a42c5e86d95055431b (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 fc946c0151f262c09b647bfc576f0adc6c3a316e Author: Teramoto Ikuhiro Date: Wed Jul 8 02:45:50 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 94.1% (5694 of 6049 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 5ab004a47..6bbda3614 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-08 01:39+0000\n" +"PO-Revision-Date: 2026-07-08 03:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -10563,7 +10563,7 @@ msgstr "" "?????????????NULL??????" #. Tag: para -#, fuzzy, no-c-format +#, no-c-format msgid "" "Index is 1-based as for OGC specs since version 0.8.0. Backward indexing " "(negative index) is not in OGC. Previous versions implemented this as 0-" @@ -10775,7 +10775,7 @@ msgid "Geometry without M dimension returns NULL" msgstr "M?????????????????NULL?????" #. Tag: para -#, fuzzy, no-c-format +#, no-c-format msgid ", , " msgstr ", , " @@ -10818,7 +10818,7 @@ msgid "End M value of a NURBSCurve" msgstr "NURBSCURVE????M?" #. Tag: para -#, fuzzy, no-c-format +#, no-c-format msgid ", , " msgstr ", , " @@ -11359,10 +11359,10 @@ msgstr "" "??????????????????NURBS?????????????????" #. Tag: para -#, fuzzy, no-c-format +#, no-c-format msgid "This example checks the knots of a curve using the default knot vector." msgstr "" -"?????????????????????????????????????" +"??????????????????????????????????????" "??" #. Tag: para @@ -11491,11 +11491,11 @@ msgstr "" "linkend=\"ST_NurbsCurveIsRational\"/>" #. Tag: refpurpose -#, fuzzy, no-c-format +#, no-c-format msgid "" "Evaluates a NURBS curve at a specific parameter value and returns the " "resulting point." -msgstr "NURBS???????????????????????????????" +msgstr "NURBS??????????????????????????????????" #. Tag: para #, no-c-format @@ -14110,6 +14110,8 @@ msgid "" "the control polygon. The number of control points must be at least " "degree + 1." msgstr "" +"control_points????????????LINESTRING?????" +"????????????????degree + 1???????" #. Tag: para #, no-c-format @@ -14118,6 +14120,9 @@ msgid "" "control point. All weights must be positive. If NULL or omitted, uniform " "weights (1.0) are used, resulting in a non-rational B-spline." msgstr "" +"????????weights?????????????????" +"?????????????????????????NULL???????????" +"??????? 1.0 ????????????B???????????" #. Tag: para #, no-c-format @@ -14127,26 +14132,31 @@ msgid "" "If provided, the knot vector must have exactly (npoints + " "degree + 1) elements and must be non-decreasing." msgstr "" +"????????knots??????????????????" +"NULL????????????????????????????????????" +"??????????????????????(npoints + " +"degree + 1)???????????????????????" +"??????" #. Tag: para #, no-c-format msgid "This example creates a degree-2 NURBS curve with uniform weights." -msgstr "" +msgstr "???????2?NURBS?????????????????" #. Tag: para #, no-c-format msgid "This example creates a rational NURBS curve with custom weights." -msgstr "" +msgstr "????????NURBS?????????????????????" #. Tag: para #, no-c-format msgid "This example creates a NURBS curve with custom weights and knots." -msgstr "" +msgstr "?????NURBS??????????????????????????????" #. Tag: para #, no-c-format msgid ", , " -msgstr "" +msgstr ", , " #. Tag: title #, no-c-format @@ -14261,7 +14271,7 @@ msgstr "???????????????????????? #. Tag: para #, no-c-format msgid "This example tests the entire table for coverage validity." -msgstr "" +msgstr "?????????????????????????????" #. Tag: para #, no-c-format @@ -14403,7 +14413,7 @@ msgstr "Availability: 3.6.0 - GEOS >= 3.14.0?????" #. Tag: para #, no-c-format msgid "This example populates the input table." -msgstr "" +msgstr "?????????????????????????" #. Tag: para #, no-c-format @@ -14413,7 +14423,7 @@ msgstr "?????????????" #. Tag: para #, no-c-format msgid "This example shows that the coverage is invalid." -msgstr "" +msgstr "??????????????????????????" #. Tag: para #, no-c-format @@ -14425,7 +14435,7 @@ msgstr "????????????" msgid "" "This example cleans the coverage by merging gaps with width less than or " "equal to 1." -msgstr "" +msgstr "???????1????????????????????????????" #. Tag: para #, no-c-format @@ -14568,12 +14578,12 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example returns all unique edges of a coverage." -msgstr "" +msgstr "??????????????????????????" #. Tag: para #, no-c-format msgid "This example returns only the interior shared edges of a coverage." -msgstr "" +msgstr "???????????????????????????" #. Tag: para #, no-c-format @@ -14995,12 +15005,12 @@ msgstr "&sqlmm_compliant; SQL-MM 3: 7.1.7" #. Tag: para #, no-c-format msgid "This example uses 3D input." -msgstr "" +msgstr "?????3????????????" #. Tag: para #, no-c-format msgid "Use only 2 segments to approximate quarter circle." -msgstr "" +msgstr "???????????????????????" #. Tag: para #, no-c-format @@ -15008,6 +15018,8 @@ msgid "" "Ensure approximated line is no further than 20 units away from. Original " "curve, and make the result direction-neutral." msgstr "" +"??????????20???????????????????????????" +"??????????" #. Tag: refpurpose #, no-c-format @@ -15097,7 +15109,7 @@ msgstr "Changed: 3.1.0. 0???Z??????????????? #. Tag: para #, no-c-format msgid "Nothing happens to an already 3D geometry." -msgstr "" +msgstr "??3?????????????????????????" #. Tag: para #, no-c-format @@ -15227,7 +15239,7 @@ msgstr "Changed: 2.1.0 2.0.x???ST_Force_Collection???????? #. Tag: para #, no-c-format msgid "This example uses a PolyhedralSurface." -msgstr "" +msgstr "???????????????????" #. Tag: refpurpose #, no-c-format @@ -19000,7 +19012,7 @@ msgid "" msgstr "" #. Tag: para -#, fuzzy, no-c-format +#, no-c-format msgid "" ", , , " "" ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 58 +++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 23 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Tue Jul 7 23:39:14 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 7 Jul 2026 23:39:14 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-78-gdc565b619 Message-ID: <20260708063915.22A731ACC1F@trac.osgeo.org> 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 dc565b619633d15b2ccd262ca70b00c1f5ee6c4d (commit) from fc946c0151f262c09b647bfc576f0adc6c3a316e (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 dc565b619633d15b2ccd262ca70b00c1f5ee6c4d Author: Teramoto Ikuhiro Date: Wed Jul 8 05:49:34 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 94.2% (5701 of 6049 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 6bbda3614..4097b2ad5 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-08 03:39+0000\n" +"PO-Revision-Date: 2026-07-08 06:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -15401,7 +15401,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example uses 2D input." -msgstr "" +msgstr "?????2????????????" #. Tag: refpurpose #, no-c-format @@ -16167,13 +16167,13 @@ msgstr "Updated 2.3.0 : ??????" #. Tag: para #, no-c-format msgid "Change first point in line string from -1 3 to -1 1." -msgstr "" +msgstr "???? (-1 3)?? (-1 1)???????" #. Tag: para #, no-c-format msgid "" "Change last point in a line string (let's play with 3D linestring this time)" -msgstr "" +msgstr "????????? (???3?????????????????)" #. Tag: para #, no-c-format @@ -16371,6 +16371,8 @@ msgid "" "With a 4D geometry - the ST_SnapToGrid(geom,size) only touches x and y " "coords but keeps m and z the same." msgstr "" +"4???????????? - ST_SnapToGrid(geom,size)?X??Y????????" +"?M??Z???????????" #. Tag: para #, no-c-format @@ -16505,7 +16507,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example scales the M value by 2." -msgstr "" +msgstr "?????M??2????????" #. Tag: title #, no-c-format @@ -16841,11 +16843,13 @@ msgid "" "Set and reset postgis.gdal_enabled_drivers for the " "current session." msgstr "" +"??????????postgis.gdal_enabled_drivers?????" +"???????" #. Tag: para #, no-c-format msgid "Set specific drivers for all new connections to a database." -msgstr "" +msgstr "???????????????????????????????" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Wed Jul 8 14:10:49 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 8 Jul 2026 14:10:49 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-79-g63de00830 Message-ID: <20260708211050.1CAC91A5CF6@trac.osgeo.org> 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 63de00830dc7afb6102a095cb1a41514e9064c1f (commit) from dc565b619633d15b2ccd262ca70b00c1f5ee6c4d (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 63de00830dc7afb6102a095cb1a41514e9064c1f Author: Paul Ramsey Date: Wed Jul 8 14:10:37 2026 -0700 Fix non-topology regression tests for GEOS >= 3.15 diff --git a/liblwgeom/cunit/cu_wrapx.c b/liblwgeom/cunit/cu_wrapx.c index a5ca09a28..79e707238 100644 --- a/liblwgeom/cunit/cu_wrapx.c +++ b/liblwgeom/cunit/cu_wrapx.c @@ -83,9 +83,11 @@ static void test_lwgeom_wrapx(void) lwgeom_free(tmp); CU_ASSERT_FATAL(ret != NULL); obt_wkt = lwgeom_to_ewkt(ret); - tmp = lwgeom_from_wkt( - "MULTILINESTRING((0 0,8 0),(-2 0,0 0))", - LW_PARSER_CHECK_NONE); +#if POSTGIS_GEOS_VERSION < 31500 + tmp = lwgeom_from_wkt("MULTILINESTRING((0 0,8 0),(-2 0,0 0))",LW_PARSER_CHECK_NONE); +#else + tmp = lwgeom_from_wkt("LINESTRING(-2 0,0 0,8 0)",LW_PARSER_CHECK_NONE); +#endif tmp2 = lwgeom_normalize(tmp); lwgeom_free(tmp); exp_wkt = lwgeom_to_ewkt(tmp2); diff --git a/regress/core/fixedoverlay.sql b/regress/core/fixedoverlay.sql index 45d3b8979..2377f5667 100644 --- a/regress/core/fixedoverlay.sql +++ b/regress/core/fixedoverlay.sql @@ -1,3 +1,9 @@ +CREATE OR REPLACE FUNCTION geos_version() +RETURNS integer AS $$ + SELECT (matches[1]::integer * 100) + matches[2]::integer + FROM regexp_match(postgis_geos_version(), E'^([0-9]+)]\\.([0-9]+)') AS matches; +$$ LANGUAGE 'sql' IMMUTABLE; + SELECT 'intersection', ST_AsText(ST_Intersection( 'LINESTRING(0 0, 9 0)'::geometry, 'LINESTRING(7 0, 13.2 0)'::geometry, @@ -13,14 +19,7 @@ SELECT 'symdifference', ST_AsText(ST_SymDifference( 'LINESTRING(7 0, 13.2 0)'::geometry, 2)); -SELECT 'union', ST_AsText(ST_Union( - 'LINESTRING(0.5 0, 9 0)'::geometry, - 'LINESTRING(7 0, 13.2 0)'::geometry, - 2)); -SELECT 'unaryunion', ST_AsText(ST_UnaryUnion( - 'GEOMETRYCOLLECTION(LINESTRING(0.5 0, 9 0), LINESTRING(7 0, 13.2 0))'::geometry, -2)); WITH n AS (SELECT geom FROM ST_Subdivide( @@ -28,3 +27,6 @@ FROM ST_Subdivide( 6, 1) AS geom) SELECT 'subdivide', count(geom), ST_AsText(ST_Normalize(ST_Union(geom))) FROM n; + + +DROP FUNCTION geos_version(); diff --git a/regress/core/fixedoverlay_expected b/regress/core/fixedoverlay_expected index 4f03bb27b..835d8b92c 100644 --- a/regress/core/fixedoverlay_expected +++ b/regress/core/fixedoverlay_expected @@ -1,6 +1,4 @@ intersection|LINESTRING(8 0,10 0) difference|LINESTRING(0 0,8 0) symdifference|MULTILINESTRING((0 0,8 0),(10 0,14 0)) -union|MULTILINESTRING((0 0,8 0),(8 0,10 0),(10 0,14 0)) -unaryunion|MULTILINESTRING((0 0,8 0),(8 0,10 0),(10 0,14 0)) subdivide|3|MULTIPOLYGON(((0 0,0 10,10 10,10 6,100 5,10 5,10 0,0 0)),((100 0,100 5,100 10,110 10,110 0,100 0))) diff --git a/regress/core/geos315.sql b/regress/core/geos315.sql index b30f0657a..5391bc22f 100644 --- a/regress/core/geos315.sql +++ b/regress/core/geos315.sql @@ -3,43 +3,43 @@ -- Connected graph (all one cluster) SELECT 'connected', id, ST_MinimumSpanningTree(geom) OVER (ORDER BY id) FROM (VALUES - (1, 'LINESTRING(0 0,1 0)'::geometry), - (2, 'LINESTRING(0 0,0 1)'::geometry), - (3, 'LINESTRING(1 1,0 1)'::geometry), - (4, 'LINESTRING(1 1,1 0)'::geometry), - (5, 'LINESTRING(0 0,1 1)'::geometry), - (6, 'LINESTRING(1 0,0 1)'::geometry) + (1, 'LINESTRING(0 0,1 0)'::geometry), + (2, 'LINESTRING(0 0,0 1)'::geometry), + (3, 'LINESTRING(1 1,0 1)'::geometry), + (4, 'LINESTRING(1 1,1 0)'::geometry), + (5, 'LINESTRING(0 0,1 1)'::geometry), + (6, 'LINESTRING(1 0,0 1)'::geometry) ) AS t(id, geom); -- Disconnected graph (two clusters) SELECT 'disconnected', id, ST_MinimumSpanningTree(geom) OVER (ORDER BY id) FROM (VALUES - (1, 'LINESTRING(0 0,1 0)'::geometry), - (2, 'LINESTRING(0 0,0 1)'::geometry), - (3, 'LINESTRING(1 1,0 1)'::geometry), - (4, 'LINESTRING(11 11,11 10)'::geometry), - (5, 'LINESTRING(10 10,11 11)'::geometry), - (6, 'LINESTRING(11 10,10 11)'::geometry) + (1, 'LINESTRING(0 0,1 0)'::geometry), + (2, 'LINESTRING(0 0,0 1)'::geometry), + (3, 'LINESTRING(1 1,0 1)'::geometry), + (4, 'LINESTRING(11 11,11 10)'::geometry), + (5, 'LINESTRING(10 10,11 11)'::geometry), + (6, 'LINESTRING(11 10,10 11)'::geometry) ) AS t(id, geom); -- NULL handling SELECT 'nulls', id, ST_MinimumSpanningTree(geom) OVER (ORDER BY id), ST_AsText(geom) FROM (VALUES - (1, 'LINESTRING(0 0,1 0)'::geometry), - (2, 'LINESTRING(0 0,0 1)'::geometry), - (3, NULL::geometry), - (4, 'LINESTRING(1 1,1 0)'::geometry), - (5, 'LINESTRING(0 0,1 1)'::geometry), - (6, 'LINESTRING(1 0,0 1)'::geometry) + (1, 'LINESTRING(0 0,1 0)'::geometry), + (2, 'LINESTRING(0 0,0 1)'::geometry), + (3, NULL::geometry), + (4, 'LINESTRING(1 1,1 0)'::geometry), + (5, 'LINESTRING(0 0,1 1)'::geometry), + (6, 'LINESTRING(1 0,0 1)'::geometry) ) AS t(id, geom); -- Empty geometry handling SELECT 'empty', id, ST_MinimumSpanningTree(geom) OVER (ORDER BY id), ST_AsText(geom) FROM (VALUES - (1, 'LINESTRING(0 0,1 0)'::geometry), - (2, 'LINESTRING EMPTY'::geometry), - (3, 'LINESTRING EMPTY'::geometry), - (4, 'LINESTRING(1 1,1 0)'::geometry), - (5, 'LINESTRING(0 0,1 1)'::geometry), - (6, 'LINESTRING(1 0,0 1)'::geometry) + (1, 'LINESTRING(0 0,1 0)'::geometry), + (2, 'LINESTRING EMPTY'::geometry), + (3, 'LINESTRING EMPTY'::geometry), + (4, 'LINESTRING(1 1,1 0)'::geometry), + (5, 'LINESTRING(0 0,1 1)'::geometry), + (6, 'LINESTRING(1 0,0 1)'::geometry) ) AS t(id, geom); -- ST_CoverageEdges @@ -67,3 +67,14 @@ SELECT 'coverage edges array' AS test, FROM coverage_edges WHERE id = 6; DROP TABLE coverage_edges; + + +-- FROM fixedoverlay +SELECT 'union', ST_AsText(ST_Union( + 'LINESTRING(0.5 0, 9 0)'::geometry, + 'LINESTRING(7 0, 13.2 0)'::geometry, + 2)); + +SELECT 'unaryunion', ST_AsText(ST_UnaryUnion( + 'GEOMETRYCOLLECTION(LINESTRING(0.5 0, 9 0), LINESTRING(7 0, 13.2 0))'::geometry, +2)); diff --git a/regress/core/geos315_expected b/regress/core/geos315_expected index 9eae3c024..8df98e9fb 100644 --- a/regress/core/geos315_expected +++ b/regress/core/geos315_expected @@ -26,3 +26,5 @@ coverage edges all|MULTILINESTRING((10 10,10 0),(10 0,0 0,0 10,10 10),(10 10,20 coverage edges exterior|MULTILINESTRING((10 0,0 0,0 10,10 10),(10 10,20 10,20 0,10 0)) coverage edges interior|MULTILINESTRING((10 10,10 0)) coverage edges array|MULTILINESTRING((10 10,10 0),(10 0,0 0,0 10,10 10),(10 10,20 10,20 0,10 0)) +union|LINESTRING(0 0,8 0,10 0,14 0) +unaryunion|LINESTRING(0 0,8 0,10 0,14 0) diff --git a/regress/core/wrapx.sql b/regress/core/wrapx.sql index d08dc9c9c..321958d52 100644 --- a/regress/core/wrapx.sql +++ b/regress/core/wrapx.sql @@ -1,94 +1,112 @@ -CREATE FUNCTION test(geom geometry, wrap float8, amount float8, exp geometry) +CREATE FUNCTION test_wrapx(geom geometry, wrap float8, amount float8, exp geometry) RETURNS text AS $$ DECLARE - obt geometry; + obt geometry; BEGIN - obt = ST_Normalize(ST_WrapX(geom, wrap, amount)); - IF ST_OrderingEquals(obt, exp) THEN - RETURN 'OK'; - ELSE - RETURN 'KO:' || ST_AsEWKT(obt) || ' != ' || ST_AsEWKT(exp); - END IF; + obt = ST_Normalize(ST_WrapX(geom, wrap, amount)); + IF ST_OrderingEquals(obt, exp) THEN + RETURN 'OK'; + ELSE + RETURN 'KO:' || ST_AsEWKT(obt) || ' != ' || ST_AsEWKT(exp); + END IF; END -$$ LANGUAGE plpgsql; +$$ LANGUAGE 'plpgsql'; -SELECT 'P1', test( - 'POINT(0 0)', 2, 10, - 'POINT(10 0)'); +CREATE OR REPLACE FUNCTION geos_version() +RETURNS integer AS $$ + SELECT (matches[1]::integer * 100) + matches[2]::integer + FROM regexp_match(postgis_geos_version(), E'^([0-9]+)]\\.([0-9]+)') AS matches; +$$ LANGUAGE 'sql' IMMUTABLE; -SELECT 'P2', test( - 'POINT(0 0)', 2, -10, - 'POINT(0 0)'); -SELECT 'P3', test( - 'POINT(0 0)', -2, -10, - 'POINT(-10 0)'); +SELECT 'P1', test_wrapx( + 'POINT(0 0)', 2, 10, + 'POINT(10 0)'); -SELECT 'L1', test( - 'LINESTRING(0 0,10 0)', 2, 10, - --'LINESTRING(2 0,12 0)'); - 'MULTILINESTRING((10 0,12 0),(2 0,10 0))'); +SELECT 'P2', test_wrapx( + 'POINT(0 0)', 2, -10, + 'POINT(0 0)'); -SELECT 'L2', test( - 'LINESTRING(0 0,10 0)', 8, -10, - 'MULTILINESTRING((0 0,8 0),(-2 0,0 0))'); +SELECT 'P3', test_wrapx( + 'POINT(0 0)', -2, -10, + 'POINT(-10 0)'); -SELECT 'L3', test( - 'LINESTRING(0 0,10 0)', 0, 10, - 'LINESTRING(0 0,10 0)'); +SELECT 'L1', test_wrapx( + 'LINESTRING(0 0,10 0)', 2, 10, + CASE WHEN geos_version() >= 315 + THEN 'LINESTRING(2 0,10 0,12 0)' + ELSE 'MULTILINESTRING((10 0,12 0),(2 0,10 0))' + END); -SELECT 'L4', test( - 'LINESTRING(0 0,10 0)', 10, -10, - 'LINESTRING(0 0,10 0)'); +SELECT 'L2', test_wrapx( + 'LINESTRING(0 0,10 0)', 8, -10, + CASE WHEN geos_version() >= 315 + THEN 'LINESTRING(-2 0,0 0,8 0)' + ELSE 'MULTILINESTRING((0 0,8 0),(-2 0,0 0))' + END); -SELECT 'ML1', test( - 'MULTILINESTRING((-10 0,0 0),(0 0,10 0))', 0, 20, - 'MULTILINESTRING((10 0,20 0),(0 0,10 0))'); +SELECT 'L3', test_wrapx( + 'LINESTRING(0 0,10 0)', 0, 10, + 'LINESTRING(0 0,10 0)'); -SELECT 'ML2', test( - 'MULTILINESTRING((-10 0,0 0),(0 0,10 0))', 0, -20, - 'MULTILINESTRING((-10 0,0 0),(-20 0,-10 0))'); +SELECT 'L4', test_wrapx( + 'LINESTRING(0 0,10 0)', 10, -10, + 'LINESTRING(0 0,10 0)'); -SELECT 'ML3', test( - 'MULTILINESTRING((10 0,5 0),(-10 0,0 0),(0 0,5 0))', 0, -20, - 'MULTILINESTRING((-10 0,0 0),(-15 0,-10 0),(-20 0,-15 0))'); +SELECT 'ML1', test_wrapx( + 'MULTILINESTRING((-10 0,0 0),(0 0,10 0))', 0, 20, + 'MULTILINESTRING((10 0,20 0),(0 0,10 0))'); -SELECT 'A1', test( - 'POLYGON((0 0,10 0,10 10,0 10,0 0), - (1 2,3 2,3 4,1 4,1 2), - (4 2,6 2,6 4,4 4,4 2), - (7 2,9 2,9 4,7 4,7 2))', 5, 10, - 'POLYGON((5 0,5 2,6 2,6 4,5 4,5 10,10 10,15 10,15 4,14 4,14 2,15 2,15 0,10 0,5 0), - (11 2,13 2,13 4,11 4,11 2), - (7 2,9 2,9 4,7 4,7 2))'); +SELECT 'ML2', test_wrapx( + 'MULTILINESTRING((-10 0,0 0),(0 0,10 0))', 0, -20, + 'MULTILINESTRING((-10 0,0 0),(-20 0,-10 0))'); -SELECT 'A2', test( - 'POLYGON((0 0,10 0,10 10,0 10,0 0), - (1 2,3 2,3 4,1 4,1 2), - (4 2,6 2,6 4,4 4,4 2), - (7 2,9 2,9 4,7 4,7 2))', 5, -10, - 'POLYGON((-5 0,-5 2,-4 2,-4 4,-5 4,-5 10,0 10,5 10,5 4,4 4,4 2,5 2,5 0,0 0,-5 0), - (1 2,3 2,3 4,1 4,1 2), - (-3 2,-1 2,-1 4,-3 4,-3 2))'); +SELECT 'ML3', test_wrapx( + 'MULTILINESTRING((10 0,5 0),(-10 0,0 0),(0 0,5 0))', 0, -20, + 'MULTILINESTRING((-10 0,0 0),(-15 0,-10 0),(-20 0,-15 0))'); -SELECT 'C1', test( - 'GEOMETRYCOLLECTION( - POLYGON((0 0,10 0,10 10,0 10,0 0), - (1 2,3 2,3 4,1 4,1 2), - (4 2,6 2,6 4,4 4,4 2), - (7 2,9 2,9 4,7 4,7 2)), - POINT(2 20), - POINT(7 -20), - LINESTRING(0 40,10 40) - )', - 5, -10, - 'GEOMETRYCOLLECTION( - POLYGON((-5 0,-5 2,-4 2,-4 4,-5 4,-5 10,0 10,5 10,5 4,4 4,4 2,5 2,5 0,0 0,-5 0), - (1 2,3 2,3 4,1 4,1 2), - (-3 2,-1 2,-1 4,-3 4,-3 2)), - MULTILINESTRING((0 40,5 40),(-5 40,0 40)), - POINT(2 20), - POINT(-3 -20) - )'); +SELECT 'A1', test_wrapx( + 'POLYGON((0 0,10 0,10 10,0 10,0 0), + (1 2,3 2,3 4,1 4,1 2), + (4 2,6 2,6 4,4 4,4 2), + (7 2,9 2,9 4,7 4,7 2))', 5, 10, + 'POLYGON((5 0,5 2,6 2,6 4,5 4,5 10,10 10,15 10,15 4,14 4,14 2,15 2,15 0,10 0,5 0), + (11 2,13 2,13 4,11 4,11 2), + (7 2,9 2,9 4,7 4,7 2))'); -DROP FUNCTION test(geometry, float8, float8, geometry); +SELECT 'A2', test_wrapx( + 'POLYGON((0 0,10 0,10 10,0 10,0 0), + (1 2,3 2,3 4,1 4,1 2), + (4 2,6 2,6 4,4 4,4 2), + (7 2,9 2,9 4,7 4,7 2))', 5, -10, + 'POLYGON((-5 0,-5 2,-4 2,-4 4,-5 4,-5 10,0 10,5 10,5 4,4 4,4 2,5 2,5 0,0 0,-5 0), + (1 2,3 2,3 4,1 4,1 2), + (-3 2,-1 2,-1 4,-3 4,-3 2))'); + +SELECT 'C1', test_wrapx( + 'GEOMETRYCOLLECTION( + POLYGON((0 0,10 0,10 10,0 10,0 0), + (1 2,3 2,3 4,1 4,1 2), + (4 2,6 2,6 4,4 4,4 2), + (7 2,9 2,9 4,7 4,7 2)), + POINT(2 20), + POINT(7 -20), + LINESTRING(0 40,10 40) + )', + 5, -10, + CASE WHEN geos_version() >= 315 + THEN 'GEOMETRYCOLLECTION(POLYGON((-5 0,-5 2,-4 2,-4 4,-5 4,-5 10,0 10,5 10,5 4,4 4,4 2,5 2,5 0,0 0,-5 0),(1 2,3 2,3 4,1 4,1 2),(-3 2,-1 2,-1 4,-3 4,-3 2)),LINESTRING(-5 40,0 40,5 40),POINT(2 20),POINT(-3 -20))' + ELSE 'GEOMETRYCOLLECTION( + POLYGON((-5 0,-5 2,-4 2,-4 4,-5 4,-5 10,0 10,5 10,5 4,4 4,4 2,5 2,5 0,0 0,-5 0), + (1 2,3 2,3 4,1 4,1 2), + (-3 2,-1 2,-1 4,-3 4,-3 2)), + MULTILINESTRING((0 40,5 40),(-5 40,0 40)), + POINT(2 20), + POINT(-3 -20) + )' + END); + + + +DROP FUNCTION geos_version(); +DROP FUNCTION test_wrapx(geometry, float8, float8, geometry); ----------------------------------------------------------------------- Summary of changes: liblwgeom/cunit/cu_wrapx.c | 8 +- regress/core/fixedoverlay.sql | 16 +-- regress/core/fixedoverlay_expected | 2 - regress/core/geos315.sql | 59 ++++++----- regress/core/geos315_expected | 2 + regress/core/wrapx.sql | 198 ++++++++++++++++++++----------------- 6 files changed, 159 insertions(+), 126 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Wed Jul 8 20:28:11 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 03:28:11 -0000 Subject: [PostGIS] #3676: Add LEAKPROOF indication in functions In-Reply-To: <046.d29bb0f5310361b8b90bc34f608408d3@osgeo.org> References: <046.d29bb0f5310361b8b90bc34f608408d3@osgeo.org> Message-ID: <061.a4de60a20d3de1068b446978a60ef514@osgeo.org> #3676: Add LEAKPROOF indication in functions ----------------------+--------------------------- Reporter: strk | Owner: robe Type: defect | Status: new Priority: low | Milestone: PostGIS 3.7.0 Component: postgis | Version: master Resolution: | Keywords: ----------------------+--------------------------- Changes (by robe): * milestone: PostGIS Fund Me => PostGIS 3.7.0 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Wed Jul 8 20:28:34 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 03:28:34 -0000 Subject: [PostGIS] #4463: PostGIS raster ST_Intersects regression with pg12 In-Reply-To: <046.edc47d474781eb1c9280fffc68e39e76@osgeo.org> References: <046.edc47d474781eb1c9280fffc68e39e76@osgeo.org> Message-ID: <061.5efe698a9d51d2e66a6819df11735ca5@osgeo.org> #4463: PostGIS raster ST_Intersects regression with pg12 ---------------------+--------------------------- Reporter: robe | Owner: robe Type: defect | Status: closed Priority: high | Milestone: PostGIS 3.7.0 Component: raster | Version: master Resolution: fixed | Keywords: ---------------------+--------------------------- Changes (by robe): * milestone: PostGIS Fund Me => PostGIS 3.7.0 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Wed Jul 8 20:29:00 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 03:29:00 -0000 Subject: [PostGIS] #4749: Improve behaviour of spatial predicates with GeometryCollection inputs In-Reply-To: <048.8616200a28b49441d2b561ae439bfc30@osgeo.org> References: <048.8616200a28b49441d2b561ae439bfc30@osgeo.org> Message-ID: <063.37ba1cf3f0c23bc5f073932176bb1e86@osgeo.org> #4749: Improve behaviour of spatial predicates with GeometryCollection inputs --------------------------+--------------------------- Reporter: mdavis | Owner: pramsey Type: enhancement | Status: new Priority: medium | Milestone: PostGIS 3.7.0 Component: postgis | Version: 2.5.x -- EOL Resolution: | Keywords: --------------------------+--------------------------- Changes (by robe): * milestone: PostGIS Fund Me => PostGIS 3.7.0 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Wed Jul 8 20:29:28 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 03:29:28 -0000 Subject: [PostGIS] #3425: Clarify PostGIS handling of repeated points wrt validity in docs In-Reply-To: <049.27893d3152c059cac1666ee83b62d99a@osgeo.org> References: <049.27893d3152c059cac1666ee83b62d99a@osgeo.org> Message-ID: <064.912a112aab5ac9f364a02d7fe977d662@osgeo.org> #3425: Clarify PostGIS handling of repeated points wrt validity in docs ----------------------------+------------------------------------------ Reporter: dbaston | Owner: Darafei Praliaskouski Type: enhancement | Status: closed Priority: low | Milestone: PostGIS 3.7.0 Component: documentation | Version: master Resolution: fixed | Keywords: ----------------------------+------------------------------------------ Changes (by robe): * milestone: PostGIS Fund Me => PostGIS 3.7.0 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Thu Jul 9 00:06:43 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 9 Jul 2026 00:06:43 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-80-g3625cbd88 Message-ID: <20260709070643.905441B1977@trac.osgeo.org> 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 3625cbd88b42f8b760f53614fae8a645e2f5bd13 (commit) from 63de00830dc7afb6102a095cb1a41514e9064c1f (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 3625cbd88b42f8b760f53614fae8a645e2f5bd13 Author: Darafei Praliaskouski Date: Sun Jun 21 14:53:30 2026 +0400 Document TopoGeo_AddLineString load order diff --git a/doc/extras_topology.xml b/doc/extras_topology.xml index 875cc95e0..3cf33a2ed 100644 --- a/doc/extras_topology.xml +++ b/doc/extras_topology.xml @@ -1716,6 +1716,15 @@ uncovered or resulting from split of existing edges) may be limited by the max_edges parameter. + +When adding many lines, the load order can have a large impact on +performance because each call checks the line against topology elements +already loaded. In bulk workflows, adding large closed or enclosing +lines before smaller contained lines can avoid expensive later splits. +For loading a collection in one call, see +. + + Updating statistics about topologies being loaded via this function is up to caller, see . ----------------------------------------------------------------------- Summary of changes: doc/extras_topology.xml | 9 +++++++++ 1 file changed, 9 insertions(+) hooks/post-receive -- PostGIS From git at osgeo.org Thu Jul 9 00:39:15 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 9 Jul 2026 00:39:15 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-81-g8fcf7910d Message-ID: <20260709073915.828B41B43B6@trac.osgeo.org> 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 8fcf7910d399209511bfdcdca53c1c9034620f50 (commit) from 3625cbd88b42f8b760f53614fae8a645e2f5bd13 (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 8fcf7910d399209511bfdcdca53c1c9034620f50 Author: Teramoto Ikuhiro Date: Thu Jul 9 07:07:42 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 94.5% (5720 of 6049 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 4097b2ad5..bcb9f937d 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-08 06:39+0000\n" +"PO-Revision-Date: 2026-07-09 07:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -16858,16 +16858,20 @@ msgid "" "requires superuser access. Also note that database, session, and user " "settings override this." msgstr "" +"??????????????????????????????????????" +"??????????????????????????????????????" +"??????????????????????????????????????" +"?" #. Tag: para #, no-c-format msgid "This example writes the setting to postgres.auto.conf." -msgstr "" +msgstr "????????postgres.auto.conf????????" #. Tag: para #, no-c-format msgid "Reload the PostgreSQL configuration so the changed setting is applied." -msgstr "" +msgstr "PostgreSQL?????????????????????" #. Tag: para #, no-c-format @@ -16937,11 +16941,13 @@ msgid "" "Set and reset postgis.enable_outdb_rasters for the " "current session." msgstr "" +"?????????postgis.enable_outdb_rasters??????" +"???????????" #. Tag: para #, no-c-format msgid "Set the default for all new connections to a database." -msgstr "" +msgstr "??????????????????????????????" #. Tag: para #, no-c-format @@ -16949,6 +16955,9 @@ msgid "" "Set the default for the whole database cluster. This requires superuser " "access. Also note that database, session, and user settings override this." msgstr "" +"????????????????????????????????" +"????????????????????????????????????" +"?????????????????????????????????????" #. Tag: refpurpose #, no-c-format @@ -17127,7 +17136,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example converts longitude/latitude coordinates to geography." -msgstr "" +msgstr "???????/???????????????????" #. Tag: para #, no-c-format @@ -17219,7 +17228,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "3D circular string." -msgstr "" +msgstr "3??????????" #. Tag: refpurpose #, no-c-format @@ -17666,6 +17675,8 @@ msgid "" "Although bytea rep contains single \\, these need to be escaped when " "inserting into a table." msgstr "" +"bytea?????? \\ ????????????????????????????" +"?????????" #. Tag: para #, no-c-format @@ -17782,6 +17793,8 @@ msgid "" "Although bytea rep contains single \\, these need to be escaped when " "inserting into a table. Unless standard_conforming_strings is set to on." msgstr "" +"bytea?????? \\ ???????standard_conforming_strings?on?????" +"?????????????????????????????????????" #. Tag: para #, no-c-format @@ -18200,7 +18213,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example creates a 3D LineString." -msgstr "" +msgstr "?????3?????????????????" #. Tag: para #, no-c-format @@ -18337,14 +18350,14 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example creates a LineString from a polyline." -msgstr "" +msgstr "???????????????????????????" #. Tag: para #, no-c-format msgid "" "This example selects a different precision than the one used for polyline " "encoding." -msgstr "" +msgstr "??????????????????????????????" #. Tag: refpurpose #, no-c-format @@ -18523,7 +18536,7 @@ msgstr "?????????20% (0.20)?????????" #. Tag: para #, no-c-format msgid "This example returns the point 20 percent along a line." -msgstr "" +msgstr "????????????20%???????????" #. Tag: para #, no-c-format @@ -18623,7 +18636,7 @@ msgstr "20%??????????????????????? #, no-c-format msgid "" "This example returns points every 20 percent along a two-dimensional line." -msgstr "" +msgstr "?????2?????????20%?????????????????" #. Tag: para #, no-c-format @@ -18677,12 +18690,18 @@ msgid "" "street data, and ST_DWithin excludes houses that are " "too far from the street." msgstr "" +"??????????????????????????????????????" +"??????????????????????????????????????" +"?????????ST_DWithin??????????????" +"?????????" #. Tag: para #, no-c-format msgid "" "This example finds the closest point on a line to a point or other geometry." msgstr "" +"??????????????????????????????????????" +"?" #. Tag: para #, no-c-format @@ -18708,6 +18727,11 @@ msgid "" "in 2D line length. The Z and M values are interpolated for added endpoints " "if present." msgstr "" +"??????????????????????????????????????" +"?????LINESTRING??????????????????????[0, 1]???" +"??????????????????????????????????????" +"?????2???????????Z??M???????????????????" +"?????????????" #. Tag: para #, no-c-format @@ -18788,6 +18812,8 @@ msgid "" "the line, even when the input has Z values. The resulting Z values are " "interpolated along the selected 2D location." msgstr "" +"??????????????????????Z????????????2???" +"????????????Z??????2????????????????" #. Tag: para #, no-c-format @@ -44789,7 +44815,7 @@ msgstr "" #. Tag: title #, no-c-format msgid "CircularString" -msgstr "??????? (CircularStringCircularString)" +msgstr "??????? (CircularString)" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 50 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 12 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Thu Jul 9 02:39:14 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 9 Jul 2026 02:39:14 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-82-gec3216f28 Message-ID: <20260709093915.265321B713A@trac.osgeo.org> 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 ec3216f2897fa8dccf7db5750e38653f9b012261 (commit) from 8fcf7910d399209511bfdcdca53c1c9034620f50 (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 ec3216f2897fa8dccf7db5750e38653f9b012261 Author: Teramoto Ikuhiro Date: Thu Jul 9 09:11:59 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 94.9% (5743 of 6049 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index bcb9f937d..7cba15792 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-09 07:39+0000\n" +"PO-Revision-Date: 2026-07-09 09:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -19033,6 +19033,8 @@ msgid "" "This example interpolates on a line rising diagonally in Z, using a point at " "the 3D midpoint." msgstr "" +"?????Z???????????????3?????????????????" +"?" #. Tag: para #, no-c-format @@ -19040,6 +19042,8 @@ msgid "" "This example uses a vertical line with zero XY extent, where 3D projection " "works but 2D projection does not." msgstr "" +"?????X?Y?????????????????3?????????2????" +"???????????" #. Tag: para #, no-c-format @@ -19159,43 +19163,43 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example creates a schema to hold data." -msgstr "" +msgstr "?????????????????????????" #. Tag: para #, no-c-format msgid "Create a simple PostgreSQL table in the schema." -msgstr "" +msgstr "??????????PostgreSQL???????????" #. Tag: para #, no-c-format msgid "Describing the table shows a single id column." -msgstr "" +msgstr "??????????id??????????" #. Tag: para #, no-c-format msgid "Add a spatial column to the table." -msgstr "" +msgstr "?????????????????" #. Tag: para #, no-c-format msgid "Add a point column using the old constraint-based behavior." -msgstr "" +msgstr "???????????????????????" #. Tag: para #, no-c-format msgid "Add a CurvePolygon column using the old constraint-based behavior." -msgstr "" +msgstr "?????????????????????????" #. Tag: para #, no-c-format msgid "Describe the table again to see the new geometry columns." -msgstr "" +msgstr "?????????????????????????????" #. Tag: para #, no-c-format msgid "" "The geometry_columns view also registers the new columns." -msgstr "" +msgstr "geometry_columns???????????????????" #. Tag: para #, no-c-format @@ -19240,6 +19244,8 @@ msgid "" "The above is also equivalent to the standard ALTER TABLE " "command. Both deregister the column from geometry_columns." msgstr "" +"????????ALTER TABLE??????????????" +"???????geometry_columns????????" #. Tag: para #, no-c-format @@ -19280,7 +19286,7 @@ msgstr "" msgid "" "The above is now equivalent to the standard DROP TABLE " "command." -msgstr "" +msgstr "??????????DROP TABLE???????????" #. Tag: para #, no-c-format @@ -19450,6 +19456,8 @@ msgid "" "This example populates geometry column metadata using typmod behavior. For " "this to work, there must be existing data." msgstr "" +"?????typmod??????????????????????????????" +"???????????????????????" #. Tag: para #, no-c-format @@ -20116,6 +20124,10 @@ msgid "" "vertical datum support so Z is not transformed and assumed to be same units " "as final." msgstr "" +"???????? - ?????? (SRID: 2163 ???????????????)(3" +"??????????????2??????????)?????????????" +"???????Z???????????????????????????????" +"???" #. Tag: para #, no-c-format @@ -20123,6 +20135,8 @@ msgid "" "Multilinestring and polygon both 3D and 2D distance. Same example as 3D " "closest point example." msgstr "" +"MULTILINESTRING?POLYGON?3?????2??????????3?????????" +"???????" #. Tag: para #, no-c-format @@ -20456,6 +20470,8 @@ msgid "" "This example transforms a WGS 84 LineString to Massachusetts State Plane " "meters." msgstr "" +"?????WGS84 LINESTRING?????????????????????????" +"???" #. Tag: para #, no-c-format @@ -20465,7 +20481,7 @@ msgstr "WGS84???????????????????" #. Tag: para #, no-c-format msgid "This example uses the default spheroid calculation." -msgstr "" +msgstr "??????????????????????????" #. Tag: para #, no-c-format @@ -20611,11 +20627,14 @@ msgid "" "The endpoints of the line lie on the circle computed by ." msgstr "" +"???????????????????g1?g2????????????????" +"?????????????????????????????????????? " +"???????????????" #. Tag: para #, no-c-format msgid "Enhanced: 3.7.0 - support for a single geometry input." -msgstr "" +msgstr "Enhanced: 3.7.0 - ??????????????????" #. Tag: para #, no-c-format @@ -20712,6 +20731,8 @@ msgid "" "returns the distance between the two vertices farthest apart in that " "geometry." msgstr "" +"???????????????????g1?g2????????????????" +"????????????????????????????" #. Tag: para #, no-c-format @@ -20942,7 +20963,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "This example uses a MultiPolygon." -msgstr "" +msgstr "?????MULTIPOLYGON????????" #. Tag: para #, no-c-format @@ -22739,6 +22760,8 @@ msgid "" "This example builds the SQL for a Boston-to-San-Francisco path with segments " "every 100 kilometers." msgstr "" +"?????????-??????????100km???????SQL????????" +"??" #. Tag: para #, no-c-format @@ -49410,6 +49433,10 @@ msgid "" "final run or after loading; add to make " "reruns tolerate an existing index." msgstr "" +"??raster2pgsql?????????????????GiST???????????" +"?????????????????????????????" +"?????????????? ????????" +"?????????" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 53 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 13 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Thu Jul 9 03:46:13 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 9 Jul 2026 03:46:13 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-86-g63345d444 Message-ID: <20260709104614.642ED1B8AFF@trac.osgeo.org> 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 63345d444bdb865524444eb0f4a4189a0890cf0a (commit) via 09f9558ae04577e6277b3c1c30cbb8921ea58a71 (commit) via 9c931e6fcdcf78a5d605a0d445b4a51564f78ff5 (commit) via ca3323d8c748dd806bab188028bb61c5f67b39af (commit) from ec3216f2897fa8dccf7db5750e38653f9b012261 (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 63345d444bdb865524444eb0f4a4189a0890cf0a Merge: ec3216f28 09f9558ae Author: Darafei Praliaskouski Date: Thu Jul 9 14:11:48 2026 +0400 Merge pull request #1160 from Komzpa/codex/ci-wrapx-collection-output Stabilize GEOS main linework handling commit 09f9558ae04577e6277b3c1c30cbb8921ea58a71 Author: Darafei Praliaskouski Date: Thu Jul 9 11:33:15 2026 +0400 Keep manual examples stable across GEOS linework merging Use disjoint lines in the ST_Union array example and avoid a vertex inside a straight shared stretch in the ST_SharedPaths examples, so the documented outputs are identical across GEOS versions. Document that ST_SharedPaths segmentation may vary with the GEOS version. diff --git a/doc/reference_overlay.xml b/doc/reference_overlay.xml index 64a20bbf2..8e96c75bf 100644 --- a/doc/reference_overlay.xml +++ b/doc/reference_overlay.xml @@ -1056,9 +1056,9 @@ FROM ( This example unions an array of linestrings. SELECT ST_AsText(ST_Union(ARRAY[ ST_GeomFromText('LINESTRING(1 2, 3 4)'), - ST_GeomFromText('LINESTRING(3 4, 4 5)') + ST_GeomFromText('LINESTRING(4 5, 5 6)') ])) As wktunion; -MULTILINESTRING((1 2,3 4),(3 4,4 5)) +MULTILINESTRING((1 2,3 4),(4 5,5 6)) See Also diff --git a/doc/reference_processing.xml b/doc/reference_processing.xml index 72e46b615..ffa35213f 100644 --- a/doc/reference_processing.xml +++ b/doc/reference_processing.xml @@ -2596,6 +2596,8 @@ FROM (SELECT ST_Polygonize(geom_4269) AS polycoll Examples: Finding shared paths + Adjacent shared path segments may be returned as separate or merged LineStrings + depending on the GEOS version. @@ -2622,11 +2624,11 @@ FROM (SELECT ST_Polygonize(geom_4269) AS polycoll SELECT ST_AsText(ST_SharedPaths(ST_GeomFromText('MULTILINESTRING((26 125,26 200,126 200,126 125,26 125), (51 150,101 150,76 175,51 150))'), - ST_GeomFromText('LINESTRING(151 100,126 156.25,126 125,90 161, 76 175)') + ST_GeomFromText('LINESTRING(151 100,126 156.25,126 125,101 150, 76 175)') ) ) GEOMETRYCOLLECTION(MULTILINESTRING((126 156.25,126 125), - (101 150,90 161),(90 161,76 175)),MULTILINESTRING EMPTY) + (101 150,76 175)),MULTILINESTRING EMPTY) @@ -2636,13 +2638,13 @@ FROM (SELECT ST_Polygonize(geom_4269) AS polycoll same example but linestring orientation flipped -SELECT ST_AsText(ST_SharedPaths(ST_GeomFromText('LINESTRING(76 175,90 161,126 125,126 156.25,151 100)'), +SELECT ST_AsText(ST_SharedPaths(ST_GeomFromText('LINESTRING(76 175,101 150,126 125,126 156.25,151 100)'), ST_GeomFromText('MULTILINESTRING((26 125,26 200,126 200,126 125,26 125), (51 150,101 150,76 175,51 150))') ) ) GEOMETRYCOLLECTION(MULTILINESTRING EMPTY, -MULTILINESTRING((76 175,90 161),(90 161,101 150),(126 125,126 156.25))) +MULTILINESTRING((76 175,101 150),(126 125,126 156.25))) commit 9c931e6fcdcf78a5d605a0d445b4a51564f78ff5 Author: Darafei Praliaskouski Date: Thu Jul 9 11:33:15 2026 +0400 Fix GEOS version parser in wrapx regression A stray ']' made the regexp never match, so the GEOS >= 3.15 expected outputs were never selected. diff --git a/regress/core/wrapx.sql b/regress/core/wrapx.sql index 321958d52..b35504961 100644 --- a/regress/core/wrapx.sql +++ b/regress/core/wrapx.sql @@ -15,7 +15,7 @@ $$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION geos_version() RETURNS integer AS $$ SELECT (matches[1]::integer * 100) + matches[2]::integer - FROM regexp_match(postgis_geos_version(), E'^([0-9]+)]\\.([0-9]+)') AS matches; + FROM regexp_match(postgis_geos_version(), E'^([0-9]+)\\.([0-9]+)') AS matches; $$ LANGUAGE 'sql' IMMUTABLE; commit ca3323d8c748dd806bab188028bb61c5f67b39af Author: Darafei Praliaskouski Date: Thu Jul 9 11:33:15 2026 +0400 Preserve topology overlay junctions under GEOS >= 3.15 line merging GEOS >= 3.15 returns overlay output line-merged, hiding the junctions between the shared and non-shared linework of a new line inside line interiors. Collect the crossing points and the mod-2 boundary of the shared linework from the intersection, and re-split the noded line at them: a no-op with older GEOS, which keeps them as component boundaries. Assert edge count instead of edge ids in the snap regression: the final topology is identical but edge id assignment depends on GEOS overlay output ordering. References https://github.com/postgis/postgis/pull/1160 diff --git a/NEWS b/NEWS index 4fa4d414c..d101510e3 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed * Bug Fixes * + - GH-1160, [topology] Preserve overlay intersection boundaries when + noding lines with GEOS main (Darafei Praliaskouski) - #6093, Fix SQL generation on ppc64el when NURBS comments are preprocessed with AltiVec vector macros (Darafei Praliaskouski) - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c index b119d5dae..a8d00c108 100644 --- a/liblwgeom/topo/lwgeom_topo.c +++ b/liblwgeom/topo/lwgeom_topo.c @@ -7379,6 +7379,57 @@ _lwt_split_by_nodes(const LWGEOM *g, const LWGEOM *nodes) return bg; } +/* + * Compute the junction points between the overlay intersection linework + * (shared paths and crossings between the noded line and nearby edges) + * and the rest of the noded line: the 0-dimensional intersection + * components plus the mod-2 boundary of the 1-dimensional ones. + * + * These junctions must become topology nodes. GEOS >= 3.15 returns + * overlay output line-merged, which would otherwise hide them inside + * line interiors. Older GEOS keeps them as boundaries of the overlay + * output components, making a split at them a no-op. + * + * Returns a MULTIPOINT. + */ +static LWGEOM * +_lwt_overlay_split_points(const LWGEOM *xset) +{ + LWGEOM *multi = lwgeom_as_multi(xset); + LWCOLLECTION *xcol = lwgeom_as_lwcollection(multi); + LWCOLLECTION *epoints = lwcollection_extract(xcol, POINTTYPE); + LWCOLLECTION *points = lwcollection_construct_empty(MULTIPOINTTYPE, xset->srid, + FLAGS_GET_Z(xset->flags), FLAGS_GET_M(xset->flags)); + LWCOLLECTION *lines = lwcollection_extract(xcol, LINETYPE); + LWGEOM *bnd = lwgeom_boundary(lwcollection_as_lwgeom(lines)); + uint32_t i; + + for (i = 0; i < epoints->ngeoms; i++) + lwcollection_add_lwgeom(points, lwgeom_clone_deep(epoints->geoms[i])); + + if (bnd) + { + LWCOLLECTION *bcol = lwgeom_as_lwcollection(bnd); + if (bcol) + { + for (i = 0; i < bcol->ngeoms; i++) + lwcollection_add_lwgeom(points, lwgeom_clone_deep(bcol->geoms[i])); + } + else if (!lwgeom_is_empty(bnd)) + { + lwcollection_add_lwgeom(points, lwgeom_clone_deep(bnd)); + } + lwgeom_free(bnd); + } + + lwcollection_release(epoints); + lwcollection_release(lines); + lwgeom_release(multi); + + points->srid = xset->srid; + return lwcollection_as_lwgeom(points); +} + static LWT_ELEMID* _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, int handleFaceSplit, int maxNewEdges) @@ -7386,7 +7437,7 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, LWGEOM *geomsbuf[1]; LWGEOM **geoms; uint32_t ngeoms; - LWGEOM *noded, *tmp; + LWGEOM *noded, *tmp, *xsplit = NULL; LWCOLLECTION *col; LWT_ELEMID *ids; LWT_ISO_EDGE *edges; @@ -7601,6 +7652,9 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, xset = lwgeom_intersection(noded, iedges); LWDEBUGG(1, xset, "Intersected"); lwgeom_free(noded); + /* Collect the junctions between shared and non-shared linework + * before line merging can hide them (see step 2.5) */ + xsplit = _lwt_overlay_split_points(xset); /* We linemerge here because INTERSECTION, as of GEOS 3.8, * will result in shared segments being output as multiple @@ -7691,6 +7745,25 @@ _lwt_AddLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges, lwcollection_release(col); } + /* 2.5. Split by overlay junctions + * + * GEOS >= 3.15 returns line-merged overlay output, hiding the + * junctions between shared and non-shared linework inside line + * interiors. Splitting restores them; older GEOS keeps them as + * component boundaries and the split is a no-op. + */ + if ( xsplit ) + { + if ( !lwgeom_is_empty(xsplit) ) + { + tmp = _lwt_split_by_nodes(noded, xsplit); + lwgeom_free(noded); + noded = tmp; + LWDEBUGG(1, noded, "Overlay-junction-split"); + } + lwgeom_free(xsplit); + } + LWDEBUG(1, "Freeing up nearby elements"); diff --git a/topology/test/regress/topogeo_addlinestring.sql b/topology/test/regress/topogeo_addlinestring.sql index 5946ceec0..1f67b7198 100644 --- a/topology/test/regress/topogeo_addlinestring.sql +++ b/topology/test/regress/topogeo_addlinestring.sql @@ -99,9 +99,9 @@ SELECT 'cross', TopoGeo_addLineString('city_data', 'SRID=4326;LINESTRING(49 18, SELECT check_changes('cross'); -- Snapping (and splitting a face) -SELECT 'snap', TopoGeo_addLineString('city_data', 'SRID=4326;LINESTRING(18 22.2, 22.5 22.2, 21.2 20.5)', 1) ORDER BY 2; +SELECT 'snap', COUNT(*) FROM TopoGeo_addLineString('city_data', 'SRID=4326;LINESTRING(18 22.2, 22.5 22.2, 21.2 20.5)', 1); SELECT check_changes('snap'); -SELECT 'snap_again', TopoGeo_addLineString('city_data', 'SRID=4326;LINESTRING(18 22.2, 22.5 22.2, 21.2 20.5)', 1) ORDER BY 2; +SELECT 'snap_again', COUNT(*) FROM TopoGeo_addLineString('city_data', 'SRID=4326;LINESTRING(18 22.2, 22.5 22.2, 21.2 20.5)', 1); SELECT check_changes('snap_again'); -- A mix of crossing and overlapping, splitting another face diff --git a/topology/test/regress/topogeo_addlinestring_expected b/topology/test/regress/topogeo_addlinestring_expected index 5035a8654..957ed5f3c 100644 --- a/topology/test/regress/topogeo_addlinestring_expected +++ b/topology/test/regress/topogeo_addlinestring_expected @@ -38,9 +38,7 @@ cross|E|LINESTRING(47 14,47 17.6) cross|E|LINESTRING(47 17.6,47 22) cross|E|LINESTRING(47 17.6,44 17) cross|E|LINESTRING(49 18,47 17.6) -snap|7 -snap|36 -snap|38 +snap|3 snap|N||POINT(21.2 20.5) snap|N||POINT(22.35 22) snap|N||POINT(18 22.2) @@ -48,9 +46,7 @@ snap|E|LINESTRING(22.35 22,35 22) snap|E|LINESTRING(22.35 22,21.2 20.5) snap|E|LINESTRING(21 22,22.35 22) snap|E|LINESTRING(18 22.2,21 22) -snap_again|7 -snap_again|36 -snap_again|38 +snap_again|3 crossover|4 crossover|N||POINT(21 10) crossover|N||POINT(16.2 14) ----------------------------------------------------------------------- Summary of changes: NEWS | 2 + doc/reference_overlay.xml | 4 +- doc/reference_processing.xml | 10 +-- liblwgeom/topo/lwgeom_topo.c | 75 +++++++++++++++++++++- regress/core/wrapx.sql | 2 +- topology/test/regress/topogeo_addlinestring.sql | 4 +- .../test/regress/topogeo_addlinestring_expected | 8 +-- 7 files changed, 89 insertions(+), 16 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Thu Jul 9 03:53:49 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 9 Jul 2026 03:53:49 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-87-gb83955d00 Message-ID: <20260709105350.16F091BD302@trac.osgeo.org> 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 b83955d009004ae2cf307c3cffbfbdd9a8bb06e6 (commit) from 63345d444bdb865524444eb0f4a4189a0890cf0a (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 b83955d009004ae2cf307c3cffbfbdd9a8bb06e6 Author: Darafei Praliaskouski Date: Thu Jul 9 14:47:26 2026 +0400 NEWS: reword GEOS 3.15 compatibility credit diff --git a/NEWS b/NEWS index d101510e3..fcd2c31ae 100644 --- a/NEWS +++ b/NEWS @@ -7,8 +7,8 @@ To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed * Bug Fixes * - - GH-1160, [topology] Preserve overlay intersection boundaries when - noding lines with GEOS main (Darafei Praliaskouski) + - GH-1160, Adapt topology, regression expectations, and manual examples + to GEOS 3.15 overlay line merging (Paul Ramsey, Darafei Praliaskouski) - #6093, Fix SQL generation on ppc64el when NURBS comments are preprocessed with AltiVec vector macros (Darafei Praliaskouski) - #6094, [upgrade] Avoid legacy string literal warnings in downgrade checks ----------------------------------------------------------------------- Summary of changes: NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- PostGIS From git at osgeo.org Thu Jul 9 08:43:31 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 9 Jul 2026 08:43:31 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-88-gd6486e89a Message-ID: <20260709154331.DFB351C0173@trac.osgeo.org> 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 d6486e89ade1b46f08f7bd56518cb71ff7b731fa (commit) from b83955d009004ae2cf307c3cffbfbdd9a8bb06e6 (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 d6486e89ade1b46f08f7bd56518cb71ff7b731fa Author: Darafei Praliaskouski Date: Thu Jul 9 19:29:11 2026 +0400 topology: free overlay split helper inputs Free the owning geometries created by the overlay split helper with the normal liblwgeom destructors. Also document the current SFCGAL, GEOS raster, and GDAL logging contracts that made related scanner findings non-issues, and fix the fixedoverlay test GEOS-version helper. diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c index a8d00c108..108174564 100644 --- a/liblwgeom/topo/lwgeom_topo.c +++ b/liblwgeom/topo/lwgeom_topo.c @@ -7422,9 +7422,9 @@ _lwt_overlay_split_points(const LWGEOM *xset) lwgeom_free(bnd); } - lwcollection_release(epoints); - lwcollection_release(lines); - lwgeom_release(multi); + lwcollection_free(epoints); + lwcollection_free(lines); + lwgeom_free(multi); points->srid = xset->srid; return lwcollection_as_lwgeom(points); diff --git a/raster/rt_core/rt_spatial_relationship.c b/raster/rt_core/rt_spatial_relationship.c index a71ce179e..0388a8ff1 100644 --- a/raster/rt_core/rt_spatial_relationship.c +++ b/raster/rt_core/rt_spatial_relationship.c @@ -1334,7 +1334,8 @@ rt_raster_intersection_fractions( /* Shallow clone a new raster with no bands */ rast_out = rt_raster_clone(rast_in, 0); - /* Add a float4 band matching GEOSGridIntersectionFractions' float buffer */ + /* GEOSGridIntersectionFractions writes float values into float* buf, + * so the output band must stay PT_32BF rather than PT_64BF. */ band_num = rt_raster_generate_new_band( rast_out, /* rast */ PT_32BF, /* pixel type */ diff --git a/raster/rt_pg/rtpg_gdal.c b/raster/rt_pg/rtpg_gdal.c index 41f357f8c..1c10aa1e0 100644 --- a/raster/rt_pg/rtpg_gdal.c +++ b/raster/rt_pg/rtpg_gdal.c @@ -1171,6 +1171,8 @@ ogrErrorHandler(CPLErr eErrClass, int err_no, const char* msg) const char* gdalErrType = "unknown type"; char *redacted = pstrdup(msg ? msg : ""); + /* GDAL debug/error text can include VSI URLs, headers, or tokens. + * Always redact before forwarding messages to PostgreSQL clients/logs. */ rtpg_gdal_redact_message(redacted); if (err_no >= 0 && err_no < gdalErrorTypesSize) diff --git a/regress/core/fixedoverlay.sql b/regress/core/fixedoverlay.sql index 2377f5667..b41b73ce6 100644 --- a/regress/core/fixedoverlay.sql +++ b/regress/core/fixedoverlay.sql @@ -1,7 +1,7 @@ CREATE OR REPLACE FUNCTION geos_version() RETURNS integer AS $$ SELECT (matches[1]::integer * 100) + matches[2]::integer - FROM regexp_match(postgis_geos_version(), E'^([0-9]+)]\\.([0-9]+)') AS matches; + FROM regexp_match(postgis_geos_version(), E'^([0-9]+)\\.([0-9]+)') AS matches; $$ LANGUAGE 'sql' IMMUTABLE; SELECT 'intersection', ST_AsText(ST_Intersection( diff --git a/sfcgal/lwgeom_sfcgal.c b/sfcgal/lwgeom_sfcgal.c index e33c92fa3..11a581e7d 100644 --- a/sfcgal/lwgeom_sfcgal.c +++ b/sfcgal/lwgeom_sfcgal.c @@ -2148,6 +2148,8 @@ sfcgal_generate_roof(PG_FUNCTION_ARGS) geom = POSTGIS2SFCGALGeometry(input); PG_FREE_IF_COPY(input, 0); + /* SFCGAL's generic C API orders slope_angle before height, unlike + * PostGIS SQL and the specialized roof wrappers. */ result = sfcgal_geometry_generate_roof(geom, roof_type, slope_angle, height, (size_t)primary_edge_index); sfcgal_geometry_delete(geom); ----------------------------------------------------------------------- Summary of changes: liblwgeom/topo/lwgeom_topo.c | 6 +++--- raster/rt_core/rt_spatial_relationship.c | 3 ++- raster/rt_pg/rtpg_gdal.c | 2 ++ regress/core/fixedoverlay.sql | 2 +- sfcgal/lwgeom_sfcgal.c | 2 ++ 5 files changed, 10 insertions(+), 5 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Thu Jul 9 11:47:37 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 18:47:37 -0000 Subject: [PostGIS] #5326: ST_Difference geograhy support In-Reply-To: <047.abab0c010e61e81640dc3bda3b13fe73@osgeo.org> References: <047.abab0c010e61e81640dc3bda3b13fe73@osgeo.org> Message-ID: <062.b7cd71d4dd7818a12a222754c4d62017@osgeo.org> #5326: ST_Difference geograhy support --------------------------+----------------------------- Reporter: latot | Owner: pramsey Type: enhancement | Status: closed Priority: medium | Milestone: PostGIS Fund Me Component: postgis | Version: 3.3.x Resolution: duplicate | Keywords: --------------------------+----------------------------- Changes (by komzpa): * resolution: => duplicate * status: new => closed Comment: Duplicates https://trac.osgeo.org/postgis/ticket/3973 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Thu Jul 9 11:48:05 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 18:48:05 -0000 Subject: [PostGIS] #5326: ST_Difference geograhy support In-Reply-To: <047.abab0c010e61e81640dc3bda3b13fe73@osgeo.org> References: <047.abab0c010e61e81640dc3bda3b13fe73@osgeo.org> Message-ID: <062.b4b77422edb8a20ff89cbb8d7675e762@osgeo.org> #5326: ST_Difference geograhy support --------------------------+----------------------------- Reporter: latot | Owner: pramsey Type: enhancement | Status: closed Priority: medium | Milestone: PostGIS Fund Me Component: postgis | Version: 3.3.x Resolution: duplicate | Keywords: --------------------------+----------------------------- Comment (by komzpa): Duplicates #3973 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Thu Jul 9 11:51:09 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 18:51:09 -0000 Subject: [PostGIS] #5325: ST_Union geography support In-Reply-To: <047.b2c82e8fddb4fcb117b20fc04f1a2c80@osgeo.org> References: <047.b2c82e8fddb4fcb117b20fc04f1a2c80@osgeo.org> Message-ID: <062.eedf18f1c052827b2dd72d8367b643ce@osgeo.org> #5325: ST_Union geography support --------------------------+----------------------------- Reporter: latot | Owner: pramsey Type: enhancement | Status: closed Priority: medium | Milestone: PostGIS Fund Me Component: postgis | Version: 3.3.x Resolution: duplicate | Keywords: --------------------------+----------------------------- Changes (by komzpa): * resolution: => duplicate * status: new => closed Comment: Duplicates #3973 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Thu Jul 9 12:09:01 2026 From: trac at osgeo.org (PostGIS) Date: Thu, 09 Jul 2026 19:09:01 -0000 Subject: [PostGIS] #5638: Need some more developer documentation In-Reply-To: <046.6065d6cbf765554938200b84f3bea454@osgeo.org> References: <046.6065d6cbf765554938200b84f3bea454@osgeo.org> Message-ID: <061.8fb8b8f2d4a8832b4d222879780a4b04@osgeo.org> #5638: Need some more developer documentation ----------------------------+--------------------------- Reporter: robe | Owner: robe Type: task | Status: closed Priority: critical | Milestone: PostGIS 3.7.0 Component: documentation | Version: 3.4.x Resolution: fixed | Keywords: ----------------------------+--------------------------- Changes (by Darafei Praliaskouski ): * resolution: => fixed * status: new => closed Comment: In [changeset:"13edb64c12ca2b7be104a3c01cb2abfd6e3a6240/git" 13edb64c/git]: {{{#!CommitTicketReference repository="git" revision="13edb64c12ca2b7be104a3c01cb2abfd6e3a6240" doc: move development workflow documentation into repo Closes #5638 Closes https://github.com/postgis/postgis/pull/925 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Thu Jul 9 23:08:17 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 9 Jul 2026 23:08:17 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-264-g9e003e1c1 Message-ID: <20260710060818.47A991C71BC@trac.osgeo.org> 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 9e003e1c1ad6d0b5747a0c9766c99beb9a7e0bb4 (commit) from e0e580289ed221f5c354cbdd79d7046c73b2b2b6 (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 9e003e1c1ad6d0b5747a0c9766c99beb9a7e0bb4 Author: Teramoto Ikuhiro Date: Fri Jul 10 06:06:56 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 95.0% (5747 of 6049 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 7cba15792..0ca9deaf2 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-09 09:39+0000\n" +"PO-Revision-Date: 2026-07-10 06:08+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -19465,6 +19465,9 @@ msgid "" "This example changes the geometry columns to use constraints if they are not " "typmod or already constrained. For this to work, there must be existing data." msgstr "" +"?????typmod????????????????????????" +"??????????????????????????????????????" +"????????????" #. Tag: refpurpose #, no-c-format @@ -22225,7 +22228,7 @@ msgid "" "same as but as an operator it can be used " "for doing nearest neighbor searches using an N-dimensional index." msgstr "" -"|=|??????????????? (|=|??????????????? (??)???3???????????????????????N???????????" "????????????" @@ -22264,6 +22267,8 @@ msgid "" "This example orders stored trajectories by their distance from a literal " "query trajectory." msgstr "" +"??????????????????????????????????????" +"????????" #. Tag: para #, no-c-format @@ -22637,6 +22642,12 @@ msgid "" "ST_AsBinary('POINT(1 2)'::geometry);. If that is not possible, " "then install legacy.sql." msgstr "" +"Changed: 2.0.0 ???????????????????????????" +"?????????????????ST_AsBinary('POINT(1 2)')??" +"??????????????? n ST_AsBinary(unknown) is not unique " +"error????????????????????ST_AsBinary('POINT" +"(1 2)'::geometry);???????????????????????" +"?legacy.sql?????????????" #. Tag: para #, no-c-format @@ -22723,7 +22734,7 @@ msgstr "" #. Tag: para #, no-c-format msgid "Which gives the same answer as:" -msgstr "" +msgstr "????????:" #. Tag: refpurpose #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) hooks/post-receive -- PostGIS From trac at osgeo.org Fri Jul 10 01:28:46 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 08:28:46 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistanc Message-ID: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistanc -------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: 3.6.x Keywords: | -------------------------------+--------------------------- In the attached dump we this case {{{ [local] lop at t1=# SELECT * FROM topology.FindVertexSegmentPairsBelowDistance('grunnkart_037',1e-15); seg_edge | segno | vert_edge | vertno | vert_geom ----------+-------+-----------+--------+---------------------------------------------------- 7 | 59 | 31 | 2 | 0101000020A2100000767C04140DD7164009093C79AE774D40 }}} the problem here that when covert this topology to simple feature we get this error {{{ SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); NOTICE: 00000: Self-intersection at or near point 5.7100108290768832 58.935012010161067 LOCATION: pg_notice, lwgeom_pg.c:389 st_isvalid ------------ f (1 row) }}} Then we run this code {{{ DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT DISTINCT ON (vs.vert_geom, e.edge_id) e.geom, vs.vert_geom FROM topology.FindVertexSegmentPairsBelowDistance( 'grunnkart_037', 1e-15 ) AS vs JOIN grunnkart_037.edge e ON e.edge_id = vs.seg_edge ORDER BY vs.vert_geom, e.edge_id LOOP BEGIN PERFORM topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom, r.vert_geom), -1 ); EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Failed: %, error: %', ST_AsText(r.vert_geom), SQLERRM; END; END LOOP; END; $$; }}} and the face geom is valid {{{ SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); st_isvalid ------------ t (1 row) }}} tested on {{{ POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160" GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db" (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18" LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 01:29:55 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 08:29:55 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistanc In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.f134e477267880e69417bad0dc4aa4ec@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistanc --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: 3.6.x Resolution: | Keywords: --------------------------------+--------------------------- Changes (by Lars Aksel Opsahl): * Attachment "t1.tar" added. The initial topology data -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 03:17:11 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 10:17:11 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistanc In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.379178a90bd938977227d56d83179cb4@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistanc --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: 3.6.x Resolution: | Keywords: --------------------------------+--------------------------- Old description: > In the attached dump we this case > > {{{ > [local] lop at t1=# SELECT * FROM > topology.FindVertexSegmentPairsBelowDistance('grunnkart_037',1e-15); > seg_edge | segno | vert_edge | vertno | vert_geom > ----------+-------+-----------+--------+---------------------------------------------------- > 7 | 59 | 31 | 2 | > 0101000020A2100000767C04140DD7164009093C79AE774D40 > > }}} > > the problem here that when covert this topology to simple feature we get > this error > > {{{ > > SELECT > ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); > NOTICE: 00000: Self-intersection at or near point 5.7100108290768832 > 58.935012010161067 > LOCATION: pg_notice, lwgeom_pg.c:389 > st_isvalid > ------------ > f > (1 row) > > }}} > > Then we run this code > > {{{ > DO $$ > DECLARE > r RECORD; > BEGIN > FOR r IN > SELECT DISTINCT ON (vs.vert_geom, > e.edge_id) > e.geom, > vs.vert_geom > FROM > topology.FindVertexSegmentPairsBelowDistance( > 'grunnkart_037', > 1e-15 > ) AS vs > JOIN grunnkart_037.edge e > ON e.edge_id = vs.seg_edge > ORDER BY vs.vert_geom, e.edge_id > LOOP > BEGIN > PERFORM > topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom, > r.vert_geom), -1 ); > EXCEPTION > WHEN OTHERS THEN > RAISE > WARNING 'Failed: %, error: %', > ST_AsText(r.vert_geom), > SQLERRM; > END; > END LOOP; > END; > $$; > > }}} > > and the face geom is valid > > {{{ > SELECT > ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); > st_isvalid > ------------ > t > (1 row) > > }}} > > tested on > > {{{ > > POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160" > GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF > URL_ENDPOINT=https://cdn.proj.org > USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj > DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db" > (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18" > LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY > }}} New description: In the attached dump we this case {{{ [local] lop at t1=# SELECT * FROM topology.FindVertexSegmentPairsBelowDistance('grunnkart_037',1e-15); seg_edge | segno | vert_edge | vertno | vert_geom ----------+-------+-----------+--------+---------------------------------------------------- 7 | 59 | 31 | 2 | 0101000020A2100000767C04140DD7164009093C79AE774D40 }}} the problem here that when covert this topology to simple feature we get this error {{{ SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); NOTICE: 00000: Self-intersection at or near point 5.7100108290768832 58.935012010161067 LOCATION: pg_notice, lwgeom_pg.c:389 st_isvalid ------------ f (1 row) }}} Then we run this code {{{ DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT DISTINCT ON (vs.vert_geom, e.edge_id) e.geom, vs.vert_geom FROM topology.FindVertexSegmentPairsBelowDistance( 'grunnkart_037', 1e-15 ) AS vs JOIN grunnkart_037.edge e ON e.edge_id = vs.seg_edge ORDER BY vs.vert_geom, e.edge_id LOOP BEGIN PERFORM topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom, r.vert_geom), -1 ); EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Failed: %, error: %', ST_AsText(r.vert_geom), SQLERRM; END; END LOOP; END; $$; }}} and the face geom is valid {{{ SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); st_isvalid ------------ t (1 row) }}} tested on {{{ POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160" GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db" (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18" LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY }}} -- Comment (by Lars Aksel Opsahl): Did another test on bigger dataset t2. We find a lot this FindVertexSegmentPairsBelowDistance we also two self intersection in simple feature as we see. {{{ SELECT 'FindVertexSegmentPairsBelowDistance before :' || count(*) FROM topology.FindVertexSegmentPairsBelowDistance( 'grunnkart_037', 1e-7 ); SELECT 'invalid face before fixVertexSegmentPairsBelowDistance:'|| count(*) FROM ( SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',face_id),8))) isvalid FROM grunnkart_037.face WHERE face_id > 0 ORDER by ST_area(topology.ST_GetFaceGeometry('grunnkart_037',face_id),true) ) r WHERE not isvalid; ?column? -------------------------------------------------- FindVertexSegmentPairsBelowDistance before :1037 (1 row) NOTICE: 00000: Self-intersection at or near point 5.7028636310767338 58.933701939524774 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Self-intersection at or near point 5.7028636310767338 58.933701939524774 LOCATION: pg_notice, lwgeom_pg.c:389 ?column? ---------------------------------------------------------- invalid face before fixVertexSegmentPairsBelowDistance:2 }}} We run fix {{{ DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT DISTINCT ON (e.edge_id) e.geom, vs.vert_geom FROM topology.FindVertexSegmentPairsBelowDistance( 'grunnkart_037', 1e-7 ) AS vs JOIN grunnkart_037.edge e ON e.edge_id = vs.seg_edge ORDER BY e.edge_id, vs.vert_geom LOOP BEGIN PERFORM topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom, r.vert_geom), -1 ); EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Failed: %, error: %', ST_AsText(r.vert_geom), SQLERRM; END; END LOOP; END; $$; NOTICE: 00000: Empty component of noded line LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Empty component of noded line LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Empty component of noded line LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Empty component of noded line LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Empty component of noded line LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Empty component of noded line LOCATION: pg_notice, lwgeom_pg.c:389 DO }}} But now we seem to have more problems than before the fix {{{ SELECT 'FindVertexSegmentPairsBelowDistance after:' || count(*) FROM topology.FindVertexSegmentPairsBelowDistance( 'grunnkart_037', 1e-7 ); SELECT 'invalid face after fixVertexSegmentPairsBelowDistance:'||count(*) FROM ( SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',face_id),8))) isvalid FROM grunnkart_037.face WHERE face_id > 0 ORDER by ST_area(topology.ST_GetFaceGeometry('grunnkart_037',face_id),true) ) r WHERE not isvalid; SELECT * from topology.ValidateTopology('grunnkart_037'); NOTICE: 00000: Too few points in geometry component at or near point 5.7221960200000002 58.942031450000002 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7085718600000002 58.93178168 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7239140600000002 58.925350950000002 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7239140600000002 58.925350940000001 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7239140900000001 58.925350950000002 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7238169699999997 58.928892070000003 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.71480999 58.936201019999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7142168199999999 58.935326719999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7236422300000003 58.93658525 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7087765800000003 58.922366529999998 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7044360200000002 58.922831590000001 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7019316699999996 58.933653839999998 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7028636400000003 58.933701939999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7029897099999998 58.93366056 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7018358600000001 58.933649299999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Self-intersection at or near point 5.7019283657189828 58.932679461437964 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7014842100000003 58.932243669999998 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7014842100000003 58.932243669999998 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7013110999999999 58.932082100000002 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7012686600000002 58.932041769999998 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7012686600000002 58.93362501 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Self-intersection at or near point 5.7028636400000003 58.933701939999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7013111099999998 58.932082100000002 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7013111099999998 58.932082100000002 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7012860300000003 58.93205871 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7012859899999997 58.932058689999998 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.70526351 58.936307399999997 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7133967700000001 58.934488729999998 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7029828299999998 58.933654189999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7029828299999998 58.933654189999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Ring Self-intersection at or near point 5.7029828299999998 58.933654189999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7027127999999996 58.933404099999997 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Self-intersection at or near point 5.70266684 58.933361529999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7026668300000001 58.933361529999999 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Too few points in geometry component at or near point 5.7027127999999996 58.933404099999997 LOCATION: pg_notice, lwgeom_pg.c:389 NOTICE: 00000: Self-intersection at or near point 5.7015160700000003 58.933634069999997 LOCATION: pg_notice, lwgeom_pg.c:389 ?column? ---------------------------------------------------------- invalid face after fixVertexSegmentPairsBelowDistance:36 (1 row) NOTICE: 00000: Checking for coincident nodes LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for edges crossing nodes LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for invalid or not-simple edges LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for crossing edges LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for edges start_node mismatch LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for edges end_node mismatch LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for faces without edges LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking edge linking LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Building edge rings LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Found 1609 rings, 1494 valid shells, 115 valid holes LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Constructing geometry of all faces LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking faces LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checked 1495 faces LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for holes coverage LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Finished checking for coverage of 115 holes LOCATION: exec_stmt_raise, pl_exec.c:3911 NOTICE: 00000: Checking for node containing_face correctness LOCATION: exec_stmt_raise, pl_exec.c:3911 error | id1 | id2 -------+-----+----- (0 rows) }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 03:18:02 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 10:18:02 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistanc In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.78656e87a73ee99133f58927b9f97e77@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistanc --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: 3.6.x Resolution: | Keywords: --------------------------------+--------------------------- Changes (by Lars Aksel Opsahl): * Attachment "t2.tar" added. test 2 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 03:20:57 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 10:20:57 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistance (was: add fixVertexSegmentPairsBelowDistanc) In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.29f29fda5db11a27c9742d0b688dfe4b@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistance --------------------------------+----------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS Fund Me Component: topology | Version: Resolution: | Keywords: --------------------------------+----------------------------- Changes (by strk): * milestone: PostGIS 3.6.5 => PostGIS Fund Me * summary: add fixVertexSegmentPairsBelowDistanc => add fixVertexSegmentPairsBelowDistance * version: 3.6.x => Old description: > In the attached dump we this case > > {{{ > [local] lop at t1=# SELECT * FROM > topology.FindVertexSegmentPairsBelowDistance('grunnkart_037',1e-15); > seg_edge | segno | vert_edge | vertno | vert_geom > ----------+-------+-----------+--------+---------------------------------------------------- > 7 | 59 | 31 | 2 | > 0101000020A2100000767C04140DD7164009093C79AE774D40 > > }}} > > the problem here that when covert this topology to simple feature we get > this error > > {{{ > > SELECT > ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); > NOTICE: 00000: Self-intersection at or near point 5.7100108290768832 > 58.935012010161067 > LOCATION: pg_notice, lwgeom_pg.c:389 > st_isvalid > ------------ > f > (1 row) > > }}} > > Then we run this code > > {{{ > DO $$ > DECLARE > r RECORD; > BEGIN > FOR r IN > SELECT DISTINCT ON (vs.vert_geom, > e.edge_id) > e.geom, > vs.vert_geom > FROM > topology.FindVertexSegmentPairsBelowDistance( > 'grunnkart_037', > 1e-15 > ) AS vs > JOIN grunnkart_037.edge e > ON e.edge_id = vs.seg_edge > ORDER BY vs.vert_geom, e.edge_id > LOOP > BEGIN > PERFORM > topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom, > r.vert_geom), -1 ); > EXCEPTION > WHEN OTHERS THEN > RAISE > WARNING 'Failed: %, error: %', > ST_AsText(r.vert_geom), > SQLERRM; > END; > END LOOP; > END; > $$; > > }}} > > and the face geom is valid > > {{{ > SELECT > ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); > st_isvalid > ------------ > t > (1 row) > > }}} > > tested on > > {{{ > > POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160" > GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF > URL_ENDPOINT=https://cdn.proj.org > USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj > DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db" > (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18" > LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY > }}} New description: In the attached dump we have this case {{{ [local] lop at t1=# SELECT * FROM topology.FindVertexSegmentPairsBelowDistance('grunnkart_037',1e-15); seg_edge | segno | vert_edge | vertno | vert_geom ----------+-------+-----------+--------+---------------------------------------------------- 7 | 59 | 31 | 2 | 0101000020A2100000767C04140DD7164009093C79AE774D40 }}} the problem here that when covert this topology to simple feature we get this error {{{ SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); NOTICE: 00000: Self-intersection at or near point 5.7100108290768832 58.935012010161067 LOCATION: pg_notice, lwgeom_pg.c:389 st_isvalid ------------ f (1 row) }}} Then we run this code {{{ DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT DISTINCT ON (vs.vert_geom, e.edge_id) e.geom, vs.vert_geom FROM topology.FindVertexSegmentPairsBelowDistance( 'grunnkart_037', 1e-15 ) AS vs JOIN grunnkart_037.edge e ON e.edge_id = vs.seg_edge ORDER BY vs.vert_geom, e.edge_id LOOP BEGIN PERFORM topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom, r.vert_geom), -1 ); EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Failed: %, error: %', ST_AsText(r.vert_geom), SQLERRM; END; END LOOP; END; $$; }}} and the face geom is valid {{{ SELECT ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8))); st_isvalid ------------ t (1 row) }}} tested on {{{ POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160" GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db" (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18" LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY }}} -- Comment: Any new function will have to wait for 3.8.0 May I recommend to NOT use WKT in your excercise ? The loss of precision you get is the reason why your simple feature constructed from face geometry becomes invalid. Verify by just calling `ST_IsValid(topology.ST_GetFaceGeometry(...))` -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 03:28:27 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 10:28:27 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistance In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.29c77cceeaa929850fd21b29785e4dbd@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistance --------------------------------+----------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS Fund Me Component: topology | Version: Resolution: | Keywords: --------------------------------+----------------------------- Comment (by Lars Aksel Opsahl): The reason we ran into this problem was that we were asked whether we could deliver valid data at a lower precision, for example when exporting to GeoJSON. It was during this investigation that we identified this type of problem. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From git at osgeo.org Fri Jul 10 03:39:22 2026 From: git at osgeo.org (git at osgeo.org) Date: Fri, 10 Jul 2026 03:39:22 -0700 (PDT) Subject: [SCM] PostGIS branch master updated. 3.7.0alpha1-265-g321c33cc4 Message-ID: <20260710103922.9508D1CA131@trac.osgeo.org> 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 321c33cc45c83e5c8faf032fb59b61df4fa1fc63 (commit) from 9e003e1c1ad6d0b5747a0c9766c99beb9a7e0bb4 (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 321c33cc45c83e5c8faf032fb59b61df4fa1fc63 Author: Teramoto Ikuhiro Date: Fri Jul 10 09:32:43 2026 +0000 Translated PostGIS Manual using Weblate (Japanese) Currently translated at 95.0% (5748 of 6049 strings) Translation: postgis/PostGIS Manual Translate-URL: https://weblate.osgeo.org/projects/postgis/postgis-manual/ja/ diff --git a/doc/po/ja/postgis-manual.po b/doc/po/ja/postgis-manual.po index 0ca9deaf2..f27f0c2b7 100644 --- a/doc/po/ja/postgis-manual.po +++ b/doc/po/ja/postgis-manual.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: postgis 3.5\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-07-05 04:20+0000\n" -"PO-Revision-Date: 2026-07-10 06:08+0000\n" +"PO-Revision-Date: 2026-07-10 10:39+0000\n" "Last-Translator: Teramoto Ikuhiro \n" "Language-Team: Japanese \n" @@ -22982,6 +22982,12 @@ msgid "" "necessary geometry can be projected into WGS84 using : ST_Transform(geom, 4326 )." msgstr "" +"GeoJSON???????????????????????????????????" +"???????????????????" +"?????????GeoJSON???????????WGS84??? (SRID=4326)???" +"??????????????????" +"???????WGS84??????????ST_Transform(geom, 4326 )" +"????????????" #. Tag: para #, no-c-format ----------------------------------------------------------------------- Summary of changes: doc/po/ja/postgis-manual.po | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) hooks/post-receive -- PostGIS From trac at osgeo.org Fri Jul 10 03:57:07 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 10:57:07 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistance In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.14103331c0ab22da513ea11b5082aff4@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistance --------------------------------+----------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS Fund Me Component: topology | Version: Resolution: | Keywords: --------------------------------+----------------------------- Comment (by Lars Aksel Opsahl): Just did a test with DISTINCT ON (vs.vert_geom) using TopoGeo_AddPoint no error from TopoGeo_AddPoint but no fix of is valid for test case t2 {{{ DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT DISTINCT ON (vs.vert_geom) e.geom, vs.vert_geom FROM topology.FindVertexSegmentPairsBelowDistance( 'grunnkart_037', 1e-7 ) AS vs JOIN grunnkart_037.edge e ON e.edge_id = vs.seg_edge ORDER BY vs.vert_geom LOOP BEGIN --PERFORM topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom, r.vert_geom), -1 ); PERFORM topology.TopoGeo_AddPoint( 'grunnkart_037', r.vert_geom, -1 ); EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Failed: %, error: %', ST_AsText(r.vert_geom), SQLERRM; END; END LOOP; END; $$; }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 03:58:09 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 10:58:09 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistance In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.2539f7fb8e9bc44d3a537f57d0db84a3@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistance --------------------------------+----------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS Fund Me Component: topology | Version: Resolution: | Keywords: --------------------------------+----------------------------- Comment (by Lars Aksel Opsahl): Comment @strk {{{ strk (osgeo) the question would then be: fix how ? I can think of 2 possible fixes: (1) drop the vertex (2) snap the segment to the vertex (3) add a node where the vertex is and hope for the bext *best (3) is effectively going to do (2) so it's really 2 possible fixes oh, and I'm aware of a bug I'm not sure I filed as a trac ticket, that if imore than 1 segment of the SAME EDGE are closer than tolerance from a node, only one will snap that one would be nice to fix actually can't find a trac ticket so I probbaly haven't filed it, but I'm pretty sure I saw it happen with one of your recently filed robustness testcases or by effect of my writing a simplified test for one of those I remember I pretended not to see th eproblem because I was focusing on fixing your specific case, but the test should be easy: (1) add a single edge with 2 segments being almost collinear (2) add a node near between the two segments, near the common vertex in an ideal world we should end up with no Vertex-Segment pair beow distance, but as of today, only one segment will snap to the incoming n }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 04:38:19 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 11:38:19 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistance In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.6072e5755b475118b097b00c919bdb62@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistance --------------------------------+----------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS Fund Me Component: topology | Version: Resolution: | Keywords: --------------------------------+----------------------------- Comment (by Lars Aksel Opsahl): THere also seems to be issue in test case 2 after fix where an error is reported when 3 edges meet the same point . As it looks for mee that's not an error. {{{ 5243 | 2 | 4628 | 38 | 0101000020A2100000126F4ED304D716407392AD7910774D40 }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Fri Jul 10 05:03:17 2026 From: trac at osgeo.org (PostGIS) Date: Fri, 10 Jul 2026 12:03:17 -0000 Subject: [PostGIS] #6095: add fixVertexSegmentPairsBelowDistance In-Reply-To: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> References: <050.37fffe4d609c05d3f0c611c773d1809a@osgeo.org> Message-ID: <065.30ea21b54036825ff7a3e20292361c18@osgeo.org> #6095: add fixVertexSegmentPairsBelowDistance --------------------------------+----------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS Fund Me Component: topology | Version: Resolution: | Keywords: --------------------------------+----------------------------- Changes (by Lars Aksel Opsahl): * Attachment "Screenshot 2026-07-10 at 14.01.30.png" added. Sample where 3 edge meet -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 02:38:25 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 09:38:25 -0000 Subject: [PostGIS] #6096: false positive values from topology.findvertexsegmentpairsbelowdistance Message-ID: <050.f8c916be0b5eda445e00f30a346bc991@osgeo.org> #6096: false positive values from topology.findvertexsegmentpairsbelowdistance -------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: 3.6.x Keywords: | -------------------------------+--------------------------- Here i as very simple testcase involving only 3 edges and 4 nodes (See attached image) where I do not understand why findvertexsegmentpairsbelowdistance return any rows after added last edge. This is tested on (this source seems to be equals to master now) {{{ POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160" GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db" (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18" LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY }}} First we create topology and add 2 edges and run FindVertexSegmentPairsBelowDistance and we find no rows {{{ SELECT topology.CreateTopology('test_topo', 4258); -- length degrees/meter 0.00012703297390676815, 7.493098741177089 SELECT topology.TopoGeo_AddLineString( 'test_topo', '0102000020A210000002000000140ABB6EA5D71640BE3992239B764D40B0F58F6FC6D7164070DDBCB19B764D40', -1 ); -- length degrees/meter 0.003258284155984599, 219.199284164798 SELECT topology.TopoGeo_AddLineString( 'test_topo', '0102000020A210000043000000B0F58F6FC6D7164070DDBCB19B764D4015A3C3FEC3D71640053545C59C764D40C441CFAEC1D716403B4111D59D764D40F6773F07BFD71640992AF7FB9E764D4002C3C8D6BBD71640381A8D3DA0764D40F0138846B9D71640AB2C8464A1764D404C63BE22B7D71640E6007977A2764D400AA7863AB6D71640B4B2053DA3764D402167506CB5D716408371B33CA4764D4020EF5FAFB6D71640523997A1A5764D40E38AC2A6B7D716409C22B3FEA6764D4050102D65B9D716400377F7D0A7764D40E60D3260BAD71640CBA19F15A8764D4021CCAB5ABBD71640D1B8045BA8764D40B38AB91CBED716400553AEDCA8764D40C47D5489C1D716404ED51555A9764D400A86CD9EC7D71640A1D545E6A9764D40737BCFF4CFD71640A79FFD9EAA764D4045076813DBD7164050651F75AB764D406370ECE1E2D716406A2A3809AC764D40D870ED1FECD7164037605CB4AC764D4067929793F5D71640DA50B437AD764D401164A220FAD71640BB2EF676AD764D406F9986BD08D81640232E3624AE764D400FCA4A1D14D8164033AE9AA4AE764D40FDFC606D1FD81640E00123EDAE764D40E7FF74442AD816407FE0553BAF764D401B99230D38D816407CA5B28FAF764D407C2AAC3646D8164067C6FFCFAF764D402D2052F856D81640B882BE20B0764D400632A66763D816406826A65FB0764D40F16AEE2872D81640F9B397BEB0764D40195FBF2D7CD816403E8BC9FDB0764D40873577EE9CD81640D3DB09E7B1764D40F902DA829ED816405ED18DF3B1764D4055F67C41B2D816400F2CF38FB2764D40FE839CB5CAD81640EC61942EB3764D40CE5FA9CBD9D816403F4B4589B3764D4092BAD187ECD81640EE7D3FF2B3764D400E0637AEFBD81640AA0CF846B4764D407FCFF1420AD91640E258AD93B4764D40683A085A20D916401FFA6302B5764D403206B4E931D916405B415158B5764D4072222D0643D91640A00E5CACB5764D40166AA6EA58D91640FF603120B6764D406AA71D6366D916403542E153B6764D40E200F78D77D91640C4671D95B6764D409D69335384D91640ED7A2CBFB6764D4041AF95AA91D91640F6CD7BF0B6764D400848C2BA9BD9164025DA8D11B7764D40A36E527CA4D91640E678CC2DB7764D40B709B628B5D916406D324B5DB7764D4010A24944C6D91640BF73EF93B7764D406FA30E3AD7D9164024CC38CEB7764D40455A71A2EAD916406E52C30CB8764D408A52BAF7FDD91640C5E90955B8764D40FB0D411411DA16401004A29BB8764D40E3A3E4581DDA16403DB60AC6B8764D408235534B25DA1640652A9BDEB8764D4014D1610B34DA164039610E11B9764D40280C59AC43DA1640C452CA4EB9764D40AA5C015E4ADA164068B18D5FB9764D407D27C9EE54DA16400C1B4780B9764D40E54246D561DA16407860B2ACB9764D40A0A4E5E671DA1640170B3BE0B9764D402E7F73F781DA1640995C5524BA764D40BD0BDE2293DA1640E4CBD061BA764D40', -1 ); SELECT * FROM topology.FindVertexSegmentPairsBelowDistance( 'test_topo', 1e-7 ); }}} Then we add the last line that connects to the common node for the two first edges. {{{ -- length degrees/meter 0.0011735358268378264, 128.4983388560817 SELECT topology.TopoGeo_AddLineString( 'test_topo', '0102000020A210000027000000B0F58F6FC6D7164070DDBCB19B764D40CF154E71C6D716400EE6FCB09B764D40528C13F2C6D71640C0472D789B764D4052A9A2F4C8D7164096B1DB349A764D40C4D12755CAD716402AA77E7999764D4044CDE1A6CAD71640F912CE9398764D40BBA76ED9CAD71640B326A5C797764D4007B85C5ACBD71640D31470C296764D40B36EA1BCCBD716407BD6F19895764D40C4D2FD4FCCD71640482FBF8A94764D4065823702CDD71640023DDC4493764D4080D44CB1CDD71640D841A44F92764D40C59BB2DDCDD71640DBDED39A91764D403031991ECED71640AA77E08D90764D40A2F8D900CED71640489CF9638F764D40BE86A089CDD7164028A35A168E764D4039810998CCD716405A3FC74A8D764D4025FFFB8BCCD7164078068D658C764D407D923A66CCD716404A9326A28B764D4046EF061DCAD71640DFECD9EC8A764D40E146A265C7D7164015B5D14D8A764D4062ED7FC4C3D71640D002A3BE89764D407DF8A028BFD71640AFEEE29D88764D401CF1F007BCD7164086F147D187764D40C7F09DAEB9D71640FAF3F52187764D401CE0232CB9D71640D1FC7DE786764D4035481D9EB8D7164048A8FEAC86764D4068AECCB1B8D71640C607861886764D4038C9A78FB9D71640B782828E85764D40774ABFA4BCD7164082D70AE783764D40904279A9BFD716400D1B8BA182764D40669F4FE9C2D71640EA228D3C81764D40A572AC5FC3D716408406BFCA7F764D40A851BC6DC3D716404D5FC81A7E764D40996647BCC7D71640408EF21F7A764D40C8B53DFCC7D716402808A56079764D4074900168C8D716401E83457778764D40D08B1742C9D71640E2EB9F7777764D40A9439B1ECAD7164043C6A22576764D40', -1 ); SELECT * FROM topology.FindVertexSegmentPairsBelowDistance( 'test_topo', 1e-7 ); }}} and we return this 4 rows {{{ seg_edge | segno | vert_edge | vertno | vert_geom ----------+-------+-----------+--------+---------------------------------------------------- 1 | 1 | 3 | 2 | 0101000020A2100000CF154E71C6D716400EE6FCB09B764D40 3 | 2 | 1 | 2 | 0101000020A2100000B0F58F6FC6D7164070DDBCB19B764D40 3 | 2 | 2 | 1 | 0101000020A2100000B0F58F6FC6D7164070DDBCB19B764D40 2 | 1 | 3 | 2 | 0101000020A2100000CF154E71C6D716400EE6FCB09B764D40 (4 rows) }}} I do understand why rows are returned. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 02:46:06 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 09:46:06 -0000 Subject: [PostGIS] #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? Message-ID: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? -------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Keywords: | -------------------------------+--------------------------- I have simple topology with 4 nodes and and edges that return 4 rows when running attached test_findvertexsegmentpairsbelowdistance tha I do not under stand why. this is tested on (source code seems be like in master) {{{ POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160" GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db" (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18" LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 02:46:40 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 09:46:40 -0000 Subject: [PostGIS] #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? In-Reply-To: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> References: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> Message-ID: <065.aac6757944c00eff212a0c9a9f110176@osgeo.org> #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Resolution: | Keywords: --------------------------------+--------------------------- Changes (by Lars Aksel Opsahl): * Attachment "topology.png" added. topology view picture -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 02:49:53 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 09:49:53 -0000 Subject: [PostGIS] #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? In-Reply-To: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> References: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> Message-ID: <065.48f1c11e9723df6c7406337190fd3e25@osgeo.org> #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Resolution: | Keywords: --------------------------------+--------------------------- Changes (by Lars Aksel Opsahl): * Attachment "test_findvertexsegmentpairsbelowdistance.sql" added. test sql file -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 02:51:38 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 09:51:38 -0000 Subject: [PostGIS] #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? In-Reply-To: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> References: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> Message-ID: <065.ef165020c11720b1dcf2cfbf168a4946@osgeo.org> #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Resolution: | Keywords: --------------------------------+--------------------------- Comment (by Lars Aksel Opsahl): When running psql -f /tmp/test_findvertexsegmentpairsbelowdistance.sql I get this output {{{ droptopology ------------------------------ Topology 'test_topo' dropped (1 row) createtopology ---------------- 15 (1 row) topogeo_addlinestring ----------------------- 1 (1 row) topogeo_addlinestring ----------------------- 2 (1 row) seg_edge | segno | vert_edge | vertno | vert_geom ----------+-------+-----------+--------+----------- (0 rows) topogeo_addlinestring ----------------------- 3 (1 row) seg_edge | segno | vert_edge | vertno | vert_geom ----------+-------+-----------+--------+---------------------------------------------------- 1 | 1 | 3 | 2 | 0101000020A2100000CF154E71C6D716400EE6FCB09B764D40 3 | 2 | 1 | 2 | 0101000020A2100000B0F58F6FC6D7164070DDBCB19B764D40 3 | 2 | 2 | 1 | 0101000020A2100000B0F58F6FC6D7164070DDBCB19B764D40 2 | 1 | 3 | 2 | 0101000020A2100000CF154E71C6D716400EE6FCB09B764D40 (4 rows) }}} -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 03:08:00 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 10:08:00 -0000 Subject: [PostGIS] #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? In-Reply-To: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> References: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> Message-ID: <065.73d0a41d9545dc38a56dc965cce657f1@osgeo.org> #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Resolution: | Keywords: --------------------------------+--------------------------- Comment (by Lars Aksel Opsahl): yes vertex '0101000020A2100000CF154E71C6D716400EE6FCB09B764D40' is very close to center node, but this vertex is on a straight line between the other first and third vertex for the last added edge so this is not problem node where will not help create a new edge. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 03:11:23 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 10:11:23 -0000 Subject: [PostGIS] #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? In-Reply-To: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> References: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> Message-ID: <065.e1e1e17357a2334a6b5c3569067810d1@osgeo.org> #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Resolution: | Keywords: --------------------------------+--------------------------- Changes (by Lars Aksel Opsahl): * Attachment "test_findvertexsegmentpairsbelowdistance_with_tolerance.sql" added. with tolerance 1e-7 -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 03:12:07 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 10:12:07 -0000 Subject: [PostGIS] #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? In-Reply-To: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> References: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> Message-ID: <065.2c2c5c2761958c933d4447d9c06ba763@osgeo.org> #6097: false positive values from topology.findvertexsegmentpairsbelowdistance ? --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: defect | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Resolution: | Keywords: --------------------------------+--------------------------- Comment (by Lars Aksel Opsahl): I also did test with tolerance and the same result -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 03:13:50 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 10:13:50 -0000 Subject: [PostGIS] #6097: reduce results from topology.findvertexsegmentpairsbelowdistance ? (was: false positive values from topology.findvertexsegmentpairsbelowdistance ?) In-Reply-To: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> References: <050.2c8dde2767d67be1af14e2d0f4142e36@osgeo.org> Message-ID: <065.a0047279be3200115bc38f39692bb585@osgeo.org> #6097: reduce results from topology.findvertexsegmentpairsbelowdistance ? --------------------------------+--------------------------- Reporter: Lars Aksel Opsahl | Owner: strk Type: enhancement | Status: new Priority: medium | Milestone: PostGIS 3.6.5 Component: topology | Version: Resolution: | Keywords: --------------------------------+--------------------------- Changes (by Lars Aksel Opsahl): * summary: false positive values from topology.findvertexsegmentpairsbelowdistance ? => reduce results from topology.findvertexsegmentpairsbelowdistance ? * type: defect => enhancement -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project. From trac at osgeo.org Sat Jul 11 16:21:42 2026 From: trac at osgeo.org (PostGIS) Date: Sat, 11 Jul 2026 23:21:42 -0000 Subject: [PostGIS] #6098: ST_Collect can turn valid POLYGONs into invalid MULTIPOLYGONs Message-ID: <049.75ddb29026802731283635bce97702c9@osgeo.org> #6098: ST_Collect can turn valid POLYGONs into invalid MULTIPOLYGONs ------------------------------------------------+-------------------------- Reporter: pnorman | Owner: pramsey Type: defect | Status: new Priority: medium | Milestone: PostGIS | 3.6.5 Component: postgis | Version: 3.6.x Keywords: collect valid multipolygon invalid | ------------------------------------------------+-------------------------- If you have two valid POLYGONs that touch each other running ST_Collect on them can return an invalid MULTIPOLYGON. ST_Collect appears to make the assumption that any set of geometries of a homogeneous type can be turned into a Multi* of that type. This is true for points and linestrings, but not true for multipolygons. In the case of the former a Multi* adds no additional validity constraints but for the latter constraints are added that none of the member POLYGONs of the MULTIPOLYGON may touch. This can be seen with the following queries {{{ SELECT ST_IsValid(geom), ST_IsValidReason(geom), ST_Area(geom), substring(st_astext(geom) FOR 40) FROM (SELECT geom geom FROM (VALUES ('SRID=3857;POLYGON((-9268999.088845689 5214595.936014973,-9267812.06685146 5213205.196203408,-9267809.584426817 5213197.55972637,-9267809.7848019 5213191.263779518,-9267785.83997943 5212881.969248425,-9267744.930066563 5212353.6841178,-9267302.724521339 5212418.611175549,-9267290.724280229 5212414.921270518,-9266682.975520242 5212512.470794289,-9266579.793484228 5212522.109832203,-9266528.809157444 5212523.133980559,-9266547.277060967 5212567.036914927,-9266554.24566109 5212610.111689871,-9266659.954649547 5213035.237094378,-9266714.378748598 5213312.84557948,-9266702.979632739 5213313.583630357,-9266745.025004411 5213471.723654301,-9266767.077395536 5213559.146894767,-9266982.63645751 5213557.429752363,-9266988.859217046 5213697.935206385,-9267005.278841939 5214068.187909914,-9267249.101922622 5214061.1834017765,-9267259.031621201 5214379.554829701,-9267016.98965237 5214383.652227536,-9267027.698587382 5214642.3040552875,-9267929.620233739 5214629.454150022,-9267991.458210874 5214629.258313381,-9268052.171861153 5214636.63985105,-9268099.404721096 5214645.6935408255,-9268145.46872639 5214657.534153168,-9268189.796147622 5214665.427902955,-9268312.715129355 5214658.52840373,-9268415.529811053 5214628.49003122,-9268506.84518935 5214613.922810667,-9268986.108993063 5214604.718508099,-9268999.088845689 5214595.936014973))'::geometry), ('SRID=3857;POLYGON((-9268999.088845689 5214595.936014973,-9267812.06685146 5213205.196203408,-9267809.584426817 5213197.55972637,-9267809.7848019 5213191.263779518,-9267744.930066563 5212353.6841178,-9267302.724521339 5212418.611175549,-9267290.724280229 5212414.921270518,-9266816.224950723 5212491.023970135,-9266682.975520242 5212512.470794289,-9266579.793484228 5212522.109832203,-9266528.809157444 5212523.133980559,-9266547.277060967 5212567.036914927,-9266554.24566109 5212610.111689871,-9266659.954649547 5213035.237094378,-9266714.378748598 5213312.84557948,-9266702.979632739 5213313.583630357,-9266745.025004411 5213471.723654301,-9266767.077395536 5213559.146894767,-9266982.63645751 5213557.429752363,-9267005.278841939 5214068.187909914,-9267249.101922622 5214061.1834017765,-9267259.031621201 5214379.554829701,-9267016.98965237 5214383.652227536,-9267027.698587382 5214642.3040552875,-9267929.620233739 5214629.454150022,-9267991.458210874 5214629.258313381,-9268052.171861153 5214636.63985105,-9268099.404721096 5214645.6935408255,-9268145.46872639 5214657.534153168,-9268189.796147622 5214665.427902955,-9268312.715129355 5214658.52840373,-9268365.569623584 5214642.891566027,-9268415.529811053 5214628.49003122,-9268506.84518935 5214613.922810667,-9268986.108993063 5214604.718508099,-9268999.088845689 5214595.936014973))'::geometry) ) AS t(geom)) AS q; SELECT ST_IsValid(geom), ST_IsValidReason(geom), ST_Area(geom), substring(st_astext(geom) FOR 40) FROM (SELECT ST_Collect(geom) geom FROM (VALUES ('SRID=3857;POLYGON((-9268999.088845689 5214595.936014973,-9267812.06685146 5213205.196203408,-9267809.584426817 5213197.55972637,-9267809.7848019 5213191.263779518,-9267785.83997943 5212881.969248425,-9267744.930066563 5212353.6841178,-9267302.724521339 5212418.611175549,-9267290.724280229 5212414.921270518,-9266682.975520242 5212512.470794289,-9266579.793484228 5212522.109832203,-9266528.809157444 5212523.133980559,-9266547.277060967 5212567.036914927,-9266554.24566109 5212610.111689871,-9266659.954649547 5213035.237094378,-9266714.378748598 5213312.84557948,-9266702.979632739 5213313.583630357,-9266745.025004411 5213471.723654301,-9266767.077395536 5213559.146894767,-9266982.63645751 5213557.429752363,-9266988.859217046 5213697.935206385,-9267005.278841939 5214068.187909914,-9267249.101922622 5214061.1834017765,-9267259.031621201 5214379.554829701,-9267016.98965237 5214383.652227536,-9267027.698587382 5214642.3040552875,-9267929.620233739 5214629.454150022,-9267991.458210874 5214629.258313381,-9268052.171861153 5214636.63985105,-9268099.404721096 5214645.6935408255,-9268145.46872639 5214657.534153168,-9268189.796147622 5214665.427902955,-9268312.715129355 5214658.52840373,-9268415.529811053 5214628.49003122,-9268506.84518935 5214613.922810667,-9268986.108993063 5214604.718508099,-9268999.088845689 5214595.936014973))'::geometry), ('SRID=3857;POLYGON((-9268999.088845689 5214595.936014973,-9267812.06685146 5213205.196203408,-9267809.584426817 5213197.55972637,-9267809.7848019 5213191.263779518,-9267744.930066563 5212353.6841178,-9267302.724521339 5212418.611175549,-9267290.724280229 5212414.921270518,-9266816.224950723 5212491.023970135,-9266682.975520242 5212512.470794289,-9266579.793484228 5212522.109832203,-9266528.809157444 5212523.133980559,-9266547.277060967 5212567.036914927,-9266554.24566109 5212610.111689871,-9266659.954649547 5213035.237094378,-9266714.378748598 5213312.84557948,-9266702.979632739 5213313.583630357,-9266745.025004411 5213471.723654301,-9266767.077395536 5213559.146894767,-9266982.63645751 5213557.429752363,-9267005.278841939 5214068.187909914,-9267249.101922622 5214061.1834017765,-9267259.031621201 5214379.554829701,-9267016.98965237 5214383.652227536,-9267027.698587382 5214642.3040552875,-9267929.620233739 5214629.454150022,-9267991.458210874 5214629.258313381,-9268052.171861153 5214636.63985105,-9268099.404721096 5214645.6935408255,-9268145.46872639 5214657.534153168,-9268189.796147622 5214665.427902955,-9268312.715129355 5214658.52840373,-9268365.569623584 5214642.891566027,-9268415.529811053 5214628.49003122,-9268506.84518935 5214613.922810667,-9268986.108993063 5214604.718508099,-9268999.088845689 5214595.936014973))'::geometry) ) AS t(geom)) AS q; }}} {{{ st_isvalid | st_isvalidreason | st_area | substring ------------+------------------+-------------------+------------------------------------------ t | Valid Geometry | 2935806.900413173 | POLYGON((-9268999.088845689 5214595.9360 t | Valid Geometry | 2935811.528830427 | POLYGON((-9268999.088845689 5214595.9360 (2 rows) NOTICE: Self-intersection at or near point -9267016.9896523692 5214383.6522275358 st_isvalid | st_isvalidreason | st_area | substring ------------+-------------------------------------------------------+-----------------+------------------------------------------ f | Self-intersection[-9267016.98965237 5214383.65222754] | 5871618.4292436 | MULTIPOLYGON(((-9268999.088845689 521459 (1 row) }}} This is not a "harmless" invalidity as https://github.com/pnorman/spirit/issues/87 shows that with the right geometries and subsequent processing with ST_SimplifyPreserveTopology and ST_AsMVTGeom results in a null geometry A work-around appears to be to wrap each ST_Collect which may contain touching polygons with a ST_ForceCollection, turning the MULTIPOLYGON into a GEOMETRYCOLLECTION {{{ SELECT ST_IsValid(geom), ST_IsValidReason(geom), ST_Area(geom), substring(st_astext(geom) FOR 40) FROM (SELECT ST_ForceCollection(ST_Collect(geom)) geom FROM (VALUES ('SRID=3857;POLYGON((-9268999.088845689 5214595.936014973,-9267812.06685146 5213205.196203408,-9267809.584426817 5213197.55972637,-9267809.7848019 5213191.263779518,-9267785.83997943 5212881.969248425,-9267744.930066563 5212353.6841178,-9267302.724521339 5212418.611175549,-9267290.724280229 5212414.921270518,-9266682.975520242 5212512.470794289,-9266579.793484228 5212522.109832203,-9266528.809157444 5212523.133980559,-9266547.277060967 5212567.036914927,-9266554.24566109 5212610.111689871,-9266659.954649547 5213035.237094378,-9266714.378748598 5213312.84557948,-9266702.979632739 5213313.583630357,-9266745.025004411 5213471.723654301,-9266767.077395536 5213559.146894767,-9266982.63645751 5213557.429752363,-9266988.859217046 5213697.935206385,-9267005.278841939 5214068.187909914,-9267249.101922622 5214061.1834017765,-9267259.031621201 5214379.554829701,-9267016.98965237 5214383.652227536,-9267027.698587382 5214642.3040552875,-9267929.620233739 5214629.454150022,-9267991.458210874 5214629.258313381,-9268052.171861153 5214636.63985105,-9268099.404721096 5214645.6935408255,-9268145.46872639 5214657.534153168,-9268189.796147622 5214665.427902955,-9268312.715129355 5214658.52840373,-9268415.529811053 5214628.49003122,-9268506.84518935 5214613.922810667,-9268986.108993063 5214604.718508099,-9268999.088845689 5214595.936014973))'::geometry), ('SRID=3857;POLYGON((-9268999.088845689 5214595.936014973,-9267812.06685146 5213205.196203408,-9267809.584426817 5213197.55972637,-9267809.7848019 5213191.263779518,-9267744.930066563 5212353.6841178,-9267302.724521339 5212418.611175549,-9267290.724280229 5212414.921270518,-9266816.224950723 5212491.023970135,-9266682.975520242 5212512.470794289,-9266579.793484228 5212522.109832203,-9266528.809157444 5212523.133980559,-9266547.277060967 5212567.036914927,-9266554.24566109 5212610.111689871,-9266659.954649547 5213035.237094378,-9266714.378748598 5213312.84557948,-9266702.979632739 5213313.583630357,-9266745.025004411 5213471.723654301,-9266767.077395536 5213559.146894767,-9266982.63645751 5213557.429752363,-9267005.278841939 5214068.187909914,-9267249.101922622 5214061.1834017765,-9267259.031621201 5214379.554829701,-9267016.98965237 5214383.652227536,-9267027.698587382 5214642.3040552875,-9267929.620233739 5214629.454150022,-9267991.458210874 5214629.258313381,-9268052.171861153 5214636.63985105,-9268099.404721096 5214645.6935408255,-9268145.46872639 5214657.534153168,-9268189.796147622 5214665.427902955,-9268312.715129355 5214658.52840373,-9268365.569623584 5214642.891566027,-9268415.529811053 5214628.49003122,-9268506.84518935 5214613.922810667,-9268986.108993063 5214604.718508099,-9268999.088845689 5214595.936014973))'::geometry) ) AS t(geom)) AS q; }}} {{{ st_isvalid | st_isvalidreason | st_area | substring ------------+------------------+-----------------+------------------------------------------ t | Valid Geometry | 5871618.4292436 | GEOMETRYCOLLECTION(POLYGON((-9268999.088 }}} This technique is not satisfactory for a few reasons 1. There's still an invalid geometry appearing in an intermediate stage 2. No one will expect valid geometries to be invalid when collected 3. There is no single aggregate function to form a geometry collection The reason for needing the multiple POLYGONs in one geometry is later on the output is passed to ST_AsMVT. MVT multipolygon geometries are a sequence of polygons encoded into a POLYGON geometry with multiple exterior/interior rings and all the validity constraints are on the individual exterior/interior sets in the sequence. -- Ticket URL: PostGIS The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.