ChenHuajun/pg_roaringbitmap

RoaringBitmap extension for PostgreSQL

C

288

162 commits

updated Sep 18, 2026

See the code

README

pg_roaringbitmap

RoaringBitmap extension for PostgreSQL.

This is originally based on https://github.com/zeromax007/gpdb-roaringbitmap.

Introduction

Roaring bitmaps are compressed bitmaps which tend to outperform conventional compressed bitmaps such as WAH, EWAH or Concise. In some instances, roaring bitmaps can be hundreds of times faster and they often offer significantly better compression. They can even be faster than uncompressed bitmaps. More information at https://github.com/RoaringBitmap/CRoaring.

Build

Requirements

Note: The regression testing before the version release only covers PostgreSQL 13 and above.

Build

su - postgres
make
sudo make install
psql -c "create extension roaringbitmap"

Note: You can use make -f Makefile_native instead of make to let the compiler use SIMD instructions if your CPU supports them. In some scenarios, it may double the performance. But if you use the pg_roaringbitmap binary built with SIMD support on a machine without SIMD support, you could get a SIGILL crash.

Test

make installcheck

Usage

roaringbitmap

about roaringbitmap data type

Logically, you could think of the roaringbitmap data type as bit(4294967296), and it should be noted that the integers added to bitmaps are considered to be unsigned. Within bitmaps, numbers are ordered according to uint32. We order the numbers like 0, 1, ..., 2147483647, -2147483648, -2147483647,..., -1. But we use bigint to reference the range of these integers, that is [0 4294967296).

input and ouput

Two kinds of input/output syntax are supported: 'array' and 'bytea'. The default output format is 'bytea'.

postgres=# select roaringbitmap('{1,100,10}');
                 roaringbitmap
------------------------------------------------
 \x3a30000001000000000002001000000001000a006400
(1 row)

or

postgres=# select '\x3a30000001000000000002001000000001000a006400'::roaringbitmap;
                 roaringbitmap
------------------------------------------------
 \x3a30000001000000000002001000000001000a006400
(1 row)

The output format can changed with roaringbitmap.output_format

postgres=# set roaringbitmap.output_format='bytea';
SET
postgres=# select '{1}'::roaringbitmap;
             roaringbitmap
----------------------------------------
 \x3a3000000100000000000000100000000100
(1 row)

postgres=# set roaringbitmap.output_format='array';
SET
postgres=# select '{1}'::roaringbitmap;
 roaringbitmap
---------------
 {1}
(1 row)

sample of usage

Use bitmap as type of column

CREATE TABLE t1 (id integer, bitmap roaringbitmap);

Build bitmap from integers

INSERT INTO t1 SELECT 1,rb_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);

INSERT INTO t1 SELECT 2,rb_build_agg(e) FROM generate_series(1,100) e;

Bitmap Calculation (OR, AND, XOR, ANDNOT)

SELECT roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}');

Bitmap Aggregate (OR, AND, XOR, BUILD)

SELECT rb_or_agg(bitmap) FROM t1;
SELECT rb_and_agg(bitmap) FROM t1;
SELECT rb_xor_agg(bitmap) FROM t1;
SELECT rb_build_agg(e) FROM generate_series(1,100) e;

Calculate cardinality

SELECT rb_cardinality('{1,2,3}');

Convert bitmap to integer array

SELECT rb_to_array(bitmap) FROM t1 WHERE id = 1;

Convert bitmap to SET of integers

SELECT unnest(rb_to_array('{1,2,3}'::roaringbitmap));

or

SELECT rb_iterate('{1,2,3}'::roaringbitmap);

Operator List

OperatorInputOutputDescExampleResult
&roaringbitmap,roaringbitmaproaringbitmapbitwise ANDroaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}'){3}
|roaringbitmap,roaringbitmaproaringbitmapbitwise ORroaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}'){1,2,3,4,5}
|roaringbitmap,integerroaringbitmapadd element to roaringbitmaproaringbitmap('{1,2,3}') | 6{1,2,3,6}
|integer,roaringbitmaproaringbitmapadd element to roaringbitmap6 | roaringbitmap('{1,2,3}'){1,2,3,6}
#roaringbitmap,roaringbitmaproaringbitmapbitwise XORroaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}'){1,2,4,5}
<<roaringbitmap,bigintroaringbitmapbitwise shift leftroaringbitmap('{1,2,3}') << 2{0,1}
>>roaringbitmap,bigintroaringbitmapbitwise shift rightroaringbitmap('{1,2,3}') >> 3{4,5,6}
-roaringbitmap,roaringbitmaproaringbitmapdifference(bitwise ANDNOT)roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}'){1,2}
-roaringbitmap,integerroaringbitmapremove element from roaringbitmaproaringbitmap('{1,2,3}') - 3{1,2}
@>roaringbitmap,roaringbitmapboolcontainsroaringbitmap('{1,2,3}') @> roaringbitmap('{3,4,5}')f
@>roaringbitmap,integerboolcontainsroaringbitmap('{1,2,3,4,5}') @> 3t
<@roaringbitmap,roaringbitmapboolis contained byroaringbitmap('{1,2,3}') <@ roaringbitmap('{3,4,5}')f
<@integer,roaringbitmapboolis contained by3 <@ roaringbitmap('{3,4,5}')t
&&roaringbitmap,roaringbitmapbooloverlap (have elements in common)roaringbitmap('{1,2,3}') && roaringbitmap('{3,4,5}')t
=roaringbitmap,roaringbitmapboolequalroaringbitmap('{1,2,3}') = roaringbitmap('{3,4,5}')f
<>roaringbitmap,roaringbitmapboolnot equalroaringbitmap('{1,2,3}') <> roaringbitmap('{3,4,5}')t

Function List

