Обсуждение: Only one version can be installed when using extension_control_path
If the same extension is in two different paths mentioned in extension_control_path,
it is impossible to install the version of the last one.
postgres=# show extension_control_path ; extension_control_path ----------------------------------------------------------------------------- $system:/extensions/meilleureextension/share:/extensions/monextension/share (1 row) postgres=# select * from pg_available_extensions where name like '%mon%'; name | default_version | installed_version | comment --------------+-----------------+-------------------+--------------- monextension | 2.0 | | Meilleure monextension | 1.0 | | Mon extension
(2 rows)
postgres=# create extension monextension version "1.0" ; ERROR: extension "monextension" has no installation script nor update path for version "1.0"
postgres=# create extension monextension ; CREATE EXTENSION postgres=# select * from pg_available_extensions where name like '%mon%'; name | default_version | installed_version | comment --------------+-----------------+-------------------+--------------- monextension | 2.0 | 2.0 | Meilleure monextension | 1.0 | 2.0 | Mon extension
Don't you think that the command
create extension monextension version "1.0" ;
should be accepted by checking in all paths ?
Pierrick,
Re: Only one version can be installed when using extension_control_path
От
"Matheus Alcantara"
Дата:
On Fri Sep 5, 2025 at 11:22 AM -03, Pierrick wrote: > If the same extension is in two different paths mentioned in > extension_control_path, > it is impossible to install the version of the last one. > > postgres=# show extension_control_path ; > extension_control_path > ----------------------------------------------------------------------------- > $system:/extensions/meilleureextension/share:/extensions/monextension/share > (1 row) > > postgres=# select * from pg_available_extensions where name like '%mon%'; > name | default_version | installed_version | comment > --------------+-----------------+-------------------+--------------- > monextension | 2.0 | | Meilleure > monextension | 1.0 | | Mon extension > > (2 rows) > > postgres=# create extension monextension version "1.0" ; > ERROR: extension "monextension" has no installation script nor update path for version "1.0" > > postgres=# create extension monextension ; > CREATE EXTENSION > postgres=# select * from pg_available_extensions where name like '%mon%'; > name | default_version | installed_version | comment > --------------+-----------------+-------------------+--------------- > monextension | 2.0 | 2.0 | Meilleure > monextension | 1.0 | 2.0 | Mon extension > > > Don't you think that the command > > create extension monextension version "1.0" ; > > should be accepted by checking in all paths ? > This is working as expected. The current behavior is that at the first step of CREATE EXTENSION command it will try to find the primary .control file of the extension. On this step it will search the .control file on paths at extension_control_path in order and it will use the first one that it finds and based on the .control file found it will install the extension using the version specified on the command. -- Matheus Alcantara
Re: Only one version can be installed when using extension_control_path
От
"David G. Johnston"
Дата:
On Monday, September 8, 2025, Matheus Alcantara <matheusssilv97@gmail.com> wrote:
On Fri Sep 5, 2025 at 11:22 AM -03, Pierrick wrote:
> If the same extension is in two different paths mentioned in
> extension_control_path,
> it is impossible to install the version of the last one.
>
> postgres=# show extension_control_path ;
> extension_control_path
> ------------------------------------------------------------ -----------------
> $system:/extensions/meilleureextension/share:/ extensions/monextension/share
> (1 row)
>
> postgres=# select * from pg_available_extensions where name like '%mon%';
> name | default_version | installed_version | comment
> --------------+-----------------+-------------------+------- --------
> monextension | 2.0 | | Meilleure
> monextension | 1.0 | | Mon extension
>
On this step it will search the .control
file on paths at extension_control_path in order and it will use the
first one that it finds and based on the .control file found it will
install the extension using the version specified on the command.
Then pg_available_extensions seems broken - it lists extensions as available that are not accessible to the user due to this policy. Maybe we need to add something indicating that certain rows are hidden behind the present path setting which would need to be changed if one wishes to install them. Also seems like the extension location should be part of the output too.
David J.
"David G. Johnston" <david.g.johnston@gmail.com> writes: > On Monday, September 8, 2025, Matheus Alcantara <matheusssilv97@gmail.com> > wrote: >> On this step it will search the .control >> file on paths at extension_control_path in order and it will use the >> first one that it finds and based on the .control file found it will >> install the extension using the version specified on the command. > Then pg_available_extensions seems broken - it lists extensions as > available that are not accessible to the user due to this policy. Maybe we > need to add something indicating that certain rows are hidden behind the > present path setting which would need to be changed if one wishes to > install them. Also seems like the extension location should be part of the > output too. Between this and previously-identified problems (commits 81eaaa2c4, f777d7738), it seems clear that extension_control_path (which is a new thing in v18) was very poorly thought out. I wonder if it's too late to revert it so that we can redesign it more carefully. regards, tom lane
On 08/09/2025 17:35, Tom Lane wrote: > "David G. Johnston" <david.g.johnston@gmail.com> writes: >> On Monday, September 8, 2025, Matheus Alcantara <matheusssilv97@gmail.com> >> wrote: >>> On this step it will search the .control >>> file on paths at extension_control_path in order and it will use the >>> first one that it finds and based on the .control file found it will >>> install the extension using the version specified on the command. >> Then pg_available_extensions seems broken - it lists extensions as >> available that are not accessible to the user due to this policy. Maybe we >> need to add something indicating that certain rows are hidden behind the >> present path setting which would need to be changed if one wishes to >> install them. Also seems like the extension location should be part of the >> output too. I agree. If an extension is the list, I expect to be able to install it. Either : - we hide the latest version found in paths in pg_available_extensions ; - we give the possibility to install all listed versions. The second option seems more relevant to me. Adding extension location is a good idea. > Between this and previously-identified problems (commits 81eaaa2c4, > f777d7738), it seems clear that extension_control_path (which is a new > thing in v18) was very poorly thought out. I wonder if it's too late > to revert it so that we can redesign it more carefully. > > regards, tom lane
Re: Only one version can be installed when using extension_control_path
От
"Matheus Alcantara"
Дата:
On Tue Sep 9, 2025 at 4:53 AM -03, Pierrick wrote: > > On 08/09/2025 17:35, Tom Lane wrote: >> "David G. Johnston" <david.g.johnston@gmail.com> writes: >>> On Monday, September 8, 2025, Matheus Alcantara <matheusssilv97@gmail.com> >>> wrote: >>>> On this step it will search the .control >>>> file on paths at extension_control_path in order and it will use the >>>> first one that it finds and based on the .control file found it will >>>> install the extension using the version specified on the command. >>> Then pg_available_extensions seems broken - it lists extensions as >>> available that are not accessible to the user due to this policy. Maybe we >>> need to add something indicating that certain rows are hidden behind the >>> present path setting which would need to be changed if one wishes to >>> install them. Also seems like the extension location should be part of the >>> output too. > > I agree. If an extension is the list, I expect to be able to install it. > I definitely agree that pg_available_extensions is wrong but I think that a fix for this should be to don't allow extensions with the same name on different paths. The current behavior is to stop the searching when the first extension name matches with the CREATE EXTENSION input, this works in the same way when for example we have the same command on multiple paths on PATH. Changing the behavior to search on all paths to find the extension that matches the name and possibly the version seems complicated and confusing to me TBH. To have multiple versions of the same extension, the .sql files for all versions should be put on the same path all together as already is today. Enabling adding the same extension on multiple paths doesn't seem right to me IMHO. Any thoughts? I'm missing something here? > Adding extension location is a good idea. > This looks like a good idea to me too. Thanks for all the comments! -- Matheus Alcantara
On 09/09/2025 16:18, Matheus Alcantara wrote:
On Tue Sep 9, 2025 at 4:53 AM -03, Pierrick wrote:On 08/09/2025 17:35, Tom Lane wrote:"David G. Johnston" <david.g.johnston@gmail.com> writes:On Monday, September 8, 2025, Matheus Alcantara <matheusssilv97@gmail.com> wrote:On this step it will search the .control file on paths at extension_control_path in order and it will use the first one that it finds and based on the .control file found it will install the extension using the version specified on the command.Then pg_available_extensions seems broken - it lists extensions as available that are not accessible to the user due to this policy. Maybe we need to add something indicating that certain rows are hidden behind the present path setting which would need to be changed if one wishes to install them. Also seems like the extension location should be part of the output too.I agree. If an extension is the list, I expect to be able to install it.I definitely agree that pg_available_extensions is wrong but I think that a fix for this should be to don't allow extensions with the same name on different paths. The current behavior is to stop the searching when the first extension name matches with the CREATE EXTENSION input, this works in the same way when for example we have the same command on multiple paths on PATH.
If so, then only one line should be printed in pg_available_extensions.
This could be the fix :).
Changing the behavior to search on all paths to find the extension that matches the name and possibly the version seems complicated and confusing to me TBH. To have multiple versions of the same extension, the .sql files for all versions should be put on the same path all together as already is today. Enabling adding the same extension on multiple paths doesn't seem right to me IMHO. Any thoughts? I'm missing something here?
Well, I don't really have a strong argument, but adding this new setting allows
people to work with extensions differently. Having different folders for different
versions of the same extension might be a new approach.
You are welcome :)Adding extension location is a good idea.This looks like a good idea to me too. Thanks for all the comments!
-- Matheus Alcantara
On Mon, Sep 08, 2025 at 11:35:42AM -0400, Tom Lane wrote: > Between this and previously-identified problems (commits 81eaaa2c4, > f777d7738), it seems clear that extension_control_path (which is a new > thing in v18) was very poorly thought out. I wonder if it's too late > to revert it so that we can redesign it more carefully. It would be too late once we are in GA, and we are not yet in GA. At this point I think that this should be Peter's call. I am not in his shoes, still I suspect like you that we may have not seen the end of it yet. If we're confident enough that we can fix anything, that's fine as a response to me, but discussions are also involving how available extensions are seen at catalog level. This bit is concerning for me, but I'm also of a pessimistic nature. -- Michael
Вложения
On 10.09.25 09:48, Pierrick wrote: > On 09/09/2025 16:18, Matheus Alcantara wrote: >> On Tue Sep 9, 2025 at 4:53 AM -03, Pierrick wrote: >>> On 08/09/2025 17:35, Tom Lane wrote: >>>> "David G. Johnston"<david.g.johnston@gmail.com> writes: >>>>> On Monday, September 8, 2025, Matheus Alcantara<matheusssilv97@gmail.com> >>>>> wrote: >>>>>> On this step it will search the .control >>>>>> file on paths at extension_control_path in order and it will use the >>>>>> first one that it finds and based on the .control file found it will >>>>>> install the extension using the version specified on the command. >>>>> Then pg_available_extensions seems broken - it lists extensions as >>>>> available that are not accessible to the user due to this policy. Maybe we >>>>> need to add something indicating that certain rows are hidden behind the >>>>> present path setting which would need to be changed if one wishes to >>>>> install them. Also seems like the extension location should be part of the >>>>> output too. >>> I agree. If an extension is the list, I expect to be able to install it. >>> >> I definitely agree that pg_available_extensions is wrong but I think >> that a fix for this should be to don't allow extensions with the same >> name on different paths. >> >> The current behavior is to stop the searching when the first extension >> name matches with the CREATE EXTENSION input, this works in the same way >> when for example we have the same command on multiple paths on PATH. > > If so, then only one line should be printed in pg_available_extensions. > This could be the fix :). Here is a patch for that. Please test it against your setup.
Вложения
On 11/09/2025 16:11, Peter Eisentraut wrote: > > Here is a patch for that. Please test it against your setup. Thanks a lot. Here is a test, and IMHO, it looks good. -- version 1 of monextension is in /tmp/extensions/share/extension postgres=# show extension_control_path ; extension_control_path ------------------------------------------------------ $system:/tmp/extensions/share:/tmp/extensions2/share (1 ligne) postgres=# select * from pg_available_extensions where name = 'monextension'; name | default_version | installed_version | comment --------------+-----------------+-------------------+--------------- monextension | 1.0 | | Mon extension (1 ligne) -- switching order postgres=# alter system set extension_control_path = '$system:/tmp/extensions2/share:/tmp/extensions/share'; ALTER SYSTEM postgres=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 ligne) postgres=# show extension_control_path ; extension_control_path ------------------------------------------------------ $system:/tmp/extensions2/share:/tmp/extensions/share (1 ligne) -- version 2 of monextension is in /tmp/extensions2/share/extension postgres=# select * from pg_available_extensions where name = 'monextension'; name | default_version | installed_version | comment --------------+-----------------+-------------------+--------------- monextension | 2.0 | | Mon extension (1 ligne) -- make a mistake in first folder postgres=# alter system set extension_control_path = '$system:/tmp/extension_old/share:/tmp/extensions/share'; ALTER SYSTEM postgres=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 ligne) -- still version 2.0 postgres=# select * from pg_available_extensions where name = 'monextension'; name | default_version | installed_version | comment --------------+-----------------+-------------------+--------------- monextension | 1.0 | | Mon extension (1 ligne)
On 11/09/2025 20:03, Pierrick wrote: > > -- make a mistake in first folder > > postgres=# alter system set extension_control_path = > '$system:/tmp/extension_old/share:/tmp/extensions/share'; > ALTER SYSTEM > postgres=# select pg_reload_conf(); > pg_reload_conf > ---------------- > t > (1 ligne) > > -- still version 2.0 sorry ... read --still version 1.0 of course > postgres=# select * from pg_available_extensions where name = > 'monextension'; > name | default_version | installed_version | comment > --------------+-----------------+-------------------+--------------- > monextension | 1.0 | | Mon extension > (1 ligne) >
On 11.09.25 20:03, Pierrick wrote: > On 11/09/2025 16:11, Peter Eisentraut wrote: >> >> Here is a patch for that. Please test it against your setup. > Thanks a lot. Here is a test, and IMHO, it looks good. committed
On Mon, Sep 8, 2025 at 12:23 PM David G. Johnston <david.g.johnston@gmail.com> wrote: > Also seems like the extension location should be part of the output too. > I've posted a patch for this at [1] [1] https://www.postgresql.org/message-id/DCTSKQAVOXIG.3A05JM1YORARK%40gmail.com -- Matheus Alcantara