Added support for system views when fetching tables etc from metadata#639
Merged
staticlibs merged 4 commits intoduckdb:mainfrom Apr 9, 2026
Merged
Added support for system views when fetching tables etc from metadata#639staticlibs merged 4 commits intoduckdb:mainfrom
staticlibs merged 4 commits intoduckdb:mainfrom
Conversation
staticlibs
approved these changes
Apr 9, 2026
Collaborator
staticlibs
left a comment
There was a problem hiding this comment.
Thanks for the PR! Looks good to me.
To pass the formatter plrease run:
python3 -m pip install --user clang_format==11.0.1
make format
Or, alternatively, apply the following diff:
diff --git a/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java b/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java
index 9a48b14a8..e6387b004 100644
--- a/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java
+++ b/src/main/java/org/duckdb/DuckDBDatabaseMetaData.java
@@ -722,7 +722,7 @@ public class DuckDBDatabaseMetaData implements DatabaseMetaData {
@Override
public ResultSet getTableTypes() throws SQLException {
- String[] tableTypesArray = new String[] {"TABLE", "LOCAL TEMPORARY", "VIEW", "SYSTEM VIEW" };
+ String[] tableTypesArray = new String[] {"TABLE", "LOCAL TEMPORARY", "VIEW", "SYSTEM VIEW"};
StringBuilder stringBuilder = new StringBuilder(128);
boolean first = true;
for (String tableType : tableTypesArray) {
@@ -759,15 +759,13 @@ public class DuckDBDatabaseMetaData implements DatabaseMetaData {
sb.append("NULL::VARCHAR AS 'TYPE_NAME'").append(TRAILING_COMMA).append(lineSeparator());
sb.append("NULL::VARCHAR AS 'SELF_REFERENCING_COL_NAME'").append(TRAILING_COMMA).append(lineSeparator());
sb.append("NULL::VARCHAR AS 'REF_GENERATION'").append(TRAILING_COMMA).append(lineSeparator());
- sb
- .append(
- "FROM (select database_name as table_catalog, schema_name as table_schema, table_name, CASE WHEN (\"temporary\") THEN ('LOCAL TEMPORARY') WHEN (\"internal\") THEN 'SYSTEM TABLE' ELSE 'TABLE' END AS table_type, comment AS TABLE_COMMENT")
- .append(lineSeparator());
+ sb.append(
+ "FROM (select database_name as table_catalog, schema_name as table_schema, table_name, CASE WHEN (\"temporary\") THEN ('LOCAL TEMPORARY') WHEN (\"internal\") THEN 'SYSTEM TABLE' ELSE 'TABLE' END AS table_type, comment AS TABLE_COMMENT")
+ .append(lineSeparator());
sb.append("from duckdb_tables() x").append(lineSeparator());
- sb
- .append(
- "union all select database_name,schema_name, view_name, CASE WHEN (\"internal\") then 'SYSTEM VIEW' ELSE 'VIEW' END, comment from duckdb_views() x ) x")
- .append(lineSeparator());
+ sb.append(
+ "union all select database_name,schema_name, view_name, CASE WHEN (\"internal\") then 'SYSTEM VIEW' ELSE 'VIEW' END, comment from duckdb_views() x ) x")
+ .append(lineSeparator());
sb.append("WHERE table_name LIKE ? ESCAPE '\\'").append(lineSeparator());
boolean hasCatalogParam = appendEqualsQual(sb, "table_catalog", catalog);
boolean hasSchemaParam = appendLikeQual(sb, "table_schema", schemaPattern);
@@ -820,15 +818,17 @@ public class DuckDBDatabaseMetaData implements DatabaseMetaData {
sb.append("schema_name AS 'TABLE_SCHEM'").append(TRAILING_COMMA).append(lineSeparator());
sb.append("table_name AS 'TABLE_NAME'").append(TRAILING_COMMA).append(lineSeparator());
sb.append("column_name as 'COLUMN_NAME'").append(TRAILING_COMMA).append(lineSeparator());
- sb.append(makeDataMap("regexp_replace(c.data_type, '\\(.*\\)', '')", "DATA_TYPE")).append(TRAILING_COMMA)
- .append(lineSeparator());
+ sb.append(makeDataMap("regexp_replace(c.data_type, '\\(.*\\)', '')", "DATA_TYPE"))
+ .append(TRAILING_COMMA)
+ .append(lineSeparator());
sb.append("c.data_type AS 'TYPE_NAME'").append(TRAILING_COMMA).append(lineSeparator());
sb.append("numeric_precision AS 'COLUMN_SIZE'").append(TRAILING_COMMA).append(lineSeparator());
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'").append(TRAILING_COMMA)
- .append(lineSeparator());
+ sb.append("CASE WHEN is_nullable = 'YES' THEN 1 else 0 END AS 'NULLABLE'")
+ .append(TRAILING_COMMA)
+ .append(lineSeparator());
sb.append("comment as 'REMARKS'").append(TRAILING_COMMA).append(lineSeparator());
sb.append("column_default AS 'COLUMN_DEF'").append(TRAILING_COMMA).append(lineSeparator());
sb.append("NULL AS 'SQL_DATA_TYPE'").append(TRAILING_COMMA).append(lineSeparator());
diff --git a/src/test/java/org/duckdb/TestMetadata.java b/src/test/java/org/duckdb/TestMetadata.java
index f4795bd05..a79642ede 100644
--- a/src/test/java/org/duckdb/TestMetadata.java
+++ b/src/test/java/org/duckdb/TestMetadata.java
@@ -11,14 +11,11 @@ import java.util.*;
public class TestMetadata {
- private static void assertNonSystemTables(ResultSet rs, String name) throws Exception
- {
+ private static void assertNonSystemTables(ResultSet rs, String name) throws Exception {
assertTrue(rs.next());
- while(true)
- {
+ while (true) {
String type = rs.getString("TABLE_TYPE");
- if(type.equals("SYSTEM VIEW") || type.equals("SYSTEM TABLE"))
- {
+ if (type.equals("SYSTEM VIEW") || type.equals("SYSTEM TABLE")) {
assertTrue(rs.next());
continue;
}
@@ -47,7 +44,7 @@ public class TestMetadata {
try (ResultSet rs = dm.getTables(null, null, null, new String[] {})) {
assertNonSystemTables(rs, "b");
assertNonSystemTables(rs, "a1");
- assertNonSystemTables(rs,"a2");
+ assertNonSystemTables(rs, "a2");
assertNonSystemTables(rs, "c");
assertFalse(rs.next());
}
@@ -557,7 +554,8 @@ public class TestMetadata {
assertFalse(rs.next());
}
- try (ResultSet rs = md.getTables(null, DuckDBConnection.DEFAULT_SCHEMA, "a", new String[] {"TABLE", "VIEW"})) {
+ try (ResultSet rs =
+ md.getTables(null, DuckDBConnection.DEFAULT_SCHEMA, "a", new String[] {"TABLE", "VIEW"})) {
assertTrue(rs.next());
assertTrue(rs.getObject("TABLE_CAT") != null);
assertEquals(rs.getString("TABLE_SCHEM"), DuckDBConnection.DEFAULT_SCHEMA);
@@ -799,7 +797,7 @@ public class TestMetadata {
}
public static void test_get_table_types() throws Exception {
- String[] tableTypesArray = new String[] {"TABLE", "LOCAL TEMPORARY", "VIEW" , "SYSTEM VIEW"};
+ String[] tableTypesArray = new String[] {"TABLE", "LOCAL TEMPORARY", "VIEW", "SYSTEM VIEW"};
List<String> tableTypesList = new ArrayList<>(asList(tableTypesArray));
tableTypesList.sort(Comparator.naturalOrder());
fixed formatting on windows + fixed test formatting
Collaborator
|
Thanks! |
staticlibs
added a commit
to staticlibs/duckdb-java
that referenced
this pull request
Apr 9, 2026
This is a backport of the PR duckdb#639 to `v1.5-variegata` stable branch. Changing DuckDBDatabaseMetaData so it supports viewing system views like information_schema Co-Authored-By: Sigge <6099273+siggemannen@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changing DuckDBDatabaseMetaData so it supports viewing system views like information_schema