基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OceanBase 数据库 MySQL 模式下常规 CTE 带有 UNION ALL 时数据类型转换错误
更新时间:2026-05-18 09:11
问题现象
OceanBase 数据库 MySQL 模式下,CTE 中 UNION ALL 左右支数据时,最终的结果会强制根据左支进行数据类型转换,导致正确性问题。
关键诊断信息
触发条件
MYSQL 模式下,CTE 中 UNION ALL 左右支有数据,且数据类型不同。
问题原因
当前 OceanBase 数据库内核处理 CTE 类型转换时,错误的将常规 UNION ALL 强制根据 UNION ALL 左支数据类型进行转换。 正确逻辑为:针对 with clause 不带 recursive 场景,应该按照常规 UNION ALL 解析,综合左右两边的结果进行类型推导。
问题的风险及影响
常规 CTE UNION ALL 执行结果可能存在正确性问题。
影响租户
影响 OceanBase 数据库中的 MySQL 租户,对于 SYS 租户和 Oracle 租户无影响。
影响版本
OceanBase 数据库 V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法及规避方式
- 对于不带有 Recursive 的 CTE Clause,参考左右支数据类型进行类型转换。
- 将 CTE UNION ALL 改写成常规的 UNION ALL 语句。
- 升级到问题已修复版本,目前已修复的版本包含 OceanBase 数据库 V3.2.3 BP10(oceanbase-3.2.3.3-110000092023091219)、V3.2.4 BP5(oceanbase-3.2.4.5-105000012023081513)及之后版本。