It's been a long time since I last had some time to spend on the prefix
PostgreSQL extension and its prefix_range data type. With PostgreSQL 9.2
out, some users wanted me to update the extension for that release, and
hinted me that it was high time that I fix that old bug for which I already
had a patch.

prefix_range release 1.2.0
I'm sorry it took that long. It's now done, you can have prefix 1.2.0 from
https://github.com/dimitri/prefix or if you want a tagged tarball then you
can use this link: https://github.com/dimitri/prefix/tarball/v1.2.0.
The changelog is all about fixing an index search bug and updating the
package to primarily be an extension for PostgreSQL 9.1 and 9.2. Of course
older Major Versions are still supported (all of them since 8.1, but please
first consider upgrading PostgreSQL) if you want to install it manually,
using the prefix--1.2.0.sql file.
debian package
And thanks to Christoph Berg the debian package is already validated and has reached debian experimental. We don't target sid these days because debian is preparing a new stable release, so there's a freeze. I think. Anyway, take your prefix package from here if you need it: http://packages.debian.org/experimental/postgresql-9.1-prefix.
Range Types
If you step back a little there's an interesting question to answer here.
Why isn't prefix_range and PostgreSQL Range Type? Given the names it seems
like a pretty good candidate.
Well the thing is that to make a generic range type you need to have a total ordering on the range elements, and a distance function that tells you how far any two elements of a range are one from each other.
When talking about prefixes, I don't see how to do that. The prefix range
['abcd', 'abce') contains an infinity of elements, all the strings that
begin with the letters abcd. I guess that coming with an ordering on text is
possible, but what if any text element represents a prefix?
I mean that in our case, the elements would be of type prefix, and 'abcd' is
a prefix of 'abcdefg'. The question I want to answer is that given a table
with prefixes 'abcd', 'abce' and 'abcde' which row in there has the longest
prefix matching the literal 'abcdef'.
I'm not seeing how to abuse the Range Types mechanism to implement that, so if you have some ideas please share them!
Tags
Previous Articles
- Fast and stupid? Wednesday, August 22 2012, 16:05
- El-Get 4.1 is out Tuesday, August 28 2012, 11:43
- PostgreSQL 9.3 Saturday, September 15 2012, 18:43
- Reset Counter Friday, October 05 2012, 09:44
Next Articles
- Another awesome conf Tuesday, October 30 2012, 12:50
- PostgreSQL for developers Friday, November 02 2012, 16:22
- Concurrent Hello Sunday, November 04 2012, 23:04
- Editing SQL Tuesday, November 06 2012, 09:55

