pgmp is also worth mentioning here,   and it's likely to be more efficient
than the numeric type or something you hack up yourself:

http://pgmp.projects.pgfoundry.org/

Best,
Leon


On Thu, Apr 10, 2014 at 10:11 AM, k...@rice.edu <k...@rice.edu> wrote:

> On Thu, Apr 10, 2014 at 09:13:47PM +0800, Olivier Lalonde wrote:
> > I was wondering if there would be any way to do the following in
> PostgreSQL:
> >
> >     UPDATE cryptotable SET work = work + 'some big hexadecimal number'
> >
> > where work is an unsigned 256 bit integer. Right now my column is a
> > character varying(64) column (hexadecimal representation of the number)
> but
> > I would be happy to switch to another data type if it lets me do the
> > operation above.
> >
> > If it's not possible with vanilla PostgreSQL, are there extensions that
> > could help me?
> >
> > --
> > - Oli
> >
> > Olivier Lalonde
> > http://www.syskall.com <-- connect with me!
> >
>
> Hi Olivier,
>
> Here are some sample pl/pgsql helper functions that I have written for
> other purposes. They use integers but can be adapted to use numeric.
>
> Regards,
> Ken
> ---------------------------
> CREATE OR REPLACE FUNCTION hex2dec(t text) RETURNS integer AS $$
> DECLARE
>   r RECORD;
> BEGIN
>   FOR r IN EXECUTE 'SELECT x'''||t||'''::integer AS hex' LOOP
>     RETURN r.hex;
>   END LOOP;
> END
> $$ LANGUAGE plpgsql IMMUTABLE STRICT;
> ---------------------------
>
> ---------------------------
> CREATE OR REPLACE FUNCTION bytea2int (
>   in_string BYTEA
> ) RETURNS INTEGER AS $$
>
> DECLARE
>
>   b1 INTEGER := 0;
>   b2 INTEGER := 0;
>   b3 INTEGER := 0;
>   b4 INTEGER := 0;
>   out_int INTEGER := 0;
>
> BEGIN
>
>   CASE OCTET_LENGTH(in_string)
>     WHEN 1 THEN
>       b4 := get_byte(in_string, 0);
>     WHEN 2 THEN
>       b3 := get_byte(in_string, 0);
>       b4 := get_byte(in_string, 1);
>     WHEN 3 THEN
>       b2 := get_byte(in_string, 0);
>       b3 := get_byte(in_string, 1);
>       b4 := get_byte(in_string, 2);
>     WHEN 4 THEN
>       b1 := get_byte(in_string, 0);
>       b2 := get_byte(in_string, 1);
>       b3 := get_byte(in_string, 2);
>       b4 := get_byte(in_string, 3);
>   END CASE;
>
>   out_int := (b1 << 24) + (b2 << 16) + (b3 << 8) + b4;
>
>   RETURN(out_int);
> END;
> $$ LANGUAGE plpgsql IMMUTABLE;
> ---------------------------
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers
>

Reply via email to