Oracle: _json 过滤器和 json() 返回引号包围的字符串,默认会破坏每个字符串比较
作者: Nitwel创建于 2026年9月17日更新于 2026年9月17日
标签BugEngine
描述臭虫
在甲骨文上,每个"Q"json"过滤器和"json ()"函数调用一个字符串值 JSON路径默默返回错误行. 没有出现出错——这种比较是完全不匹配的.
原因是在[`FnHelperOracle.json'](https://GitHub.com/directus/directus/blob/main/api/src/database/helpers/fn/dialects/oracle.ts#L85-L93)中有一个错误的假设:
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? // JSON VALUE 只返回分级值( 对象/阵列返回 NULL) // JSONQUERY 只返回对象/阵列( 返回 Scalars 的 NULL) <- not true //COALESCE 处理这两个案件 COALESCE(JSONQUERY(???)","$.path","JSON VALUE"(?),"$.path").
`JSONQUERY ' 并不**将`NULL ' 运回甲骨文23ai上的平板。 它以JSON的引文完整地取回了标尺,因此`CoALESCE'从不掉到`JSON-VALUE',取出一个字符串值为`红色'而不是`红色'。
直接反对‘gvenzl/oracle-free:23-slim-fastart', 排行" :"红色","obj":{"主题":"黑暗" :"}}`:":
`JSON-VALUE ' `JSON-VALUE ' `目前的`CoALESCE(JSON-VALUE, JSON-VALUE) ' ` `JSON-VALUE'` '
| -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
‘$.obj' ‘(null)' ‘'"主题":"黑暗" ‘'"主题":"黑暗" :""(null)"
`$. missing' `(null)' `(null)' `(null)' `(null)' ` `(null)' ` ` .
唯一引用文物的就是整个失败模式:
** 布罗肯**
- 与`红色'、决不`红色'作对比
- 以`/ ends'及其`i'/`n'等变体为起点,锁定的`Like'Brand'`击中领先的`''
- `/----------之间-`'(0x22),在每封信之前排序
- 任何点- 路径或数组索引路径
- 字符串字段上的关系过滤器
- `json()' in`fields'和`sort',将引用的字符串还给客户
** 未受影响**
- 所有数字运算符——它们取自单独的“JSON-VALUE(.返回数字)”分支。
- QQCons' / QQNCons' / “相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相干相
- `null ' /`nnull ' - 无效不变
- 对象和阵列值路径——这些真正需要`JSONQUERY'
无关紧要的-`Like ' 案件值得一提:`QQeq ' 在同一字段失败时,`Contains ' passing,使这个字段看起来像一个操作员特有的错误,而不是一个取出错误。
重写
运行 Oracle 的“端点/query/json” e2e套件:
pnpm vitest -- -- 项目甲骨文运行测试/端点/query/json
" 主要 " 成果:
QQ 文件 QQ 结果 QQ
| -- -- -- -- -- -- --
'filter.test.ts ' 失败了 / 89 *
*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
** 151起失败中66起。 ** 每一次失败都是错误的行数或引用的字符串,绝不是出错.
最小独立复制:
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
CREATE Table json repro ("id" Number, "meta" VARCHAR2(4000)"); ; 活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活化活.
INSERT ING json repro VALUES(1,"{""颜色":"红色","品牌":"BrandX"}");
-- 返回0行
SELECT 计数( *)
. . . . . . .内容来源: directus/directus