Inline Extension - Mailing list pgsql-hackers
From | Dimitri Fontaine |
---|---|
Subject | Inline Extension |
Date | |
Msg-id | m2aa5y0w4z.fsf@2ndQuadrant.fr Whole thread Raw |
Responses |
Re: Inline Extension
|
List | pgsql-hackers |
Hi, The extension mechanism we added in 9.1 is aimed at allowing a fully integrated contrib management, which was big enough a goal to preclude doing anything else in its first release. Now we have it and we can think some more about what features we want covered, and a pretty obvious one that's been left out is the ability to define and update an extension without resorting to file system support for those extensions that do not need a shared object library. We could have been calling that “SQL ONLY” extensions, but to simplify the grammar support I did use the “inline” keyword so there we go. Please find attached a WIP patch implementing that. Note that the main core benefit to integrating this feature is the ability to easily add regression tests for extension related features. Which is not done yet in the attached. I'm sending this quite soon because of the pg_dump support. When an extension is inline, we want to dump its content, as we currently do in the binary dump output. I had in mind that we could output a full CREATE EXTENSION INLINE script in between some dollar-quoting rather than adding each extension's object with a ALTER EXTENSION ... ADD line like what pg_upgrade compatibility is currently doing. It seems like much more work though, and I'd appreciate input about how exactly to do that (it looks like making pg_dump reentrant, somehow). Or some reason not to bother and just rename and share the binary upgrade facility that Bruce already has put into pg_dump. Here's a usage example that will certainly end up in the docs: create extension pair inline version '1.0' schema pair not relocatable as $pair$ CREATE TYPE pair AS ( k text, v text ); CREATE OR REPLACE FUNCTION pair(anyelement, text) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair'; CREATE OR REPLACE FUNCTION pair(text, anyelement) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair'; CREATE OR REPLACE FUNCTION pair(anyelement, anyelement) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair'; CREATE OR REPLACE FUNCTION pair(text, text) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair;'; CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = anyelement, PROCEDURE = pair); CREATE OPERATOR ~> (LEFTARG = anyelement, RIGHTARG = text, PROCEDURE = pair); CREATE OPERATOR ~> (LEFTARG = anyelement, RIGHTARG = anyelement, PROCEDURE = pair); CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = text, PROCEDURE = pair); $pair$; alter extension pair update from '1.0' to '1.1' with $pair$ CREATE OR REPLACE FUNCTION key(pair) RETURNS text LANGUAGE SQL AS 'SELECT ($1).k;'; CREATE OR REPLACE FUNCTION value(pair) RETURNS text LANGUAGE SQL AS 'SELECT ($1).v;'; CREATE OPERATOR %% (RIGHTARG = pair, PROCEDURE = key); CREATE OPERATOR %# (RIGHTARG = pair, PROCEDURE = value); $pair$; Regards, -- Dimitri Fontaine http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support
Attachment
pgsql-hackers by date: