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);