diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2014-11-04 11:35:15 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2014-11-04 11:39:48 +0200 |
commit | 5028f22f6eb0579890689655285a4778b4ffc460 (patch) | |
tree | ed3a4cd635306b18cb0e2851281920db6770a826 /contrib/hstore/hstore_gist.c | |
parent | 404bc51cde9dce1c674abe4695635612f08fe27e (diff) | |
download | postgresql-5028f22f6eb0579890689655285a4778b4ffc460.tar.gz postgresql-5028f22f6eb0579890689655285a4778b4ffc460.zip |
Switch to CRC-32C in WAL and other places.
The old algorithm was found to not be the usual CRC-32 algorithm, used by
Ethernet et al. We were using a non-reflected lookup table with code meant
for a reflected lookup table. That's a strange combination that AFAICS does
not correspond to any bit-wise CRC calculation, which makes it difficult to
reason about its properties. Although it has worked well in practice, seems
safer to use a well-known algorithm.
Since we're changing the algorithm anyway, we might as well choose a
different polynomial. The Castagnoli polynomial has better error-correcting
properties than the traditional CRC-32 polynomial, even if we had
implemented it correctly. Another reason for picking that is that some new
CPUs have hardware support for calculating CRC-32C, but not CRC-32, let
alone our strange variant of it. This patch doesn't add any support for such
hardware, but a future patch could now do that.
The old algorithm is kept around for tsquery and pg_trgm, which use the
values in indexes that need to remain compatible so that pg_upgrade works.
While we're at it, share the old lookup table for CRC-32 calculation
between hstore, ltree and core. They all use the same table, so might as
well.
Diffstat (limited to 'contrib/hstore/hstore_gist.c')
-rw-r--r-- | contrib/hstore/hstore_gist.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/contrib/hstore/hstore_gist.c b/contrib/hstore/hstore_gist.c index d4a9aaa4c13..876b4359c6e 100644 --- a/contrib/hstore/hstore_gist.c +++ b/contrib/hstore/hstore_gist.c @@ -6,8 +6,8 @@ #include "access/gist.h" #include "access/skey.h" #include "catalog/pg_type.h" +#include "utils/pg_crc.h" -#include "crc32.h" #include "hstore.h" /* bigint defines */ @@ -68,6 +68,20 @@ typedef struct #define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) ) +/* shorthand for calculating CRC-32 of a single chunk of data. */ +static pg_crc32 +crc32_sz(char *buf, int size) +{ + pg_crc32 crc; + + INIT_TRADITIONAL_CRC32(crc); + COMP_TRADITIONAL_CRC32(crc, buf, size); + FIN_TRADITIONAL_CRC32(crc); + + return crc; +} + + PG_FUNCTION_INFO_V1(ghstore_in); PG_FUNCTION_INFO_V1(ghstore_out); |