in-catalog Extension Scripts and Control parameters (templates?) - Mailing list pgsql-hackers

From Dimitri Fontaine
Subject in-catalog Extension Scripts and Control parameters (templates?)
Date
Msg-id m2sj7j5xiq.fsf_-_@2ndQuadrant.fr
Whole thread Raw
In response to Re: Dumping an Extension's Script  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: in-catalog Extension Scripts and Control parameters (templates?)
List pgsql-hackers
Tom Lane <tgl@sss.pgh.pa.us> writes:
>> CREATE TEMPLATE yadda;
>> ALTER TEMPLATE yadda ADD FILE 'yadda--1.0.sql' CONTENT $$...$$;
>
> FWIW, the more I think about it the more I like the notion of treating
> "extension templates" as a separate kind of object.  I do see value in
> storing them inside the database system: transactional safety, the
> ability to identify an owner, etc etc.  But conflating this
> functionality with installed extensions is just going to create
> headaches.

I totally agree that the current proposal is somewhat of a mess, and
making a distinction between an extension and its packaging seems like a
good approach to the problem.

Tom Lane <tgl@sss.pgh.pa.us> writes:
> A dump-level option for that seems completely wrong in any case: it
> breaks one of the fundamental design objectives for extensions, or
> at least for extensions as originally conceived.  It might be necessary
> to do it this way for these new critters, but that just reinforces the
> point that you're designing a new kind of object.

Well what this template idea is saying to me is that once installed,
we're still talking about an extension, the exact same thing.

> I think a separate kind of "extension template" object would make a lot
> more sense.

I'm on board now. We still have some questions to answer, and here's a
worked out design proposal for implementing my understanding of your
"extension's template" idea:
- Extension Scripts are now stored in the catalogs, right?
  problem: pg_extension_script(extension, version, fromversion, script)           what's the unique key when
fromversionis nullable? 
  so I would propose to have instead:
  pg_extension_install_script(extension, version, script)  unique(extension, version)
  pg_extension_update_script(extension, oldversion, newversion, script)  unique(extension, oldversion, newversion)
- The control file should get in the catalogs too, and as it can get  some per-version changes, it needs to be stored
separately:
  pg_extension_control(extension, version, default_version,                       default_full_version,
module_pathname,                      relocatable, superuser, schema, requires)  unique(extension, version) 
  We would do the secondary control file overriding at creation time.
- The naming "TEMPLATE" appears to me to be too much of a generic  naming for our usage here, so I'm not sure about it
yet.On the other  hand the following proposal would certainly require to reserve new  keywords, which we want to avoid: 
    CREATE EXTENSION PARAMETERS FOR 'version' [ WITH ] key = val…    CREATE EXTENSION SCRIPT FOR 'version' AS $$ … $$;
 CREATE EXTENSION SCRIPT FROM 'version' TO 'version' AS … 
  So maybe what we could do instead is something like the following:
    ALTER EXTENSION … CONFIGURATION FOR 'version' SET param = value, …;    ALTER EXTENSION … SET SCRIPT FOR 'version'
AS$$ … $$;    ALTER EXTENSION … SET SCRIPT FROM 'version' TO 'version' AS … 
  Oh actually TEMPLATE is already a keyword thanks to text search, so  another alternative would be the following, if
wereally really want  to avoid any new keyword in our grammar: 
    ALTER EXTENSION … CONFIGURATION FOR 'version' SET param = value, …;    ALTER EXTENSION … SET TEMPLATE FOR 'version'
AS$$ … $$;    ALTER EXTENSION … SET TEMPLATE FROM 'version' TO 'version' AS … 
  That would mean that ALTER EXTENSION could create objects in other  catalogs for an extension that does not exists
itselfyet, but is now  known available (select * from pg_available_extensions()). 
  We already have commands that will create subsidiary objects in other  places in the catalogs (serial, composite
types,array types) but all  of those are using the new object in the command itself. So that  would be new, but it
allowsfor not having any new keyword here. 


The $2.56 question being what would be the pg_dump policy of the
"extension templates" objects?  I suppose the whole game here is to dump
them all by default, which would just work at pg_restore time too.

It's possible to filter templates out at dump or restore time if you
need to install a new set of templates for a given extension before to
run CREATE EXTENSION so that's ok.

Now, my understanding is that CREATE EXTENSION would check for templates
being already available in the catalogs and failing to find them would
have to do the extra steps of creating them from disk files as a
preparatory step, right? (backward compatibility requirement)


Finally, while we're talking about reflecting on-disk objects into the
catalogs, do we want to have a pg_module catalog where we list all
shared objects binaries we know about, with a boolean column to indicate
which of those we loaded in the current session, and by which extension
if any?

I don't think we could easily match a .so with an extension's template
so I won't be proposing that, but we could quite easily match them now
with extensions, because we're going to have to LOAD the module while
creating_extension = true.
Regards,
--
Dimitri Fontaine
http://2ndQuadrant.fr     PostgreSQL : Expertise, Formation et Support



pgsql-hackers by date:

Previous
From: Pavan Deolasee
Date:
Subject: Setting visibility map in VACUUM's second phase
Next
From: Christian Ullrich
Date:
Subject: Re: strange isolation test buildfarm failure on guaibasaurus