</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>
*-------------------------------------------------------------------------
*/
-#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.
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);
+}
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 202408121
+#define CATALOG_VERSION_NO 202408122
#endif
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',
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
\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
--
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
--