墨墨导读:世界上没有不存在 Bug 的软件,Bug 总是在变化中,层出不穷。Oracle 19c 中,一个有趣的 BUG 在国外的微博上引起热议。

首先看看如下一段代码,大家来猜测一下两次 put_line 的输出:Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失_Jav

你可能会说,what ? 这有什么不同?


先看看在 Oracle 11g 中的结果:Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失_Jav_02一切正常,可是我们再看看 Oracle 19c 中,有一点点 slightly worrying wrong 出现了,在 Patrick Jolliffe 的微博上,作者展示了这个输出:

Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失_Jav_03


在 Oracle 18c 、19c 中,应该都可以建到这个效果:


Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失_Jav_04

显然这是由于 Bug 引发的,Oracle 在处理 LOB 对象时,当对 Null 或者 empty clob 结合 String 时,遇到了这个 BUG。


Bug 号是:31142377 。问题显示在 21.1 版本中修正。但是针对 19.5 / 19.6 都有独立的补丁可以下载。


Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失_Jav_05


如果您的数据库中有对于 CLOB 的频繁操作,建议检查是否遇到过不曾注意到的BUG,因为这个 BUG 不会抛出异常,可能会导致数据存储的丢失。

Patch 31142377: CONCATENATION OF A NULL CLOB WITH NON-NULL DATA YIELDS WRONG RESULTS WHEN DEST. LOB IS PART OF THE CONCATENATION


官方版本的重现代码如下:Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失_Jav_06

执行效果如下:

Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失_Jav_07


供读者参考,大家也可以看看 18c、19c 不同版本上的输出表现。


墨天轮原文链接:https://www.modb.pro/db/27833(复制到浏览器中打开或者点击“阅读原文”)