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")));

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to