jOOQ解析连接无法解析EXPLAIN ANALYZE的解决方案咨询
问题背景
通过配置了解析规则(withParseDialect(...)及其他withParse...()方法)的jOOQ连接记录和转换SQL语句,自定义Settings初始化代码如下:
private Settings createSettings() { return new Settings() .withParseDialect(SQLDialect.ORACLE) .withParseUnknownFunctions(ParseUnknownFunctions.IGNORE) .withTransformTableListsToAnsiJoin(true) .withTransformUnneededArithmeticExpressions(TransformUnneededArithmeticExpressions.ALWAYS) .withTransformRownum(Transformation.ALWAYS) .withRenderQuotedNames(RenderQuotedNames.EXPLICIT_DEFAULT_UNQUOTED) .withRenderCoalesceToEmptyStringInConcat(true) .withRenderOptionalAsKeywordForFieldAliases(RenderOptionalKeyword.ON) .withRenderOptionalAsKeywordForTableAliases(RenderOptionalKeyword.ON) .withRenderNameCase(RenderNameCase.UPPER) .withBatchSize(500); // Custom batch size }
解析EXPLAIN ANALYZE SELECT * FROM employees WHERE active_emp = 1;这类查询时,抛出错误:
org.jooq.ParserException: Unsupported syntax: EXPLAIN
当前环境:jOOQ 3.19.6、PostgreSQL 14、普通JDBC连接(未使用DSLContext.fetch())、Java 11。
需要解决的问题:在此解析配置下,是否支持或跳过EXPLAIN ANALYZE的解析?是否需要绕过jOOQ解析这类语句?
解决方案
1. 匹配目标数据库的解析方言
当前设置的ParseDialect为SQLDialect.ORACLE,但实际使用的是PostgreSQL。Oracle解析器不支持PostgreSQL特有的EXPLAIN ANALYZE语法,而PostgreSQL解析器原生支持该语法,只需修改解析方言配置:
.withParseDialect(SQLDialect.POSTGRES)
2. 让解析器忽略未知语句类型
如果必须保留Oracle解析方言,可通过ParseUnknownStatements配置让jOOQ跳过无法解析的语句,直接传递给数据库:
.withParseUnknownStatements(ParseUnknownStatements.IGNORE)
开启后,jOOQ不会对EXPLAIN ANALYZE这类无法识别的语句执行解析,也就不会抛出解析错误。
3. 单独绕过jOOQ解析特定语句
若上述配置无法满足需求,可在执行SQL前做判断:如果语句包含EXPLAIN ANALYZE前缀,直接使用原生JDBC连接执行,不走jOOQ的解析流程。
内容的提问来源于stack exchange,提问作者Raoua KHATERCHI

