StarRocks rtrim 字符串函数完全指南语法、参数、实战与底层实现【免费下载链接】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/starrocksrtrim是 StarRocks 内置的字符串裁剪函数用于移除字符串右侧结尾处连续出现的空格或指定字符是数据清洗、日志字段处理和报表统计中最常用的函数之一。本文将以 StarRocks 官方文档为基础结合仓库源码与单元测试系统讲解rtrim的语法、参数约束、返回值、典型示例并深入剖析其在 BE 端后端存储引擎的向量化执行与 SIMD 优化原理帮助你在实际查询中写出更高效、更准确的 SQL。函数简介rtrim从字符串的右侧结尾部分移除连续出现的空格或指定字符。它与 ltrim移除左侧、trim两侧同时移除构成 StarRocks 的裁剪函数家族。从 StarRocks2.5.0 版本开始rtrim支持从字符串中移除指定的字符此前仅支持移除空格。这一能力使它在处理带固定分隔符、填充符或特殊标记的数据时极为实用。语法VARCHAR rtrim(VARCHAR str[, VARCHAR characters]);完整的函数声明形式为VARCHAR rtrim(VARCHAR str[, VARCHAR characters])其中str必选参数待裁剪的字符串数据类型必须为 VARCHAR。characters可选参数要移除的字符数据类型为 VARCHAR。如果不指定该参数默认移除空格如果该参数被设置为空字符串则返回报错。返回值返回值的数据类型为VARCHAR返回移除右侧连续空格或指定字符后的字符串。若str为 NULL则结果同样为 NULL与 MySQL 行为一致。参数约束与注意事项基于 trim_prepare 函数 的实现rtrim的第二个参数有严格的约束理解这些约束有助于规避查询报错必须为常量字面量第二个参数只能是查询中的字符串字面量不能是列名或运行时表达式。源码中若检测到第二个参数不是常量列会抛出Invalid argument: The second parameter of trim only accept literal value错误。这是因为函数在FRAGMENT_LOCAL阶段的prepare期间就会将该字符集合固化到函数状态TrimState中供后续执行复用。不能为 NULL如果第二个参数为 NULL例如rtrim(abc, CAST(NULL AS VARCHAR))会报The second parameter should not be null错误而不是返回 NULL。不能为空字符串如果第二个参数为空字符串会报The second parameter should not be empty string错误这与官方文档“空字符返回报错”的描述一致。示例示例一移除字符串右侧的连续空格mysql SELECT rtrim( ab d ); --------------------- | rtrim( ab d ) | --------------------- | ab d | --------------------- 1 row in set (0.00 sec)输入 ab d 时仅右侧的 3 个连续空格被移除左侧的 3 个空格保持不变因此结果仍是 ab d可视化输出中左侧空格被保留、右侧无空格。示例二移除字符串右侧的指定字符mysql SELECT rtrim(xxabcdxx, x); ------------------------ | rtrim(xxabcdxx, x) | ------------------------ | xxabcd | ------------------------ 1 row in set (0.00 sec)此时characters被视作一个字符集合从右侧开始逐个匹配集合内的任意字符并移除直到遇到不属于该集合的字符为止。上例中右侧的xx被移除左侧的xx保留结果为xxabcd。示例三字符集合而非子串语义rtrim(barxxyz, xyz)的结果是bar而非barx因为x、y、z均属于待移除集合右侧的xyz会全部被移除。这与 trim 文档中 MySQL 兼容语法TRIM(TRAILING xyz FROM barxxyz)返回barx按整段子串移除一次的行为形成鲜明对比。实践中请务必区分这两种语义-- 子串形式整段 xyz 作为整体移除结果为 barx mysql SELECT TRIM(TRAILING xyz FROM barxxyz); -- barx -- 字符集合形式右侧任意 x/y/z 都移除结果为 bar mysql SELECT rtrim(barxxyz, xyz); -- bar相关函数对照rtrim与另外两个裁剪函数在方向上互补可按下表对照使用函数作用示例输入 ab d 结果ltrim移除左侧连续空格或指定字符ltrim( ab d)ab drtrim移除右侧连续空格或指定字符rtrim( ab d ) ab dtrim移除两侧连续空格或指定字符trim( ab c )ab c三者共用同一套底层裁剪实现详见下文仅通过TrimType枚举区分裁剪方向TRIM_LEFT、TRIM_RIGHT、TRIM_BOTH。底层实现向量化执行与自适应 SIMD 优化rtrim的实现在 BE 端 string_functions.cpp 中其入口为StatusOrColumnPtr StringFunctions::rtrim(FunctionContext* context, const starrocks::Columns columns) { return trim_implTRIM_RIGHT(context, columns); }rtrim通过模板参数TRIM_RIGHT复用了与ltrimTRIM_LEFT、trimTRIM_BOTH完全相同的trim_impl实现只裁剪右侧。核心执行路径prepare 阶段固化裁剪参数trim_prepare在片段级作用域FRAGMENT_LOCAL内创建TrimState保存remove_chars、is_utf8标记以及预计算的 UTF-8 字符索引utf8_index并完成参数合法性校验常量、非 NULL、非空。自适应裁剪策略AdaptiveTrimFunction::evaluate会先对前 100 行采样sample_num统计平均每行首尾需要移除的字符数当平均值超过阈值simd_threshold此处为 8时才启用 SIMD 路径否则走标量路径。这一设计源于“字符串中空格较少时 SIMD 收益不明显”的工程判断。SIMD 快速路径在__SSE2__支持的环境下skip_trailing_spaces使用_mm_loadu_si128、_mm_cmpeq_epi8、_mm_movemask_epi8等指令一次比对 16 字节再通过__builtin_clz快速定位第一个非裁剪字符的位置skip_leading_spaces则用__builtin_ctz完成对称的从左查找。UTF-8 安全裁剪当characters包含多字节字符如中文、emoji时函数切换到 UTF-8 路径依据UTF8_BYTE_LENGTH_TABLE与预构建的utf8_index逐字符而非逐字节匹配确保不会在字符中间切断。这一点在清洗中文文本时尤其重要。内存管理结果通过RunTimeColumnTypeTYPE_VARCHAR输出预先根据输入列大小预留容量并借助BinaryColumn的 offsets 机制在trim_per_slice中对每个 slice 计算裁剪后的起止指针一次性写入结果字节串避免逐行拼接的开销。测试验证BE 端单元测试 string_fn_trim_test.cpp 覆盖了rtrim的核心场景包括普通字符串的右裁剪结果断言rtrimTest全空格字符串裁剪后得到空字符串含 NULL 值的批量向量化输入验证 NULL 语义NULL 输入保持 NULL大基数4096 行批量数据的正确性与空值传播行为。此外测试中对 UTF-8 场景也有覆盖例如rtrim_string(abc, )结果为abc验证了多字节字符的正确裁剪。实际应用场景清洗导入数据的尾部空格外部文件或上游系统导入的字段常带尾部空格用rtrim(col)归一化后再进行 JOIN、GROUP BY 或去重可避免因空格不一致导致的数据匹配失败。移除固定填充符例如协议号、流水号右侧的补位字符0或x可一步完成rtrim(code, 0)。配合聚合统计口径统一在 ETL 视图中直接使用rtrim生成标准化列供下游报表引用。与 trim/ltrim 组合需要只处理一侧时避免额外开销例如只清理右侧时优先使用rtrim而非trim以减少无谓的左侧扫描。参考文档trim移除两侧空格或指定字符并支持 MySQL 兼容的TRIM(... FROM ...)语法与trim_string/ltrim_string/rtrim_string内置函数ltrim移除左侧空格或指定字符rtrim 中文文档中文版语法与示例说明【免费下载链接】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),仅供参考