FunctionInputOutputDescExampleResult
rb_buildinteger[]roaringbitmapCreate roaringbitmap from integer arrayrb_build('{1,2,3,4,5}'){1,2,3,4,5}
rb_indexroaringbitmap,integerbigintReturn the 0-based index of the element in this roaringbitmap, or -1 if not presentrb_index('{1,2,3}',3)2
rb_cardinalityroaringbitmapbigintReturn cardinality of the roaringbitmaprb_cardinality('{1,2,3,4,5}')5
rb_and_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the AND of two roaringbitmapsrb_and_cardinality('{1,2,3}','{3,4,5}')1
rb_or_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the OR of two roaringbitmapsrb_or_cardinality('{1,2,3}','{3,4,5}')5
rb_xor_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the XOR of two roaringbitmapsrb_xor_cardinality('{1,2,3}','{3,4,5}')4
rb_andnot_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the ANDNOT of two roaringbitmapsrb_andnot_cardinality('{1,2,3}','{3,4,5}')2
rb_is_emptyroaringbitmapbooleanCheck if roaringbitmap is empty.rb_is_empty('{1,2,3,4,5}')f
rb_fillroaringbitmap,range_start bigint,range_end bigintroaringbitmapFill the specified range (not include the range_end)rb_fill('{1,2,3}',5,7){1,2,3,5,6}
rb_clearroaringbitmap,range_start bigint,range_end bigintroaringbitmapClear the specified range (not include the range_end)rb_clear('{1,2,3}',2,3){1,3}
rb_fliproaringbitmap,range_start bigint,range_end bigintroaringbitmapNegative the specified range (not include the range_end)rb_flip('{1,2,3}',2,10){1,4,5,6,7,8,9}
rb_rangeroaringbitmap,range_start bigint,range_end bigintroaringbitmapReturn new set with specified range (not include the range_end)rb_range('{1,2,3}',2,3){2}
rb_range_cardinalityroaringbitmap,range_start bigint,range_end bigintbigintReturn the cardinality of specified range (not include the range_end)rb_range_cardinality('{1,2,3}',2,3)1
rb_minroaringbitmapintegerReturn the smallest offset in roaringbitmap. Return NULL if the bitmap is emptyrb_min('{1,2,3}')1
rb_maxroaringbitmapintegerReturn the greatest offset in roaringbitmap. Return NULL if the bitmap is emptyrb_max('{1,2,3}')3
rb_rankroaringbitmap,integerbigintReturn the number of elements that are smaller or equal to the specified offsetrb_rank('{1,2,3}',3)3
rb_jaccard_distroaringbitmap,roaringbitmapdouble precisionReturn the jaccard distance(or the Jaccard similarity coefficient) of two bitmapsrb_jaccard_dist('{1,2,3}','{3,4}')0.25
rb_selectroaringbitmap,bitset_limit bigint,bitset_offset bigint=0,reverse boolean=false,range_start bigint=0,range_end bigint=4294967296roaringbitmapReturn subset [bitset_offset,bitset_offset+bitset_limit) of bitmap between range [range_start,range_end)rb_select('{1,2,3,4,5,6,7,8,9}',5,2){3,4,5,6,7}
rb_to_arrayroaringbitmapinteger[]Convert roaringbitmap to integer arrayrb_to_array(roaringbitmap('{1,2,3}')){1,2,3}
rb_iterateroaringbitmapSET of integerReturn set of integer from a roaringbitmap data.rb_iterate(roaringbitmap('{1,2,3}'))
1
2
3
rb_runoptimizeroaringbitmaproaringbitmapReturn space-optimized bitmaprb_runoptimize(roaringbitmap('{1,2,3,4,5}')) {1,2,3,4,5} (but the underlying bitmap is smaller)
rb_group_elements_by_sourceroaringbitmap[]TABLE(sources integer[], members roaringbitmap)Group the elements found across an array of bitmaps by the combination of source bitmaps (1-based indices into the input array) that contain them
select sources, rb_to_array(members)
    from rb_group_elements_by_source(ARRAY[
        rb_build('{1,2,3,4,5}'),
        rb_build('{1,2,3,6,7}')
    ])
sources | rb_to_array
--------+------------
{1,2}   | {1,2,3}
{1}     | {4,5}
{2}     | {6,7}

Aggregation List

FunctionInputOutputDescExampleResult
rb_build_aggintegerroaringbitmapBuild a roaringbitmap from a integer set
select rb_build_agg(id)
    from (values (1),(2),(3)) t(id)
{1,2,3}
rb_or_aggroaringbitmaproaringbitmapAND Aggregate calculations from a roaringbitmap set
select rb_or_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
{1,2,3,4}
rb_and_aggroaringbitmaproaringbitmapAND Aggregate calculations from a roaringbitmap set
select rb_and_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
{2,3}
rb_xor_aggroaringbitmaproaringbitmapXOR Aggregate calculations from a roaringbitmap set
select rb_xor_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
{1,4}
rb_or_cardinality_aggroaringbitmapbigintOR Aggregate calculations from a roaringbitmap set, return cardinality.
select rb_or_cardinality_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
4
rb_and_cardinality_aggroaringbitmapbigintAND Aggregate calculations from a roaringbitmap set, return cardinality
select rb_and_cardinality_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
2
rb_xor_cardinality_aggroaringbitmapbigintXOR Aggregate calculations from a roaringbitmap set, return cardinality
select rb_xor_cardinality_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
2

roaringbitmap64

about roaringbitmap64 data type

​​roaringbitmap64​​ is a 64-bit Roaring bitmap implementation, and its format definition can be found in https://github.com/RoaringBitmap/RoaringFormatSpec. Logically, you could think of the roaringbitmap64 data type as bit(18446744073709551615) just like roaringbitmap, and it should be noted that the bigint data added to bitmaps are considered to be unsigned. Within 64 bit bitmaps, numbers are ordered according to uint64. We order the numbers like 0, 1, ..., 9223372036854775807, -9223372036854775808, -9223372036854775807,..., -1.

