seekdb vs OceanBase:SQL 语法差异全解析

最近收到一个需求,要对比一下 SeekDB 和 OceanBase 的 SQL 语法差异,我花了点时间对比了一下,正好分享出来,大家应该会感兴趣。先 BB 几句背景:

SeekDB 是从 OceanBase 4.3.5 版本(提交 4b8c513fcc21)分叉出来的数据库项目,在保持 OceanBase 核心 SQL 语法兼容性的基础上,针对 AI 搜索和位置管理等场景进行了功能增强和精简。这里要再说一下,SeekDB 只支持 MySQL 模式,不支持 Oracle 模式。基于 SQL 解析器文件的详细对比,总结了 SeekDB 与 OceanBase 在 SQL 语法层面的主要差异。当然这里只是针对 4b8c513fcc21 版本的对比,后面的 OceanBase 版本 4.4/4.5 我印象里也是有 AI 功能的。

对比方法

通过对比两个项目的 SQL 解析器文件(sql_parser_mysql_mode.y):

  • 基准版本: OceanBase 4.3.5(27086 行,1134 个语法规则)

  • 对比版本: SeekDB 当前版本(26507 行,1096 个语法规则)

  • 对比方式: 基于 Git 历史分析和语法规则提取

主要差异概览

1. 删除的功能(8 项)

SeekDB 移除了以下 OceanBase 中的功能,这些功能在 SeekDB 中不再支持:

| 功能 | SQL 语句 | 说明 |

|------|---------|------|

| 审计功能 | AUDIT | 数据库审计相关语句 |

| 表空间管理 | CREATE TABLESPACE
DROP TABLESPACE
ALTER TABLESPACE | 表空间的创建、删除和修改 |

| 主密钥轮换 | ROTATE MASTER KEY | 主密钥轮换功能 |

| 敏感规则管理 | CREATE SENSITIVE RULE
DROP SENSITIVE RULE
ALTER SENSITIVE RULE | 敏感数据规则管理 |

其实就可以理解为租户相关的、集群管理相关的、还有bootstrap什么的都删除了。

2. 新增的功能(4 项核心语句 + AI 搜索)

SeekDB 新增了以下功能:

2.1 位置管理(Location Management)

SeekDB 引入了完整的位置管理功能,用于管理外部存储位置:


-- 创建位置

CREATE LOCATION loc1 URL 's3://bucket/path'

CREDENTIAL (ACCESSID='id', ACCESSKEY='key');

-- 修改位置

ALTER LOCATION loc1 URL 's3://bucket/newpath';

-- 删除位置

DROP LOCATION loc1;

-- 查看所有位置

SHOW LOCATIONS;

-- 查看位置创建语句

SHOW CREATE LOCATION loc1;

-- 查看位置中的文件

SHOW FILES IN LOCATION @loc_var '/subpath';

特点:

  • 支持 S3 等外部存储的位置管理

  • 支持认证信息(CREDENTIAL)配置

  • 支持使用用户变量(@loc_var)和子路径

  • 新增相关权限:CREATE LOCATIONREADWRITE

2.2 AI 搜索功能

SeekDB 在 2025 年 10 月集中引入了 AI 搜索相关功能:

MATCH() 函数(2025-10-13 引入)

AI 搜索功能是 SeekDB 的核心功能之一,主要用于支持全文搜索、向量搜索和混合搜索。感兴趣的话也可以翻翻文档,我这里就列一下基本用法。


-- 基本用法

SELECT MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE) as score

FROM doc_table

WHERE MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE);

-- 多列匹配

SELECT MATCH(query, content) AGAINST('text' IN NATURAL LANGUAGE MODE) as score

FROM doc_table;

-- 带权重的列

SELECT MATCH(query^2, content) AGAINST('text' IN NATURAL LANGUAGE MODE) as score

FROM doc_table;

SCORE() 函数(2025-10-13 引入)


SELECT id, SCORE() as score

FROM doc_table

WHERE MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE);

HYBRID_SEARCH() 函数(2025-10-16 引入)


SELECT id, HYBRID_SEARCH('search text', 'param') as hybrid_result

FROM doc_table;

VECTOR_SIMILARITY() 函数(2025-10-17 引入)


-- 使用 COSINE 度量

SELECT VECTOR_SIMILARITY(vector1, vector2, COSINE) as similarity

FROM vector_table;

-- 支持多种度量方式:COSINE、DOT、EUCLIDEAN、MANHATTAN

SELECT VECTOR_SIMILARITY(vector1, vector2, DOT) as similarity

FROM vector_table;

3. 语法增强

LOCATION 表达式扩展

CREATE TABLEALTER TABLE 中,LOCATION 子句的功能得到增强:

OceanBase 4.3.5:


CREATE EXTERNAL TABLE t1 (id INT) LOCATION 's3://bucket/path';

SeekDB:


-- 支持用户变量

CREATE EXTERNAL TABLE t1 (id INT) LOCATION @loc_var;

-- 支持子路径

CREATE EXTERNAL TABLE t1 (id INT) LOCATION @loc_var '/subpath';

-- 仍然支持字符串字面量

CREATE EXTERNAL TABLE t1 (id INT) LOCATION 's3://bucket/path';

兼容性分析

完全兼容的语句

以下核心 SQL 语句在两个版本中完全一致,无需修改:

  • :white_check_mark: CREATE INDEX - 索引创建语法完全相同

  • :white_check_mark: ALTER TABLE - 表修改语法完全相同(LOCATION 子句除外)

  • :white_check_mark: CREATE TABLE - 表创建语法完全相同(LOCATION 子句除外)

  • :white_check_mark: 其他 DDL、DML 核心语句

需要关注的差异

  1. LOCATION 子句: SeekDB 支持用户变量和子路径,这是语法增强,向后兼容

  2. 已删除功能: 如果使用了表空间、审计等功能,需要调整

  3. 新增功能: AI 搜索和位置管理是 SeekDB 独有的功能

测试验证

为了验证这些 SQL 语法的正确性,我编写了语法测试用例:

以下就是为了演示说明,完整的测试方式我看看能不能把代码贴出来。


# 测试位置管理语法

def test_create_location_syntax():

valid_sqls = [

"CREATE LOCATION loc1 URL 's3://bucket/path'",

"CREATE LOCATION loc1 URL 's3://bucket/path' CREDENTIAL (ACCESSID='id', ACCESSKEY='key')",

"CREATE OR REPLACE LOCATION loc1 URL 's3://bucket/path'",

]

# 验证语法结构...

# 测试 AI 搜索语法

def test_match_function_syntax():

valid_sqls = [

"SELECT MATCH(content) AGAINST('text' IN NATURAL LANGUAGE MODE) FROM doc_table",

"SELECT MATCH(query, content) AGAINST('text' IN NATURAL LANGUAGE MODE) FROM doc_table",

]

# 验证语法结构...

我写的测试都跑过了,其实就是确认下新增功能的 SQL 语法格式正确。我大概就说这么多吧,SQL 语法有问题欢迎找我。我是神圣安伯大魔王,负责 OceanBase 开发者相关的技术文档。求轻喷就行了。

1 个赞

咦,表格没有渲染出来。凑合看吧 lol

1 个赞