prestodb/presto · warning · SQLFeatureNotSupportedException

setSQLXML

Error message

setSQLXML

What it means

PrestoPreparedStatement.setSQLXML is a stub throwing SQLFeatureNotSupportedException. The driver does not support java.sql.SQLXML parameters; Presto has no XML locator type in its JDBC layer. XML data must be passed as a string value.

Source

Thrown at presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoPreparedStatement.java:617

    @Override
    public void setBlob(int parameterIndex, InputStream inputStream, long length)
            throws SQLException
    {
        throw new SQLFeatureNotSupportedException("setBlob");
    }

    @Override
    public void setNClob(int parameterIndex, Reader reader, long length)
            throws SQLException
    {
        throw new SQLFeatureNotSupportedException("setNClob");
    }

    @Override
    public void setSQLXML(int parameterIndex, SQLXML xmlObject)
            throws SQLException
    {
        throw new SQLFeatureNotSupportedException("setSQLXML");
    }

    @Override
    public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)
            throws SQLException
    {
        throw new SQLFeatureNotSupportedException("setObject");
    }

    @Override
    public void setAsciiStream(int parameterIndex, InputStream x, long length)
            throws SQLException
    {
        throw new NotImplementedException("PreparedStatement", "setAsciiStream");
    }

    @Override
    public void setBinaryStream(int parameterIndex, InputStream x, long length)

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Call sqlObject.getString() and bind with setString
  2. Store XML as a VARCHAR/JSON column and bind via setString or setObject(String)
  3. Handle XML parsing in application code rather than relying on driver-side SQLXML support

Example fix

// before
pstmt.setSQLXML(1, sqlxml);
// after
pstmt.setString(1, sqlxml.getString());
Defensive patterns

Strategy: fallback

Validate before calling

if (value instanceof java.sql.SQLXML) { pstmt.setString(parameterIndex, ((java.sql.SQLXML) value).getString()); }

Type guard

boolean isLocatorType(Object v) { return v instanceof java.sql.SQLXML || v instanceof java.sql.Clob || v instanceof java.sql.Blob || v instanceof java.sql.NClob; }

Try / catch

try { pstmt.setSQLXML(idx, sqlxml); } catch (SQLFeatureNotSupportedException e) { pstmt.setString(idx, sqlxml.getString()); }

Prevention

When it happens

Trigger: Calling PreparedStatement.setSQLXML(int parameterIndex, java.sql.SQLXML xmlObject) on a PrestoPreparedStatement; code paths that bind XML-typed values via the JDBC 4 SQLXML API.

Common situations: Applications ported from DB2/Oracle XML-enabled columns; generic persistence frameworks that map XML column types to setSQLXML.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/60a185861a9e0332. Report an issue: GitHub.