求助:BigQuery Simba JDBC驱动空指针异常问题及解决办法
BigQuery Simba JDBC驱动1.5.2.1005在DataGrip中执行带FOR循环的存储过程触发空指针异常的问题及临时方案
问题详情
- 环境:JetBrains DataGrip + Simba BigQuery JDBC驱动1.5.2.1005
- 触发场景:执行包含
FOR iterator IN (query)循环的存储过程时,BigQuery侧日志显示执行成功,但DataGrip返回驱动报错:[HY000] [Simba][JDBC](11380) Null pointer exception. java.lang.NullPointerException - 复现代码:
CREATE OR REPLACE PROCEDURE performance.bug_test() BEGIN DECLARE working TIMESTAMP DEFAULT (SELECT GREATEST(CURRENT_TIMESTAMP())); FOR broken IN (SELECT x FROM UNNEST([1, 2, 3]) x) DO -- 无需执行任何逻辑即可触发 END FOR; END; CALL performance.bug_test(); - 根因:驱动在获取执行统计信息时,调用
com.google.api.services.bigquery.model.ScriptStatistics.getEvaluationKind()返回null(该字段本身允许为null),未做空值判断直接使用导致空指针异常。
可行临时解决方案
降级JDBC驱动版本
回退到1.5.1.x系列的稳定版本,该版本未引入导致问题的统计信息处理逻辑,可避免触发空指针。关闭DataGrip的执行统计获取
在DataGrip的BigQuery连接设置中,找到"获取执行统计"或类似选项并禁用,阻止驱动请求ScriptStatistics相关数据。替换FOR循环写法
用WHILE循环结合数组遍历的方式替代原FOR循环逻辑,示例:CREATE OR REPLACE PROCEDURE performance.bug_test() BEGIN DECLARE working TIMESTAMP DEFAULT (SELECT GREATEST(CURRENT_TIMESTAMP())); DECLARE x_array ARRAY<INT64> DEFAULT [1, 2, 3]; DECLARE idx INT64 DEFAULT 1; DECLARE current_x INT64; WHILE idx <= ARRAY_LENGTH(x_array) DO SET current_x = x_array[ORDINAL(idx)]; -- 原FOR循环内的业务逻辑写在这里 SET idx = idx + 1; END WHILE; END; CALL performance.bug_test();调整DataGrip执行方式
尝试将存储过程定义和CALL语句选中后,用DataGrip的"执行脚本"(而非单独调用存储过程)的方式运行,部分场景下可绕过驱动的统计信息获取步骤。
Bug反馈渠道
- 可在Google Cloud的BigQuery官方Issue Tracker提交bug报告
- 也可在JetBrains DataGrip的官方论坛或Issue Tracker反馈该兼容性问题
内容的提问来源于stack exchange,提问作者Tim Russell
相关产品推荐
相关产品推荐

