Monday, May 02 2011
PostgreSQL, debian, Extensions, release, prefix, 9.1

Extension module_pathname and .sql.in

While currently too busy at work to deliver much Open Source contributions, let's debunk an old habit of PostgreSQL extension authors. It's all down to copy pasting from contrib, and there's no reason to continue doing $libdir this way ever since 7.4 days.

Let's take an example here, with the prefix extension. This one too will need some love, but is still behind on my spare time todo list, sorry about that. So, in the prefix.sql.in we read

CREATE OR REPLACE FUNCTION prefix_range_in(cstring)
  RETURNS prefix_range
  AS 'MODULE_PATHNAME'
  LANGUAGE 'C' IMMUTABLE STRICT;

Two things are to change here. First, the PostgreSQL backend will understand just fine if you just say AS '$libdir/prefix'. So you have to know in the sql script the name of the shared object library, but if you do, you can maintain directly a prefix.sql script instead.

The advantage is that you now can avoid a compatibility problem when you want to support PostgreSQL from 8.2 to 9.1 in your extension (older than that and it's no longer supported). You directly ship your script.

For compatibility, you could also use the control file module_pathname property. But for 9.1 you then have to add a implicit Make rule so that the script is derived from your .sql.in. And as you are managing several scripts — so that you can handle versioning and upgrades — it can get hairy ( hint, you need to copy prefix.sql as prefix--1.1.1.sql, then change its name at next revision, and think about upgrade scripts too). The module_pathname facility is better to keep for when managing more than a single extension in the same directory, like the SPI contrib is doing.

Sure, maintaining an extension that targets both antique releases of PostgreSQL and CREATE EXTENSION super-powered one(s) (not yet released) is a little more involved than that. We'll get back to that, as some people are still pioneering the movement.

On my side, I'm working with some debian developer on how to best manage the packaging of those extensions, and this work could end up as a specialized policy document and a coordinated team of maintainers for all things PostgreSQL in debian. This will also give some more steam to the PostgreSQL effort for debian packages: the idea is to maintain packages for all supported version (from 8.2 up to soon 9.1), something debian itself can not commit to.