prefix 1.1.0
So I had two
bug
reports about
prefix in less than a week. It means several
things, one of them is that my code is getting used in the wild, which is
nice. The other side of the coin is that people do find bugs in there. This
one is about the behavior of the
btree opclass
of the type
prefix range
. We
cheat a lot there by simply having written one, because a range does not
have a strict ordering: is
[1-3]
before of after
[2-4]
? But when you know
you have no overlapping intervals in your
prefix_range
column, being able to
have it part of a
primary key is damn useful.
Note: in
8.5
we should have a way to express
contraint exclusion and have
PostgreSQL forbids overlapping entries for us. Not being there yet, you
could write a
constraint trigger and use the
GiST index to have nice speed
there, which is exactly what this
constraint exclusion support is about.
It turns out the code change required is pretty simple:
- return (a->first == b->first) ? (a->last - b->last) : (a->first - b->first);
+ /*
+ * we are comparing e.g. '1' and '12' (the shorter contains the
+ * smaller), so let's pretend '12' < '1' as it contains less elements.
+ */
+ return (alen == mlen) ? 1 : -1;
This happens in the
compare support function (see
Interfacing Extensions To Indexes) so that means you now have to rebuild
your
prefix_range
btree indexes, hence the version number bump.