input and ouput

Two kinds of input/output syntax are supported: 'array' and 'bytea'. The default output format is 'bytea'.

postgres=# select roaringbitmap64('{1,100,10}');
                            roaringbitmap64
------------------------------------------------------------------------
 \x0100000000000000000000003a30000001000000000002001000000001000a006400
(1 row)

or

postgres=# select '\x0100000000000000000000003a30000001000000000002001000000001000a006400'::roaringbitmap64;
                            roaringbitmap64
------------------------------------------------------------------------
 \x0100000000000000000000003a30000001000000000002001000000001000a006400
(1 row)

The output format can changed with roaringbitmap.output_format

postgres=# set roaringbitmap.output_format='bytea';
SET
postgres=# select '{1}'::roaringbitmap64;
                        roaringbitmap64
----------------------------------------------------------------
 \x0100000000000000000000003a3000000100000000000000100000000100
(1 row)

postgres=# set roaringbitmap.output_format='array';
SET
postgres=# select '{1}'::roaringbitmap64;
 roaringbitmap64
-----------------
 {1}
(1 row)

sample of usage

Use bitmap as type of column

CREATE TABLE t1 (id integer, bitmap roaringbitmap64);

Build bitmap from set of bigint

INSERT INTO t1 SELECT 1,rb64_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);

INSERT INTO t1 SELECT 2,rb64_build_agg(e) FROM generate_series(1,100) e;

Bitmap Calculation (OR, AND, XOR, ANDNOT)

SELECT roaringbitmap64('{1,2,3}') | roaringbitmap64('{3,4,5}');
SELECT roaringbitmap64('{1,2,3}') & roaringbitmap64('{3,4,5}');
SELECT roaringbitmap64('{1,2,3}') # roaringbitmap64('{3,4,5}');
SELECT roaringbitmap64('{1,2,3}') - roaringbitmap64('{3,4,5}');

Bitmap Aggregate (OR, AND, XOR, BUILD)

SELECT rb64_or_agg(bitmap) FROM t1;
SELECT rb64_and_agg(bitmap) FROM t1;
SELECT rb64_xor_agg(bitmap) FROM t1;
SELECT rb64_build_agg(e) FROM generate_series(1,100) e;

Calculate cardinality

SELECT rb64_cardinality('{1,2,3}');

Convert bitmap to bigint array

SELECT rb64_to_array(bitmap) FROM t1 WHERE id = 1;

Convert bitmap to SET of bigint

SELECT unnest(rb64_to_array('{1,2,3}'::roaringbitmap64));

or

SELECT rb64_iterate('{1,2,3}'::roaringbitmap64);

Operator List

OperatorInputOutputDescExampleResult
&roaringbitmap64,roaringbitmap64roaringbitmap64bitwise ANDroaringbitmap64('{1,2,3}') & roaringbitmap64('{3,4,5}'){3}
|roaringbitmap64,roaringbitmap64roaringbitmap64bitwise ORroaringbitmap64('{1,2,3}') | roaringbitmap64('{3,4,5}'){1,2,3,4,5}
|roaringbitmap64,bigintroaringbitmap64add element to roaringbitmap64roaringbitmap64('{1,2,3}') | 6{1,2,3,6}
|bigint,roaringbitmap64roaringbitmap64add element to roaringbitmap646 | roaringbitmap64('{1,2,3}'){1,2,3,6}
#roaringbitmap64,roaringbitmap64roaringbitmap64bitwise XORroaringbitmap64('{1,2,3}') # roaringbitmap64('{3,4,5}'){1,2,4,5}
<<roaringbitmap64,bigintroaringbitmap64bitwise shift leftroaringbitmap64('{1,2,3}') << 2{0,1}
>>roaringbitmap64,bigintroaringbitmap64bitwise shift rightroaringbitmap64('{1,2,3}') >> 3{4,5,6}
-roaringbitmap64,roaringbitmap64roaringbitmap64difference(bitwise ANDNOT)roaringbitmap64('{1,2,3}') - roaringbitmap64('{3,4,5}'){1,2}
-roaringbitmap64,bigintroaringbitmap64remove element from roaringbitmap64roaringbitmap64('{1,2,3}') - 3{1,2}
@>roaringbitmap64,roaringbitmap64boolcontainsroaringbitmap64('{1,2,3}') @> roaringbitmap64('{3,4,5}')f
@>roaringbitmap64,bigintboolcontainsroaringbitmap64('{1,2,3,4,5}') @> 3t
<@roaringbitmap64,roaringbitmap64boolis contained byroaringbitmap64('{1,2,3}') <@ roaringbitmap64('{3,4,5}')f
<@bigint,roaringbitmap64boolis contained by3 <@ roaringbitmap64('{3,4,5}')t
&&roaringbitmap64,roaringbitmap64booloverlap (have elements in common)roaringbitmap64('{1,2,3}') && roaringbitmap64('{3,4,5}')t
=roaringbitmap64,roaringbitmap64boolequalroaringbitmap64('{1,2,3}') = roaringbitmap64('{3,4,5}')f
<>roaringbitmap64,roaringbitmap64boolnot equalroaringbitmap64('{1,2,3}') <> roaringbitmap64('{3,4,5}')t

Function List

