{"record":{"id":"d2df7a63dc4e6a46","repo":"prestodb/presto","slug":"no-wrapper-for-d2df7a","errorCode":null,"errorMessage":"No wrapper for ","messagePattern":"No wrapper for ","errorType":"exception","errorClass":"SQLException","httpStatus":null,"severity":"error","filePath":"presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoDatabaseMetaData.java","lineNumber":1405,"sourceCode":"                \"ORDER BY TABLE_CAT, table_SCHEM, TABLE_NAME, COLUMN_NAME\");\n    }\n\n    @Override\n    public boolean generatedKeyAlwaysReturned()\n            throws SQLException\n    {\n        return false;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public <T> T unwrap(Class<T> iface)\n            throws SQLException\n    {\n        if (isWrapperFor(iface)) {\n            return (T) this;\n        }\n        throw new SQLException(\"No wrapper for \" + iface);\n    }\n\n    @Override\n    public boolean isWrapperFor(Class<?> iface)\n            throws SQLException\n    {\n        return iface.isInstance(this);\n    }\n\n    private ResultSet selectEmpty(String sql)\n            throws SQLException\n    {\n        return select(sql + \" LIMIT 0\");\n    }\n\n    private ResultSet select(String sql)\n            throws SQLException\n    {","sourceCodeStart":1387,"sourceCodeEnd":1423,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoDatabaseMetaData.java#L1387-L1423","documentation":"unwrap(iface) in PrestoDatabaseMetaData throws SQLException('No wrapper for ' + iface) when the requested interface is not one this object implements or wraps. Per the JDBC Wrapper contract, PrestoDatabaseMetaData only unwraps itself (or interfaces it directly implements, e.g. DatabaseMetaData); asking for any other vendor extension interface fails.","triggerScenarios":"Calling ((SomeVendorInterface) meta.unwrap(SomeVendorInterface.class)) where SomeVendorInterface is not implemented by PrestoDatabaseMetaData — e.g. unwrapping to a native connection or vendor metadata extension.","commonSituations":"Pooling frameworks (HikariCP, DBCP) that unwrap statements/metadata to vendor types, code written against Oracle/MySQL driver extensions being reused with Presto.","solutions":["Only unwrap to interfaces PrestoDatabaseMetaData actually implements (it returns itself)","Call isWrapperFor(iface) first and handle false without invoking unwrap","Remove vendor-specific unwrapping when using Presto; code against java.sql interfaces","Use reflection-free feature detection (DatabaseMetaData.supportsX) instead of driver-specific casts"],"exampleFix":"// before\nVendorMeta vm = (VendorMeta) meta.unwrap(VendorMeta.class); // throws\n// after\nif (meta.isWrapperFor(VendorMeta.class)) {\n    VendorMeta vm = meta.unwrap(VendorMeta.class);\n} else {\n    // fall back to standard java.sql.DatabaseMetaData usage\n}","handlingStrategy":"type-guard","validationCode":"if (!meta.isWrapperFor(iface)) { /* skip unwrap, use java.sql API directly */ }","typeGuard":"boolean unwrappable = iface != null && meta.isWrapperFor(iface);","tryCatchPattern":"try { return meta.unwrap(iface); } catch (SQLException e) { if (e.getMessage().startsWith(\"No wrapper for\")) { return fallbackToStandardApi(); } throw e; }","preventionTips":["Only unwrap interfaces the Presto driver actually implements","Call isWrapperFor before unwrap","Avoid vendor-driver unwrap patterns from Oracle/MySQL codebases when using Presto"],"tags":["jdbc","unwrap","wrapper","type-cast"],"backgroundTag":"jdbc-unwrap-not-supported","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}