Skip to content

Commit

Permalink
Get data types directly from linked tables from H2
Browse files Browse the repository at this point in the history
  • Loading branch information
katzyn committed Jan 4, 2022
1 parent 69aff24 commit 4a2e677
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 4 deletions.
9 changes: 9 additions & 0 deletions h2/src/main/org/h2/jdbc/JdbcResultSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -4277,4 +4277,13 @@ public Value[] getUpdateRow() {
return updateRow;
}

/**
* INTERNAL
*
* @return result
*/
public ResultInterface getResult() {
return result;
}

}
16 changes: 14 additions & 2 deletions h2/src/main/org/h2/table/TableLink.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@
import org.h2.index.IndexType;
import org.h2.index.LinkedIndex;
import org.h2.jdbc.JdbcConnection;
import org.h2.jdbc.JdbcResultSet;
import org.h2.message.DbException;
import org.h2.result.LocalResult;
import org.h2.result.ResultInterface;
import org.h2.result.Row;
import org.h2.schema.Schema;
import org.h2.util.JdbcUtils;
Expand Down Expand Up @@ -177,10 +179,20 @@ private void readMetaData() throws SQLException {

try (Statement stat = conn.getConnection().createStatement();
ResultSet rs = stat.executeQuery("SELECT * FROM " + qualifiedTableName + " T WHERE 1=0")) {
if (columnList.isEmpty()) {
if (rs instanceof JdbcResultSet) {
ResultInterface result = ((JdbcResultSet) rs).getResult();
columnList.clear();
columnMap.clear();
for (int i = 0, l = result.getVisibleColumnCount(); i < l;) {
String n = result.getColumnName(i);
Column col = new Column(n, result.getColumnType(i), this, ++i);
columnList.add(col);
columnMap.put(n, col);
}
} else if (columnList.isEmpty()) {
// alternative solution
ResultSetMetaData rsMeta = rs.getMetaData();
for (int i = 0; i < rsMeta.getColumnCount();) {
for (int i = 0, l = rsMeta.getColumnCount(); i < l;) {
String n = rsMeta.getColumnName(i + 1);
n = convertColumnName(n);
int sqlType = rsMeta.getColumnType(i + 1);
Expand Down
7 changes: 5 additions & 2 deletions h2/src/test/org/h2/test/db/TestLinkedTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -703,14 +703,17 @@ private void testGeometry() throws SQLException {
Connection cb = DriverManager.getConnection("jdbc:h2:mem:two", "sa", "sa");
Statement sa = ca.createStatement();
Statement sb = cb.createStatement();
sa.execute("CREATE TABLE TEST(ID SERIAL, the_geom geometry)");
sa.execute("INSERT INTO TEST(THE_GEOM) VALUES('POINT (1 1)')");
sa.execute("CREATE TABLE TEST(ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,"
+ " THE_GEOM GEOMETRY, THE_GEOM_2 GEOMETRY(POINT, 4326))");
sa.execute("INSERT INTO TEST(THE_GEOM, THE_GEOM_2) VALUES"
+ " (GEOMETRY 'POINT (1 1)', GEOMETRY 'SRID=4326;POINT(2 2)')");
String sql = "CREATE LINKED TABLE T(NULL, " +
"'jdbc:h2:mem:one', 'sa', 'sa', 'TEST') READONLY";
sb.execute(sql);
try (ResultSet rs = sb.executeQuery("SELECT * FROM T")) {
assertTrue(rs.next());
assertEquals("POINT (1 1)", rs.getString("THE_GEOM"));
assertEquals("SRID=4326;POINT (2 2)", rs.getString("THE_GEOM_2"));
}
sb.execute("DROP TABLE T");
ca.close();
Expand Down

0 comments on commit 4a2e677

Please sign in to comment.