FunctionInputOutputDescExampleResult
rb64_buildbigint[]roaringbitmap64Create roaringbitmap64 from bigint arrayrb64_build('{1,2,3,4,5}'){1,2,3,4,5}
rb64_indexroaringbitmap64,bigintbigintReturn the 0-based index of the element in this roaringbitmap64, or -1 if not presentrb64_index('{1,2,3}',3)2
rb64_cardinalityroaringbitmap64bigintReturn cardinality of the roaringbitmap64rb64_cardinality('{1,2,3,4,5}')5
rb64_and_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the AND of two roaringbitmapsrb64_and_cardinality('{1,2,3}','{3,4,5}')1
rb64_or_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the OR of two roaringbitmapsrb64_or_cardinality('{1,2,3}','{3,4,5}')5
rb64_xor_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the XOR of two roaringbitmapsrb64_xor_cardinality('{1,2,3}','{3,4,5}')4
rb64_andnot_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the ANDNOT of two roaringbitmapsrb64_andnot_cardinality('{1,2,3}','{3,4,5}')2
rb64_is_emptyroaringbitmap64booleanCheck if roaringbitmap64 is empty.rb64_is_empty('{1,2,3,4,5}')f
rb64_fillroaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Fill the specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_fill('{1,2,3}',5,7){1,2,3,5,6}
rb64_clearroaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Clear the specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_clear('{1,2,3}',2,3){1,3}
rb64_fliproaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Negative the specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_flip('{1,2,3}',2,10){1,4,5,6,7,8,9}
rb64_rangeroaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Return new set with specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_range('{1,2,3}',2,3){2}
rb64_range_cardinalityroaringbitmap64,range_start bigint,range_end bigintbigintReturn the cardinality of specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_range_cardinality('{1,2,3}',2,3)1
rb64_minroaringbitmap64bigintReturn the smallest offset in roaringbitmap64. Return NULL if the bitmap is emptyrb64_min('{1,2,3}')1
rb64_maxroaringbitmap64bigintReturn the greatest offset in roaringbitmap64. Return NULL if the bitmap is emptyrb64_max('{1,2,3}')3
rb64_rankroaringbitmap64,bigintbigintReturn the number of elements that are smaller or equal to the specified offsetrb64_rank('{1,2,3}',3)3
rb64_jaccard_distroaringbitmap64,roaringbitmap64double precisionReturn the jaccard distance(or the Jaccard similarity coefficient) of two bitmapsrb64_jaccard_dist('{1,2,3}','{3,4}')0.25
rb64_selectroaringbitmap64,bitset_limit bigint,bitset_offset bigint=0,reverse boolean=false,range_start bigint=0,range_end bigint=-1roaringbitmap64Return subset [bitset_offset,bitset_offset+bitset_limit) of bitmap between range [range_start,range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_select('{1,2,3,4,5,6,7,8,9}',5,2){3,4,5,6,7}
rb64_to_arrayroaringbitmap64bigint[]Convert roaringbitmap64 to bigint arrayrb64_to_array(roaringbitmap64('{1,2,3}')){1,2,3}
rb64_iterateroaringbitmap64SET of bigintReturn set of bigint from a roaringbitmap64 data.rb64_iterate(roaringbitmap64('{1,2,3}'))
1
2
3
rb64_runoptimizeroaringbitmap64roaringbitmap64Return space-optimized bitmaprb64_runoptimize(roaringbitmap64('{1,2,3,4,5}')) {1,2,3,4,5} (but the underlying bitmap is smaller)
rb64_group_elements_by_sourceroaringbitmap64[]TABLE(sources integer[], members roaringbitmap64)Group the elements found across an array of bitmaps by the combination of source bitmaps (1-based indices into the input array) that contain them
select sources, rb64_to_array(members)
    from rb64_group_elements_by_source(ARRAY[
        rb64_build('{1,2,3,4,5}'),
        rb64_build('{1,2,3,6,7}')
    ])
sources | rb64_to_array
--------+--------------
{1,2}   | {1,2,3}
{1}     | {4,5}
{2}     | {6,7}

Aggregation List

FunctionInputOutputDescExampleResult
rb64_build_aggbigintroaringbitmap64Build a roaringbitmap64 from a bigint set
select rb64_build_agg(id)
    from (values (1),(2),(3)) t(id)
{1,2,3}
rb64_or_aggroaringbitmap64roaringbitmap64AND Aggregate calculations from a roaringbitmap64 set
select rb64_or_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
{1,2,3,4}
rb64_and_aggroaringbitmap64roaringbitmap64AND Aggregate calculations from a roaringbitmap64 set
select rb64_and_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
{2,3}
rb64_xor_aggroaringbitmap64roaringbitmap64XOR Aggregate calculations from a roaringbitmap64 set
select rb64_xor_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
{1,4}
rb64_or_cardinality_aggroaringbitmap64bigintOR Aggregate calculations from a roaringbitmap64 set, return cardinality.
select rb64_or_cardinality_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
4
rb64_and_cardinality_aggroaringbitmap64bigintAND Aggregate calculations from a roaringbitmap64 set, return cardinality
select rb64_and_cardinality_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
2
rb64_xor_cardinality_aggroaringbitmap64bigintXOR Aggregate calculations from a roaringbitmap64 set, return cardinality
select rb64_xor_cardinality_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
2

Cloud Vendor Support

pg_roaringbitmap is supported by the following cloud vendors

To request support for pg_roaringbitmap from other cloud vendors, please see the following:

  • DigitalOcean Managed Databases: comment on this idea
  • Azure Database for PostgreSQL: comment on this post
gpdb
greenplum
pg-roaringbitmap
postgres
postgresql
roaringbitmap-extension
roaring-bitmaps

Contributors

ChenHuajun

115 commits

notoriousR-O-B

14 commits

zeromax007

5 commits

ChenHuajun/pg_roaringbitmap

RoaringBitmap extension for PostgreSQL

C

288

162 commits

updated Sep 18, 2026

See the code

README

pg_roaringbitmap

RoaringBitmap extension for PostgreSQL.

This is originally based on https://github.com/zeromax007/gpdb-roaringbitmap.

Introduction

Roaring bitmaps are compressed bitmaps which tend to outperform conventional compressed bitmaps such as WAH, EWAH or Concise. In some instances, roaring bitmaps can be hundreds of times faster and they often offer significantly better compression. They can even be faster than uncompressed bitmaps. More information at https://github.com/RoaringBitmap/CRoaring.

Build

Requirements

Note: The regression testing before the version release only covers PostgreSQL 13 and above.

Build

su - postgres
make
sudo make install
psql -c "create extension roaringbitmap"

Note: You can use make -f Makefile_native instead of make to let the compiler use SIMD instructions if your CPU supports them. In some scenarios, it may double the performance. But if you use the pg_roaringbitmap binary built with SIMD support on a machine without SIMD support, you could get a SIGILL crash.

Test

make installcheck

Usage

roaringbitmap

about roaringbitmap data type

Logically, you could think of the roaringbitmap data type as bit(4294967296), and it should be noted that the integers added to bitmaps are considered to be unsigned. Within bitmaps, numbers are ordered according to uint32. We order the numbers like 0, 1, ..., 2147483647, -2147483648, -2147483647,..., -1. But we use bigint to reference the range of these integers, that is [0 4294967296).

input and ouput

Two kinds of input/output syntax are supported: 'array' and 'bytea'. The default output format is 'bytea'.

postgres=# select roaringbitmap('{1,100,10}');
                 roaringbitmap
------------------------------------------------
 \x3a30000001000000000002001000000001000a006400
(1 row)

or

postgres=# select '\x3a30000001000000000002001000000001000a006400'::roaringbitmap;
                 roaringbitmap
------------------------------------------------
 \x3a30000001000000000002001000000001000a006400
(1 row)

The output format can changed with roaringbitmap.output_format

postgres=# set roaringbitmap.output_format='bytea';
SET
postgres=# select '{1}'::roaringbitmap;
             roaringbitmap
----------------------------------------
 \x3a3000000100000000000000100000000100
(1 row)

postgres=# set roaringbitmap.output_format='array';
SET
postgres=# select '{1}'::roaringbitmap;
 roaringbitmap
---------------
 {1}
(1 row)

sample of usage

Use bitmap as type of column

CREATE TABLE t1 (id integer, bitmap roaringbitmap);

Build bitmap from integers

INSERT INTO t1 SELECT 1,rb_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);

