Обсуждение: Only one version can be installed when using extension_control_path

Поиск
Список
Период
Сортировка

Only one version can be installed when using extension_control_path

От
Pierrick
Дата:

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.

Re: Only one version can be installed when using extension_control_path

От
Tom Lane
Дата:
"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



Re: Only one version can be installed when using extension_control_path

От
Pierrick
Дата:
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



Re: Only one version can be installed when using extension_control_path

От
Pierrick
Дата:


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.


Adding extension location is a good idea.

This looks like a good idea to me too.

Thanks for all the comments!
You are welcome :)

--
Matheus Alcantara

Re: Only one version can be installed when using extension_control_path

От
Michael Paquier
Дата:
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

Вложения

Re: Only one version can be installed when using extension_control_path

От
Peter Eisentraut
Дата:
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.

Вложения

Re: Only one version can be installed when using extension_control_path

От
Pierrick
Дата:
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)




Re: Only one version can be installed when using extension_control_path

От
Pierrick
Дата:
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)
>



Re: Only one version can be installed when using extension_control_path

От
Peter Eisentraut
Дата:
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




Re: Only one version can be installed when using extension_control_path

От
Matheus Alcantara
Дата:
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