You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2018/12/21 20:27:19 UTC
[geode] branch feature/GEODE-6225 updated: test now creates the
same table in a schema and the meta data code now works with this. Added
code to work around a bug in postgreSQL.
This is an automated email from the ASF dual-hosted git repository.
dschneider pushed a commit to branch feature/GEODE-6225
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/feature/GEODE-6225 by this push:
new adfa447 test now creates the same table in a schema and the meta data code now works with this. Added code to work around a bug in postgreSQL.
adfa447 is described below
commit adfa4471398ed70dc291903f8c90e8dac0c7a5f9
Author: Darrel Schneider <ds...@pivotal.io>
AuthorDate: Fri Dec 21 12:26:15 2018 -0800
test now creates the same table in a schema and the meta data code now works with this.
Added code to work around a bug in postgreSQL.
---
.../connectors/jdbc/JdbcWriterIntegrationTest.java | 11 +++++++
.../jdbc/internal/TableMetaDataManager.java | 36 ++++++++++++++--------
.../jdbc/internal/TableMetaDataManagerTest.java | 27 ++++++++++++++++
3 files changed, 62 insertions(+), 12 deletions(-)
diff --git a/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/JdbcWriterIntegrationTest.java b/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/JdbcWriterIntegrationTest.java
index 7e56456..7a7ae0f 100644
--- a/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/JdbcWriterIntegrationTest.java
+++ b/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/JdbcWriterIntegrationTest.java
@@ -75,6 +75,15 @@ public abstract class JdbcWriterIntegrationTest {
.writeInt("age", 21).create();
employee1 = (Employee) pdx1.getObject();
employee2 = (Employee) pdx2.getObject();
+ createTableInUnusedSchema();
+ }
+
+ private void createTableInUnusedSchema() throws SQLException {
+ Connection connection2 = getConnection();
+ statement.execute("Create Schema unusedSchema");
+ statement = connection2.createStatement();
+ statement.execute("Create Table " + "unusedSchema." + REGION_TABLE_NAME
+ + " (id varchar(10) primary key not null, name varchar(10), age int)");
}
private void setupRegion(String ids) throws RegionMappingExistsException {
@@ -99,6 +108,8 @@ public abstract class JdbcWriterIntegrationTest {
}
if (statement != null) {
statement.execute("Drop table " + REGION_TABLE_NAME);
+ statement.execute("Drop table unusedSchema." + REGION_TABLE_NAME);
+ statement.execute("Drop schema unusedSchema");
statement.close();
}
if (connection != null) {
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java
index b8971ef..77ab650 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java
@@ -50,15 +50,21 @@ public class TableMetaDataManager {
TableMetaData result;
try {
DatabaseMetaData metaData = connection.getMetaData();
- try (ResultSet tables = metaData.getTables(DEFAULT_CATALOG, DEFAULT_SCHEMA, "%", null)) {
+ String catalogFilter = DEFAULT_CATALOG;
+ String schemaFilter = DEFAULT_SCHEMA;
+ if ("PostgreSQL".equals(metaData.getDatabaseProductName())) {
+ schemaFilter = "public";
+ }
+ try (ResultSet tables = metaData.getTables(catalogFilter, schemaFilter, "%", null)) {
String realTableName = getTableNameFromMetaData(tableName, tables);
- List<String> keys = getPrimaryKeyColumnNamesFromMetaData(realTableName, metaData, ids);
+ List<String> keys = getPrimaryKeyColumnNamesFromMetaData(realTableName, metaData,
+ catalogFilter, schemaFilter, ids);
String quoteString = metaData.getIdentifierQuoteString();
if (quoteString == null) {
quoteString = "";
}
result = new TableMetaData(realTableName, keys, quoteString);
- getDataTypesFromMetaData(realTableName, metaData, result);
+ getDataTypesFromMetaData(realTableName, metaData, catalogFilter, schemaFilter, result);
}
} catch (SQLException e) {
throw JdbcConnectorException.createException(e);
@@ -69,18 +75,24 @@ public class TableMetaDataManager {
private String getTableNameFromMetaData(String tableName, ResultSet tables) throws SQLException {
String result = null;
int inexactMatches = 0;
+ int exactMatches = 0;
while (tables.next()) {
String name = tables.getString("TABLE_NAME");
if (name.equals(tableName)) {
- return name;
+ exactMatches++;
+ result = name;
} else if (name.equalsIgnoreCase(tableName)) {
inexactMatches++;
result = name;
}
}
- if (inexactMatches > 1) {
+ if (exactMatches == 1) {
+ return result;
+ }
+
+ if (inexactMatches > 1 || exactMatches > 1) {
throw new JdbcConnectorException("Duplicate tables that match region name");
}
@@ -91,7 +103,7 @@ public class TableMetaDataManager {
}
private List<String> getPrimaryKeyColumnNamesFromMetaData(String tableName,
- DatabaseMetaData metaData,
+ DatabaseMetaData metaData, String catalogFilter, String schemaFilter,
String ids)
throws SQLException {
List<String> keys = new ArrayList<>();
@@ -99,12 +111,12 @@ public class TableMetaDataManager {
if (ids != null && !ids.isEmpty()) {
keys.addAll(Arrays.asList(ids.split(",")));
for (String key : keys) {
- checkColumnExistsInTable(tableName, metaData, key);
+ checkColumnExistsInTable(tableName, metaData, catalogFilter, schemaFilter, key);
}
} else {
try (
ResultSet primaryKeys =
- metaData.getPrimaryKeys(DEFAULT_CATALOG, DEFAULT_SCHEMA, tableName)) {
+ metaData.getPrimaryKeys(catalogFilter, schemaFilter, tableName)) {
while (primaryKeys.next()) {
String key = primaryKeys.getString("COLUMN_NAME");
keys.add(key);
@@ -119,9 +131,9 @@ public class TableMetaDataManager {
}
private void getDataTypesFromMetaData(String tableName, DatabaseMetaData metaData,
- TableMetaData result) throws SQLException {
+ String catalogFilter, String schemaFilter, TableMetaData result) throws SQLException {
try (ResultSet columnData =
- metaData.getColumns(DEFAULT_CATALOG, DEFAULT_SCHEMA, tableName, "%")) {
+ metaData.getColumns(catalogFilter, schemaFilter, tableName, "%")) {
while (columnData.next()) {
String columnName = columnData.getString("COLUMN_NAME");
int dataType = columnData.getInt("DATA_TYPE");
@@ -131,10 +143,10 @@ public class TableMetaDataManager {
}
private void checkColumnExistsInTable(String tableName, DatabaseMetaData metaData,
- String columnName) throws SQLException {
+ String catalogFilter, String schemaFilter, String columnName) throws SQLException {
int caseInsensitiveMatches = 0;
try (ResultSet columnData =
- metaData.getColumns(DEFAULT_CATALOG, DEFAULT_SCHEMA, tableName, "%")) {
+ metaData.getColumns(catalogFilter, schemaFilter, tableName, "%")) {
while (columnData.next()) {
String realColumnName = columnData.getString("COLUMN_NAME");
if (columnName.equals(realColumnName)) {
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java
index 9ce9874..a3156a4 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java
@@ -83,6 +83,19 @@ public class TableMetaDataManagerTest {
assertThat(data.getKeyColumnNames()).isEqualTo(Arrays.asList(KEY_COLUMN, KEY_COLUMN2));
verify(connection).getMetaData();
+ verify(databaseMetaData).getTables("", "", "%", null);
+ }
+
+ @Test
+ public void verifyPostgreUsesPublicSchemaByDefault() throws Exception {
+ setupCompositePrimaryKeysMetaData();
+ when(databaseMetaData.getDatabaseProductName()).thenReturn("PostgreSQL");
+
+ TableMetaDataView data = tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, "");
+
+ assertThat(data.getKeyColumnNames()).isEqualTo(Arrays.asList(KEY_COLUMN, KEY_COLUMN2));
+ verify(connection).getMetaData();
+ verify(databaseMetaData).getTables("", "public", "%", null);
}
@@ -271,6 +284,20 @@ public class TableMetaDataManagerTest {
}
@Test
+ public void throwsExceptionWhenTwoTablesHaveExactSameName() throws Exception {
+ setupPrimaryKeysMetaData();
+ when(primaryKeysResultSet.next()).thenReturn(true).thenReturn(false);
+ when(tablesResultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
+
+ when(tablesResultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME).thenReturn(TABLE_NAME);
+
+ assertThatThrownBy(
+ () -> tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, null))
+ .isInstanceOf(JdbcConnectorException.class)
+ .hasMessage("Duplicate tables that match region name");
+ }
+
+ @Test
public void throwsExceptionWhenNoPrimaryKeyInTable() throws Exception {
setupPrimaryKeysMetaData();
when(primaryKeysResultSet.next()).thenReturn(false);