Обсуждение: Concatenating bytea types...

Поиск
Список
Период
Сортировка

Concatenating bytea types...

От
Marko Rihtar
Дата:
Hi all,<br /><br />i have a little problem.<br />I'm trying to rewrite one procedure from mysql that involves bytes
concatenation.<br/>This is my snippet from postgres code:<br />...<br />cv1 bytea;<br />...<br />cv1 :=
E'\\000'::bytea;<br/> ...<br />cv1 := CONCAT(cv1, DECODE(TO_HEX(11), 'escape'));<br />...<br />this third line throws
followingerror:<br />invalid hexadecimal digit: "\"<br /><br />I run it through the debugger and saw that after
assigningthe zero byte value to cv1 variable, postgres automatically converts it to \x00.<br /> And then inside CONCAT
itbrakes with above error.<br /><br />Inside select it works fine<br />select CONCAT(E'\\000'::bytea,
DECODE(TO_HEX(11),'escape'))<br />select CONCAT('\x00'::bytea, DECODE(TO_HEX(11), 'escape'))<br /><br />Is there a way
tosolve this somehow?<br /><br />thanks for help,<br /><br />Marko<br /> 

Re: Concatenating bytea types...

От
Richard Huxton
Дата:
On 28/02/13 10:21, Marko Rihtar wrote:
> Hi all,
>
> i have a little problem.
> I'm trying to rewrite one procedure from mysql that involves bytes
> concatenation.
> This is my snippet from postgres code:

You seem to be mixing up escape and hex literal formatting along with 
decode(). The following should help.

BEGIN;

CREATE FUNCTION to_hex_pair(int) RETURNS text AS $$    SELECT right('0' || to_hex($1), 2);
$$ LANGUAGE sql;

CREATE FUNCTION f_concat_bytea1(bytea, bytea) RETURNS text AS $$
BEGIN    RETURN $1 || $2;
END;
$$ LANGUAGE plpgsql;

CREATE FUNCTION f_concat_bytea2(bytea, bytea) RETURNS bytea AS $$
DECLARE    cv1 bytea;
BEGIN    cv1 := '\x01'::bytea;    RETURN $1 || cv1 || $2;
END;
$$ LANGUAGE plpgsql;

CREATE FUNCTION f_concat_bytea3(text, text) RETURNS bytea AS $$
DECLARE    cv1 text;
BEGIN    cv1 := '01';    RETURN decode($1 || cv1 || $2, 'hex');
END;
$$ LANGUAGE plpgsql;

SELECT '\x000b'::bytea             AS want_this,       decode('000b','hex')        AS or_this1,
decode('\000\013','escape')AS or_this2;
 
SELECT f_concat_bytea1('\x00', '\x0b');
SELECT f_concat_bytea2('\x00', '\x0b');
SELECT f_concat_bytea3('00', '0b');

ROLLBACK;



--   Richard Huxton  Archonet Ltd



Re: Concatenating bytea types...

От
Jasen Betts
Дата:
On 2013-02-28, Marko Rihtar <rihtar.marko@gmail.com> wrote:
> --047d7b603fca8e330f04d6c63f7b
> Content-Type: text/plain; charset=ISO-8859-1
>
> Hi all,
>
> i have a little problem.

> cv1 := CONCAT(cv1, DECODE(TO_HEX(11), 'escape'));

what's that supposed to do? if I were to fix it how would I know?





-- 
⚂⚃ 100% natural