Re: Adding unsigned 256 bit integers

Поиск
Список
Период
Сортировка
От Olivier Lalonde
Тема Re: Adding unsigned 256 bit integers
Дата
Msg-id CALwxDuFEYULRr0LVUcutGN+2M4jB2ZeM-w9_WXcYkNo-6GXu9w@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Adding unsigned 256 bit integers  (Leon Smith <leon.p.smith@gmail.com>)
Список pgsql-hackers
Thanks for helping me out everyone. I ended up simply using the numeric type (I didn't realize it could support such large numbers) and writing the hex-to-numeric conversion functions in my application code.


On 11 April 2014 12:27, Leon Smith <leon.p.smith@gmail.com> wrote:
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, ktm@rice.edu <ktm@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




--
- Oli

Olivier Lalonde
http://www.syskall.com <-- connect with me!

Freelance web and Node.js engineer
Skype: o-lalonde

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

Предыдущее
От: Marko Kreen
Дата:
Сообщение: Re: Problem with txid_snapshot_in/out() functionality
Следующее
От: Etsuro Fujita
Дата:
Сообщение: Minor improvements in create_foreign_table.sgml