-
Notifications
You must be signed in to change notification settings - Fork 158
/
Copy pathfib_pack.sql
35 lines (32 loc) · 1.1 KB
/
fib_pack.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
create or replace function public.fib_pack(a int[])
returns bytea
immutable
strict -- returns null if any parameter is null
parallel safe -- Postgres 10 or later
security invoker
language sql
set search_path = ''
as $func$
select coalesce(
public.bit_to_bytea(
public.bit_agg(
public.fib_code_bin(
public.fib_encode(u.dec, f.seq)
)
)
),
''
)
from unnest(a) as u(dec),
coalesce(array(select t.n from public.fib_seq(47) as t(n) offset 2)) as f(seq); --1 2 3 5 8 13 21...
$func$;
comment on function public.fib_pack(a int[]) is 'Packs integers (with values > 0) by Fibonacci encoding algorithm to bytea';
--TEST
do $$
begin
assert public.fib_pack(null) is null;
assert public.fib_pack('{}') = '\x';
assert public.fib_pack('{1,2,3,4,5,6,7,8,9,10,11,12,13}') = '\xD9D8E6B0E34CBAC180';
assert public.fib_pack('{13,12,11,10,9,8,7,6,5,4,3,2,1}') = '\x075969C61AE63B3780';
end;
$$;