From 71a2885707204f09de78292bb32dab538a15de89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Sun, 8 Jun 2025 12:30:38 +0900 Subject: [PATCH 1/6] Add JDBC4ResultSetMetadata --- .../turso/jdbc4/JDBC4ResultSetMetadata.java | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java new file mode 100644 index 000000000..2a44e3075 --- /dev/null +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java @@ -0,0 +1,144 @@ +package tech.turso.jdbc4; + +import java.sql.ResultSetMetaData; +import java.sql.SQLException; + +public class JDBC4ResultSetMetadata implements ResultSetMetaData { + @Override + public int getColumnCount() throws SQLException { + // TODO + return 0; + } + + @Override + public boolean isAutoIncrement(int column) throws SQLException { + // TODO + return false; + } + + @Override + public boolean isCaseSensitive(int column) throws SQLException { + // TODO + return false; + } + + @Override + public boolean isSearchable(int column) throws SQLException { + // TODO + return false; + } + + @Override + public boolean isCurrency(int column) throws SQLException { + // TODO + return false; + } + + @Override + public int isNullable(int column) throws SQLException { + // TODO + return 0; + } + + @Override + public boolean isSigned(int column) throws SQLException { + // TODO + return false; + } + + @Override + public int getColumnDisplaySize(int column) throws SQLException { + // TODO + return 0; + } + + @Override + public String getColumnLabel(int column) throws SQLException { + // TODO + return ""; + } + + @Override + public String getColumnName(int column) throws SQLException { + // TODO + return ""; + } + + @Override + public String getSchemaName(int column) throws SQLException { + // TODO + return ""; + } + + @Override + public int getPrecision(int column) throws SQLException { + // TODO + return 0; + } + + @Override + public int getScale(int column) throws SQLException { + // TODO + return 0; + } + + @Override + public String getTableName(int column) throws SQLException { + // TODO + return ""; + } + + @Override + public String getCatalogName(int column) throws SQLException { + // TODO + return ""; + } + + @Override + public int getColumnType(int column) throws SQLException { + // TODO + return 0; + } + + @Override + public String getColumnTypeName(int column) throws SQLException { + // TODO + return ""; + } + + @Override + public boolean isReadOnly(int column) throws SQLException { + // TODO + return false; + } + + @Override + public boolean isWritable(int column) throws SQLException { + // TODO + return false; + } + + @Override + public boolean isDefinitelyWritable(int column) throws SQLException { + // TODO + return false; + } + + @Override + public String getColumnClassName(int column) throws SQLException { + // TODO + return ""; + } + + @Override + public T unwrap(Class iface) throws SQLException { + // TODO + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + // TODO + return false; + } +} From a00fe6d358095e4d7f4b724ec166795d685edce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Sun, 8 Jun 2025 12:34:49 +0900 Subject: [PATCH 2/6] Extract resultSet to field and implement getMetadata() --- .../main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java | 7 ++++--- .../main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java index a9cc3350e..e3ebfc8c7 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -28,6 +28,7 @@ import tech.turso.core.LimboResultSet; public final class JDBC4PreparedStatement extends JDBC4Statement implements PreparedStatement { private final String sql; + private final JDBC4ResultSet resultSet; public JDBC4PreparedStatement(JDBC4Connection connection, String sql) throws SQLException { super(connection); @@ -35,13 +36,13 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep this.sql = sql; this.statement = connection.prepare(sql); this.statement.initializeColumnMetadata(); + this.resultSet = new JDBC4ResultSet(this.statement.getResultSet()); } @Override public ResultSet executeQuery() throws SQLException { // TODO: check bindings etc - requireNonNull(this.statement); - return new JDBC4ResultSet(this.statement.getResultSet()); + return this.resultSet; } @Override @@ -204,7 +205,7 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override @SkipNullableCheck public ResultSetMetaData getMetaData() throws SQLException { - return null; + return new JDBC4ResultSetMetadata(this.resultSet); } @Override diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java index 2a44e3075..73f6a4be7 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java @@ -4,6 +4,13 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; public class JDBC4ResultSetMetadata implements ResultSetMetaData { + + private final JDBC4ResultSet resultSet; + + public JDBC4ResultSetMetadata(JDBC4ResultSet resultSet) { + this.resultSet = resultSet; + } + @Override public int getColumnCount() throws SQLException { // TODO From 208c6963e0d1383fcdbfedccdbe5e7f55b424e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Sun, 8 Jun 2025 13:07:19 +0900 Subject: [PATCH 3/6] Implement getTables for JDBC4DatabaseMetaData --- .../java/tech/turso/core/LimboResultSet.java | 12 + .../turso/jdbc4/JDBC4DatabaseMetaData.java | 75 +++++- .../java/tech/turso/jdbc4/JDBC4ResultSet.java | 8 +- .../turso/jdbc4/JDBC4ResultSetMetadata.java | 240 +++++++++--------- .../jdbc4/JDBC4DatabaseMetaDataTest.java | 111 ++++++++ 5 files changed, 322 insertions(+), 124 deletions(-) diff --git a/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java b/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java index 4e6877fc7..0f38e72c0 100644 --- a/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java +++ b/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java @@ -119,6 +119,18 @@ public final class LimboResultSet { this.open = false; } + @Nullable + public Object get(String columnName) throws SQLException { + final int columnsLength = this.columnNames.length; + for (int i = 0; i < columnsLength; i++) { + if (this.columnNames[i].equals(columnName)) { + return get(i + 1); + } + } + + throw new SQLException("column name " + columnName + " not found"); + } + // Note that columnIndex starts from 1 @Nullable public Object get(int columnIndex) throws SQLException { diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java index fd159d2bd..ca233e234 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java @@ -687,16 +687,85 @@ public final class JDBC4DatabaseMetaData implements DatabaseMetaData { return null; } + // TODO: make use of getSearchStringEscape @Override - @SkipNullableCheck public ResultSet getTables( @Nullable String catalog, @Nullable String schemaPattern, String tableNamePattern, @Nullable String[] types) throws SQLException { - // TODO: after union is supported - return null; + // SQLite doesn't support catalogs or schemas — reject if non-empty values provided + if (catalog != null && !catalog.isEmpty()) { + return connection.prepareStatement("SELECT * FROM sqlite_schema WHERE 1=0").executeQuery(); + } + + if (schemaPattern != null && !schemaPattern.isEmpty()) { + return connection.prepareStatement("SELECT * FROM sqlite_schema WHERE 1=0").executeQuery(); + } + + // Start building query + StringBuilder sql = new StringBuilder( + "SELECT " + + "NULL AS TABLE_CAT, " + + "NULL AS TABLE_SCHEM, " + + "name AS TABLE_NAME, " + + "CASE type " + + " WHEN 'table' THEN 'TABLE' " + + " WHEN 'view' THEN 'VIEW' " + + " ELSE UPPER(type) " + + "END AS TABLE_TYPE, " + + "NULL AS REMARKS, " + + "NULL AS TYPE_CAT, " + + "NULL AS TYPE_SCHEM, " + + "NULL AS TYPE_NAME, " + + "NULL AS SELF_REFERENCING_COL_NAME, " + + "NULL AS REF_GENERATION " + + "FROM sqlite_schema " + + "WHERE 1=1" + ); + + // Apply type filtering if needed + if (types != null && types.length > 0) { + sql.append(" AND type IN ("); + for (int i = 0; i < types.length; i++) { + if (i > 0) sql.append(", "); + sql.append("?"); + } + sql.append(")"); + } + + // Apply table name pattern filtering + if (tableNamePattern != null) { + sql.append(" AND name LIKE ?"); + } + + // Comply with spec: sort by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME + sql.append(" ORDER BY TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME"); + + // Prepare and bind statement + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + int paramIndex = 1; + + if (types != null && types.length > 0) { + for (String type : types) { + String sqliteType; + if ("TABLE".equalsIgnoreCase(type)) { + sqliteType = "table"; + } else if ("VIEW".equalsIgnoreCase(type)) { + sqliteType = "view"; + } else { + sqliteType = type.toLowerCase(); + } + stmt.setString(paramIndex++, sqliteType); + } + } + + if (tableNamePattern != null) { + stmt.setString(paramIndex, tableNamePattern); + } + + return stmt.executeQuery(); } @Override diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java index 9fbead092..4efc8a61e 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java @@ -190,8 +190,12 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { @Override public String getString(String columnLabel) throws SQLException { - // TODO - return ""; + final Object result = this.resultSet.get(columnLabel); + if (result == null) { + return ""; + } + + return wrapTypeConversion(() -> (String) result); } @Override diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java index 73f6a4be7..a1982a713 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java @@ -2,150 +2,152 @@ package tech.turso.jdbc4; import java.sql.ResultSetMetaData; import java.sql.SQLException; +import tech.turso.annotations.SkipNullableCheck; public class JDBC4ResultSetMetadata implements ResultSetMetaData { - private final JDBC4ResultSet resultSet; + private final JDBC4ResultSet resultSet; - public JDBC4ResultSetMetadata(JDBC4ResultSet resultSet) { - this.resultSet = resultSet; - } + public JDBC4ResultSetMetadata(JDBC4ResultSet resultSet) { + this.resultSet = resultSet; + } - @Override - public int getColumnCount() throws SQLException { - // TODO - return 0; - } + @Override + public int getColumnCount() throws SQLException { + // TODO + return 0; + } - @Override - public boolean isAutoIncrement(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isAutoIncrement(int column) throws SQLException { + // TODO + return false; + } - @Override - public boolean isCaseSensitive(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isCaseSensitive(int column) throws SQLException { + // TODO + return false; + } - @Override - public boolean isSearchable(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isSearchable(int column) throws SQLException { + // TODO + return false; + } - @Override - public boolean isCurrency(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isCurrency(int column) throws SQLException { + // TODO + return false; + } - @Override - public int isNullable(int column) throws SQLException { - // TODO - return 0; - } + @Override + public int isNullable(int column) throws SQLException { + // TODO + return 0; + } - @Override - public boolean isSigned(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isSigned(int column) throws SQLException { + // TODO + return false; + } - @Override - public int getColumnDisplaySize(int column) throws SQLException { - // TODO - return 0; - } + @Override + public int getColumnDisplaySize(int column) throws SQLException { + // TODO + return 0; + } - @Override - public String getColumnLabel(int column) throws SQLException { - // TODO - return ""; - } + @Override + public String getColumnLabel(int column) throws SQLException { + // TODO + return ""; + } - @Override - public String getColumnName(int column) throws SQLException { - // TODO - return ""; - } + @Override + public String getColumnName(int column) throws SQLException { + // TODO + return ""; + } - @Override - public String getSchemaName(int column) throws SQLException { - // TODO - return ""; - } + @Override + public String getSchemaName(int column) throws SQLException { + // TODO + return ""; + } - @Override - public int getPrecision(int column) throws SQLException { - // TODO - return 0; - } + @Override + public int getPrecision(int column) throws SQLException { + // TODO + return 0; + } - @Override - public int getScale(int column) throws SQLException { - // TODO - return 0; - } + @Override + public int getScale(int column) throws SQLException { + // TODO + return 0; + } - @Override - public String getTableName(int column) throws SQLException { - // TODO - return ""; - } + @Override + public String getTableName(int column) throws SQLException { + // TODO + return ""; + } - @Override - public String getCatalogName(int column) throws SQLException { - // TODO - return ""; - } + @Override + public String getCatalogName(int column) throws SQLException { + // TODO + return ""; + } - @Override - public int getColumnType(int column) throws SQLException { - // TODO - return 0; - } + @Override + public int getColumnType(int column) throws SQLException { + // TODO + return 0; + } - @Override - public String getColumnTypeName(int column) throws SQLException { - // TODO - return ""; - } + @Override + public String getColumnTypeName(int column) throws SQLException { + // TODO + return ""; + } - @Override - public boolean isReadOnly(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isReadOnly(int column) throws SQLException { + // TODO + return false; + } - @Override - public boolean isWritable(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isWritable(int column) throws SQLException { + // TODO + return false; + } - @Override - public boolean isDefinitelyWritable(int column) throws SQLException { - // TODO - return false; - } + @Override + public boolean isDefinitelyWritable(int column) throws SQLException { + // TODO + return false; + } - @Override - public String getColumnClassName(int column) throws SQLException { - // TODO - return ""; - } + @Override + public String getColumnClassName(int column) throws SQLException { + // TODO + return ""; + } - @Override - public T unwrap(Class iface) throws SQLException { - // TODO - return null; - } + @Override + @SkipNullableCheck + public T unwrap(Class iface) throws SQLException { + // TODO + return null; + } - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - // TODO - return false; - } + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + // TODO + return false; + } } diff --git a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4DatabaseMetaDataTest.java b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4DatabaseMetaDataTest.java index 149516039..41c797580 100644 --- a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4DatabaseMetaDataTest.java +++ b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4DatabaseMetaDataTest.java @@ -1,9 +1,16 @@ package tech.turso.jdbc4; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import java.util.Properties; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tech.turso.TestUtils; @@ -44,4 +51,108 @@ class JDBC4DatabaseMetaDataTest { void getDriverVersion_should_not_return_empty_string() { assertFalse(metaData.getDriverVersion().isEmpty()); } + + @Test + void getTables_with_non_empty_catalog_should_return_empty() throws SQLException { + ResultSet rs = metaData.getTables("nonexistent", null, null, null); + assertNotNull(rs); + assertFalse(rs.next()); + rs.close(); + } + + @Test + void getTables_with_non_empty_schema_should_return_empty() throws SQLException { + ResultSet rs = metaData.getTables(null, "schema", null, null); + assertNotNull(rs); + assertFalse(rs.next()); + rs.close(); + } + + @Test + void getTables_should_return_correct_table_info() throws SQLException { + try (Statement stmt = connection.createStatement()) { + stmt.execute("CREATE TABLE test_table (id INTEGER PRIMARY KEY)"); + } + + ResultSet rs = metaData.getTables(null, null, null, null); + + assertNotNull(rs); + + assertTrue(rs.next()); + + assertEquals("test_table", rs.getString("TABLE_NAME")); + assertEquals("TABLE", rs.getString("TABLE_TYPE")); + + assertFalse(rs.next()); + + rs.close(); + } + + @Test + void getTables_with_pattern_should_filter_results() throws SQLException { + // Create test tables + try (Statement stmt = connection.createStatement()) { + stmt.execute("CREATE TABLE test1 (id INTEGER PRIMARY KEY)"); + stmt.execute("CREATE TABLE test2 (id INTEGER PRIMARY KEY)"); + stmt.execute("CREATE TABLE other (id INTEGER PRIMARY KEY)"); + } + + ResultSet rs = metaData.getTables(null, null, "test%", null); + + assertNotNull(rs); + + int tableCount = 0; + while (rs.next()) { + String tableName = rs.getString("TABLE_NAME"); + assertTrue(tableName.startsWith("test")); + tableCount++; + } + + assertEquals(2, tableCount); + + rs.close(); + } + + @Test + @Disabled("CREATE VIEW not supported yet") + void getTables_with_type_filter_should_return_only_views() throws SQLException { + try (Statement stmt = connection.createStatement()) { + stmt.execute("CREATE TABLE my_table (id INTEGER PRIMARY KEY)"); + stmt.execute("CREATE VIEW my_view AS SELECT * FROM my_table"); + } + + ResultSet rs = metaData.getTables(null, null, null, new String[] {"VIEW"}); + + assertNotNull(rs); + + assertTrue(rs.next()); + assertEquals("my_view", rs.getString("TABLE_NAME")); + assertEquals("VIEW", rs.getString("TABLE_TYPE")); + + assertFalse(rs.next()); + + rs.close(); + } + + @Test + @Disabled("CREATE VIEW not supported yet") + void getTables_with_pattern_and_type_filter_should_work_together() throws SQLException { + try (Statement stmt = connection.createStatement()) { + stmt.execute("CREATE TABLE alpha (id INTEGER)"); + stmt.execute("CREATE TABLE beta (id INTEGER)"); + stmt.execute("CREATE VIEW alpha_view AS SELECT * FROM alpha"); + } + + ResultSet rs = metaData.getTables(null, null, "alpha%", new String[] {"VIEW"}); + + assertNotNull(rs); + + assertTrue(rs.next()); + assertEquals("alpha_view", rs.getString("TABLE_NAME")); + assertEquals("VIEW", rs.getString("TABLE_TYPE")); + + assertFalse(rs.next()); + + rs.close(); + } } From 166854cce2dac85700a3236988fae0050ab725eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Sun, 8 Jun 2025 13:08:41 +0900 Subject: [PATCH 4/6] Nit --- .../turso/jdbc4/JDBC4DatabaseMetaData.java | 38 +++++++++---------- .../turso/jdbc4/JDBC4PreparedStatement.java | 1 - 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java index ca233e234..b641d631e 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java @@ -705,25 +705,25 @@ public final class JDBC4DatabaseMetaData implements DatabaseMetaData { } // Start building query - StringBuilder sql = new StringBuilder( - "SELECT " + - "NULL AS TABLE_CAT, " + - "NULL AS TABLE_SCHEM, " + - "name AS TABLE_NAME, " + - "CASE type " + - " WHEN 'table' THEN 'TABLE' " + - " WHEN 'view' THEN 'VIEW' " + - " ELSE UPPER(type) " + - "END AS TABLE_TYPE, " + - "NULL AS REMARKS, " + - "NULL AS TYPE_CAT, " + - "NULL AS TYPE_SCHEM, " + - "NULL AS TYPE_NAME, " + - "NULL AS SELF_REFERENCING_COL_NAME, " + - "NULL AS REF_GENERATION " + - "FROM sqlite_schema " + - "WHERE 1=1" - ); + StringBuilder sql = + new StringBuilder( + "SELECT " + + "NULL AS TABLE_CAT, " + + "NULL AS TABLE_SCHEM, " + + "name AS TABLE_NAME, " + + "CASE type " + + " WHEN 'table' THEN 'TABLE' " + + " WHEN 'view' THEN 'VIEW' " + + " ELSE UPPER(type) " + + "END AS TABLE_TYPE, " + + "NULL AS REMARKS, " + + "NULL AS TYPE_CAT, " + + "NULL AS TYPE_SCHEM, " + + "NULL AS TYPE_NAME, " + + "NULL AS SELF_REFERENCING_COL_NAME, " + + "NULL AS REF_GENERATION " + + "FROM sqlite_schema " + + "WHERE 1=1"); // Apply type filtering if needed if (types != null && types.length > 0) { diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java index e3ebfc8c7..0565a4bf2 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -203,7 +203,6 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep } @Override - @SkipNullableCheck public ResultSetMetaData getMetaData() throws SQLException { return new JDBC4ResultSetMetadata(this.resultSet); } From d6a5d8647abab811f2fe871d72887ec076cbbfa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Sun, 8 Jun 2025 13:20:37 +0900 Subject: [PATCH 5/6] Remove JDBC4ResultSetMetadata.java --- .../turso/jdbc4/JDBC4PreparedStatement.java | 2 +- .../turso/jdbc4/JDBC4ResultSetMetadata.java | 153 ------------------ 2 files changed, 1 insertion(+), 154 deletions(-) delete mode 100644 bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java index 0565a4bf2..467cf94d1 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -204,7 +204,7 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override public ResultSetMetaData getMetaData() throws SQLException { - return new JDBC4ResultSetMetadata(this.resultSet); + return this.resultSet; } @Override diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java deleted file mode 100644 index a1982a713..000000000 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSetMetadata.java +++ /dev/null @@ -1,153 +0,0 @@ -package tech.turso.jdbc4; - -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import tech.turso.annotations.SkipNullableCheck; - -public class JDBC4ResultSetMetadata implements ResultSetMetaData { - - private final JDBC4ResultSet resultSet; - - public JDBC4ResultSetMetadata(JDBC4ResultSet resultSet) { - this.resultSet = resultSet; - } - - @Override - public int getColumnCount() throws SQLException { - // TODO - return 0; - } - - @Override - public boolean isAutoIncrement(int column) throws SQLException { - // TODO - return false; - } - - @Override - public boolean isCaseSensitive(int column) throws SQLException { - // TODO - return false; - } - - @Override - public boolean isSearchable(int column) throws SQLException { - // TODO - return false; - } - - @Override - public boolean isCurrency(int column) throws SQLException { - // TODO - return false; - } - - @Override - public int isNullable(int column) throws SQLException { - // TODO - return 0; - } - - @Override - public boolean isSigned(int column) throws SQLException { - // TODO - return false; - } - - @Override - public int getColumnDisplaySize(int column) throws SQLException { - // TODO - return 0; - } - - @Override - public String getColumnLabel(int column) throws SQLException { - // TODO - return ""; - } - - @Override - public String getColumnName(int column) throws SQLException { - // TODO - return ""; - } - - @Override - public String getSchemaName(int column) throws SQLException { - // TODO - return ""; - } - - @Override - public int getPrecision(int column) throws SQLException { - // TODO - return 0; - } - - @Override - public int getScale(int column) throws SQLException { - // TODO - return 0; - } - - @Override - public String getTableName(int column) throws SQLException { - // TODO - return ""; - } - - @Override - public String getCatalogName(int column) throws SQLException { - // TODO - return ""; - } - - @Override - public int getColumnType(int column) throws SQLException { - // TODO - return 0; - } - - @Override - public String getColumnTypeName(int column) throws SQLException { - // TODO - return ""; - } - - @Override - public boolean isReadOnly(int column) throws SQLException { - // TODO - return false; - } - - @Override - public boolean isWritable(int column) throws SQLException { - // TODO - return false; - } - - @Override - public boolean isDefinitelyWritable(int column) throws SQLException { - // TODO - return false; - } - - @Override - public String getColumnClassName(int column) throws SQLException { - // TODO - return ""; - } - - @Override - @SkipNullableCheck - public T unwrap(Class iface) throws SQLException { - // TODO - return null; - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - // TODO - return false; - } -} From 853e12f8a1dcff49f81154207cc205ce0727c418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Sun, 8 Jun 2025 13:29:10 +0900 Subject: [PATCH 6/6] Nit --- .../java/src/main/java/tech/turso/core/LimboResultSet.java | 3 --- .../src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java b/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java index 0f38e72c0..15fbc7e16 100644 --- a/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java +++ b/bindings/java/src/main/java/tech/turso/core/LimboResultSet.java @@ -119,7 +119,6 @@ public final class LimboResultSet { this.open = false; } - @Nullable public Object get(String columnName) throws SQLException { final int columnsLength = this.columnNames.length; for (int i = 0; i < columnsLength; i++) { @@ -131,8 +130,6 @@ public final class LimboResultSet { throw new SQLException("column name " + columnName + " not found"); } - // Note that columnIndex starts from 1 - @Nullable public Object get(int columnIndex) throws SQLException { if (!this.isOpen()) { throw new SQLException("ResultSet is not open"); diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java index 467cf94d1..4a0cabd49 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -204,7 +204,7 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override public ResultSetMetaData getMetaData() throws SQLException { - return this.resultSet; + return this.resultSet; } @Override