Re: BUG #19506: LOAD '$libdir/...' inside extension scripts ignores dynamic_library_path with extension_control_path

From: Gabriele Bartolini <gabriele(dot)bartolini(at)enterprisedb(dot)com>
To: Matheus Alcantara <matheusssilv97(at)gmail(dot)com>
Cc: gabriele(dot)bartolini(at)gmail(dot)com, pgsql-bugs(at)lists(dot)postgresql(dot)org, PG Bug reporting form <noreply(at)postgresql(dot)org>
Subject: Re: BUG #19506: LOAD '$libdir/...' inside extension scripts ignores dynamic_library_path with extension_control_path
Date: 2026-06-24 09:47:11
Message-ID: CA+VUV5r0Yu11PZrBa6yE4djSii3AHta7T57rza40fxyq6p8AOA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hi everyone,

I realised I hadn't sent this email with the patch. Please find the
attached patch.

Thanks,
Gabriele

On Fri, 5 Jun 2026 at 22:12, Matheus Alcantara <matheusssilv97(at)gmail(dot)com>
wrote:

> On 03/06/26 19:21, PG Bug reporting form wrote:
> > The following bug has been logged on the website:
> >
> > Bug reference: 19506
> > Logged by: Gabriele Bartolini
> > Email address: gabriele(dot)bartolini(at)gmail(dot)com
> > PostgreSQL version: 18.4
> > Operating system: Linux (reproduced under CloudNativePG/Kubernetes)
> > Description:
> >
> > When an extension is installed in a location reached via
> > `extension_control_path` / `dynamic_library_path` (rather than the
> > compiled-in package library directory), a LOAD '$libdir/foo' hardcoded
> > inside an extension's SQL script fails to find the library. PostGIS does
> > this in its upgrade scripts, so a PostGIS upgrade fails:
> >
> > ```
> > app=# SELECT postgis_extensions_upgrade();
> > NOTICE: Updating extension postgis 3.6.1
> > ERROR: could not access file "$libdir/postgis-3": No such file or
> directory
> > CONTEXT: SQL statement "LOAD '$libdir/postgis-3'"
> > extension script file "postgis--ANY--3.6.3.sql", near line 1530
> > ```
> >
> > This is a side effect of the fix for bug #18920 (commit f777d773878).
> Commit
> > 4f7f7b03758 (`extension_control_path`) made the feature work by stripping
> > the '$libdir/' prefix so that dynamic_library_path is consulted. #18920
> then
> > restricted that stripping to the function-load path so that a user-issued
> > `LOAD` keeps the literal '$libdir/' prefix. As a result, a `LOAD` inside
> an
> > extension script now also keeps the literal prefix, so
> > `dynamic_library_path` is never consulted, and the library cannot be
> found.
> >
>
> The only reason that it was decided that we should strip the $libdir
> was that almost all popular extensions use $libdir prefix on
> module_pathname on .control files, so the extension_control_path would
> not work and waiting for extensions to change this will make the
> extension_control_path almost useless (I hope that we can remove this
> in the future once 18 is the minimum supported version).
>
> I'm not sure if we also want this for the LOAD command, I'm wondering
> if the postgis could remove the $libdir prefix from the LOAD command
> instead of Postgres striping this, what do you think? IIRC a simple
> LOAD 'postgis-3' on versions before 18 will still works.
>
> I think that extensions should start to remove the $libdir prefix
> since extension_control_path is going to the second release cycle, but
> I agree that it seems more complicated than it actually is.
>
> --
> Matheus Alcantara
> EDB: https://www.enterprisedb.com
>
>
>

--
Gabriele Bartolini
VP, Chief Architect, Kubernetes
enterprisedb.com / Melbourne, Australia

Attachment Content-Type Size
0001-Strip-libdir-from-LOAD-inside-extension-scripts.patch application/octet-stream 11.2 KB

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Laurenz Albe 2026-06-24 09:56:58 Re: BUG #19483: pg_upgrade fails with orphan records in pg_init_priv catalog table
Previous Message Etsuro Fujita 2026-06-24 09:15:25 Re: BUG #19484: Segmentation fault triggered by FDW