From a34dfd807534ff0eeffbe5013b5f5dcc4b71fe5a Mon Sep 17 00:00:00 2001 From: Magnus Persson <1431685+magnusp@users.noreply.github.com> Date: Thu, 22 Oct 2026 01:59:11 +0200 Subject: [PATCH] fix(jdbc): return all xerial table types --- .../libsql/jdbc/LibsqlDatabaseMetaData.java | 6 +++- .../jdbc/LibsqlDatabaseMetaDataTest.java | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaData.java b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaData.java index 00584c8..d257149 100644 --- a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaData.java +++ b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaData.java @@ -486,7 +486,11 @@ public ResultSet getPrimaryKeys(String catalog, String schema, String table) thr @Override public ResultSet getTableTypes() throws SQLException { - return executeMetadataQuery("SELECT 'TABLE' AS TABLE_TYPE UNION SELECT 'VIEW' AS TABLE_TYPE"); + return executeMetadataQuery( + "SELECT 'TABLE' AS TABLE_TYPE " + + "UNION SELECT 'VIEW' AS TABLE_TYPE " + + "UNION SELECT 'SYSTEM TABLE' AS TABLE_TYPE " + + "UNION SELECT 'GLOBAL TEMPORARY' AS TABLE_TYPE"); } @Override diff --git a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaDataTest.java b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaDataTest.java index 886655f..1284d8f 100644 --- a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaDataTest.java +++ b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlDatabaseMetaDataTest.java @@ -11,7 +11,10 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; +import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static org.assertj.core.api.Assertions.assertThat; @@ -120,6 +123,21 @@ void getTablesWithEmptyTableNamePatternMatchesEverything() throws SQLException { assertThat(connection.lastSql).contains("TABLE_NAME LIKE '%'"); } + @Test + void getTableTypesReturnsEveryXerialTableType() throws SQLException { + LibsqlDatabaseMetaData metadata = new LibsqlDatabaseMetaData(new TableTypesConnection()); + + List tableTypes = new ArrayList<>(); + try (ResultSet resultSet = metadata.getTableTypes()) { + while (resultSet.next()) { + tableTypes.add(resultSet.getString("TABLE_TYPE")); + } + } + + assertThat(tableTypes) + .containsExactlyInAnyOrder("TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY"); + } + @Test void getColumnsReportsDeclaredTypesSizesNullabilityAndAutoIncrement() throws SQLException { LibsqlDatabaseMetaData metadata = new LibsqlDatabaseMetaData(new StmtResultConnection(columnMetadataRows())); @@ -223,6 +241,24 @@ public StmtResult executeStatement(Stmt stmt) { } } + private static final class TableTypesConnection extends LibsqlConnection { + private static final Pattern TYPE_ROW = Pattern.compile("SELECT '([^']*)' AS TABLE_TYPE"); + + private TableTypesConnection() { + super(null, null); + } + + @Override + public StmtResult executeStatement(Stmt stmt) { + List rows = new ArrayList<>(); + Matcher matcher = TYPE_ROW.matcher(stmt.sql()); + while (matcher.find()) { + rows.add(new Row(List.of(Value.of(matcher.group(1))))); + } + return new StmtResult(List.of(new Col("TABLE_TYPE", "TEXT")), rows, 0, null); + } + } + private static final class RecordingConnection extends LibsqlConnection { private final StmtResult result; private String lastSql;