md5(bytea) - Mailing list pgsql-patches
From | Abhijit Menon-Sen |
---|---|
Subject | md5(bytea) |
Date | |
Msg-id | 20050519025810.GA17298@penne.toroid.org Whole thread Raw |
Responses |
Re: md5(bytea)
|
List | pgsql-patches |
The appended patch fiddles with md5_text() until it handles any varlena, and adds an entry for md5(bytea) to pg_proc. -- ams *** src/include/catalog/pg_proc.h~ 2005-05-19 07:45:05.191855191 +0530 --- src/include/catalog/pg_proc.h 2005-05-19 07:56:45.785482224 +0530 *************** *** 3267,3273 **** DESCR("I/O"); /* cryptographic */ ! DATA(insert OID = 2311 ( md5 PGNSP PGUID 12 f f t f i 1 25 "25" _null_ _null_ _null_ md5_text - _null_ )); DESCR("calculates md5 hash"); /* crosstype operations for date vs. timestamp and timestamptz */ --- 3267,3275 ---- DESCR("I/O"); /* cryptographic */ ! DATA(insert OID = 2311 ( md5 PGNSP PGUID 12 f f t f i 1 25 "25" _null_ _null_ _null_ md5_varlena - _null_ )); ! DESCR("calculates md5 hash"); ! DATA(insert OID = 2321 ( md5 PGNSP PGUID 12 f f t f i 1 25 "17" _null_ _null_ _null_ md5_varlena - _null_ )); DESCR("calculates md5 hash"); /* crosstype operations for date vs. timestamp and timestamptz */ *** src/include/utils/builtins.h~ 2005-05-19 07:56:05.737477425 +0530 --- src/include/utils/builtins.h 2005-05-19 07:56:16.249641262 +0530 *************** *** 571,577 **** extern Datum array_to_text(PG_FUNCTION_ARGS); extern Datum to_hex32(PG_FUNCTION_ARGS); extern Datum to_hex64(PG_FUNCTION_ARGS); ! extern Datum md5_text(PG_FUNCTION_ARGS); extern Datum unknownin(PG_FUNCTION_ARGS); extern Datum unknownout(PG_FUNCTION_ARGS); --- 571,577 ---- extern Datum array_to_text(PG_FUNCTION_ARGS); extern Datum to_hex32(PG_FUNCTION_ARGS); extern Datum to_hex64(PG_FUNCTION_ARGS); ! extern Datum md5_varlena(PG_FUNCTION_ARGS); extern Datum unknownin(PG_FUNCTION_ARGS); extern Datum unknownout(PG_FUNCTION_ARGS); *** src/backend/utils/adt/varlena.c~ 2005-05-19 07:46:28.895234689 +0530 --- src/backend/utils/adt/varlena.c 2005-05-19 08:20:42.844470560 +0530 *************** *** 2297,2324 **** } /* ! * Create an md5 hash of a text string and return it as hex * * md5 produces a 16 byte (128 bit) hash; double it for hex */ #define MD5_HASH_LEN 32 Datum ! md5_text(PG_FUNCTION_ARGS) { ! text *in_text = PG_GETARG_TEXT_P(0); size_t len; ! char *hexsum; text *result_text; /* Calculate the length of the buffer using varlena metadata */ ! len = VARSIZE(in_text) - VARHDRSZ; ! ! /* leave room for the terminating '\0' */ ! hexsum = (char *) palloc(MD5_HASH_LEN + 1); /* get the hash result */ ! if (md5_hash(VARDATA(in_text), len, hexsum) == false) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory"))); --- 2297,2323 ---- } /* ! * Create an md5 hash of a varlena and return it as hex * * md5 produces a 16 byte (128 bit) hash; double it for hex */ #define MD5_HASH_LEN 32 Datum ! md5_varlena(PG_FUNCTION_ARGS) { ! /* It would be nice if we could avoid de-toasting the whole varlena, ! * and feed it to md5_hash in small chunks instead. */ ! struct varlena *in = PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); size_t len; ! char hexsum[MD5_HASH_LEN+1]; text *result_text; /* Calculate the length of the buffer using varlena metadata */ ! len = VARSIZE(in) - VARHDRSZ; /* get the hash result */ ! if (md5_hash(VARDATA(in), len, hexsum) == false) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory")));
pgsql-patches by date: