Summary
In duckdb_jdbc 1.5.2.0, DatabaseMetaData.getColumns(...) returns values of "true" / "false" for the IS_NULLABLE column. The JDBC specification mandates "YES" / "NO" / "" (empty). 1.5.1.0 returned "YES" as expected; this is a regression.
This breaks consumers that parse IS_NULLABLE per spec — notably jOOQ's generic MetaImpl under SQLDialect.DEFAULT, whose getTables(...) then returns tables with an empty field list.
Reproduction
import java.sql.*;
import java.util.Properties;
public class Repro {
public static void main(String[] a) throws Exception {
var c = new org.duckdb.DuckDBDriver().connect("jdbc:duckdb:", new Properties());
try (var s = c.createStatement()) {
s.execute("CREATE TABLE \"t\" (\"id\" BIGINT, \"v\" VARCHAR)");
}
try (var rs = c.getMetaData().getColumns(null, null, "t", null)) {
while (rs.next()) {
System.out.println(rs.getString("COLUMN_NAME") + " -> IS_NULLABLE=" + rs.getString("IS_NULLABLE"));
}
}
}
}
Observed
1.5.2.0
id -> IS_NULLABLE=true
v -> IS_NULLABLE=true
1.5.1.0 (expected / spec-compliant)
id -> IS_NULLABLE=YES
v -> IS_NULLABLE=YES
Spec reference
java.sql.DatabaseMetaData#getColumns, column 18 IS_NULLABLE:
String => ISO rules are used to determine the nullability for a column.
YES --- if the column can include NULLs
NO --- if the column cannot include NULLs
- empty string --- if the nullability for the column is unknown
Boolean literals "true" / "false" are not valid per the spec.
Impact
- Any JDBC consumer that does
"YES".equals(isNullable) / "NO".equals(isNullable) will misinterpret column nullability.
- jOOQ 3.21.x generic
Meta with SQLDialect.DEFAULT returns tables with zero fields against DuckDB 1.5.2.0, whereas SQLDialect.DUCKDB (dialect-specific path) still works. This surfaces in downstream test suites that use DSL.using(conn, SQLDialect.DEFAULT).meta() for inspection.
Environment
- duckdb_jdbc: 1.5.2.0 (regression) vs 1.5.1.0 (OK)
- JDK: Zulu 11.0.29
- OS: Linux x86_64
Summary
In
duckdb_jdbc 1.5.2.0,DatabaseMetaData.getColumns(...)returns values of"true"/"false"for theIS_NULLABLEcolumn. The JDBC specification mandates"YES"/"NO"/""(empty).1.5.1.0returned"YES"as expected; this is a regression.This breaks consumers that parse
IS_NULLABLEper spec — notably jOOQ's genericMetaImplunderSQLDialect.DEFAULT, whosegetTables(...)then returns tables with an empty field list.Reproduction
Observed
1.5.2.0
1.5.1.0 (expected / spec-compliant)
Spec reference
java.sql.DatabaseMetaData#getColumns, column 18IS_NULLABLE:Boolean literals
"true"/"false"are not valid per the spec.Impact
"YES".equals(isNullable)/"NO".equals(isNullable)will misinterpret column nullability.MetawithSQLDialect.DEFAULTreturns tables with zero fields against DuckDB 1.5.2.0, whereasSQLDialect.DUCKDB(dialect-specific path) still works. This surfaces in downstream test suites that useDSL.using(conn, SQLDialect.DEFAULT).meta()for inspection.Environment