pentaho/pentaho-kettle · error · MonetDbVersionException

MonetDBVersion.Exception.VersionIsNull

MonetDBVersion.Exception.VersionIsNull

Error message

MonetDBVersion.Exception.VersionIsNull

What it means

MonetDbVersion.parseVersion() throws MonetDbVersionException with this message when the MonetDB server's product version string is null. The version is normally read from the server (e.g. via the 'SELECT @@version' / productVersion connection property) and must be non-null before pattern validation. A null means the driver/connection did not return any version string at all.

Solutions

  1. Verify the JDBC URL targets a real MonetDB server and the connection is open before the loader reads its version (getDatabaseProductVersion).
  2. Check driver configuration: use the supported MonetDB JDBC driver so connection metadata includes the product version.
  3. Log/print DatabaseMetaData.getDatabaseProductVersion() on your connection to confirm what is actually returned; if null, fix connectivity/auth first.
  4. If the error persists during the bulk-load step, test the same connection with a plain Table Output step to isolate the loader's version check.

Example fix

// before
String ver = dbMeta.getDatabaseProductVersion(); // may be null
MonetDbVersion v = new MonetDbVersion(ver); // throws VersionIsNull
// after
String ver = dbMeta.getDatabaseProductVersion();
if (ver == null) {
  throw new MonetDbVersionException("MonetDB server did not report a product version");
}
MonetDbVersion v = new MonetDbVersion(ver);
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: confirm the server reports a product version before building MonetDbVersion
java.sql.DatabaseMetaData md = connection.getMetaData();
String ver = md.getDatabaseProductVersion();
if (ver == null || ver.trim().isEmpty()) {
  throw new IllegalStateException("MonetDB connection returned no product version; check driver/URL");
}

Type guard

// Java
static boolean hasVersion(String productVersion) {
  return productVersion != null && !productVersion.trim().isEmpty();
}

Prevention

When it happens

Trigger: Constructing MonetDbVersion (which calls parseVersion internally) with a null productVersion — typically because the MonetDB JDBC connection returned no version metadata property.

Common situations: Connecting through a proxy/non-MonetDB driver that omits the productVersion property; database metadata lookups failing silently before version negotiation (the loader checks the server version for feature gating); misconfigured JDBC URL pointing at a non-MonetDB service.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/14fe760b0a394177. Report an issue: GitHub.

Appendix: source

Thrown at plugins/monet-db-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/monetdbbulkloader/MonetDbVersion.java:149

    if ( result != 0 ) {
      return result;
    }
    return result;
  }

  /**
   * Parses string representation of MonetDb version. Sets up <code>majorVersion</code>. Also <code>minorVersion</code>
   * and <code>patchVersion</code> if they are present in the product version. Omits all other possible parts as
   * insignificant.
   *
   * @param productVersion
   *          a string representation of version
   * @throws MonetDbVersionException
   *           if productVersion is null or has incorrect format ( see {@link MonetDbVersion#VERSION_PATTERN} )
   */
  private void parseVersion( String productVersion ) throws MonetDbVersionException {
    if ( productVersion == null ) {
      throw new MonetDbVersionException( BaseMessages.getString( PKG, "MonetDBVersion.Exception.VersionIsNull" ) );
    }

    if ( !VERSION_PATTERN.matcher( productVersion ).matches() ) {
      throw new MonetDbVersionException( BaseMessages.getString( PKG,
          "MonetDBVersion.Exception.VersionFormatIsInvalid", productVersion ) );
    }

    int startIndex = 0;
    String[] versionParts = productVersion.split( SEPARATOR );
    majorVersion = Integer.valueOf( versionParts[startIndex] );
    if ( versionParts.length > 1 ) {
      minorVersion = Integer.valueOf( versionParts[startIndex + 1] );
    }
    if ( versionParts.length > 2 ) {
      patchVersion = Integer.valueOf( versionParts[startIndex + 2] );
    }

  }

View on GitHub (pinned to f3058517a1)