apache/dolphinscheduler · error · UnsupportedOperationException

Can't get validation query without compatible mode

Error message

Can't get validation query without compatible mode

What it means

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.

Source

Thrown at dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java:113

        connectionParam.setDriverClassName(getDatasourceDriver());
        connectionParam.setValidationQuery(getValidationQuery(connectionParam.getCompatibleMode()));
        connectionParam.setOther(obDataSourceParamDTO.getOther());
        return connectionParam;
    }

    @Override
    public ConnectionParam createConnectionParams(String connectionJson) {
        return JSONUtils.parseObject(connectionJson, OceanBaseConnectionParam.class);
    }

    @Override
    public String getDatasourceDriver() {
        return DataSourceConstants.COM_OCEANBASE_JDBC_DRIVER;
    }

    @Override
    public String getValidationQuery() {
        throw new UnsupportedOperationException("Can't get validation query without compatible mode");
    }

    public String getValidationQuery(String compatibleMode) {
        if (compatibleMode != null) {
            switch (compatibleMode.trim().toLowerCase()) {
                case "mysql":
                    return DataSourceConstants.MYSQL_VALIDATION_QUERY;
                case "oracle":
                    return DataSourceConstants.ORACLE_VALIDATION_QUERY;
            }
        }
        throw new UnsupportedOperationException("Invalid compatible mode: " + compatibleMode);

    }

    @Override
    public String getJdbcUrl(ConnectionParam connectionParam) {
        OceanBaseConnectionParam obConnectionParam = (OceanBaseConnectionParam) connectionParam;

View on GitHub (pinned to 02eac45a1b)

Solutions

  1. Ensure the OceanBase datasource defines compatibleMode (mysql or oracle) in its params so the overload getValidationQuery(compatibleMode) is invoked
  2. If you maintain calling code, call getValidationQuery(((OceanBaseConnectionParam) cp).getCompatibleMode()) instead of the no-arg version
  3. Set compatibleMode in the datasource form/JSON when creating the OceanBase datasource

Example fix

// before
String vq = processor.getValidationQuery(); // throws
// after
String vq = processor.getValidationQuery(
    ((OceanBaseConnectionParam) connectionParam).getCompatibleMode());
Defensive patterns

Strategy: try-catch

Validate before calling

if ("OCEANBASE".equals(type) &&
    !"mysql".equalsIgnoreCase(mode) && !"oracle".equalsIgnoreCase(mode)) {
  throw new IllegalArgumentException("OceanBase datasource needs compatibleMode=mysql|oracle");
}

Type guard

boolean hasCompatibleMode(OceanBaseConnectionParam p) {
  String m = p.getCompatibleMode();
  return m != null && ("mysql".equalsIgnoreCase(m.trim()) || "oracle".equalsIgnoreCase(m.trim()));
}

Try / catch

try {
  vq = processor.getValidationQuery();
} catch (UnsupportedOperationException e) {
  if (e.getMessage().contains("validation query")) {
    vq = processor.getValidationQuery(obParam.getCompatibleMode());
  } else throw e;
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of apache/dolphinscheduler@02eac45a1b (2026-09-06). Data as JSON: /api/errors/38fd89a300073372. Report an issue: GitHub.