Skip to content

Commit 67027fd

Browse files
committed
add type cast for roaringbitmap and roaringbitmap64
1 parent 1d0712d commit 67027fd

File tree

5 files changed

+149
-2
lines changed

5 files changed

+149
-2
lines changed

expected/roaringbitmap64.out

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,39 @@ select roaringbitmap64('{1,9999,-88888}'::roaringbitmap64::bytea);
182182
{1,9999,-88888}
183183
(1 row)
184184

185+
select roaringbitmap('{}')::roaringbitmap64;
186+
roaringbitmap
187+
---------------
188+
{}
189+
(1 row)
190+
191+
select roaringbitmap('{0,1,9999,2147483647,-2147483648,-2,-1}')::roaringbitmap64;
192+
roaringbitmap
193+
-----------------------------------------
194+
{0,1,9999,2147483647,-2147483648,-2,-1}
195+
(1 row)
196+
197+
select roaringbitmap64('{}')::roaringbitmap;
198+
roaringbitmap64
199+
-----------------
200+
{}
201+
(1 row)
202+
203+
select roaringbitmap64('{0,1,9999,2147483647,-2147483648,-2,-1}')::roaringbitmap;
204+
roaringbitmap64
205+
-----------------------------------------
206+
{0,1,9999,2147483647,-2147483648,-2,-1}
207+
(1 row)
208+
185209
-- Exception
186210
select roaringbitmap64('\x11'::bytea);
187211
ERROR: bitmap format is error
188212
select '\x11'::bytea::roaringbitmap64;
189213
ERROR: bitmap format is error
214+
select roaringbitmap64('{0,1,9999,2147483648,-2147483648,-2,-1}')::roaringbitmap;
215+
ERROR: value "2147483648" is out of range for type integer
216+
select roaringbitmap64('{0,1,9999,2147483647,-2147483649,-2,-1}')::roaringbitmap;
217+
ERROR: value "-2147483649" is out of range for type integer
190218
-- Test Opperator
191219
select roaringbitmap64('{}') & roaringbitmap64('{}');
192220
?column?

roaringbitmap--0.5--1.0.sql

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,22 @@ CREATE CAST (roaringbitmap64 AS bytea) WITHOUT FUNCTION;
5454

5555
CREATE CAST (bytea AS roaringbitmap64) WITH FUNCTION roaringbitmap64(bytea);
5656

57+
--
58+
-- type cast for roaringbitmap
59+
--
60+
CREATE OR REPLACE FUNCTION rb64_to_roaringbitmap(roaringbitmap64)
61+
RETURNS roaringbitmap
62+
AS 'MODULE_PATHNAME', 'rb64_to_roaringbitmap'
63+
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
64+
65+
CREATE OR REPLACE FUNCTION rb64_from_roaringbitmap(roaringbitmap)
66+
RETURNS roaringbitmap64
67+
AS 'MODULE_PATHNAME', 'rb64_from_roaringbitmap'
68+
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
69+
70+
CREATE CAST (roaringbitmap64 AS roaringbitmap) WITH FUNCTION rb64_to_roaringbitmap(roaringbitmap64);
71+
CREATE CAST (roaringbitmap AS roaringbitmap64) WITH FUNCTION rb64_from_roaringbitmap(roaringbitmap);
72+
5773
--
5874
-- Operator Functions
5975
--

roaringbitmap--1.0.sql

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ CREATE OR REPLACE FUNCTION roaringbitmap(bytea)
4646
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
4747

4848
CREATE CAST (roaringbitmap AS bytea) WITHOUT FUNCTION;
49-
5049
CREATE CAST (bytea AS roaringbitmap) WITH FUNCTION roaringbitmap(bytea);
5150

5251
--
@@ -537,9 +536,24 @@ CREATE OR REPLACE FUNCTION roaringbitmap64(bytea)
537536
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
538537

539538
CREATE CAST (roaringbitmap64 AS bytea) WITHOUT FUNCTION;
540-
541539
CREATE CAST (bytea AS roaringbitmap64) WITH FUNCTION roaringbitmap64(bytea);
542540

541+
--
542+
-- type cast for roaringbitmap
543+
--
544+
CREATE OR REPLACE FUNCTION rb64_to_roaringbitmap(roaringbitmap64)
545+
RETURNS roaringbitmap
546+
AS 'MODULE_PATHNAME', 'rb64_to_roaringbitmap'
547+
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
548+
549+
CREATE OR REPLACE FUNCTION rb64_from_roaringbitmap(roaringbitmap)
550+
RETURNS roaringbitmap64
551+
AS 'MODULE_PATHNAME', 'rb64_from_roaringbitmap'
552+
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
553+
554+
CREATE CAST (roaringbitmap64 AS roaringbitmap) WITH FUNCTION rb64_to_roaringbitmap(roaringbitmap64);
555+
CREATE CAST (roaringbitmap AS roaringbitmap64) WITH FUNCTION rb64_from_roaringbitmap(roaringbitmap);
556+
543557
--
544558
-- Operator Functions
545559
--

roaringbitmap64.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,6 +1528,88 @@ rb64_iterate(PG_FUNCTION_ARGS) {
15281528
}
15291529
}
15301530

1531+
//convert roaringbitmap64 to roaringbitmap
1532+
PG_FUNCTION_INFO_V1(rb64_to_roaringbitmap);
1533+
Datum rb64_to_roaringbitmap(PG_FUNCTION_ARGS);
1534+
1535+
Datum
1536+
rb64_to_roaringbitmap(PG_FUNCTION_ARGS)
1537+
{
1538+
bytea *serializedbytes = PG_GETARG_BYTEA_P(0);
1539+
roaring64_bitmap_t *r1;
1540+
roaring64_iterator_t *iterator;
1541+
roaring_bitmap_t *r2;
1542+
size_t expectedsize;
1543+
1544+
r1 = roaring64_bitmap_portable_deserialize_safe(VARDATA(serializedbytes), VARSIZE(serializedbytes) - VARHDRSZ);
1545+
if (!r1)
1546+
ereport(ERROR,
1547+
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
1548+
errmsg("bitmap format is error")));
1549+
1550+
r2 = roaring_bitmap_create();
1551+
iterator = roaring64_iterator_create(r1);
1552+
while (roaring64_iterator_has_value(iterator))
1553+
{
1554+
int64_t value = roaring64_iterator_value(iterator);
1555+
if(value > INT32_MAX || value < INT32_MIN)
1556+
ereport(ERROR,
1557+
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1558+
errmsg("value \"%ld\" is out of range for type %s", value,
1559+
"integer")));
1560+
roaring_bitmap_add(r2, (int32_t)value);
1561+
roaring64_iterator_advance(iterator);
1562+
}
1563+
roaring64_iterator_free(iterator);
1564+
1565+
expectedsize = roaring_bitmap_portable_size_in_bytes(r2);
1566+
serializedbytes = (bytea *) palloc(VARHDRSZ + expectedsize);
1567+
roaring_bitmap_portable_serialize(r2, VARDATA(serializedbytes));
1568+
roaring64_bitmap_free(r1);
1569+
roaring_bitmap_free(r2);
1570+
1571+
SET_VARSIZE(serializedbytes, VARHDRSZ + expectedsize);
1572+
PG_RETURN_BYTEA_P(serializedbytes);
1573+
}
1574+
1575+
//convert roaringbitmap to roaringbitmap64
1576+
PG_FUNCTION_INFO_V1(rb64_from_roaringbitmap);
1577+
Datum rb64_from_roaringbitmap(PG_FUNCTION_ARGS);
1578+
1579+
Datum
1580+
rb64_from_roaringbitmap(PG_FUNCTION_ARGS)
1581+
{
1582+
bytea *serializedbytes = PG_GETARG_BYTEA_P(0);
1583+
roaring_bitmap_t *r1;
1584+
roaring_uint32_iterator_t *iterator;
1585+
roaring64_bitmap_t *r2;
1586+
size_t expectedsize;
1587+
1588+
r1 = roaring_bitmap_portable_deserialize_safe(VARDATA(serializedbytes), VARSIZE(serializedbytes) - VARHDRSZ);
1589+
if (!r1)
1590+
ereport(ERROR,
1591+
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
1592+
errmsg("bitmap format is error")));
1593+
1594+
r2 = roaring64_bitmap_create();
1595+
iterator = roaring_iterator_create(r1);
1596+
while (iterator->has_value)
1597+
{
1598+
roaring64_bitmap_add(r2, (int64_t)(int32_t)iterator->current_value);
1599+
roaring_uint32_iterator_advance(iterator);
1600+
}
1601+
roaring_uint32_iterator_free(iterator);
1602+
1603+
expectedsize = roaring64_bitmap_portable_size_in_bytes(r2);
1604+
serializedbytes = (bytea *) palloc(VARHDRSZ + expectedsize);
1605+
roaring64_bitmap_portable_serialize(r2, VARDATA(serializedbytes));
1606+
roaring_bitmap_free(r1);
1607+
roaring64_bitmap_free(r2);
1608+
1609+
SET_VARSIZE(serializedbytes, VARHDRSZ + expectedsize);
1610+
PG_RETURN_BYTEA_P(serializedbytes);
1611+
}
1612+
15311613
//bitmap or trans
15321614
PG_FUNCTION_INFO_V1(rb64_or_trans);
15331615
Datum rb64_or_trans(PG_FUNCTION_ARGS);

sql/roaringbitmap64.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,16 @@ select '{1}'::roaringbitmap64::bytea::roaringbitmap64;
5252
select '{1,9999,-88888}'::roaringbitmap64::bytea::roaringbitmap64;
5353
select roaringbitmap64('{1,9999,-88888}'::roaringbitmap64::bytea);
5454

55+
select roaringbitmap('{}')::roaringbitmap64;
56+
select roaringbitmap('{0,1,9999,2147483647,-2147483648,-2,-1}')::roaringbitmap64;
57+
select roaringbitmap64('{}')::roaringbitmap;
58+
select roaringbitmap64('{0,1,9999,2147483647,-2147483648,-2,-1}')::roaringbitmap;
59+
5560
-- Exception
5661
select roaringbitmap64('\x11'::bytea);
5762
select '\x11'::bytea::roaringbitmap64;
63+
select roaringbitmap64('{0,1,9999,2147483648,-2147483648,-2,-1}')::roaringbitmap;
64+
select roaringbitmap64('{0,1,9999,2147483647,-2147483649,-2,-1}')::roaringbitmap;
5865

5966
-- Test Opperator
6067

0 commit comments

Comments
 (0)