Druid项目中MV_CONTAINS函数NullPointerException问题分析与修复
在Druid 30.0.0版本升级过程中,用户反馈了一个关于MV_CONTAINS函数的严重问题。当该函数与JSON_QUERY_ARRAY组合使用时,系统会抛出NullPointerException异常,而这一功能在之前的29.0.0版本中运行正常。
问题背景
MV_CONTAINS是Druid中用于检查数组是否包含特定元素的函数。在典型使用场景中,开发人员会将其与JSON_QUERY_ARRAY结合使用,从JSON文档中提取数组并进行包含性检查。例如,查询用户代理类型是否为"Browser"的常见操作。
问题根源分析
经过深入分析,发现问题出在Druid内部对ARRAY_CONTAINS表达式的优化处理上。当该优化路径遇到JSON_QUERY_ARRAY返回的复杂类型(COMPLEX)时,系统会尝试将右侧参数强制转换为数组元素类型。但由于JSON_QUERY_ARRAY无法预先确定元素类型,导致类型转换失败并引发空指针异常。
解决方案
修复方案的核心在于修改优化路径的条件判断。具体来说,在Function.java文件中,我们增加了对原始类型和原始类型数组的显式检查。只有当左侧表达式类型为原始类型或原始类型数组时,才会进入优化路径,否则保持原有处理逻辑。
这一修改确保了当遇到复杂类型时,系统会回退到逐行检查的类型处理机制,而不是尝试进行不安全的类型转换。同时,类似的修复也需要应用于array_overlap函数,因为它共享相同的优化路径。
最佳实践建议
虽然修复了该问题,但从性能角度考虑,我们建议开发人员优先使用ARRAY_CONTAINS函数而非MV_CONTAINS,特别是在处理JSON数组时。MV_系列函数主要针对Druid早期的多值字符串列设计,而ARRAY_系列函数更适合处理现代Druid版本中的真实数组类型。
此外,对于JSON数据处理,使用JSON_VALUE表达式通常能获得更好的性能优化,因为它可以直接利用Druid的嵌套字段列存储结构,而不是像JSON_QUERY/JSON_QUERY_ARRAY那样处理原始JSON数据。
版本影响
该问题影响从30.0.0开始的Druid版本,包括最新的31.0.0版本。修复后,用户将能够继续使用原有的查询模式,同时我们也鼓励开发人员采用更优化的查询写法以获得更好的性能。
通过这次问题的分析和修复,不仅解决了具体的功能异常,也为Druid处理复杂类型时的表达式优化提供了更健壮的机制,有助于提升整个系统的稳定性。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00