INSERT INTO t1 SELECT 2,rb_build_agg(e) FROM generate_series(1,100) e;

Bitmap Calculation (OR, AND, XOR, ANDNOT)

SELECT roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}');

Bitmap Aggregate (OR, AND, XOR, BUILD)

SELECT rb_or_agg(bitmap) FROM t1;
SELECT rb_and_agg(bitmap) FROM t1;
SELECT rb_xor_agg(bitmap) FROM t1;
SELECT rb_build_agg(e) FROM generate_series(1,100) e;

Calculate cardinality

SELECT rb_cardinality('{1,2,3}');

Convert bitmap to integer array

SELECT rb_to_array(bitmap) FROM t1 WHERE id = 1;

Convert bitmap to SET of integers

SELECT unnest(rb_to_array('{1,2,3}'::roaringbitmap));

or

SELECT rb_iterate('{1,2,3}'::roaringbitmap);

Operator List

OperatorInputOutputDescExampleResult
&roaringbitmap,roaringbitmaproaringbitmapbitwise ANDroaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}'){3}
|roaringbitmap,roaringbitmaproaringbitmapbitwise ORroaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}'){1,2,3,4,5}
|roaringbitmap,integerroaringbitmapadd element to roaringbitmaproaringbitmap('{1,2,3}') | 6{1,2,3,6}
|integer,roaringbitmaproaringbitmapadd element to roaringbitmap6 | roaringbitmap('{1,2,3}'){1,2,3,6}
#roaringbitmap,roaringbitmaproaringbitmapbitwise XORroaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}'){1,2,4,5}
<<roaringbitmap,bigintroaringbitmapbitwise shift leftroaringbitmap('{1,2,3}') << 2{0,1}
>>roaringbitmap,bigintroaringbitmapbitwise shift rightroaringbitmap('{1,2,3}') >> 3{4,5,6}
-roaringbitmap,roaringbitmaproaringbitmapdifference(bitwise ANDNOT)roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}'){1,2}
-roaringbitmap,integerroaringbitmapremove element from roaringbitmaproaringbitmap('{1,2,3}') - 3{1,2}
@>roaringbitmap,roaringbitmapboolcontainsroaringbitmap('{1,2,3}') @> roaringbitmap('{3,4,5}')f
@>roaringbitmap,integerboolcontainsroaringbitmap('{1,2,3,4,5}') @> 3t
<@roaringbitmap,roaringbitmapboolis contained byroaringbitmap('{1,2,3}') <@ roaringbitmap('{3,4,5}')f
<@integer,roaringbitmapboolis contained by3 <@ roaringbitmap('{3,4,5}')t
&&roaringbitmap,roaringbitmapbooloverlap (have elements in common)roaringbitmap('{1,2,3}') && roaringbitmap('{3,4,5}')t
=roaringbitmap,roaringbitmapboolequalroaringbitmap('{1,2,3}') = roaringbitmap('{3,4,5}')f
<>roaringbitmap,roaringbitmapboolnot equalroaringbitmap('{1,2,3}') <> roaringbitmap('{3,4,5}')t

Function List

