问题现象
执行的一条 SQL 语句中包含了 UDF,UDF 内部会访问 package 中的复杂类型变量,直连不同机器时,查询返回的结果集不一致。
问题原因
当 OceanBase 数据库在执行一条包含 UDF 的 SQL 语句时,如果 UDF 内部修改了 package 变量,package 变量会缓存在当前会话上。分布式计划下,远端算子有访问会话上 package 变量的需求,因此在实现上会在发送远端算子的同时向远端同步 package 变量。在远端变量的同步上采用的策略是先将变量序列化为 hex 值,在远端再将 hex 值反序列化。这里对于复杂一些的变量序列化与反序列化逻辑不正确,造成的结果是远端看到的 package 复杂类型变量是不正确的值。
问题的风险及影响
package 变量值无法正确的序列化到远端,会出现正确性问题。
注意
该问题仅在 Oracle 租户下出现。
影响版本
OceanBase 数据库 V3.2.3 BP10(oceanbase-3.2.3.3-110000092023091219)版本。
解决方法及规避方式
- 将 package 的
collect(record)类型变量拆解成多个collection(basic)变量,同步改造业务的 PL 或 SQL 代码。 - 升级到问题已修复版本。