Add user-callable CRC functions.
We've had code for CRC-32 and CRC-32C for some time (for WAL records, etc.), but there was no way for users to call it, despite apparent popular demand. The new crc32() and crc32c() functions accept bytea input and return bigint (to avoid returning negative values). Bumps catversion. Author: Aleksander Alekseev Reviewed-by: Peter Eisentraut, Tom Lane Discussion: https://postgr.es/m/CAJ7c6TNMTGnqnG%3DyXXUQh9E88JDckmR45H2Q%2B%3DucaCLMOW1QQw%40mail.gmail.com
This commit is contained in:
parent
313df8f5ad
commit
760162fedb
@ -4490,6 +4490,40 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
|
||||
</para></entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry role="func_table_entry"><para role="func_signature">
|
||||
<indexterm>
|
||||
<primary>crc32</primary>
|
||||
</indexterm>
|
||||
<function>crc32</function> ( <type>bytea</type> )
|
||||
<returnvalue>bigint</returnvalue>
|
||||
</para>
|
||||
<para>
|
||||
Computes the CRC-32 value of the binary string.
|
||||
</para>
|
||||
<para>
|
||||
<literal>crc32('abc'::bytea)</literal>
|
||||
<returnvalue>891568578</returnvalue>
|
||||
</para></entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry role="func_table_entry"><para role="func_signature">
|
||||
<indexterm>
|
||||
<primary>crc32c</primary>
|
||||
</indexterm>
|
||||
<function>crc32c</function> ( <type>bytea</type> )
|
||||
<returnvalue>bigint</returnvalue>
|
||||
</para>
|
||||
<para>
|
||||
Computes the CRC-32C value of the binary string.
|
||||
</para>
|
||||
<para>
|
||||
<literal>crc32c('abc'::bytea)</literal>
|
||||
<returnvalue>910901175</returnvalue>
|
||||
</para></entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry role="func_table_entry"><para role="func_signature">
|
||||
<indexterm>
|
||||
|
@ -17,9 +17,12 @@
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "c.h"
|
||||
#include "postgres.h"
|
||||
|
||||
#include "port/pg_crc32c.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/pg_crc.h"
|
||||
#include "varatt.h"
|
||||
|
||||
/*
|
||||
* Lookup table for calculating CRC-32 using Sarwate's algorithm.
|
||||
@ -95,3 +98,33 @@ const uint32 pg_crc32_table[256] = {
|
||||
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
|
||||
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
|
||||
};
|
||||
|
||||
/*
|
||||
* SQL-callable functions
|
||||
*/
|
||||
|
||||
Datum
|
||||
crc32_bytea(PG_FUNCTION_ARGS)
|
||||
{
|
||||
bytea *in = PG_GETARG_BYTEA_PP(0);
|
||||
pg_crc32 crc;
|
||||
|
||||
INIT_TRADITIONAL_CRC32(crc);
|
||||
COMP_TRADITIONAL_CRC32(crc, VARDATA_ANY(in), VARSIZE_ANY_EXHDR(in));
|
||||
FIN_TRADITIONAL_CRC32(crc);
|
||||
|
||||
PG_RETURN_INT64(crc);
|
||||
}
|
||||
|
||||
Datum
|
||||
crc32c_bytea(PG_FUNCTION_ARGS)
|
||||
{
|
||||
bytea *in = PG_GETARG_BYTEA_PP(0);
|
||||
pg_crc32c crc;
|
||||
|
||||
INIT_CRC32C(crc);
|
||||
COMP_CRC32C(crc, VARDATA_ANY(in), VARSIZE_ANY_EXHDR(in));
|
||||
FIN_CRC32C(crc);
|
||||
|
||||
PG_RETURN_INT64(crc);
|
||||
}
|
||||
|
@ -57,6 +57,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 202408121
|
||||
#define CATALOG_VERSION_NO 202408122
|
||||
|
||||
#endif
|
||||
|
@ -7743,6 +7743,14 @@
|
||||
proname => 'system', provolatile => 'v', prorettype => 'tsm_handler',
|
||||
proargtypes => 'internal', prosrc => 'tsm_system_handler' },
|
||||
|
||||
# CRC variants
|
||||
{ oid => '8571', descr => 'CRC-32 value',
|
||||
proname => 'crc32', proleakproof => 't', prorettype => 'int8',
|
||||
proargtypes => 'bytea', prosrc => 'crc32_bytea' },
|
||||
{ oid => '8572', descr => 'CRC-32C value',
|
||||
proname => 'crc32c', proleakproof => 't', prorettype => 'int8',
|
||||
proargtypes => 'bytea', prosrc => 'crc32c_bytea' },
|
||||
|
||||
# cryptographic
|
||||
{ oid => '2311', descr => 'MD5 hash',
|
||||
proname => 'md5', proleakproof => 't', prorettype => 'text',
|
||||
|
@ -874,6 +874,8 @@ xid8ne(xid8,xid8)
|
||||
xid8cmp(xid8,xid8)
|
||||
uuid_extract_timestamp(uuid)
|
||||
uuid_extract_version(uuid)
|
||||
crc32(bytea)
|
||||
crc32c(bytea)
|
||||
-- restore normal output mode
|
||||
\a\t
|
||||
-- List of functions used by libpq's fe-lobj.c
|
||||
|
@ -2255,6 +2255,33 @@ SELECT sha512('The quick brown fox jumps over the lazy dog.');
|
||||
\x91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bbc6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed
|
||||
(1 row)
|
||||
|
||||
--
|
||||
-- CRC
|
||||
--
|
||||
SELECT crc32('');
|
||||
crc32
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
SELECT crc32('The quick brown fox jumps over the lazy dog.');
|
||||
crc32
|
||||
------------
|
||||
1368401385
|
||||
(1 row)
|
||||
|
||||
SELECT crc32c('');
|
||||
crc32c
|
||||
--------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
SELECT crc32c('The quick brown fox jumps over the lazy dog.');
|
||||
crc32c
|
||||
-----------
|
||||
419469235
|
||||
(1 row)
|
||||
|
||||
--
|
||||
-- encode/decode
|
||||
--
|
||||
|
@ -719,6 +719,15 @@ SELECT sha384('The quick brown fox jumps over the lazy dog.');
|
||||
SELECT sha512('');
|
||||
SELECT sha512('The quick brown fox jumps over the lazy dog.');
|
||||
|
||||
--
|
||||
-- CRC
|
||||
--
|
||||
SELECT crc32('');
|
||||
SELECT crc32('The quick brown fox jumps over the lazy dog.');
|
||||
|
||||
SELECT crc32c('');
|
||||
SELECT crc32c('The quick brown fox jumps over the lazy dog.');
|
||||
|
||||
--
|
||||
-- encode/decode
|
||||
--
|
||||
|
Loading…
x
Reference in New Issue
Block a user