Обсуждение: Concatenating bytea types...
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 />
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
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