Skip to content

Added support for system views when fetching tables etc from metadata#639

Merged
staticlibs merged 4 commits intoduckdb:mainfrom
siggemannen:main
Apr 9, 2026
Merged

Added support for system views when fetching tables etc from metadata#639
staticlibs merged 4 commits intoduckdb:mainfrom
siggemannen:main

Conversation

@siggemannen
Copy link
Copy Markdown
Contributor

Changing DuckDBDatabaseMetaData so it supports viewing system views like information_schema

Copy link
Copy Markdown
Collaborator

@staticlibs staticlibs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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());
 

@staticlibs staticlibs merged commit c8d20e1 into duckdb:main Apr 9, 2026
14 checks passed
@staticlibs
Copy link
Copy Markdown
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants