Bit & Bitmap
Notice: Some of the examples below are referenced from ClickHouse Documentation but have been adapted and modified to work in ByConity.
bitTest
Takes any integer and converts it into [binary form].
Syntax
SELECT bitTest(number, index)
Arguments
number– Integer number.index– Position of bit.
Returned values
Returns a value of bit at specified position.
Type: UInt8 .
Example
For example, the number 43 in base-2 (binary) numeral system is 101011.
Query:
SELECT bitTest(43, 1);
Result:
┌─bitTest(43, 1)─┐
│ 1 │
└────────────────┘
Another example:
Query:
SELECT bitTest(43, 2);
Result:
┌─bitTest(43, 2)─┐
│ 0 │
└────────────────┘
bitTestAll
Returns result of [logical conjuction] (AND operator) of all bits at given positions. The countdown starts from 0 from the right to the left.
The conjuction for bitwise operations:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Syntax
SELECT bitTestAll(number, index1, index2, index3, index4, ...)
Arguments
number– Integer number.index1,index2,index3,index4– Positions of bit. For example, for set of positions (index1,index2,index3,index4) is true if and only if all of its positions are true (index1⋀index2, ⋀index3⋀index4).
Returned values
Returns result of logical conjuction.
Type: UInt8 .
Example
For example, the number 43 in base-2 (binary) numeral system is 101011.
Query:
SELECT bitTestAll(43, 0, 1, 3, 5);
Result:
┌─bitTestAll(43, 0, 1, 3, 5)─┐
│ 1 │
└────────────────────────────┘
Another example:
Query:
SELECT bitTestAll(43, 0, 1, 3, 5, 2);
Result:
┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│ 0 │
└───────────────────────────────┘
bitTestAny
Returns result of [logical disjunction](OR operator) of all bits at given positions. The countdown starts from 0 from the right to the left.
The disjunction for bitwise operations:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
Syntax
SELECT bitTestAny(number, index1, index2, index3, index4, ...)
Arguments
number– Integer number.index1,index2,index3,index4– Positions of bit.
Returned values
Returns result of logical disjuction.
Type: UInt8 .
Example
For example, the number 43 in base-2 (binary) numeral system is 101011.
Query:
SELECT bitTestAny(43, 0, 2);
Result:
┌─bitTestAny(43, 0, 2)─┐
│ 1 │
└──────────────────────┘
Another example:
Query:
SELECT bitTestAny(43, 4, 2);
Result:
┌─bitTestAny(43, 4, 2)─┐
│ 0 │
└──────────────────────┘
bitmapAnd
Two bitmap and calculation, the result is a new bitmap.
Syntax
bitmapAnd(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- The Bitmap object
Example
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
Result:
┌─res─┐
│ [3] │
└─────┘
bitmapAndCardinality
Two bitmap and calculation, return cardinality of type UInt64.
Syntax
bitmapAndCardinality(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- The cardinality in type
UInt64.
Type:Uint64
Example
SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
Result:
┌─res─┐
│ 1 │
└─────┘
bitmapAndnot
Two bitmap andnot calculation, the result is a new bitmap.
Syntax
bitmapAndnot(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- The Bitmap object
Type: Bitmap object.
Example
SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
Result:
┌─res────┐
│ [1, 2] │
└────────┘
bitmapAndnotCardinality
Two bitmap andnot calculation, return cardinality of type UInt64.
Syntax
bitmapAndnotCardinality(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- The cardinality in
UInt64.
Type: UInt64
Example
SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
Result:
┌─res─┐
│ 2 │
└─────┘
bitmapBuild
Build a bitmap from unsigned integer array.
Syntax
bitmapBuild(array)
Arguments
array– Unsigned integer array.
Returned value
- The bitmap object
Type: Bitmap object.
Example
SELECT toTypeName(bitmapBuild([1, 2, 3, 4, 5]));
Result:
┌─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─┐
│ AggregateFunction(groupBitmap, UInt8) │
└──────────────────────────────────────────┘
bitmapCardinality
Return bitmap cardinality of type UInt64.
Syntax
bitmapCardinality(bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- The bitmap cardinality in type
UInt64.
Type: UInt64 .
Example
SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res;
Result:
┌─res─┐
│ 5 │
└─────┘
bitmapContains
Checks whether the bitmap contains an element.
Syntax
bitmapContains(haystack, needle)
Arguments
haystack– [Bitmap object], where the function searches.needle– Value that the function searches. Type: [UInt32] .
Returned values
- 0 — If
haystackdoes not containneedle. - 1 — If
haystackcontainsneedle.
Type: UInt8 .
Example
SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res;
Result:
┌─res─┐
│ 1 │
└─────┘
bitmapHasAll
Analogous to hasAll(array, array) returns 1 if the first bitmap contains all the elements of the second one, 0 otherwise.
If the second argument is an empty bitmap then returns 1.
Syntax
bitmapHasAll(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Returned value
1, returns 1 if the first bitmap contains all the elements of the second one or If the second argument is an empty bitmap .0, otherwise.
Type: UInt8
Example
SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
Result:
┌─res─┐
│ 0 │
└─────┘
bitmapHasAny
Checks whether two bitmaps have intersection by some elements.
Syntax
bitmapHasAny(bitmap1, bitmap2)
If you are sure that bitmap2 contains strictly one element, consider using the [bitmapContains] function. It works more efficiently.
Arguments
bitmap*– Bitmap object.
Return values
1, ifbitmap1andbitmap2have one similar element at least.0, otherwise.
Example
SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
Result:
┌─res─┐
│ 1 │
└─────┘
bitmapMax
Return the greatest value of type UInt64 in the set, 0 if the set is empty.
Syntax
bitmapMax(bitmap)
Arguments
bitmap– Bitmap object.
Return values
- Return the greatest value of type UInt64 in the set.
Type: UInt64
Example
SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res;
Result:
┌─res─┐
│ 5 │
└─────┘
bitmapMin
Return the smallest value of type UInt64 in the set, UINT32_MAX if the set is empty.
Syntax
bitmapMin(bitmap)
Arguments
bitmap– Bitmap object.
Return values
- Return the smallest value of type UInt64 in the set.
Type: UInt64
Example
SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res;
Result:
┌─res─┐
│ 1 │
└─────┘
bitmapOr
Two bitmap or calculation, the result is a new bitmap.
bitmapOr(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- The Bitmap object
Type: Bitmap object.
Example
SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
Result:
┌─res─────────────┐
│ [1, 2, 3, 4, 5] │
└─────────────────┘
bitmapOrCardinality
Two bitmap or calculation, return cardinality of type UInt64.
Syntax
bitmapOrCardinality(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Return values
- Return or calculation result in cardinality.
Type:UInt64
Example
SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
Result:
┌─res─┐
│ 5 │
└─────┘
bitmapSubsetInRange
Return subset in specified range (not include the range_end).
Syntax
bitmapSubsetInRange(bitmap, range_start, range_end)
Arguments
bitmap– [Bitmap object].range_start– Range start point. Type: [UInt32].range_end– Range end point (excluded). Type: [UInt32].
Return values
- Return or calculation result.
Type:array
Example
SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,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,100,200,500]), toUInt32(30), toUInt32(200))) AS res;
Result:
┌─res───────────────────┐
│ [30, 31, 32, 33, 100] │
└───────────────────────┘
bitmapSubsetLimit
Creates a subset of bitmap with n elements taken between range_start and cardinality_limit .
Syntax
bitmapSubsetLimit(bitmap, range_start, cardinality_limit)
Arguments
bitmap– [Bitmap object].range_start– The subset starting point. Type: [UInt32].cardinality_limit– The subset cardinality upper limit. Type: [UInt32].
Returned value
- The subset.
Type: Bitmap object .
Example
Query:
SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,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,100,200,500]), toUInt32(30), toUInt32(200))) AS res;
Result:
┌─res─────────────────────────────┐
│ [30, 31, 32, 33, 100, 200, 500] │
└─────────────────────────────────┘
bitmapToArray
Convert bitmap to integer array.
Syntax
bitmapToArray(bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- An array.
Type: array .
Example
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res;
Result:
┌─res─────────────┐
│ [1, 2, 3, 4, 5] │
└─────────────────┘
bitmapXor
Two bitmap xor calculation, the result is a new bitmap.
bitmapXor(bitmap,bitmap)
Arguments
bitmap– Bitmap object.
Returned value
- The Bitmap object
Type: Bitmap object.
Example
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
Result:
┌─res──────────┐
│ [1, 2, 4, 5] │
└──────────────┘
bitmapXorCardinality
Two bitmap xor calculation, return cardinality of type UInt64.
Syntax
bitmapXorCardinality(bitmap,bitmap)
Arguments
bitmap– Bitmap object.Returned value
The Bitmap object
Type: Bitmap object.
Example
SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
Result:
┌─res─┐
│ 4 │
└─────┘