diff --git a/src/main/java/org/sqlite/jdbc3/JDBC3DatabaseMetaData.java b/src/main/java/org/sqlite/jdbc3/JDBC3DatabaseMetaData.java index 7bc388fdd..4e24cae8a 100644 --- a/src/main/java/org/sqlite/jdbc3/JDBC3DatabaseMetaData.java +++ b/src/main/java/org/sqlite/jdbc3/JDBC3DatabaseMetaData.java @@ -1979,6 +1979,11 @@ class PrimaryKeyFinder { public PrimaryKeyFinder(String table) throws SQLException { this.table = table; + // specific handling for sqlite_schema and synonyms, so that + // getExportedKeys/getPrimaryKeys return an empty ResultSet instead of throwing an + // exception + if ("sqlite_schema".equals(table) || "sqlite_master".equals(table)) return; + if (table == null || table.trim().length() == 0) { throw new SQLException("Invalid table name: '" + this.table + "'"); } diff --git a/src/test/java/org/sqlite/DBMetaDataTest.java b/src/test/java/org/sqlite/DBMetaDataTest.java index 17fc5151d..b7370bf73 100644 --- a/src/test/java/org/sqlite/DBMetaDataTest.java +++ b/src/test/java/org/sqlite/DBMetaDataTest.java @@ -18,8 +18,11 @@ import java.util.Properties; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledInNativeImage; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** These tests are designed to stress Statements on memory databases. */ public class DBMetaDataTest { @@ -1596,4 +1599,31 @@ public void version() throws Exception { assertThat(meta.getDatabaseMinorVersion()).as("db minor version").isEqualTo(minorVersion); assertThat(meta.getUserName()).as("user name").isNull(); } + + @Nested + class SqliteSchema { + @ParameterizedTest + @ValueSource(strings = {"sqlite_schema", "sqlite_master"}) + public void getImportedKeys(String table) throws SQLException { + ResultSet importedKeys = meta.getImportedKeys(null, null, table); + + assertThat(importedKeys.next()).isFalse(); + } + + @ParameterizedTest + @ValueSource(strings = {"sqlite_schema", "sqlite_master"}) + public void getExportedKeys(String table) throws SQLException { + ResultSet exportedKeys = meta.getExportedKeys(null, null, table); + + assertThat(exportedKeys.next()).isFalse(); + } + + @ParameterizedTest + @ValueSource(strings = {"sqlite_schema", "sqlite_master"}) + public void getPrimaryKeys(String table) throws SQLException { + ResultSet primaryKeys = meta.getPrimaryKeys(null, null, table); + + assertThat(primaryKeys.next()).isFalse(); + } + } }