Problem with ST_NRings
Marco Boeringa
marco at boeringa.demon.nl
Tue Dec 2 12:35:47 PST 2025
Thanks Erik,
Adding the search paths to the function definitions as you suggested,
indeed fixed the issue. Still slightly puzzled that I didn't run into
this before in the past year since upgrading to PG17/18, but I guess
that I missed the particular configuration hitting this part of my code.
Marco
Op 2-12-2025 om 20:43 schreef Erik Wienhold:
> On 2025-12-02 20:19 +0100, Marco Boeringa wrote:
>> If I change the CREATE MATERIALIZED VIEW to CREATE TABLE, exactly the same
>> SQL statement succeeds... Both modes used to work. My current setup is
>> PostgreSQL 18.1 / PostGIS 3.6.1.
>>
>> Op 2-12-2025 om 19:57 schreef Marco Boeringa:
>>> As part of a larger workflow, I am using a custom PostgreSQL function
>>> that depends on ST_NRings, and is used to create a MATERIALIZED VIEW.
>>>
>>> This has worked flawlessly until recently. I now ran into an issue with
>>> the error message below. Going over my own code calling the custom
>>> function that includes the ST_NRings call, I just cannot see any recent
>>> code change made by myself explaining this sudden error. This part of
>>> the code has been stable for quite a while.
>>>
>>> As input to the custom function, WGS1984 OpenStreetMap data is used,
>>> stored as 'geometry' type. There are actually explicit type casts in
>>> the code as well, so even that part of the error message I cannot
>>> explain for now.
>>>
>>> My question: has there been any change to ST_NRings in a recent update
>>> of PostGIS (3.6.0 or 3.6.1?), that might explain this error? E.g. should
>>> the 'public' be in this error message at all, I would have expected
>>> "ERROR: function st_nrings(geometry) does not exist"?
>>>
>>> ERROR: function st_nrings(public.geometry) does not exist
>>> LINE 8: WHEN ST_NRings($1) = 1 THEN $1
>>> ^
>>> HINT: No function matches the given name and argument types. You might
>>> need to add explicit type casts.
> Postgres runs REFRESH MATERIALIZED VIEW (and other maintenance commands)
> with a safe search_path since version 17 [1]. That also explains why
> you see type public.geometry instead of just geometry in the error
> message.
>
> You need to use the qualified function name public.ST_NRings in your
> custom function. Or change the search_path config of that function so
> that it no longer depends on the session search_path, e.g.:
>
> CREATE FUNCTION my_func(public.geometry)
> RETURNS int
> SET search_path = public, pg_catalog, pg_temp
> AS $$ SELECT ST_NRings($1); $$ LANGUAGE sql;
>
> [1] https://www.postgresql.org/docs/17/release-17.html#RELEASE-17-MIGRATION
>
More information about the postgis-users
mailing list