Re: Adding unsigned 256 bit integers

From: "ktm(at)rice(dot)edu" <ktm(at)rice(dot)edu>
To: Olivier Lalonde <olalonde(at)gmail(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Adding unsigned 256 bit integers
Date: 2014-04-10 14:11:10
Message-ID: 20140410141110.GJ25879@aart.rice.edu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

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

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2014-04-10 14:18:30 Re: [PATCH] Negative Transition Aggregate Functions (WIP)
Previous Message Alexander Korotkov 2014-04-10 14:09:34 Partial match fix for fast scan