apache/shardingsphere · error · SQLFeatureNotSupportedException

getCursorName

Error message

getCursorName

What it means

getCursorName() is final in AbstractUnsupportedOperationResultSet and throws SQLFeatureNotSupportedException. Named cursors only exist for positioned UPDATE/DELETE CURRENT OF statements, which the sharding driver cannot support because rows come from multiple merged physical ResultSets with no shared cursor name.

Solutions

  1. Replace positioned updates with keyed UPDATE/DELETE statements using the primary key.
  2. Remove or guard getCursorName calls in introspection/probing code (catch SQLFeatureNotSupportedException or skip when the driver is ShardingSphere).
  3. Perform CURRENT OF workflows on a connection from the physical datasource.

Example fix

// before
String cursor = rs.getCursorName(); // throws
stmt.executeUpdate("UPDATE t SET c=1 WHERE CURRENT OF " + cursor);

// after
stmt.executeUpdate("UPDATE t SET c=1 WHERE id=" + rs.getLong("id"));
Defensive patterns

Strategy: try-catch

Validate before calling

// introspection tools: probe driver identity before calling
DatabaseMetaData md = conn.getMetaData();
boolean isSharding = md.getURL().startsWith("jdbc:shardingsphere:");
if (!isSharding) { String c = rs.getCursorName(); }

Try / catch

try {
    cursorName = rs.getCursorName();
} catch (SQLFeatureNotSupportedException e) {
    cursorName = null; // positioned CURRENT OF unsupported; use keyed DML
}

Prevention

When it happens

Trigger: Calling ResultSet.getCursorName() on a sharding ResultSet — typically legacy code building 'UPDATE ... WHERE CURRENT OF cursor' statements or generic JDBC introspection utilities that dump all ResultSet metadata.

Common situations: Code migrated from Oracle/DB2/PostgreSQL that uses positioned updates; ORM or query-tool code that calls getCursorName during capability probing; 'UPDATE ... WHERE CURRENT OF' patterns applied to a sharded schema.

Related errors


AI-assisted analysis of apache/shardingsphere@e952770a21 (2026-08-14). Data as JSON: /api/errors/1d2f3ea5e45b9484. Report an issue: GitHub.

Appendix: source

Thrown at jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/unsupported/AbstractUnsupportedOperationResultSet.java:145

    
    @Override
    public final boolean rowInserted() throws SQLException {
        throw new SQLFeatureNotSupportedException("rowInserted");
    }
    
    @Override
    public final boolean rowUpdated() throws SQLException {
        throw new SQLFeatureNotSupportedException("rowUpdated");
    }
    
    @Override
    public final boolean rowDeleted() throws SQLException {
        throw new SQLFeatureNotSupportedException("rowDeleted");
    }
    
    @Override
    public final String getCursorName() throws SQLException {
        throw new SQLFeatureNotSupportedException("getCursorName");
    }
    
    @Override
    public final int getHoldability() throws SQLException {
        throw new SQLFeatureNotSupportedException("getHoldability");
    }
    
    @Override
    public final NClob getNClob(final int columnIndex) throws SQLException {
        throw new SQLFeatureNotSupportedException("getNClob");
    }
    
    @Override
    public final NClob getNClob(final String columnLabel) throws SQLException {
        throw new SQLFeatureNotSupportedException("getNClob");
    }
    
    @Override

View on GitHub (pinned to e952770a21)