ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

StarRocks space() 字符串函数详解:语法、边界行为与底层实现

StarRocks space() 字符串函数详解:语法、边界行为与底层实现 StarRocks space() 字符串函数详解语法、边界行为与底层实现【免费下载链接】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/starrocksspace(x)是 StarRocks 提供的一个标量字符串函数用于根据传入的整数x构造一个由指定数量空格组成的字符串常用于对齐输出、拼接格式化文本、分隔字符串片段等场景。本文以官方函数参考文档 space.md 为核心骨架结合 FE 函数注册表与 BE 端向量化实现源码完整说明其语法、参数约束、返回值、边界行为NULL 与超长处理以及底层执行原理帮助你在实际 SQL 中正确、高效地使用该函数。函数定位与概述space()是一个典型的标量Scalar字符串构造函数它不读取任何表数据只依据输入参数生成一段由空格字符 构成的字符串。在 StarRocks 中该函数被归类为字符串函数String Functions官方文档描述为 Returns a string of the specified number of spaces返回指定数量空格组成的字符串。从 FE 侧的函数注册表 gensrc/script/functions.py 可以看到它的登记信息[30070, space, True, True, VARCHAR, [INT], StringFunctions::space],其中明确了space的输入类型为INT、输出类型为VARCHAR并将后端实现绑定到 BE 的StringFunctions::space入口。语法与参数说明space(x);项目说明函数名space参数x期望返回的空格数量支持的数据类型为 INT32 位有符号整数返回值VARCHAR 类型由x个空格字符ASCII 0x20组成的字符串x既可以是字面量常量如space(6)也可以是任意返回 INT 的表达式或表列如space(length(col))BE 端会对常量输入做常量列constant column优化。返回值与边界行为除了返回 x 个空格这个基本语义外space()在边界输入下的行为同样关键。综合源码实现 string_functions.cpp 与单元测试 string_fn_space_test.cpp 可以归纳出如下规则输入x返回结果x 0且x olap_string_max_length返回x个空格组成的字符串x 0返回空字符串非 NULLx 0含INT_MIN返回 NULLx olap_string_max_length含INT_MAX返回 NULL输入本身为 NULL返回 NULL其中olap_string_max_length是 BE 端配置项olap_string_max_length含义为 the max length supported for varchar type默认值1048576即 1 MiB定义于 config.h并通过 storage_define.cpp 中的get_olap_string_max_length()暴露给执行引擎。也就是说space()生成的字符串长度受 StarRocks VARCHAR 类型最大长度约束超出即返回 NULL 而非截断。需要特别留意的是与很多数据库将space(-1)视为空串或报错不同StarRocks 对负数入参统一返回 NULLspace(0)则返回空字符串二者语义不同使用时请勿混淆。使用示例官方文档给出的基础示例如下mysql select space(6); ---------- | space(6) | ---------- | | ---------- 1 row in set (0.00 sec)结果集中看似为空的单元格实际包含 6 个空格字符。下面再补充几个常用组合用法-- 返回 0 个空格结果为长度为 0 的空字符串 SELECT CHAR_LENGTH(space(0)); -- 0 -- 用 CHAR_LENGTH / LENGTH 验证空格数量 SELECT CHAR_LENGTH(space(6)); -- 6 -- 与 CONCAT 配合做文本对齐 SELECT CONCAT(SR, space(1), ROCKS); -- SR ROCKS -- 入参为表列表达式 SELECT col, CHAR_LENGTH(space(col)) FROM (SELECT CAST(3 AS INT) AS col) t; -- 3 -- 边界输入负数与超长输入返回 NULL SELECT space(-1); -- NULL需要说明space()的参数支持 INT 类型若传入非 INT 字面量如space(3)StarRocks 会按隐式转换规则将其转换为 INT 后计算超大值超过默认 1048576与负值的结果为 NULL实际运行前可通过CHAR_LENGTH(space(x))进行验证。底层实现原理BE 端向量化实现space()的声明位于 string_functions.h/** * Return a string of the specified number of spaces * * param: [length] * paramType: [IntColumn] * return: BinaryColumn */ DEFINE_VECTORIZED_FN(space);其向量化入口定义在 string_functions.cppStatusOrColumnPtr StringFunctions::space(FunctionContext* context, const Columns columns) { return VectorizedUnaryFunctionSpaceFunction::evaluateTYPE_INT, TYPE_VARCHAR(columns[0]); }函数通过VectorizedUnaryFunction模板以TYPE_INT - TYPE_VARCHAR的类型组合分发到SpaceFunction。核心实现如下string_functions.cppstruct SpaceFunction { template LogicalType Type, LogicalType ResultType static ColumnPtr evaluate(const ColumnPtr v1) { const auto* len_column down_castconst Int32Column*(v1.get()); const auto len_array len_column-immutable_data(); const auto num_rows len_column-size(); NullableBinaryColumnBuilder builder; auto dst_bytes builder.data_column_raw_ptr()-get_bytes(); auto dst_offsets builder.data_column_raw_ptr()-get_offset(); auto nulls builder.get_null_data(); dst_offsets.resize(num_rows 1); dst_offsets.set(0, 0); nulls.resize(num_rows); bool has_null false; size_t dst_off 0; for (auto i 0; i num_rows; i) { auto len len_array[i]; if (UNLIKELY((uint32_t)len get_olap_string_max_length())) { dst_offsets.set(i 1, dst_off); has_null true; nulls[i] 1; } else { dst_off len; dst_offsets.set(i 1, dst_off); } } dst_bytes.resize(dst_off, ); builder.set_has_null(has_null); RETURN_COLUMN(builder.build(v1-is_constant()), space); } };其执行逻辑可以拆解为三步长度校验遍历输入 INT 列若len大于get_olap_string_max_length()即配置olap_string_max_length默认 1048576则将该行标记为 NULL。由于len被强转为uint32_t比较负数会被视为极大的无符号数天然满足大于上限的条件因此负数输入也会被置为 NULL与测试用例完全吻合。偏移量构建对合法行累加长度构建 BinaryColumn 的 offset 数组dst_offsets这是 StarRocks 变长列BinaryColumn的标准内存布局。批量填充一次性将结果缓冲区dst_bytes整体resize为dst_off大小并以 填充——std::vector::resize的按值填充特性使得整列空格在单次调用内完成避免逐行写入向量化批处理效率很高。最后builder.build(v1-is_constant())会根据输入列是否为常量列决定输出常量列或普通列当space(6)这样的常量表达式出现在查询中时整列数据共享同一份缓冲区进一步降低内存与计算开销。与 fast_repeat 的关系SpaceFunction实现之后紧跟的是fast_repeatstring_functions.cpp这是repeat()函数的 O(logN) 快速重复算法基于 repeat_times 的二进制位分解每轮最多两次 memcpy使底层memcpy得以充分利用 SIMD 优化。从源码结构看space()与repeat()同属字符串构造类函数实现位置相邻但相互独立space()直接生成定长空格串而repeat()负责将任意字符串按次数复制二者可结合使用如CONCAT(space(n), repeat(-, m))构造复杂格式文本。函数分发链路从 FE 到 BE 的完整调用链为FE 解析 SQL在 StarRocks.g4 定义的语法规则中识别函数调用FE 根据 functions.py 中的注册信息函数 ID 30070、输入 INT、输出 VARCHAR完成类型检查与函数签名匹配生成的执行计划将函数调用下推至 BEBE 通过FunctionContext与VectorizedUnaryFunction调度到SpaceFunction完成向量化计算。单元测试验证BE 端为space()提供了专门的测试文件 string_fn_space_test.cpp覆盖了三种典型场景spaceTest批量输入对 0~19 共 20 个长度的输入逐行断言验证space(k)恰好等于k个空格std::string(k, )spaceConstTest常量列边界覆盖-1、0、1、olap_string_max_length - 1、olap_string_max_length 1、INT32_MAX、INT32_MIN以及 NULL 输入验证负数、超长输入均返回 NULL0返回空串spaceNullableColumnTest可空列混合 INT_MIN/INT_MAX、最大长度 ±i 及 NULL 标记行共 600 余行逐一断言结果是否为 NULL 以及空格串内容是否精确匹配。这三个测试用例从函数正确性、边界语义、可空列支持三个维度锁定了space()的行为契约是官方文档返回指定数量空格语义的源码级佐证。总结space(x)虽然函数体简单但完整理解它需要把握三点一是参数与返回类型为INT - VARCHAR的映射二是边界语义——0返回空串、负数与超过olap_string_max_length默认 1048576由 BE 配置 be.conf 中olap_string_max_length控制的值返回 NULL三是底层基于 BinaryColumn 一次性批量填充的向量化实现保证了批处理场景下的高效执行。结合本文的边界对照表与示例你可以在报表对齐、字符串格式化等场景中放心使用space()并在必要时通过CHAR_LENGTH(space(x))自校验输出长度。相关参考官方函数文档space.md函数注册与签名gensrc/script/functions.pyBE 端实现string_functions.cpp 与 string_functions.h长度上限配置config.h单元测试string_fn_space_test.cpp【免费下载链接】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),仅供参考
返回列表