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),仅供参考

相关新闻

Nacos配置不生效?从拉取链路到本地快照,一文讲透排查思路

Nacos配置不生效?从拉取链路到本地快照,一文讲透排查思路

配置中心的报错往往比业务代码更难定位,因为你面对的不是一段具体的代码,而是一整套“服务端存储、客户端拉取、本地快照缓存、动态刷新机制”串联起来的链路。很多项目在 Nacos 上遇到的“配置未正确加载/缓存”问题,排查到最后你会发现&…

2026/9/18 21:57:22 阅读更多 →
local_auth 平台接口深度解析:local_auth_platform_interface 的架构、实现与扩展指南

local_auth 平台接口深度解析:local_auth_platform_interface 的架构、实现与扩展指南

local_auth 平台接口深度解析:local_auth_platform_interface 的架构、实现与扩展指南 【免费下载链接】packages A collection of useful packages maintained by the Flutter team 项目地址: https://gitcode.com/GitHub_Trending/pac/packages 本篇文章围…

2026/9/18 21:57:22 阅读更多 →
用Python解析霍兰德SDS结果docx:RIASEC三维码与自动化报告生成

用Python解析霍兰德SDS结果docx:RIASEC三维码与自动化报告生成

简介:这份资源是2021-2022年整理的霍兰德SDS职业兴趣测试结果分析文档,面向高中生、大学生及职业规划指导人员,用于帮助读者理解测试原理、解读个人代码并匹配适宜职业方向。文档包含完整六种职业兴趣类型说明(实际型、研究型、艺…

2026/9/18 21:57:22 阅读更多 →

最新新闻

douyin-downloader:抖音去水印批量下载工具新手上手指南

douyin-downloader:抖音去水印批量下载工具新手上手指南

douyin-downloader:抖音去水印批量下载工具新手上手指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…

2026/9/18 22:35:44 阅读更多 →
Grafana Tempo 中的 go-humanize 工具库:让字节、时间与数字输出更人性化

Grafana Tempo 中的 go-humanize 工具库:让字节、时间与数字输出更人性化

Grafana Tempo 中的 go-humanize 工具库:让字节、时间与数字输出更人性化 【免费下载链接】tempo Grafana Tempo is a high volume, minimal dependency distributed tracing backend. 项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempo 导读 gi…

2026/9/18 22:35:44 阅读更多 →
Nacos MCP Router 的 mcp_servers 一多就靠手改?让 Codex 走 TaoToken 通道按 stdio/SSE 分类整理

Nacos MCP Router 的 mcp_servers 一多就靠手改?让 Codex 走 TaoToken 通道按 stdio/SSE 分类整理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 22:35:44 阅读更多 →
Miniflare 中的变量与密钥绑定:在 Cloudflare Workers 本地测试中注入 Variables、Secrets 与 Blob 资源

Miniflare 中的变量与密钥绑定:在 Cloudflare Workers 本地测试中注入 Variables、Secrets 与 Blob 资源

Miniflare 中的变量与密钥绑定:在 Cloudflare Workers 本地测试中注入 Variables、Secrets 与 Blob 资源 【免费下载链接】cloudflare-docs Cloudflare’s documentation 项目地址: https://gitcode.com/GitHub_Trending/cl/cloudflare-docs 本文基于 cloudf…

2026/9/18 22:35:44 阅读更多 →
Creo ptcdbatch 转 stp 卡住?把 Codex 的 Base URL 改到 TaoToken 再排查 dxc

Creo ptcdbatch 转 stp 卡住?把 Codex 的 Base URL 改到 TaoToken 再排查 dxc

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 22:35:44 阅读更多 →
Miles强化学习框架开发者指南:30分钟读懂源码架构与三类进程协作

Miles强化学习框架开发者指南:30分钟读懂源码架构与三类进程协作

Miles强化学习框架开发者指南:30分钟读懂源码架构与三类进程协作 【免费下载链接】miles Miles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime. 项目地址: https://gitcode.…

2026/9/18 22:34:44 阅读更多 →

日新闻

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

很多朋友第一次看到"逻辑回归"这四个字,第一反应就是——这玩意儿是个回归模型吧?我当年也是在Matlab里跑完一段代码,看着输出的0.73、0.86这种概率值,才回过神来:这家伙其实是披着回归外衣的分类神器&#…

2026/9/18 0:00:28 阅读更多 →
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

简介:这份报告是2023-2028年高值医用耗材行业调研及发展前景趋势预测报告,面向医疗器械企业管理者、投资机构、行业研究人员及关注政策变化的从业者,用于把握行业监管动向、市场格局与未来趋势。报告以PDF格式呈现,共1个文件、整体…

2026/9/18 0:00:28 阅读更多 →
三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

先把我自己的背景交代一下:我之前在搞具身智能和机器人导航相关的项目,很长一段时间里都被“环境表示”这件事卡着。传统做法是用点云或者网格做几何建模,语义信息另外再跑分割模型,两套东西各管各的,时间一长就会发现…

2026/9/18 0:00:28 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →