This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit f80bece056ab2a9df3f5fb282bd8b3bf9ecbe778
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Mon Dec 27 19:49:56 2021 +0100

    Fix a test failure caused by the upgrade of PostgreSQL JDBC driver version.
    The driver now reports ""public"."geometry"" (including inner quotes) as 
the object type instead of "geometry".
---
 .../apache/sis/internal/sql/feature/Column.java    | 29 +++++++++++++++++++---
 .../sis/internal/sql/feature/QueryAnalyzer.java    |  3 ++-
 .../sis/internal/sql/feature/TableAnalyzer.java    |  3 ++-
 3 files changed, 29 insertions(+), 6 deletions(-)

diff --git 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Column.java
 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Column.java
index c2f75ab..1ec8fbe 100644
--- 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Column.java
+++ 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Column.java
@@ -133,14 +133,15 @@ public final class Column {
      *
      * @param  analyzer  the analyzer which is creating this column.
      * @param  metadata  the result of {@code DatabaseMetaData.getColumns(…)}.
+     * @param  quote     value of {@code 
DatabaseMetaData.getIdentifierQuoteString()}.
      * @throws SQLException if an error occurred while fetching metadata.
      *
      * @see DatabaseMetaData#getColumns(String, String, String, String)
      */
-    Column(final Analyzer analyzer, final ResultSet metadata) throws 
SQLException {
+    Column(final Analyzer analyzer, final ResultSet metadata, final String 
quote) throws SQLException {
         label = name = analyzer.getUniqueString(metadata, 
Reflection.COLUMN_NAME);
         type         = metadata.getInt(Reflection.DATA_TYPE);
-        typeName     = metadata.getString(Reflection.TYPE_NAME);
+        typeName     = localPart(metadata.getString(Reflection.TYPE_NAME), 
quote);
         precision    = metadata.getInt(Reflection.COLUMN_SIZE);
         isNullable   = 
Boolean.TRUE.equals(SQLUtilities.parseBoolean(metadata.getString(Reflection.IS_NULLABLE)));
         propertyName = label;
@@ -150,21 +151,41 @@ public final class Column {
      * Creates a new column from the result of a query.
      *
      * @param  metadata  value of {@link ResultSet#getMetaData()}.
+     * @param  column    index of the column for which to get metadata.
+     * @param  quote     value of {@code 
DatabaseMetaData.getIdentifierQuoteString()}.
      * @throws SQLException if an error occurred while fetching metadata.
      *
      * @see ResultSet#getMetaData()
      */
-    Column(final ResultSetMetaData metadata, final int column) throws 
SQLException {
+    Column(final ResultSetMetaData metadata, final int column, final String 
quote) throws SQLException {
         name         = metadata.getColumnName(column);
         label        = metadata.getColumnLabel(column);
         type         = metadata.getColumnType(column);
-        typeName     = metadata.getColumnTypeName(column);
+        typeName     = localPart(metadata.getColumnTypeName(column), quote);
         precision    = metadata.getPrecision(column);
         isNullable   = metadata.isNullable(column) == 
ResultSetMetaData.columnNullable;
         propertyName = label;
     }
 
     /**
+     * PostgreSQL JDBC drivers sometime gives the fully qualified type name.
+     * For example we sometime get {@code "public"."geometry"} (including the 
quotes)
+     * instead of a plain {@code geometry}. If this is the case, keep only the 
local part.
+     */
+    private static String localPart(String type, final String quote) {
+        if (type != null && quote != null) {
+            int end = type.lastIndexOf(quote);
+            if (end >= 0) {
+                int start = type.lastIndexOf(quote, end - 1);
+                if (start >= 0 && end > (start += quote.length())) {
+                    type = type.substring(start, end);
+                }
+            }
+        }
+        return type;
+    }
+
+    /**
      * Modifies this column for declaring it as a geometry or raster column.
      * This method is invoked during inspection of the {@code 
"GEOMETRY_COLUMNS"} table of a spatial database.
      * It can also be invoked during the inspection of {@code 
"GEOGRAPHY_COLUMNS"} or {@code "RASTER_COLUMNS"}
diff --git 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/QueryAnalyzer.java
 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/QueryAnalyzer.java
index ec638ea..371ea5d 100644
--- 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/QueryAnalyzer.java
+++ 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/QueryAnalyzer.java
@@ -75,12 +75,13 @@ final class QueryAnalyzer extends FeatureAnalyzer {
          * Get the list of all columns in the query. We do that now because we 
will need this list
          * for finding primary keys (below) and also before 
`getForeignerKeys(…)` can be executed.
          */
+        final String quote = analyzer.metadata.getIdentifierQuoteString();
         try (PreparedStatement stmt = 
analyzer.metadata.getConnection().prepareStatement(query)) {
             final ResultSetMetaData meta = stmt.getMetaData();
             columns = new Column[meta.getColumnCount()];
             columnsPerTable = new HashMap<>();
             for (int i=1; i <= columns.length; i++) {
-                final Column column = new Column(meta, i);
+                final Column column = new Column(meta, i, quote);
                 columns[i-1] = column;
                 /*
                  * In order to identify geometry columns, we need to know the 
table where the column come from.
diff --git 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java
 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java
index 8b2b415..b8b4387 100644
--- 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java
+++ 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java
@@ -157,9 +157,10 @@ final class TableAnalyzer extends FeatureAnalyzer {
          * needs to be invoked before to invoke `database.getMapping(column)`.
          */
         final Map<String,Column> columns = new LinkedHashMap<>();
+        final String quote = analyzer.metadata.getIdentifierQuoteString();
         try (ResultSet reflect = analyzer.metadata.getColumns(id.catalog, 
schemaEsc, tableEsc, null)) {
             while (reflect.next()) {
-                final Column column = new Column(analyzer, reflect);
+                final Column column = new Column(analyzer, reflect, quote);
                 if (columns.put(column.name, column) != null) {
                     throw duplicatedColumn(column);
                 }

Reply via email to