Re: Adding unsigned 256 bit integers

Поиск
Список
Период
Сортировка
От ktm@rice.edu
Тема Re: Adding unsigned 256 bit integers
Дата
Msg-id 20140410141110.GJ25879@aart.rice.edu
обсуждение исходный текст
Ответ на Adding unsigned 256 bit integers  (Olivier Lalonde <olalonde@gmail.com>)
Ответы Re: Adding unsigned 256 bit integers  (Leon Smith <leon.p.smith@gmail.com>)
Список 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;
---------------------------



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Alexander Korotkov
Дата:
Сообщение: Partial match fix for fast scan
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [PATCH] Negative Transition Aggregate Functions (WIP)