StarRocks bitxor 位异或函数详解:语法、参数类型、返回语义与源码实现
2026/9/18 0:13:15 网站建设 项目流程

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)计算两个整数xy的按位异或(bitwise XOR)结果。异或运算的规则是:两个二进制位相同时结果为 0,不同时结果为 1,即:

x 位y 位结果位
000
011
101
110

按位异或最常见的特性是“与自身异或得 0”(x ^ x == 0)、与 0 异或不变(x ^ 0 == x)、两次异或同一值可还原((x ^ k) ^ k == x),这些特性使其在数据打标、权限位翻转、字段值交换等场景中非常实用。

语法

BITXOR(x, y);
  • 函数名为bitxor,大小写不敏感;
  • 两个参数xy均为必填;
  • 返回值类型与第一个参数x的类型一致。

参数说明与类型约束

bitxor的两个参数必须满足如下约束:

  • x:必须是数值表达式,且只能为以下整数类型之一:TINYINTSMALLINTINTBIGINTLARGEINT
  • y:类型要求与x完全一致,同样限定为TINYINTSMALLINTINTBIGINTLARGEINT
  • xy必须类型一致(must agree in data type),即不允许出现bitxor(INT, BIGINT)这类混合类型调用,使用时需先通过CAST显式统一类型。

注意:bitxor不接受浮点类型(FLOATDOUBLE)与布尔类型,位运算仅适用于整数。若确有需要,可先用CAST(x AS INT)等方式转换为整数后再调用。

返回值规则

  • 返回值的类型与x的类型相同(例如xBIGINT,则返回值也是BIGINT)。
  • 如果xy中任意一个值为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的二进制为0115的二进制为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; }

从源码结构看,bitxorbitandl & r)、bitorl | 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:

  • bitxorTinyIntbitxor(10, 10) == 0
  • bitxorSmallIntbitxor(10, 10) == 0
  • bitxorIntbitxor(10, 10) == 0
  • bitxorBigintbitxor(100, 100) == 0
  • bitxorLargeIntbitxor(100, 100) == "0"(LARGEINT 返回大整数对象)

执行计划相关测试ScalarOperatorToExecExprTest也把bitxorbitandbitorbit_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;
  • 支持类型:TINYINTSMALLINTINTBIGINTLARGEINT,不支持浮点与布尔;
  • FE 端通过FunctionSet注册内建算子并在ScalarOperatorToExpr中映射,BE 端由ArithmeticBinaryOperator::applyl ^ 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询