{"record":{"id":"3bca779c916bae30","repo":"tursodatabase/turso","slug":"not-yet-implemented-by-sqlite-jdbc-driver","errorCode":null,"errorMessage":"Not yet implemented by SQLite JDBC driver","messagePattern":"Not yet implemented by SQLite JDBC driver","errorType":"exception","errorClass":"SQLFeatureNotSupportedException","httpStatus":null,"severity":"warning","filePath":"bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java","lineNumber":1186,"sourceCode":"\n  @Override\n  public ResultSet getClientInfoProperties() throws SQLException {\n    throw new SQLFeatureNotSupportedException();\n  }\n\n  @Override\n  @SkipNullableCheck\n  public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern)\n      throws SQLException {\n    throw new SQLFeatureNotSupportedException();\n  }\n\n  @Override\n  @SkipNullableCheck\n  public ResultSet getFunctionColumns(\n      String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern)\n      throws SQLException {\n    throw new SQLFeatureNotSupportedException(\"Not yet implemented by SQLite JDBC driver\");\n  }\n\n  @Override\n  @SkipNullableCheck\n  public ResultSet getPseudoColumns(\n      String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)\n      throws SQLException {\n    throw new SQLFeatureNotSupportedException();\n  }\n\n  @Override\n  public boolean generatedKeyAlwaysReturned() throws SQLException {\n    throw new SQLFeatureNotSupportedException();\n  }\n\n  @Override\n  @SkipNullableCheck\n  public <T> T unwrap(Class<T> iface) throws SQLException {","sourceCodeStart":1168,"sourceCodeEnd":1204,"githubUrl":"https://github.com/tursodatabase/turso/blob/bad083fafbefdeae9a42ec19bdaaad8918dcf411/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java#L1168-L1204","documentation":"DatabaseMetaData.getFunctionColumns throws SQLFeatureNotSupportedException because the JDBC metadata layer does not implement function-column introspection (the neighboring getFunctions and getPseudoColumns are likewise unimplemented). Callers that walk this metadata during schema discovery will fail even though ordinary table metadata methods work.","triggerScenarios":"metaData.getFunctionColumns(catalog, schema, functionPattern, columnPattern) invoked directly; schema-diff or migration tools enumerating function parameters; IDE database browsers (DBeaver, DataGrip, IntelliJ) opening the Functions node; Hibernate/Spring Data performing full metadata sweeps at startup.","commonSituations":"Pointing a database GUI tool at a Turso JDBC URL and expanding the functions tree; running Liquibase/Flyway community extensions that probe function metadata; ORM bootstrap with aggressive metadata collection; custom admin consoles that render full schemas.","solutions":["Wrap getFunctionColumns in try-catch (SQLFeatureNotSupportedException) and degrade to 'no function metadata'.","Skip the call entirely when DatabaseMetaData.getSQLKeywords-style capability checks or driver name indicate the Turso driver.","Query pragma table_info / sqlite_master directly for the schema information you actually need.","For GUI tools, restrict browsing to tables and views, or file a tool-side issue to tolerate unsupported function metadata."],"exampleFix":"// before\nResultSet rs = metaData.getFunctionColumns(null, null, \"myFunc\", \"%\");\n\n// after\nList<Map<String, Object>> params = List.of();\ntry {\n    try (ResultSet rs = metaData.getFunctionColumns(null, null, \"myFunc\", \"%\")) {\n        params = readRows(rs);\n    }\n} catch (SQLFeatureNotSupportedException e) {\n    // driver does not expose function-column metadata; proceed without it\n}","handlingStrategy":"try-catch","validationCode":"DatabaseMetaData md = conn.getMetaData();\n// no direct capability flag exists for getFunctionColumns; probe once and cache\nboolean functionColumnsSupported;\ntry {\n    md.getFunctionColumns(null, null, \"%\", \"%\").close();\n    functionColumnsSupported = true;\n} catch (SQLFeatureNotSupportedException e) {\n    functionColumnsSupported = false;\n}","typeGuard":null,"tryCatchPattern":"try {\n    try (ResultSet rs = metaData.getFunctionColumns(catalog, schema, fnPattern, colPattern)) {\n        return readRows(rs);\n    }\n} catch (SQLFeatureNotSupportedException e) {\n    return Collections.emptyList(); // function-column metadata unavailable; degrade gracefully\n}","preventionTips":["Never assume full DatabaseMetaData coverage on alternative JDBC drivers.","Isolate metadata sweeps in a capability-aware adapter that catches SQLFeatureNotSupportedException per method.","For schema inspection, prefer engine-native queries (pragma table_info, sqlite_master) over exhaustive JDBC metadata.","When shipping tools that browse schemas, test them against more than one driver."],"tags":["java","jdbc","metadata","databasemetadata","not-implemented","schema-tooling"],"backgroundTag":"jdbc-metadata-not-implemented","analyzedSha":"bad083fafbefdeae9a42ec19bdaaad8918dcf411","analyzedAt":"2026-08-16T23:12:11.798Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}