StarRocks bitxor 位异或函数详解:语法、参数类型、返回语义与源码实现
【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks
bitxor是 StarRocks 提供的位运算标量函数,用于对两个整数表达式执行按位异或(XOR)运算。本文基于 bitxor 官方文档 展开,结合 FE/BE 源码与测试用例,完整讲解其语法、参数约束、返回值规则、NULL 语义、实战示例,并从源码层面剖析其内部实现与注册机制,帮助你理解并放心地在多维分析、实时查询与临时查询场景中使用位运算。
bitxor 函数概述
bitxor(x, y)计算两个整数x与y的按位异或(bitwise XOR)结果。异或运算的规则是:两个二进制位相同时结果为 0,不同时结果为 1,即:
| x 位 | y 位 | 结果位 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
按位异或最常见的特性是“与自身异或得 0”(x ^ x == 0)、与 0 异或不变(x ^ 0 == x)、两次异或同一值可还原((x ^ k) ^ k == x),这些特性使其在数据打标、权限位翻转、字段值交换等场景中非常实用。
语法
BITXOR(x, y);- 函数名为
bitxor,大小写不敏感; - 两个参数
x与y均为必填; - 返回值类型与第一个参数
x的类型一致。
参数说明与类型约束
bitxor的两个参数必须满足如下约束:
x:必须是数值表达式,且只能为以下整数类型之一:TINYINT、SMALLINT、INT、BIGINT、LARGEINT。y:类型要求与x完全一致,同样限定为TINYINT、SMALLINT、INT、BIGINT、LARGEINT。x与y必须类型一致(must agree in data type),即不允许出现bitxor(INT, BIGINT)这类混合类型调用,使用时需先通过CAST显式统一类型。
注意:
bitxor不接受浮点类型(FLOAT、DOUBLE)与布尔类型,位运算仅适用于整数。若确有需要,可先用CAST(x AS INT)等方式转换为整数后再调用。
返回值规则
- 返回值的类型与
x的类型相同(例如x为BIGINT,则返回值也是BIGINT)。 - 如果
x或y中任意一个值为NULL,则结果为NULL(NULL 传播语义)。 - 运算按补码形式进行,因此负数也可以直接参与异或,符号位参与运算,结果仍以对应整数类型表示。
示例
基础示例
与 0 异或结果保持不变:
mysql> select bitxor(3,0); +--------------+ | bitxor(3, 0) | +--------------+ | 3 | +--------------+ 1 row in set (0.00 sec)非零参数异或
mysql> select bitxor(3,5); +--------------+ | bitxor(3, 5) | +--------------+ | 6 | +--------------+ 1 row in set (0.00 sec)计算过程:3的二进制为011,5的二进制为101,逐位异或得到110,即十进制6。
自身异或与 NULL 传播
mysql> select bitxor(7,7); +--------------+ | bitxor(7, 7) | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec) mysql> select bitxor(null, 1); +-----------------+ | bitxor(NULL, 1) | +-----------------+ | NULL | +-----------------+ 1 row in set (0.00 sec)结合表查询
-- 假设存在表 user_flags(user_id INT, flags INT) -- 将第 2 位(值 2)翻转,实现权限位切换 SELECT user_id, flags, bitxor(flags, 2) AS toggled_flags FROM user_flags;源码级实现解析
bitxor在 StarRocks 中是作为算术/位运算内建函数实现并注册的,其实现贯穿 FE(前端)与 BE(后端)两个部分。
BE 端:位异或的实际计算
BE 端将bitxor定义为位运算算子结构体之一,实现在 be/src/exprs/arithmetic_operation.h:
struct BitAndOp {}; struct BitOrOp {}; struct BitXorOp {}; struct BitNotOp {}; struct BitShiftLeftOp {}; struct BitShiftRightOp {}; struct BitShiftRightLogicalOp {};在ArithmeticBinaryOperator::apply中,BitXorOp对应的实际运算是 C++ 的按位异或操作符^(be/src/exprs/arithmetic_operation.h):
} else if constexpr (is_bitxor_op<Op>) { return l ^ r; }从源码结构看,bitxor与bitand(l & r)、bitor(l | r)共用同一套ArithmeticBinaryOperator模板分发框架,通过BitXorOpGuard做编译期类型守卫(be/src/exprs/arithmetic_operation.h),get_op_name()在算子序列化时返回字符串"bitxor"(be/src/exprs/arithmetic_operation.h),供执行计划反序列化时识别。
FE 端:函数注册与算子映射
FE 端在FunctionSet中定义函数名常量(fe/fe-core/src/main/java/com/starrocks/catalog/FunctionSet.java):
public static final String BITXOR = "bitxor";在initAritheticFunctions中,BITAND()、BITOR()、BITXOR()、BITNOT()等位运算函数作为内建算子注册(fe/fe-core/src/main/java/com/starrocks/catalog/FunctionSet.java),注册逻辑由gensrc/script/gen_functions.py生成,这也解释了文档中参数类型被严格限定为IntegerType.INTEGER_TYPES(TINYINT/SMALLINT/INT/BIGINT/LARGEINT)的由来。
在 SQL 执行计划生成阶段,字符串"bitxor"会被映射为ArithmeticExpr.Operator.BITXOR(fe/fe-core/src/main/java/com/starrocks/sql/plan/ScalarOperatorToExpr.java),随后传递到 BE 端执行上述l ^ r运算。
测试覆盖
FE 单测对bitxor的全部五种整数类型均有覆盖,见 fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java:
bitxorTinyInt:bitxor(10, 10) == 0bitxorSmallInt:bitxor(10, 10) == 0bitxorInt:bitxor(10, 10) == 0bitxorBigint:bitxor(100, 100) == 0bitxorLargeInt:bitxor(100, 100) == "0"(LARGEINT 返回大整数对象)
执行计划相关测试ScalarOperatorToExecExprTest也把bitxor与bitand、bitor、bit_shift_left等一同作为位运算函数用例进行验证(fe/fe-core/src/test/java/com/starrocks/sql/plan/ScalarOperatorToExecExprTest.java)。
典型应用场景
- 权限位开关:用
bitxor(flags, mask)一键翻转某个二进制位,配合bitand判断位状态。 - 数据脱敏/还原:利用
(x ^ k) ^ k == x的特性,以固定掩码k对数值字段做可逆变换。 - 值交换:在不引入临时变量的情况下用三次异或交换两个整数。
- 奇偶校验与指纹:对多个整型列做异或生成轻量级校验值,用于粗粒度数据比对。
相关位运算函数
bitxor是 StarRocks 位运算函数族的一员,同类函数还包括:
bitand(x, y):按位与bitor(x, y):按位或bitnot(x):按位取反bit_shift_left(x, n):按位左移bit_shift_right(x, n):按位右移
它们共享相同的参数类型约束(仅限整数类型)与 NULL 传播语义,注册与实现机制也保持一致,可参考 FunctionSet.java 与 arithmetic_operation.h 进一步阅读源码。
小结
bitxor(x, y)对两个类型一致的整数执行按位异或,返回值类型与x一致,任一参数为 NULL 则结果为 NULL;- 支持类型:
TINYINT、SMALLINT、INT、BIGINT、LARGEINT,不支持浮点与布尔; - FE 端通过
FunctionSet注册内建算子并在ScalarOperatorToExpr中映射,BE 端由ArithmeticBinaryOperator::apply以l ^ r完成计算,全程有单测覆盖五种整数类型。
掌握bitxor的语法与语义后,你可以在 StarRocks 中安全地使用位运算完成权限控制、状态压缩与校验类任务。
【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考