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