十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

StarRocks strright 函数详解:从右侧提取子串的用法、别名与 UTF-8 底层实现

StarRocks strright 函数详解:从右侧提取子串的用法、别名与 UTF-8 底层实现 StarRocks strright 函数详解从右侧提取子串的用法、别名与 UTF-8 底层实现【免费下载链接】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/starrocksstrright是 StarRocks 字符串函数族中用于从字符串右侧截取指定长度子串的函数其语义与right完全等价可视为right的别名。本文基于 strright 官方文档结合 FE 函数注册与 BE 向量化执行源码完整讲解语法、示例、边界行为、UTF-8 字符计数规则及其底层实现原理帮助你写出精确、可预期的字符串截取 SQL。函数概述与别名关系strright(str, len)的作用是从字符串str的最右侧开始按指定长度len提取子串。长度单位是UTF-8 字符character而非字节byte因此对中文等多字节字符同样安全。该函数同时注册为right两者完全等价FE 端在 FunctionSet.java 中分别定义了RIGHT right与STRRIGHT strright两个函数名指向同一套内置函数实现你可以根据团队 SQL 风格任意选择strright(...)或right(...)执行结果完全一致。官方文档明确注明This function is also named as right对应文档见 right.md。语法与参数说明VARCHAR strright(VARCHAR str, INT len)参数类型说明strVARCHAR源字符串即被截取的对象lenINT从右侧开始提取的字符个数UTF-8 字符为单位返回值VARCHAR截取得到的子串行为要点当len小于等于字符串长度时返回最右侧的len个字符当len大于字符串长度时返回整个原字符串越界不报错也不会返回 NULL。示例演示官方文档给出了如下示例MySQL select strright(Hello starrocks,9); -------------------------------- | strright(Hello starrocks, 9) | -------------------------------- | starrocks | --------------------------------Hello starrocks共 15 个字符取最右侧 9 个字符即得到starrocks。结合参数行为还可以验证以下边界场景-- len 大于字符串长度返回整个字符串 SELECT strright(starrocks, 100); -- starrocks -- len 为 0返回空字符串 SELECT strright(starrocks, 0); -- (empty) -- 多字节 UTF-8 字符按字符计数而非按字节 SELECT strright(StarRocks 数据库, 3); -- 数据库3 个中文字符 -- 与 right 完全等价 SELECT strright(StarRocks, 5), right(StarRocks, 5); -- Rocks | Rocks底层实现与边界语义BE 端向量化实现在 BE 端strright/right的实现位于 string_functions.cpp// right // right(s, n) equals to substr(s, -n, n) except the case len(s) n under which // right(s, n) return the entire s. StatusOrColumnPtr StringFunctions::right(FunctionContext* context, const Columns columns) { ... if (state ! nullptr state-is_const) { return right_const(state, columns); } else { return right_not_const(context, columns); } }源码注释明确了其与substr的关系right(s, n)等价于substr(s, -n, n)唯一的例外是当len(s) n时right(s, n)返回整个s而substr在越界时可能返回空串。这一语义由模板参数allow_out_of_left_bound控制对right函数allow_out_of_left_bound恒为true即允许越过左边界、直接返回完整字符串对substr/left函数该参数恒为false。相关核心逻辑见 string_functions.cpp 的ascii_substr_per_slice与 utf8_substr_from_right_per_slice当负偏移即从右往左数导致from_pos 0时allow_out_of_left_bound为true则直接输出整个字符串否则输出空串。常量折叠优化const optimization执行引擎对right/strright做了专门的常量优化。当两列在 Fragment 局部范围内均为非空常量时会走left_or_right_prepare预计算路径Status StringFunctions::left_or_right_prepare(FunctionContext* context, FunctionContext::FunctionStateScope scope) { ... state-is_const true; int len ColumnHelper::get_const_valueTYPE_INT(len_column); // right_const ignores state-pos, just use state-len state-pos 1; state-len len; ... }见 string_functions.cpp。由于strright(xxx, 9)这类 SQL 中两个参数往往都是字面量该优化可将截取结果在 prepare 阶段直接计算出来显著降低执行期开销。ASCII 与 UTF-8 双路径BE 实现按字符串内容自动分派两条路径ASCII 快速路径若字符串为纯 ASCII可直接通过指针算术from_pos s-size定位起点无需逐字符扫描见 ascii_substr_per_sliceUTF-8 慢速路径若包含多字节字符则从右向左扫描 UTF-8 字符边界确保按“字符”而非“字节”截取见 utf8_right_not_const。对不超过 32 字节的短串还会使用栈上small_index缓存每个 UTF-8 字符的字节偏移以加速定位。这也解释了文档中“The unit for length: utf-8 character”的底层原因长度的单位始终是字符个数中英文混排时不会出现半个字符的截断。使用建议与注意事项别名互换strright与right完全等价新旧代码风格切换无任何兼容风险越界安全len大于字符串长度时返回原串不会报错len 0返回空串可安全用于清洗场景字符单位涉及中文、Emoji 等多字节字符时务必理解长度单位是字符而非字节与substr的负偏移语义一致NULL 处理任一参数为 NULL 时结果返回 NULL由RETURN_IF_COLUMNS_ONLY_NULL等空值短路机制统一处理相关函数与left从左侧截取见 left.md、substr/substring、length/char_length等函数组合使用可完成各类字符串处理需求。小结strright是 StarRocks 提供的一个语义简洁、实现高效的右侧子串截取函数与right互为别名。从 FE 的 FunctionSet.java 注册到 BE 的 StringFunctions::right 向量化执行再到 ASCII/UTF-8 双路径与常量折叠优化整条链路保证了该函数在多字节场景下的正确性与高性能。需要从字符串右侧提取固定数量字符时直接使用strright(str, len)即可。keywordSTRRIGHT, RIGHT, 字符串函数, 右侧截取, UTF-8, StarRocks【免费下载链接】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),仅供参考
返回列表