diff --git a/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java b/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java index 1fc7fdd2b..c0760c89f 100644 --- a/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java +++ b/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java @@ -827,7 +827,7 @@ public ResultSet getColumns(String catalog, String schemaPattern, String tableNa sb.append("NULL AS 'BUFFER_LENGTH'").append(TRAILING_COMMA).append(lineSeparator()); sb.append("numeric_scale AS 'DECIMAL_DIGITS'").append(TRAILING_COMMA).append(lineSeparator()); sb.append("10 AS 'NUM_PREC_RADIX'").append(TRAILING_COMMA).append(lineSeparator()); - sb.append("CASE WHEN is_nullable = 'YES' THEN 1 else 0 END AS 'NULLABLE'") + sb.append("CASE WHEN is_nullable = TRUE THEN 1 else 0 END AS 'NULLABLE'") .append(TRAILING_COMMA) .append(lineSeparator()); sb.append("comment as 'REMARKS'").append(TRAILING_COMMA).append(lineSeparator()); @@ -836,7 +836,9 @@ public ResultSet getColumns(String catalog, String schemaPattern, String tableNa sb.append("NULL AS 'SQL_DATETIME_SUB'").append(TRAILING_COMMA).append(lineSeparator()); sb.append("NULL AS 'CHAR_OCTET_LENGTH'").append(TRAILING_COMMA).append(lineSeparator()); sb.append("column_index AS 'ORDINAL_POSITION'").append(TRAILING_COMMA).append(lineSeparator()); - sb.append("is_nullable AS 'IS_NULLABLE'").append(TRAILING_COMMA).append(lineSeparator()); + sb.append("CASE WHEN is_nullable = TRUE THEN 'YES' ELSE 'NO' END AS 'IS_NULLABLE'") + .append(TRAILING_COMMA) + .append(lineSeparator()); sb.append("NULL AS 'SCOPE_CATALOG'").append(TRAILING_COMMA).append(lineSeparator()); sb.append("NULL AS 'SCOPE_SCHEMA'").append(TRAILING_COMMA).append(lineSeparator()); sb.append("NULL AS 'SCOPE_TABLE'").append(TRAILING_COMMA).append(lineSeparator()); diff --git a/src/test/java/org/duckdb/TestMetadata.java b/src/test/java/org/duckdb/TestMetadata.java index c5c9220ec..cc0b0f48f 100644 --- a/src/test/java/org/duckdb/TestMetadata.java +++ b/src/test/java/org/duckdb/TestMetadata.java @@ -1,6 +1,5 @@ package org.duckdb; -import static java.lang.System.lineSeparator; import static java.util.Arrays.asList; import static org.duckdb.TestDuckDBJDBC.JDBC_URL; import static org.duckdb.test.Assertions.*; @@ -1052,4 +1051,26 @@ public static void test_metadata_system_columns() throws Exception { assertTrue(count > 0); } } + + public static void test_metadata_is_nullable() throws Exception { + try (Connection conn = DriverManager.getConnection(JDBC_URL); Statement stmt = conn.createStatement()) { + stmt.execute("CREATE TABLE tab1 (col1 INT, col2 INT NOT NULL)"); + DatabaseMetaData dbMeta = conn.getMetaData(); + try (ResultSet rs = dbMeta.getColumns(null, null, "tab1", null)) { + ResultSetMetaData rsMeta = rs.getMetaData(); + assertEquals(rsMeta.getColumnName(11), "NULLABLE"); + assertEquals(rsMeta.getColumnType(11), Types.INTEGER); + assertEquals(rsMeta.getColumnName(18), "IS_NULLABLE"); + assertEquals(rsMeta.getColumnType(18), Types.VARCHAR); + + assertTrue(rs.next()); + assertEquals(rs.getInt("NULLABLE"), DatabaseMetaData.columnNullable); + assertEquals(rs.getString("IS_NULLABLE"), "YES"); + assertTrue(rs.next()); + assertEquals(rs.getInt("NULLABLE"), DatabaseMetaData.columnNoNulls); + assertEquals(rs.getString("IS_NULLABLE"), "NO"); + assertFalse(rs.next()); + } + } + } }