From eaf5725f569fab62a67a51c0b0bddbb6a44797a2 Mon Sep 17 00:00:00 2001 From: "Juergen E. Fischer" Date: Sat, 25 Jan 2014 00:59:30 +0100 Subject: [PATCH] postgres provider: don't try to detect geometry type or srid, if it's already known (fixes #9421) --- src/providers/postgres/qgspostgresconn.cpp | 50 +++++++++++++------ .../postgres/qgspostgresfeatureiterator.cpp | 4 +- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/providers/postgres/qgspostgresconn.cpp b/src/providers/postgres/qgspostgresconn.cpp index cdf7e20e4c7..e4a5ccafe7d 100644 --- a/src/providers/postgres/qgspostgresconn.cpp +++ b/src/providers/postgres/qgspostgresconn.cpp @@ -1132,21 +1132,41 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert table += QString( " WHERE %1" ).arg( layerProperty.sql ); } - QString query = QString( "SELECT DISTINCT" - " CASE" - " WHEN %1 THEN 'POINT'" - " WHEN %2 THEN 'LINESTRING'" - " WHEN %3 THEN 'POLYGON'" - " END," - " %4(%5%6)" - " FROM %7" ) - .arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPoint, layerProperty.geometryColType == sctGeography ) ) - .arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBLineString, layerProperty.geometryColType == sctGeography ) ) - .arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPolygon, layerProperty.geometryColType == sctGeography ) ) - .arg( majorVersion() < 2 ? "srid" : "st_srid" ) - .arg( quotedIdentifier( layerProperty.geometryColName ) ) - .arg( layerProperty.geometryColType == sctGeography ? "::geometry" : "" ) - .arg( table ); + QString query = "SELECT DISTINCT "; + + QGis::WkbType type = layerProperty.types.value( 0, QGis::WKBUnknown ); + if ( type == QGis::WKBUnknown ) + { + query += QString( "CASE" + " WHEN %1 THEN 'POINT'" + " WHEN %2 THEN 'LINESTRING'" + " WHEN %3 THEN 'POLYGON'" + " END" ) + .arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPoint, layerProperty.geometryColType == sctGeography ) ) + .arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBLineString, layerProperty.geometryColType == sctGeography ) ) + .arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPolygon, layerProperty.geometryColType == sctGeography ) ); + } + else + { + query += quotedValue( QgsPostgresConn::postgisWkbTypeName( type ) ); + } + + query += ","; + + int srid = layerProperty.srids.value( 0, INT_MIN ); + if ( srid == INT_MIN ) + { + query += QString( "%1(%2%3)" ) + .arg( majorVersion() < 2 ? "srid" : "st_srid" ) + .arg( quotedIdentifier( layerProperty.geometryColName ) ) + .arg( layerProperty.geometryColType == sctGeography ? "::geometry" : "" ); + } + else + { + query += QString::number( srid ); + } + + query += " FROM " + table; QgsDebugMsg( "Retrieving geometry types: " + query ); diff --git a/src/providers/postgres/qgspostgresfeatureiterator.cpp b/src/providers/postgres/qgspostgresfeatureiterator.cpp index 7cd4809c699..162390f7002 100644 --- a/src/providers/postgres/qgspostgresfeatureiterator.cpp +++ b/src/providers/postgres/qgspostgresfeatureiterator.cpp @@ -305,7 +305,7 @@ bool QgsPostgresFeatureIterator::declareCursor( const QString& whereClause ) { QString simplifyFunctionName = simplifyMethod.methodType() == QgsSimplifyMethod::OptimizeForRendering ? ( P->mConnectionRO->majorVersion() < 2 ? "simplify" : "st_simplify" ) - : ( P->mConnectionRO->majorVersion() < 2 ? "simplifypreservetopology" : "st_simplifypreservetopology" ); + : ( P->mConnectionRO->majorVersion() < 2 ? "simplifypreservetopology" : "st_simplifypreservetopology" ); double tolerance = simplifyMethod.tolerance() * 0.8; //-> Default factor for the maximum displacement distance for simplification, similar as GeoServer does simplifyGeometry = simplifyMethod.methodType() == QgsSimplifyMethod::OptimizeForRendering; @@ -635,7 +635,7 @@ bool QgsPostgresFeatureIterator::getFeature( QgsPostgresResult &queryResult, int geometry = QgsGeometry::fromPolyline( polyline ); feature.setGeometry( geometry ); - } + } } } }