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 <[email protected]>
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);

Reply via email to