尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

StarRocks CONV 函数详解:进制转换语法、示例与源码级实现原理

StarRocks CONV 函数详解:进制转换语法、示例与源码级实现原理 StarRocks CONV 函数详解进制转换语法、示例与源码级实现原理【免费下载链接】starrocksThe worlds 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本文以 StarRocks 官方函数参考文档中的conv函数为主体完整讲解其语法、参数、返回值与示例用法并结合后端BE源码揭示该函数的两个重载如何注册、基数的合法范围2~36在哪里被校验、以及字符串解析与有/无符号基数下溢、越界时的具体处理路径。读完本文你既能直接上手在查询中使用CONV完成任意进制二进制到三十六进制的转换也能准确预判边界输入如非法基数、超长字符串下函数的实际行为。函数概述conv用于将数字x从一个进制源基数转换到另一个进制目标基数并以字符串VARCHAR形式返回转换结果。它是 StarRocks 数学函数族中与进制转换相关的核心函数常见于 ID 编码、位图/二进制调试、十六进制标识符互转等场景。语法CONV(x, y, z);参数说明x要转换的数字支持VARCHAR或BIGINT两种输入类型y源进制source base支持TINYINTz目标进制target base支持TINYINT。两个基数的合法范围可以从源码确认BE 端在 math_functions.h 中定义了static const int32_t MIN_BASE 2; static const int32_t MAX_BASE 36;即基数必须在 2 到 36 之间含边界与 36 个数字字母字符0-9A-Z一一对应。若在运行期传入越界基数该行的结果会直接返回 NULL而不是报错见下文conv_int实现。返回值返回VARCHAR类型。示例官方文档给出的基础示例把十进制的 8 转换为二进制表示mysql select conv(8,10,2); ---------------- || conv(8, 10, 2) | ---------------- | 1000 | ---------------- 1 row in set (0.00 sec)基于同一实现还可以这样使用进制转换的数学结果由实现确定性保证select conv(255, 10, 16);十进制转十六进制返回FFselect conv(FF, 16, 10);字符串FF按十六进制解析再转十进制返回255select conv(255, 10, 2);十进制转二进制返回11111111。需要注意几个由源码直接决定的边界行为x或任一基数为 NULL 时该行结果为 NULL基数超出[2, 36]时该行结果为 NULL字符串输入若全为空白字符返回0字符串按源进制解析失败时返回0源进制中出现“无法用该进制表示”的数字例如把十进制数15当作二进制解析时的高位数字5 ≥ 2实现会从头丢弃不可表示部分只保留可表示的低位这一行为与 Hive、MySQL 保持一致。源码实现函数注册与两个重载conv在 StarRocks 的函数注册表中注册为两个重载定义在 functions.py[10320, conv, True, False, VARCHAR, [BIGINT, TINYINT, TINYINT], MathFunctions::conv_int], [10321, conv, True, False, VARCHAR, [VARCHAR, TINYINT, TINYINT], MathFunctions::conv_string],这解释了参数表中x同时支持BIGINT与VARCHAR的原因编译器会根据x的类型选择对应实现两者最终都产出VARCHAR列对应 MathFunctions::conv_int 与 MathFunctions::conv_string均为DEFINE_VECTORIZED_FN定义的向量化函数。BIGINT 输入conv_intconv_int 的处理流程是通过ColumnViewer逐行读取BIGINT x、TINYINT y、TINYINT z三列任一参数为 NULL直接 append null校验abs(y)与abs(z)是否落在[MIN_BASE, MAX_BASE]内越界则该行返回 NULL当源基数y ! 10时调用 decimal_in_base_to_decimal 把“以 y 进制解释的 x”还原为十进制整数若中途溢出走handle_parse_result兜底最后统一调用 decimal_to_base 把十进制整数按目标基数z逐位取余编码为字符串。其中decimal_in_base_to_decimal采用经典的按十进制位展开算法依次取x的每一位十进制数字若该数字 src_base不可用该进制表示则把累计结果清零重来只保留低位可表示部分若累计值溢出*result digit返回 false 交由上层处理。VARCHAR 输入conv_stringconv_string 针对字符串输入做了更完整的解析跳过前导空白StringParser::skip_leading_whitespace若整串都是空白直接返回0识别可选的负号前缀用StringParser::string_to_intuint64_t按abs(src_base)解析出数值解析结果分支处理PARSE_SUCCESS若源基数为负有符号模式将结果夹取clamp到int64的min/max范围内PARSE_FAILURE返回0PARSE_OVERFLOW有符号模式下调到int64极值无符号模式下负数取 0、正数取uint64最大值若输入为负先做二进制取反加一按位取补码再交给decimal_to_base输出。目标基数符号语义decimal_to_basedecimal_to_base 是两种重载共用的编码出口其关键语义是输出字符集为0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_s_alphanumeric_chars因此目标基数最大为 36目标基数为负dest_base 0时把输入数当作有符号数先取绝对值编码负数结果会带-前缀目标基数为正时按补码twos complement无符号解释输入即负数会输出为一个很大的无符号进制串缓冲区按二进制位数上限sizeof(uint64_t) * 8 1预留最长 65 位加符号位保证任何 64 位整数都能安全编码。另外handle_parse_result 对溢出情况的兜底策略在源码注释中明确说明 “This is consistent with Hive and MySQLs behavior”溢出时若目标基数为负则置-1否则置uint64最大值。这为跨引擎迁移时的行为一致性提供了实现层面的依据。小结要点结论依据语法CONV(x, y, z)返回 VARCHAR本文档x类型BIGINT / VARCHAR 两个重载functions.py基数范围2 ~ 36越界返回 NULLmath_functions.h字符串解析失败 / 全空白返回0conv_string溢出处理与 Hive、MySQL 行为一致handle_parse_result目标基数负/正的符号语义负有符号输出可带-正补码无符号输出decimal_to_base在实际使用中建议将conv用于确定性的编码转换ID 进制互转、十六进制调试等并提前对基数合法性与字符串可解析性做约束若需了解同族的其他数学函数行为差异可继续参考 数学函数文档目录 所在目录下的相邻文档。【免费下载链接】starrocksThe worlds 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),仅供参考
返回列表