Re: md5(bytea) - Mailing list pgsql-patches

From Abhijit Menon-Sen
Subject Re: md5(bytea)
Date
Msg-id 20050519061716.GA23006@penne.toroid.org
Whole thread Raw
In response to Re: md5(bytea)  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: md5(bytea)
Re: md5(bytea)
List pgsql-patches
At 2005-05-19 01:28:31 -0400, tgl@sss.pgh.pa.us wrote:
>
> No, I don't much care for that, because it gives free license for
> anyone to define pg_proc entries that allow bytea values to be fed
> to functions that are expecting text inputs.

Ah. I misunderstood the comment before the failing opr_sanity test.
Here's an updated patch, which also adds some regression tests.

Thanks.

-- ams

*** src/include/catalog/pg_proc.h~    2005-05-19 11:18:07.436175502 +0530
--- src/include/catalog/pg_proc.h    2005-05-19 11:20:13.530150617 +0530
***************
*** 3269,3274 ****
--- 3269,3276 ----
  /* 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");
+ DATA(insert OID =  2321 (  md5       PGNSP PGUID 12 f f t f i 1 25 "17" _null_ _null_ _null_  md5_bytea - _null_ ));
+ DESCR("calculates md5 hash");

  /* crosstype operations for date vs. timestamp and timestamptz */
  DATA(insert OID = 2338 (  date_lt_timestamp           PGNSP PGUID 12 f f t f i 2 16 "1082 1114" _null_ _null_ _null_
date_lt_timestamp- _null_ )); 

*** src/include/utils/builtins.h~    2005-05-19 11:18:33.563611812 +0530
--- src/include/utils/builtins.h    2005-05-19 11:18:45.621505655 +0530
***************
*** 572,577 ****
--- 572,578 ----
  extern Datum to_hex32(PG_FUNCTION_ARGS);
  extern Datum to_hex64(PG_FUNCTION_ARGS);
  extern Datum md5_text(PG_FUNCTION_ARGS);
+ extern Datum md5_bytea(PG_FUNCTION_ARGS);

  extern Datum unknownin(PG_FUNCTION_ARGS);
  extern Datum unknownout(PG_FUNCTION_ARGS);

*** src/backend/utils/adt/varlena.c~    2005-05-19 11:20:23.495409981 +0530
--- src/backend/utils/adt/varlena.c    2005-05-19 11:31:17.562163881 +0530
***************
*** 2327,2329 ****
--- 2327,2353 ----
      result_text = PG_STR_GET_TEXT(hexsum);
      PG_RETURN_TEXT_P(result_text);
  }
+
+ /* This function takes a bytea and returns the text representation (32
+  * lowercase hex characters) of its 16-byte MD5 checksum.
+  */
+
+ Datum
+ md5_bytea(PG_FUNCTION_ARGS)
+ {
+     /* It would be nice if we could avoid de-toasting the whole bytea,
+      * and feed it to md5_hash in small chunks instead. */
+     struct varlena *in = PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+     char    hexsum[MD5_HASH_LEN+1];
+     text   *result_text;
+     size_t    len;
+
+     len = VARSIZE(in) - VARHDRSZ;
+     if (md5_hash(VARDATA(in), len, hexsum) == false)
+         ereport(ERROR,
+                 (errcode(ERRCODE_OUT_OF_MEMORY),
+                  errmsg("out of memory")));
+
+     result_text = PG_STR_GET_TEXT(hexsum);
+     PG_RETURN_TEXT_P(result_text);
+ }

*** src/test/regress/sql/strings.sql~    2005-05-19 11:36:54.299345864 +0530
--- src/test/regress/sql/strings.sql    2005-05-19 11:39:06.825197521 +0530
***************
*** 331,333 ****
--- 331,347 ----
  select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') = 'd174ab98d277d9f5a5611c2c9f419d9f' AS
"TRUE";

  select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890') =
'57edf4a22be3c955ac49da2e2107b67a'AS "TRUE"; 
+
+ select md5(''::bytea) = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE";
+
+ select md5('a'::bytea) = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE";
+
+ select md5('abc'::bytea) = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE";
+
+ select md5('message digest'::bytea) = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE";
+
+ select md5('abcdefghijklmnopqrstuvwxyz'::bytea) = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE";
+
+ select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'::bytea) =
'd174ab98d277d9f5a5611c2c9f419d9f'AS "TRUE"; 
+
+ select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890'::bytea) =
'57edf4a22be3c955ac49da2e2107b67a'AS "TRUE"; 

*** src/test/regress/expected/strings.out~    2005-05-19 11:40:21.864090448 +0530
--- src/test/regress/expected/strings.out    2005-05-19 11:40:29.050835136 +0530
***************
*** 825,827 ****
--- 825,869 ----
   t
  (1 row)

+ select md5(''::bytea) = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE";
+  TRUE
+ ------
+  t
+ (1 row)
+
+ select md5('a'::bytea) = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE";
+  TRUE
+ ------
+  t
+ (1 row)
+
+ select md5('abc'::bytea) = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE";
+  TRUE
+ ------
+  t
+ (1 row)
+
+ select md5('message digest'::bytea) = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE";
+  TRUE
+ ------
+  t
+ (1 row)
+
+ select md5('abcdefghijklmnopqrstuvwxyz'::bytea) = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE";
+  TRUE
+ ------
+  t
+ (1 row)
+
+ select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'::bytea) =
'd174ab98d277d9f5a5611c2c9f419d9f'AS "TRUE"; 
+  TRUE
+ ------
+  t
+ (1 row)
+
+ select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890'::bytea) =
'57edf4a22be3c955ac49da2e2107b67a'AS "TRUE"; 
+  TRUE
+ ------
+  t
+ (1 row)
+

pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: md5(bytea)
Next
From: Abhijit Menon-Sen
Date:
Subject: Re: md5(bytea)