FunctionInputOutputDescExampleResult
rb_buildinteger[]roaringbitmapCreate roaringbitmap from integer arrayrb_build('{1,2,3,4,5}'){1,2,3,4,5}
rb_indexroaringbitmap,integerbigintReturn the 0-based index of the element in this roaringbitmap, or -1 if not presentrb_index('{1,2,3}',3)2
rb_cardinalityroaringbitmapbigintReturn cardinality of the roaringbitmaprb_cardinality('{1,2,3,4,5}')5
rb_and_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the AND of two roaringbitmapsrb_and_cardinality('{1,2,3}','{3,4,5}')1
rb_or_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the OR of two roaringbitmapsrb_or_cardinality('{1,2,3}','{3,4,5}')5
rb_xor_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the XOR of two roaringbitmapsrb_xor_cardinality('{1,2,3}','{3,4,5}')4
rb_andnot_cardinalityroaringbitmap,roaringbitmapbigintReturn cardinality of the ANDNOT of two roaringbitmapsrb_andnot_cardinality('{1,2,3}','{3,4,5}')2
rb_is_emptyroaringbitmapbooleanCheck if roaringbitmap is empty.rb_is_empty('{1,2,3,4,5}')f
rb_fillroaringbitmap,range_start bigint,range_end bigintroaringbitmapFill the specified range (not include the range_end)rb_fill('{1,2,3}',5,7){1,2,3,5,6}
rb_clearroaringbitmap,range_start bigint,range_end bigintroaringbitmapClear the specified range (not include the range_end)rb_clear('{1,2,3}',2,3){1,3}
rb_fliproaringbitmap,range_start bigint,range_end bigintroaringbitmapNegative the specified range (not include the range_end)rb_flip('{1,2,3}',2,10){1,4,5,6,7,8,9}
rb_rangeroaringbitmap,range_start bigint,range_end bigintroaringbitmapReturn new set with specified range (not include the range_end)rb_range('{1,2,3}',2,3){2}
rb_range_cardinalityroaringbitmap,range_start bigint,range_end bigintbigintReturn the cardinality of specified range (not include the range_end)rb_range_cardinality('{1,2,3}',2,3)1
rb_minroaringbitmapintegerReturn the smallest offset in roaringbitmap. Return NULL if the bitmap is emptyrb_min('{1,2,3}')1
rb_maxroaringbitmapintegerReturn the greatest offset in roaringbitmap. Return NULL if the bitmap is emptyrb_max('{1,2,3}')3
rb_rankroaringbitmap,integerbigintReturn the number of elements that are smaller or equal to the specified offsetrb_rank('{1,2,3}',3)3
rb_jaccard_distroaringbitmap,roaringbitmapdouble precisionReturn the jaccard distance(or the Jaccard similarity coefficient) of two bitmapsrb_jaccard_dist('{1,2,3}','{3,4}')0.25
rb_selectroaringbitmap,bitset_limit bigint,bitset_offset bigint=0,reverse boolean=false,range_start bigint=0,range_end bigint=4294967296roaringbitmapReturn subset [bitset_offset,bitset_offset+bitset_limit) of bitmap between range [range_start,range_end)rb_select('{1,2,3,4,5,6,7,8,9}',5,2){3,4,5,6,7}
rb_to_arrayroaringbitmapinteger[]Convert roaringbitmap to integer arrayrb_to_array(roaringbitmap('{1,2,3}')){1,2,3}
rb_iterateroaringbitmapSET of integerReturn set of integer from a roaringbitmap data.rb_iterate(roaringbitmap('{1,2,3}'))
1
2
3
rb_runoptimizeroaringbitmaproaringbitmapReturn space-optimized bitmaprb_runoptimize(roaringbitmap('{1,2,3,4,5}')) {1,2,3,4,5} (but the underlying bitmap is smaller)
rb_group_elements_by_sourceroaringbitmap[]TABLE(sources integer[], members roaringbitmap)Group the elements found across an array of bitmaps by the combination of source bitmaps (1-based indices into the input array) that contain them
select sources, rb_to_array(members)
    from rb_group_elements_by_source(ARRAY[
        rb_build('{1,2,3,4,5}'),
        rb_build('{1,2,3,6,7}')
    ])
sources | rb_to_array
--------+------------
{1,2}   | {1,2,3}
{1}     | {4,5}
{2}     | {6,7}

Aggregation List

FunctionInputOutputDescExampleResult
rb_build_aggintegerroaringbitmapBuild a roaringbitmap from a integer set
select rb_build_agg(id)
    from (values (1),(2),(3)) t(id)
{1,2,3}
rb_or_aggroaringbitmaproaringbitmapAND Aggregate calculations from a roaringbitmap set
select rb_or_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
{1,2,3,4}
rb_and_aggroaringbitmaproaringbitmapAND Aggregate calculations from a roaringbitmap set
select rb_and_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
{2,3}
rb_xor_aggroaringbitmaproaringbitmapXOR Aggregate calculations from a roaringbitmap set
select rb_xor_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
{1,4}
rb_or_cardinality_aggroaringbitmapbigintOR Aggregate calculations from a roaringbitmap set, return cardinality.
select rb_or_cardinality_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
4
rb_and_cardinality_aggroaringbitmapbigintAND Aggregate calculations from a roaringbitmap set, return cardinality
select rb_and_cardinality_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
2
rb_xor_cardinality_aggroaringbitmapbigintXOR Aggregate calculations from a roaringbitmap set, return cardinality
select rb_xor_cardinality_agg(bitmap)
    from (values (roaringbitmap('{1,2,3}')),
                 (roaringbitmap('{2,3,4}'))
          ) t(bitmap)
2

roaringbitmap64

about roaringbitmap64 data type

​​roaringbitmap64​​ is a 64-bit Roaring bitmap implementation, and its format definition can be found in https://github.com/RoaringBitmap/RoaringFormatSpec. Logically, you could think of the roaringbitmap64 data type as bit(18446744073709551615) just like roaringbitmap, and it should be noted that the bigint data added to bitmaps are considered to be unsigned. Within 64 bit bitmaps, numbers are ordered according to uint64. We order the numbers like 0, 1, ..., 9223372036854775807, -9223372036854775808, -9223372036854775807,..., -1.

