基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OceanBase 数据库 MySQL mode PL 中 "--" 注释内容为空时非预期忽略下一个非空行内容
更新时间:2026-05-29 08:46
问题现象
OceanBase 数据库 MySQL 租户下,PL 语句中 -- 开头的注释内容为空时,会将下一个非空行中的内容识别成单行注释的一部分。
示例。
CREATE PROCEDURE `prepareTest2`()
begin
-- 注释 0
select 1;
--
-- 注释 1
--
select 2;
--
--
select 3;
--
--
--
select 4;
--
select 5;
--
--
select 6;
select 7;--
select 8;
--
select 9;
--
select 10;
select 'end-end';
select 'end';
end
最后的输出将会是 1 3 6 7。
关键诊断信息
触发条件
OceanBase 数据库 MySQL 租户下,PL 语句中 -- 开头的注释内容。
事前巡检
避免出现无意义的 -- 开头的空内容注释。
事后诊断
查看 PL 源码中是否有 -- 开头的空注释。
问题原因
当前 OceanBase 数据库的 PL 语言前端 scanner 和 parser 使用 flex/bison 框架构建,其中 flex 识别 comment 的规则。
space [ \t\n\r\f]
comment ("--"{space}+{non_newline}*)|(#{non_newline}*)
可见在识别 -- 单行注释的时候要求其后跟随至少一个空字符。当 -- 之后没有内容时(全部是 space 能够匹配的空字符),会导致 {space}+ 匹配到其后尾随的所有空字符(包含换行符),进而导致 {non_newline}* 匹配到下一个非空行。最后 -- 之后的第一个非空行就被识别成了单行注释的一部分。
问题的风险及影响
正确性风险,因为 -- 忽略掉的语句不能确定,所以可能会忽略一部分语句内容导致语法报错,也可能会忽略完整的语句导致潜在的正确性问题。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 MySQL 租户,对于 Oracle 租户无影响。
影响版本
OceanBase 数据库企业版 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.2 GA(oceanbase-3.2.2-20211130225726)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220419)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本、V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100000032023071023)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本、V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本、V4.2.5 GA(oceanbase-4.2.5.0-100000082024102022)及之后版本、V4.3.0(oceanbase-4.3.0.0-100000072024020200)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.1 BP10 Hotfix3(oceanbase-4.2.1.10-110030032024121120)、V4.2.1 BP10 Hotfix4(oceanbase-4.2.1.10-110040012024122218)、V4.2.1 BP10 Hotfix5(oceanbase-4.2.1.10-110050012025011614)、V4.2.1 BP10 Hotfix6(oceanbase-4.2.1.10-110060022025022409)、V4.2.1 BP11(oceanbase-4.2.1.11-111000052025032520)、V4.2.5 BP1(oceanbase-4.2.5.1-101000182024120722)。
删除
--开头的空内容注释。
规避方式
避免出现无意义的 -- 开头的空内容注释。