ARTICLE DETAIL

资讯详情

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

StarRocks instr 字符串函数详解:用法、语义与源码级实现剖析

StarRocks instr 字符串函数详解:用法、语义与源码级实现剖析 StarRocks instr 字符串函数详解用法、语义与源码级实现剖析【免费下载链接】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 的instr字符串查找函数围绕官方文档docs/en/sql-reference/sql-functions/string-functions/instr.md给出的语法与语义结合 FE前端函数注册与 BE后端向量化实现源码完整讲解其参数含义、返回值规则、空串与 NULL 等边界行为、UTF-8 中文字符计数差异以及与locate系列函数的关联帮助你准确使用该函数并理解其底层工作原理。函数概述instr是 StarRocks 提供的字符串定位函数用于查找一个子串substring在另一个字符串中首次出现的位置。它遵循 MySQL 兼容的语义返回位置从1开始计数而非 0计数单位是字符character不是字节因此对中文等多字节字符的处理需要特别注意若子串在字符串中找不到返回0官方文档的语义描述为This function returns the position wherestrfirst appeared insubstrstart counting from 1 and measured in characters. Ifstris not found insubstr, then this function will return 0.instr常用于文本字段中的关键词定位、字符串切分预处理配合substring/substring_index使用、以及数据清洗时判断某字段是否包含指定模式等场景。语法与参数INT instr(VARCHAR str, VARCHAR substr)参数类型说明strVARCHAR被搜索的字符串即大海haystack在其中查找子串substrVARCHAR要查找的子串即针needle返回值INT子串首次出现的字符位置1 起始未找到返回 0官方文档给出的语法中第一个参数str为被搜索字符串第二个参数substr为待查找子串与 MySQL 的INSTR(str, substr)参数顺序保持一致。示例以下示例来自官方文档可直接在 StarRocks 的 MySQL 协议终端中执行验证MySQL select instr(abc, b); ------------------- | instr(abc, b) | ------------------- | 2 | ------------------- MySQL select instr(abc, d); ------------------- | instr(abc, d) | ------------------- | 0 | -------------------第一个查询子串b在abc中位于第 2 个字符位置因此返回2第二个查询子串d不存在于abc返回0。在真实表上使用时它同样适用于列级运算。例如基于instr判断某个 URL 字段中是否包含指定路径段或过滤出邮箱地址中包含特定域名关键字的行instr(col, keyword) 0即可作为布尔条件。边界行为与注意事项空子串empty needle从 BE 端实现be/src/exprs/locate.cpp可以确认当substr为空字符串时有一套专门的逻辑若str为空串则返回位置1空串在空串中视为出现在第 1 个字符位置若str非空则返回起始位置1在locate的三参数变体中若start大于字符串长度则返回0。这一行为在源码注释中写得很明确// if needle is empty string, at legal start position in haystack以及// needle and haystack are all empty, the result is one。NULL 处理instr遵循 StarRocks 表达式求值的一致性规则只要str或substr中任一参数为 NULL结果即为 NULL。这在 BE 端由RETURN_IF_COLUMNS_ONLY_NULL(columns)等 Nullable 列处理逻辑保证相关测试见 be/test/exprs/string_fn_locate_test.cpp 中的locateNullTest等用例。中文与 UTF-8 多字节字符文档明确指出返回位置按字符计数而非字节计数。这一点对中文场景至关重要对中文字符abc查找abc返回值为5前 4 个汉字算 4 个字符abc从第 5 个字符位置开始而不是按字节计算的13BE 端测试用例instrChineseTestbe/test/exprs/string_fn_locate_test.cpp专门验证了这一点构造中文字符0~中文字符1920 行数据查找对应的数字子串断言结果全部为5。需要特别提醒instr对中文字符的定位是基于完整 UTF-8 字符的不会出现把一个汉字的某个字节误当作起始位置的情况。实现中通过utf8_len计算从字符串头到匹配位置的字符数见 be/src/exprs/locate.cpp。与 locate 系列函数的关系在 StarRocks 中instr与locate共享同一套底层实现be/src/exprs/locate.cpp二者的区别仅在于参数顺序函数签名语义instrINT instr(VARCHAR str, VARCHAR substr)被搜索串在前子串在后等价于固定从位置 1 开始的查找locateINT locate(VARCHAR substr, VARCHAR str[, INT pos])子串在前被搜索串在后支持第三个参数指定起始查找位置具体来说instr的向量化实现StringFunctions::instrbe/src/exprs/locate.cpp会创建一个值为1的常量起始位置列然后复用与locate完全相同的两个核心路径子串为常量、被搜索串为列haystack_vector_and_needle_const使用VolnitskyUTF8搜索引擎对整列一次性批量扫描适合谓词下推式的全列过滤场景子串与被搜索串均为列haystack_vector_and_needle_vector逐行使用LibcASCIICaseSensitiveStringSearcher小型搜索器查找。从源码结构可以推断这一设计使得instr(abc, col)这类常量子串 动态列的组合能获得更好的向量化执行性能。DEFINE_VECTORIZED_FN(instr)声明位于 be/src/exprs/string_functions.h。FE 端的函数注册与兼容性在 FE 端instr作为内置标量函数被注册fe/fe-core/src/main/java/com/starrocks/catalog/FunctionSet.java 中定义了常量public static final String INSTR instr;在 Trino/Presto 语法兼容层中index函数会被转换为 StarRocks 的instrregisterFunctionTransformer(index, 2, instr, ...)见 fe/fe-core/src/main/java/com/starrocks/connector/parser/trino/Trino2SRFunctionCallTransformer.java。这意味着从 Trino 迁移到 StarRocks 的查询中两参数index(string, substring)的写法可以无缝继续使用。性能与实现要点instr的 BE 实现针对列式存储做了专门的优化理解这些要点有助于你在实际查询中写出更高效的表达式批量扫描而非逐行函数调用在常量子串场景下VolnitskyUTF8搜索引擎配合列内 offsets 存储会一次性扫描整列数据并同时定位所有匹配行显著摊薄了搜索器初始化的开销空子串短路needle.size 0时走独立分支避免无意义的搜索边界检查每次命中都会校验start 0 || pos needle.size row_end防止跨字符串边界的误匹配见 be/src/exprs/locate.cpp结果列预分配通过RunTimeColumnTypeTYPE_INT预分配结果列并批量写入减少内存分配次数。总结instr是 StarRocks 中一个轻量但语义细腻的字符串定位函数它返回 1 起始的字符位置未命中返回 0对空串、NULL、UTF-8 中文都有明确且经过测试保证的行为它与locate共享底层实现前者固定从位置 1 查找且参数顺序为(str, substr)后者支持自定义起始位置且参数顺序为(substr, str, [pos])。官方参考文档见 instr.md 与 locate.md底层实现与测试可分别在 be/src/exprs/locate.cpp 和 be/test/exprs/string_fn_locate_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),仅供参考
返回列表