Hello again, I've found what I'm looking for. I overlooked the binary string functions which I stumbled upon just now. The set_byte() function for binary strings is just what I needed. The function for those interested now becomes: CREATE OR REPLACE FUNCTION utils.int_littleendian(v_number integer) RETURNS bytea AS $BODY$ DECLARE v_textresult bytea; v_temp int; v_int int; v_i int = 0; BEGIN v_int = v_number; v_textresult = '1234'; WHILE(v_i < 4) LOOP raise notice 'loop %',v_int; v_temp := v_int%256; v_int := v_int - v_temp; v_int := v_int / 256; SELECT set_byte(v_textresult,v_i,v_temp) INTO v_textresult; v_i := v_i + 1; END LOOP; return v_textresult; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; regards, Maarten On Tue, 2010-06-15 at 17:54 +0200, maarten wrote: > Hi all, > > I've been looking for a while now to solve my problem. > I'd like to store an integer (and other things) in a bytea field of a > table from a trigger function. > The integer needs to be inserted in it's binary representation: > 1 -> \x01\x00\x00\x00 > 256 -> \x00\x01\x00\x00 > > (which would be E'\\001\\000\\000\\000' and E'\\000\\001\\000\\000') > > Since I did not find any functions in the documentation I'm writing my > own function to do this in plpgsql. (attached below) > > This works for many values and fails for many values. The reason is > that chr(integer) works fine for me till 127 (chr(127) -> '\177') but > from 128 and onwards it returns useless results. chr(128) -> '\302\200' > > If anyone has any idea on how to proceed that would be greatly > appreciated. > > For the record, chr(integer) works just how it's supposed to, I realize > I'll need something along the lines of > IF v_temp = 0 -> E'\\000' > ELSIF v_temp < 128 -> chr(v_temp) > ELSE ... > > It's the ... I'm looking for. (or some function that can replace that > entire IF block, or even better, the entire function) > > Thanks in advance, > Maarten > > > CREATE OR REPLACE FUNCTION utils.int_littleendian(v_number integer) > RETURNS bytea AS > $BODY$ > DECLARE > v_textresult bytea; > v_temp int; > v_int int; > v_i int = 4; > BEGIN > v_int = v_number; > v_textresult = ''; > WHILE(v_i > 0) LOOP > v_temp := v_int%256; > v_int := v_int - v_temp; > v_int := v_int / 256; > IF v_temp = 0 THEN > v_textresult = v_textresult || E'\\000'; > ELSE > v_textresult = v_textresult || chr(v_temp); > END IF; > v_i := v_i - 1; > END LOOP; > return v_textresult; > END; > > $BODY$ > LANGUAGE 'plpgsql' VOLATILE > COST 100; > > > > -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general