input and ouput

Two kinds of input/output syntax are supported: 'array' and 'bytea'. The default output format is 'bytea'.

postgres=# select roaringbitmap64('{1,100,10}');
                            roaringbitmap64
------------------------------------------------------------------------
 \x0100000000000000000000003a30000001000000000002001000000001000a006400
(1 row)

or

postgres=# select '\x0100000000000000000000003a30000001000000000002001000000001000a006400'::roaringbitmap64;
                            roaringbitmap64
------------------------------------------------------------------------
 \x0100000000000000000000003a30000001000000000002001000000001000a006400
(1 row)

The output format can changed with roaringbitmap.output_format

postgres=# set roaringbitmap.output_format='bytea';
SET
postgres=# select '{1}'::roaringbitmap64;
                        roaringbitmap64
----------------------------------------------------------------
 \x0100000000000000000000003a3000000100000000000000100000000100
(1 row)

postgres=# set roaringbitmap.output_format='array';
SET
postgres=# select '{1}'::roaringbitmap64;
 roaringbitmap64
-----------------
 {1}
(1 row)

sample of usage

Use bitmap as type of column

CREATE TABLE t1 (id integer, bitmap roaringbitmap64);

Build bitmap from set of bigint

INSERT INTO t1 SELECT 1,rb64_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);

INSERT INTO t1 SELECT 2,rb64_build_agg(e) FROM generate_series(1,100) e;

Bitmap Calculation (OR, AND, XOR, ANDNOT)

SELECT roaringbitmap64('{1,2,3}') | roaringbitmap64('{3,4,5}');
SELECT roaringbitmap64('{1,2,3}') & roaringbitmap64('{3,4,5}');
SELECT roaringbitmap64('{1,2,3}') # roaringbitmap64('{3,4,5}');
SELECT roaringbitmap64('{1,2,3}') - roaringbitmap64('{3,4,5}');

Bitmap Aggregate (OR, AND, XOR, BUILD)

SELECT rb64_or_agg(bitmap) FROM t1;
SELECT rb64_and_agg(bitmap) FROM t1;
SELECT rb64_xor_agg(bitmap) FROM t1;
SELECT rb64_build_agg(e) FROM generate_series(1,100) e;

Calculate cardinality

SELECT rb64_cardinality('{1,2,3}');

Convert bitmap to bigint array

SELECT rb64_to_array(bitmap) FROM t1 WHERE id = 1;

Convert bitmap to SET of bigint

SELECT unnest(rb64_to_array('{1,2,3}'::roaringbitmap64));

or

SELECT rb64_iterate('{1,2,3}'::roaringbitmap64);

Operator List

OperatorInputOutputDescExampleResult
&roaringbitmap64,roaringbitmap64roaringbitmap64bitwise ANDroaringbitmap64('{1,2,3}') & roaringbitmap64('{3,4,5}'){3}
|roaringbitmap64,roaringbitmap64roaringbitmap64bitwise ORroaringbitmap64('{1,2,3}') | roaringbitmap64('{3,4,5}'){1,2,3,4,5}
|roaringbitmap64,bigintroaringbitmap64add element to roaringbitmap64roaringbitmap64('{1,2,3}') | 6{1,2,3,6}
|bigint,roaringbitmap64roaringbitmap64add element to roaringbitmap646 | roaringbitmap64('{1,2,3}'){1,2,3,6}
#roaringbitmap64,roaringbitmap64roaringbitmap64bitwise XORroaringbitmap64('{1,2,3}') # roaringbitmap64('{3,4,5}'){1,2,4,5}
<<roaringbitmap64,bigintroaringbitmap64bitwise shift leftroaringbitmap64('{1,2,3}') << 2{0,1}
>>roaringbitmap64,bigintroaringbitmap64bitwise shift rightroaringbitmap64('{1,2,3}') >> 3{4,5,6}
-roaringbitmap64,roaringbitmap64roaringbitmap64difference(bitwise ANDNOT)roaringbitmap64('{1,2,3}') - roaringbitmap64('{3,4,5}'){1,2}
-roaringbitmap64,bigintroaringbitmap64remove element from roaringbitmap64roaringbitmap64('{1,2,3}') - 3{1,2}
@>roaringbitmap64,roaringbitmap64boolcontainsroaringbitmap64('{1,2,3}') @> roaringbitmap64('{3,4,5}')f
@>roaringbitmap64,bigintboolcontainsroaringbitmap64('{1,2,3,4,5}') @> 3t
<@roaringbitmap64,roaringbitmap64boolis contained byroaringbitmap64('{1,2,3}') <@ roaringbitmap64('{3,4,5}')f
<@bigint,roaringbitmap64boolis contained by3 <@ roaringbitmap64('{3,4,5}')t
&&roaringbitmap64,roaringbitmap64booloverlap (have elements in common)roaringbitmap64('{1,2,3}') && roaringbitmap64('{3,4,5}')t
=roaringbitmap64,roaringbitmap64boolequalroaringbitmap64('{1,2,3}') = roaringbitmap64('{3,4,5}')f
<>roaringbitmap64,roaringbitmap64boolnot equalroaringbitmap64('{1,2,3}') <> roaringbitmap64('{3,4,5}')t

Function List

