On Thu, Oct 2, 2014 at 4:00 PM, George Neuner <gneuner2@xxxxxxxxxxx> wrote: > --------------- code ---------------- > CREATE OR REPLACE FUNCTION gen_random() > RETURNS double precision AS > $BODY$ > DECLARE > num float8 := 0; > den float8 := 281474976710655; -- 0xFFFFFFFFFFFF > bytes bytea[6]; > BEGIN > -- get random bytes from crypto module > bytes := ext.gen_random_bytes(6); > > -- assemble a double precision value > num := num + get_byte( bytes, 0 ); > FOR i IN 1..5 LOOP > num := num * 256; > num := num + get_byte( bytes, i ); > END LOOP; > > -- normalize value to range 0.0 .. 1.0 > RETURN num / den; > END; > $BODY$ > LANGUAGE plpgsql VOLATILE; > --------------- code ---------------- > > The error is: > ERROR: array value must start with "{" or dimension information > SQL state: 22P02 > Context: PL/pgSQL function gen_random() line 8 at assignment > > which, if I'm counting correctly, is > bytes := ext.gen_random_bytes(6); Guessing on the name of ext.gen_random_bytes(6) it returns a value that is incompatible with bytea[] array representation time from time, so take a closer look at ext.gen_random_bytes() first. You can test the case using DO block. > If I comment out that line, it then tells me get_byte() is undefined, > which should be impossible because it's built in. Feels like somewhere inside ext.gen_random_bytes() you set a search_path that allows to see get_byte() and the search_path that was set before the gen_random() call doesn't allow it. -- Kind regards, Sergey Konoplev PostgreSQL Consultant and DBA http://www.linkedin.com/in/grayhemp +1 (415) 867-9984, +7 (499) 346-7196, +7 (988) 888-1979 gray.ru@xxxxxxxxx -- Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-performance