支持正则匹配表达式 RLIKE

背景

OpenMLDB 尚未支持内置的正则表达式匹配,在这个任务中,你将参照我们的内置函数开发流程,实现一个字符串正则匹配函数:RLIKE。

编程语言

C++

实现方案

语法定义
<subject> [ NOT ] RLIKE <pattern>
举例:
SELECT * FROM t1 WHERE col1 RLIKE '^abc$';

整体流程
整体流程与之前实现的 https://github.com/4paradigm/OpenMLDB/pull/841 相似,主要需要两部分功能:第一是添加一个 regexp_like 的内置 udf 函数,第二则是实现 SQL 编译上对 RLIKE expression 的支持(上面语法定义的格式), regexp_like 函数会作为 RLIKE expression 的底层实现。具体步骤:

  1. SQL 语法支持,zetasql 支持 RLIKE keyword 并支持解析 RLIKE 语句 (这部分工作可以由 社区导师支持完成)
  2. 逻辑计划: 拓展对应的 BinaryExpr 节点支持 RLIKE 类型
    a. 关注目录: hybridse/src/planv2, hybridse/src/plan
    b. ast_node_converter.{h,cc} 将 ASTNode 转化成 SqlNode
    c. planner_v2.{h,cc} 将 SqlNode 转化成 PlanNode
  3. 添加 regexp_like builtin function,可以参考 https://openmldb.ai/docs/zh/main/developer/built_in_function_develop_guide.html
    a. 参数和其他数据库实现保持一致,即 regexp_like( , [ , ] )
    b. 第三个参数是可选参数, 应支持 c , i , m , e , s 的类型, 默认是 c (case sensitive)
    c. 参数详细定义可参考 https://docs.snowflake.com/en/sql-reference/functions-regexp.html#label-regexp-parameters-argument
  4. Codegen: 支持处理 RLIKE 的表达式节点,实现逻辑上主要调用 regexp_like 函数

你可以主要参考的资料:
● OpenMLDB 内 LIKE PREDICATE 的实现流程:https://github.com/4paradigm/OpenMLDB/pull/841
https://openmldb.ai/docs/zh/main/developer/built_in_function_develop_guide.html

测试方法
● 上述实现的步骤,如果有改动的,需要有对应的 UT case 覆盖
● 分别测试 RLIKE 表达式和 regexp_like 函数
● 端对端测试,需要往 cases/ 目录添加对应的 YAML case
○ 执行引擎端,可以使用 toydb_run_engine 运行一个单独的 case, toydb_engine_test 负责运行所有的 yaml case
○ 端对端,使用 sql_cluster_test 运行 case, 可以使用 --gtest_filter 过滤 case
○ Tips: 默认会运行所有 yaml case 很化时间,需要查看相关测试代码并只选择有改动的 case
● 应保证 RLIKE 在 batch/request/batch request 三种模式下都可以计算正确
○ 添加的 yaml case 默认会在三种模式下都测试一遍。toydb_run_engine 可以在通过 --runner_mode 指定运行的模式

其他信息
● 应考虑实现采用的正则匹配标准,并给出具体的文档说明和例子
○ 第一版可以考虑 C++ 标准库的正则匹配实现
● 不需要考虑实现 ANSI SQL 的 SIMILIAR TO predicate 语义

参考资料
https://docs.snowflake.com/en/sql-reference/functions/rlike.html
https://docs.snowflake.com/en/sql-reference/functions/regexp_like.html
https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-like
https://spark.apache.org/docs/latest/api/sql/index.html#regexp_like
https://github.com/4paradigm/OpenMLDB/pull/841

GitHub Issue

https://github.com/4paradigm/OpenMLDB/issues/862