{"record":{"id":"38fd89a300073372","repo":"apache/dolphinscheduler","slug":"can-t-get-validation-query-without-compatible-mode","errorCode":null,"errorMessage":"Can't get validation query without compatible mode","messagePattern":"Can't get validation query without compatible mode","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java","lineNumber":113,"sourceCode":"        connectionParam.setDriverClassName(getDatasourceDriver());\n        connectionParam.setValidationQuery(getValidationQuery(connectionParam.getCompatibleMode()));\n        connectionParam.setOther(obDataSourceParamDTO.getOther());\n        return connectionParam;\n    }\n\n    @Override\n    public ConnectionParam createConnectionParams(String connectionJson) {\n        return JSONUtils.parseObject(connectionJson, OceanBaseConnectionParam.class);\n    }\n\n    @Override\n    public String getDatasourceDriver() {\n        return DataSourceConstants.COM_OCEANBASE_JDBC_DRIVER;\n    }\n\n    @Override\n    public String getValidationQuery() {\n        throw new UnsupportedOperationException(\"Can't get validation query without compatible mode\");\n    }\n\n    public String getValidationQuery(String compatibleMode) {\n        if (compatibleMode != null) {\n            switch (compatibleMode.trim().toLowerCase()) {\n                case \"mysql\":\n                    return DataSourceConstants.MYSQL_VALIDATION_QUERY;\n                case \"oracle\":\n                    return DataSourceConstants.ORACLE_VALIDATION_QUERY;\n            }\n        }\n        throw new UnsupportedOperationException(\"Invalid compatible mode: \" + compatibleMode);\n\n    }\n\n    @Override\n    public String getJdbcUrl(ConnectionParam connectionParam) {\n        OceanBaseConnectionParam obConnectionParam = (OceanBaseConnectionParam) connectionParam;","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java#L95-L131","documentation":"OceanBase supports two compatible modes (MySQL and Oracle), each with a different validation query. The no-arg getValidationQuery() has no mode context, so it always throws UnsupportedOperationException; callers must use getValidationQuery(compatibleMode) instead.","triggerScenarios":"Any code path calling the interface-default getValidationQuery() on OceanBaseDataSourceProcessor — i.e. code that resolves a validation query without first reading the datasource's compatibleMode parameter.","commonSituations":"Generic datasource framework code fetching the validation query via the no-arg API; misconfiguration where the OceanBase datasource's compatibleMode is absent so the mode-aware overload is not used.","solutions":["Ensure the OceanBase datasource defines compatibleMode (mysql or oracle) in its params so the overload getValidationQuery(compatibleMode) is invoked","If you maintain calling code, call getValidationQuery(((OceanBaseConnectionParam) cp).getCompatibleMode()) instead of the no-arg version","Set compatibleMode in the datasource form/JSON when creating the OceanBase datasource"],"exampleFix":"// before\nString vq = processor.getValidationQuery(); // throws\n// after\nString vq = processor.getValidationQuery(\n    ((OceanBaseConnectionParam) connectionParam).getCompatibleMode());","handlingStrategy":"try-catch","validationCode":"if (\"OCEANBASE\".equals(type) &&\n    !\"mysql\".equalsIgnoreCase(mode) && !\"oracle\".equalsIgnoreCase(mode)) {\n  throw new IllegalArgumentException(\"OceanBase datasource needs compatibleMode=mysql|oracle\");\n}","typeGuard":"boolean hasCompatibleMode(OceanBaseConnectionParam p) {\n  String m = p.getCompatibleMode();\n  return m != null && (\"mysql\".equalsIgnoreCase(m.trim()) || \"oracle\".equalsIgnoreCase(m.trim()));\n}","tryCatchPattern":"try {\n  vq = processor.getValidationQuery();\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().contains(\"validation query\")) {\n    vq = processor.getValidationQuery(obParam.getCompatibleMode());\n  } else throw e;\n}","preventionTips":["Always set compatibleMode when defining OceanBase datasources","Use the mode-aware overload in custom code","Add form validation for compatibleMode in tooling"],"tags":["oceanbase","unsupported-operation","validation-query","jdbc"],"backgroundTag":"operation-not-supported","analyzedSha":"02eac45a1b6676e639fcbfb4be2243de5771b05d","analyzedAt":"2026-09-06T17:43:00.555Z","contentChangedAt":"2026-09-06T17:43:00.555Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}