Was curious if there's a simple way to reverse bytea strings without dealing with hex or regex.
In case someone finds it useful, here's what I came up with:
create or replace function bytea_reverse(bytea)
returns bytea
language sql immutable parallel safe
return (
select string_agg(substring($1 from byte_pos for 1), '')
from generate_series(octet_length($1), 1, -1) as byte_pos);
I also had the need to output integers in little endian format that the above function can easily do with bytea_reverse(int4send(x)), but since we know it is always 4 bytes, this is about 30% faster:
create or replace function public.int4send_le(int)
returns bytea
language sql immutable parallel safe
return
(select int4send( $1 << 24
| ($1 << 8 & 16711680)
| ($1 >> 8 & 65280)
| ($1 >> 24 & 255)));
These correctly reverse both positive and negative integers as bytea:
select int4send(i), int4send_le(i), bytea_reverse(int4send(i)) from generate_series(-2,1) i;
int4send | int4send_le | bytea_reverse
------------+-------------+---------------
\xfffffffe | \xfeffffff | \xfeffffff
\xffffffff | \xffffffff | \xffffffff
\x00000000 | \x00000000 | \x00000000
\x00000001 | \x01000000 | \x01000000