Hackers,

I wanted to get a (ok, not so) quick note in about this before the beta 
dropped. I've been thinking about the "requires" parameter on extensions 
control files. Right now it just lists the names of extensions that are 
required for the extension to run:

    requires = 'foo, bar'

But I'm assuming that at some point there's going to be something a bit more 
robust: specifically, requiring a minimum version, perhaps something like:

    requires = 'foo 1.0, bar 0.31.4'

I know that Dimitri has thought about this a bit, and I suspect we can all 
agree that most extensible systems have some way to at least specify the 
minimum version of a dependency. Is this something that's likely to come down 
the pike, perhaps in 9.2 or later?

If so, we return to the issue of comparing version strings in order to 
resolve/verify dependencies.

One way to solve the problem would be either for a developer to specify a 
version order in the control file, or else to ensure that the upgrade scripts 
are there for every single version.

But frankly, I would oppose something like this, as it once again puts the onus 
on the extension developer to take care of what is essentially a bookkeeping 
detail. And if I'm any example, there will often be mistakes, typos, etc.

I think a better solution would be to mandate a version string format for 
extensions *today*. This would remove the onus on the developer, while making 
version comparisons inside the database efficient and predictable.

Now, I know that ideas has been rejected in the past (at least for *right 
now*), but I'm here to tell you that not solving this problem up front is 
fodder for a nightmare later. Perl, for example, has only recently standardized 
on a version numbering scheme, but thanks to a 15 year history of none at all, 
it has to bend over backwards to try to manage any version scheme in existence. 
I mean, just look at this mess:

  http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/

I definitely think that version numbers should be boring. A few simple rules 
and then forget about it, it should just work.

I certainly didn't want to deal with this issue in PGXN, where dependency 
checking is planned for the command-line client. So I decided to use semantic 
versions. They have now been implemented as a native type in PostgreSQL, thanks 
to Sam Vilain porting the PL/pgSQL-based domain I originally wrote. The code is 
here:

  http://master.pgxn.org/dist/semver/0.2.0/

The reason I went with semantic versions, rather than just a numeric, as I'd 
originally planned, is because they are almost exactly the same format as 
PostgreSQL version numbers. So they were useful for specifying a dependency on 
a particular version of PostgreSQL. So by letting the core project set the 
standard, with just a minor modification of that standard, I get something that 
just works but is much more flexible than a numeric version. FWIW, the only 
difference that I've noticed between semantic versions and PostgreSQL versions 
is in developer/alpha/beta releases. So where PostgreSQL has released 
9.1alpha5, the semantic version is 9.1.0alpha5. (And the semver data type can 
convert from the former to the latter).

So, to summarize:

* I think we're going to need a formal version string spec for extensions.

* If that's true, I think it should be specified *now*, before extensions are 
in the wild, so that we don't end up with the legacy version string nightmares 
that Perl modules suffer from.

* If we do adopt a spec, I think it should reflect the PostgreSQL core version 
strings as closely as possible, and should be fully compatible with them.

* So it might be worth looking at semver or something similar to integrate.

Thoughts?

Best,

David
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to