From 89805d385d5caec72709eadb8066497d620a1016 Mon Sep 17 00:00:00 2001 From: hutiefang76 <137664623+hutiefang76@users.noreply.github.com> Date: Sat, 10 Oct 2026 10:10:32 +0800 Subject: [PATCH] Report configured NULL ordering in JDBC metadata Signed-off-by: hutiefang76 <137664623+hutiefang76@users.noreply.github.com> --- .../org/duckdb/DuckDBDatabaseMetaData.java | 16 +++++++--- src/test/java/org/duckdb/TestMetadata.java | 29 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java b/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java index 1cfee691a..23311b138 100644 --- a/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java +++ b/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java @@ -61,24 +61,32 @@ public boolean isReadOnly() throws SQLException { return conn.isReadOnly(); } + private String getDefaultNullOrder() throws SQLException { + try (Statement s = conn.createStatement(); + ResultSet rs = s.executeQuery("SELECT current_setting('default_null_order')")) { + rs.next(); + return rs.getString(1); + } + } + @Override public boolean nullsAreSortedHigh() throws SQLException { - return true; + return "NULLS_LAST_ON_ASC_FIRST_ON_DESC".equals(getDefaultNullOrder()); } @Override public boolean nullsAreSortedLow() throws SQLException { - return false; + return "NULLS_FIRST_ON_ASC_LAST_ON_DESC".equals(getDefaultNullOrder()); } @Override public boolean nullsAreSortedAtStart() throws SQLException { - return true; + return "NULLS_FIRST".equals(getDefaultNullOrder()); } @Override public boolean nullsAreSortedAtEnd() throws SQLException { - return false; + return "NULLS_LAST".equals(getDefaultNullOrder()); } @Override diff --git a/src/test/java/org/duckdb/TestMetadata.java b/src/test/java/org/duckdb/TestMetadata.java index 19d764aaf..0cac96318 100644 --- a/src/test/java/org/duckdb/TestMetadata.java +++ b/src/test/java/org/duckdb/TestMetadata.java @@ -1145,4 +1145,33 @@ public static void test_metadata_get_udts() throws Exception { } } } + + public static void test_metadata_null_ordering() throws Exception { + String[] options = {"NULLS_LAST", "NULLS_FIRST", "NULLS_FIRST_ON_ASC_LAST_ON_DESC", + "NULLS_LAST_ON_ASC_FIRST_ON_DESC"}; + try (Connection conn = DriverManager.getConnection(JDBC_URL); Statement stmt = conn.createStatement()) { + stmt.execute("CREATE TABLE test_null_order (i INTEGER)"); + stmt.execute("INSERT INTO test_null_order VALUES (1), (2), (NULL)"); + + DatabaseMetaData md = conn.getMetaData(); + for (String option : options) { + stmt.execute("SET default_null_order = '" + option + "'"); + + boolean ascNullFirst = isNullFirst(stmt, "ASC"); + boolean descNullFirst = isNullFirst(stmt, "DESC"); + + assertEquals(md.nullsAreSortedHigh(), !ascNullFirst && descNullFirst); + assertEquals(md.nullsAreSortedLow(), ascNullFirst && !descNullFirst); + assertEquals(md.nullsAreSortedAtStart(), ascNullFirst && descNullFirst); + assertEquals(md.nullsAreSortedAtEnd(), !ascNullFirst && !descNullFirst); + } + } + } + + private static boolean isNullFirst(Statement stmt, String direction) throws Exception { + try (ResultSet rs = stmt.executeQuery("SELECT i FROM test_null_order ORDER BY i " + direction)) { + assertTrue(rs.next()); + return rs.getObject(1) == null; + } + } }