Giả sư ta sử dụng bitwise operators để implement permissions nhưng số quyền lúc này đã > 64 (overflow) thì chúng ta cần tách các quyền thành các nhóm quyền. Và việc update permissions lúc này trở nên phức tạp hơn do không thể sử dụng 1 thành phần 64bit để lưu trữ nữa mà sẽ phải là int array. Để đảm bảo merge quyền được đúng thứ tự thì ta sẽ query như sau:
with test as (
select 1 as id, array [1, 8] as new_permissions union
select 1 as id, array [1, 2, 6] as new_permissions
)
select id, array_agg(elem order by odr) as permissions
from (
select id, odr, bit_or(coalesce(elem, 0)) as elem
from test
cross join unnest(new_permissions) with ordinality as u(elem, odr)
group by 1, 2
) s
group by 1
order by 1
output:
id | permissions
---|------------
1 | {1, 10, 6}