FunctionInputOutputDescExampleResult
rb64_buildbigint[]roaringbitmap64Create roaringbitmap64 from bigint arrayrb64_build('{1,2,3,4,5}'){1,2,3,4,5}
rb64_indexroaringbitmap64,bigintbigintReturn the 0-based index of the element in this roaringbitmap64, or -1 if not presentrb64_index('{1,2,3}',3)2
rb64_cardinalityroaringbitmap64bigintReturn cardinality of the roaringbitmap64rb64_cardinality('{1,2,3,4,5}')5
rb64_and_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the AND of two roaringbitmapsrb64_and_cardinality('{1,2,3}','{3,4,5}')1
rb64_or_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the OR of two roaringbitmapsrb64_or_cardinality('{1,2,3}','{3,4,5}')5
rb64_xor_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the XOR of two roaringbitmapsrb64_xor_cardinality('{1,2,3}','{3,4,5}')4
rb64_andnot_cardinalityroaringbitmap64,roaringbitmap64bigintReturn cardinality of the ANDNOT of two roaringbitmapsrb64_andnot_cardinality('{1,2,3}','{3,4,5}')2
rb64_is_emptyroaringbitmap64booleanCheck if roaringbitmap64 is empty.rb64_is_empty('{1,2,3,4,5}')f
rb64_fillroaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Fill the specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_fill('{1,2,3}',5,7){1,2,3,5,6}
rb64_clearroaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Clear the specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_clear('{1,2,3}',2,3){1,3}
rb64_fliproaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Negative the specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_flip('{1,2,3}',2,10){1,4,5,6,7,8,9}
rb64_rangeroaringbitmap64,range_start bigint,range_end bigintroaringbitmap64Return new set with specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_range('{1,2,3}',2,3){2}
rb64_range_cardinalityroaringbitmap64,range_start bigint,range_end bigintbigintReturn the cardinality of specified range (not include the range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_range_cardinality('{1,2,3}',2,3)1
rb64_minroaringbitmap64bigintReturn the smallest offset in roaringbitmap64. Return NULL if the bitmap is emptyrb64_min('{1,2,3}')1
rb64_maxroaringbitmap64bigintReturn the greatest offset in roaringbitmap64. Return NULL if the bitmap is emptyrb64_max('{1,2,3}')3
rb64_rankroaringbitmap64,bigintbigintReturn the number of elements that are smaller or equal to the specified offsetrb64_rank('{1,2,3}',3)3
rb64_jaccard_distroaringbitmap64,roaringbitmap64double precisionReturn the jaccard distance(or the Jaccard similarity coefficient) of two bitmapsrb64_jaccard_dist('{1,2,3}','{3,4}')0.25
rb64_selectroaringbitmap64,bitset_limit bigint,bitset_offset bigint=0,reverse boolean=false,range_start bigint=0,range_end bigint=-1roaringbitmap64Return subset [bitset_offset,bitset_offset+bitset_limit) of bitmap between range [range_start,range_end),negative range value will be internally converted to unsigned int64, and range_end = 0 means unlimitedrb64_select('{1,2,3,4,5,6,7,8,9}',5,2){3,4,5,6,7}
rb64_to_arrayroaringbitmap64bigint[]Convert roaringbitmap64 to bigint arrayrb64_to_array(roaringbitmap64('{1,2,3}')){1,2,3}
rb64_iterateroaringbitmap64SET of bigintReturn set of bigint from a roaringbitmap64 data.rb64_iterate(roaringbitmap64('{1,2,3}'))
1
2
3
rb64_runoptimizeroaringbitmap64roaringbitmap64Return space-optimized bitmaprb64_runoptimize(roaringbitmap64('{1,2,3,4,5}')) {1,2,3,4,5} (but the underlying bitmap is smaller)
rb64_group_elements_by_sourceroaringbitmap64[]TABLE(sources integer[], members roaringbitmap64)Group the elements found across an array of bitmaps by the combination of source bitmaps (1-based indices into the input array) that contain them
select sources, rb64_to_array(members)
    from rb64_group_elements_by_source(ARRAY[
        rb64_build('{1,2,3,4,5}'),
        rb64_build('{1,2,3,6,7}')
    ])
sources | rb64_to_array
--------+--------------
{1,2}   | {1,2,3}
{1}     | {4,5}
{2}     | {6,7}

Aggregation List

FunctionInputOutputDescExampleResult
rb64_build_aggbigintroaringbitmap64Build a roaringbitmap64 from a bigint set
select rb64_build_agg(id)
    from (values (1),(2),(3)) t(id)
{1,2,3}
rb64_or_aggroaringbitmap64roaringbitmap64AND Aggregate calculations from a roaringbitmap64 set
select rb64_or_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
{1,2,3,4}
rb64_and_aggroaringbitmap64roaringbitmap64AND Aggregate calculations from a roaringbitmap64 set
select rb64_and_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
{2,3}
rb64_xor_aggroaringbitmap64roaringbitmap64XOR Aggregate calculations from a roaringbitmap64 set
select rb64_xor_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
{1,4}
rb64_or_cardinality_aggroaringbitmap64bigintOR Aggregate calculations from a roaringbitmap64 set, return cardinality.
select rb64_or_cardinality_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
4
rb64_and_cardinality_aggroaringbitmap64bigintAND Aggregate calculations from a roaringbitmap64 set, return cardinality
select rb64_and_cardinality_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
2
rb64_xor_cardinality_aggroaringbitmap64bigintXOR Aggregate calculations from a roaringbitmap64 set, return cardinality
select rb64_xor_cardinality_agg(bitmap)
    from (values (roaringbitmap64('{1,2,3}')),
                 (roaringbitmap64('{2,3,4}'))
          ) t(bitmap)
2

Cloud Vendor Support

pg_roaringbitmap is supported by the following cloud vendors

To request support for pg_roaringbitmap from other cloud vendors, please see the following:

  • DigitalOcean Managed Databases: comment on this idea
  • Azure Database for PostgreSQL: comment on this post
gpdb
greenplum
pg-roaringbitmap
postgres
postgresql
roaringbitmap-extension
roaring-bitmaps

Contributors

ChenHuajun

115 commits

notoriousR-O-B

14 commits

zeromax007

5 commits

Languages

C

87.4%

C++

7.8%

PLpgSQL

4.7%