@@ -324,7 +324,7 @@ bool QgsPostgresConn::getTableInfo( bool searchGeometryColumnsOnly, bool searchP
324
324
325
325
mLayersSupported .clear ();
326
326
327
- for ( int i = 0 ; i < (hasTopology () ? 3 : 2 ); i++ )
327
+ for ( int i = 0 ; i < ( hasTopology () ? 3 : 2 ); i++ )
328
328
{
329
329
QString sql, tableName, schemaName, columnName, typeName, sridName, gtableName;
330
330
QgsPostgresGeometryColumnType columnType = sctGeometry;
@@ -727,7 +727,7 @@ QString QgsPostgresConn::postgisVersion()
727
727
if ( mPostgisVersionMajor > 1 )
728
728
{
729
729
QgsPostgresResult result = PQexec ( " SELECT EXISTS ( SELECT c.oid FROM pg_class AS c JOIN pg_namespace AS n ON c.relnamespace=n.oid WHERE n.nspname='topology' AND c.relname='topology' )" );
730
- if ( result.PQntuples () >= 1 && result.PQgetvalue (0 , 0 ) == " t" )
730
+ if ( result.PQntuples () >= 1 && result.PQgetvalue ( 0 , 0 ) == " t" )
731
731
{
732
732
mTopologyAvailable = true ;
733
733
}
@@ -1137,14 +1137,9 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
1137
1137
QGis::WkbType type = layerProperty.types .value ( 0 , QGis::WKBUnknown );
1138
1138
if ( type == QGis::WKBUnknown )
1139
1139
{
1140
- query += QString ( " CASE"
1141
- " WHEN %1 THEN 'POINT'"
1142
- " WHEN %2 THEN 'LINESTRING'"
1143
- " WHEN %3 THEN 'POLYGON'"
1144
- " END" )
1145
- .arg ( postgisTypeFilter ( layerProperty.geometryColName , QGis::WKBPoint, layerProperty.geometryColType == sctGeography ) )
1146
- .arg ( postgisTypeFilter ( layerProperty.geometryColName , QGis::WKBLineString, layerProperty.geometryColType == sctGeography ) )
1147
- .arg ( postgisTypeFilter ( layerProperty.geometryColName , QGis::WKBPolygon, layerProperty.geometryColType == sctGeography ) );
1140
+ query += QString ( " upper(geometrytype(%1%2))" )
1141
+ .arg ( quotedIdentifier ( layerProperty.geometryColName ) )
1142
+ .arg ( layerProperty.geometryColType == sctGeography ? " ::geometry" : " " );
1148
1143
}
1149
1144
else
1150
1145
{
@@ -1181,7 +1176,30 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
1181
1176
if ( type.isEmpty () )
1182
1177
continue ;
1183
1178
1184
- layerProperty.types << QgsPostgresConn::wkbTypeFromPostgis ( type );
1179
+ // if both multi and single types exists, go for the multi type,
1180
+ // so that st_multi can be applied if necessary.
1181
+ QGis::WkbType wkbType0 = QGis::flatType ( QgsPostgresConn::wkbTypeFromPostgis ( type ) );
1182
+ QGis::WkbType multiType0 = QGis::multiType ( wkbType0 );
1183
+
1184
+ int j;
1185
+ for ( j = 0 ; j < layerProperty.size (); j++ )
1186
+ {
1187
+ if ( layerProperty.srids [j] != srid.toInt () )
1188
+ continue ;
1189
+
1190
+ QGis::WkbType wkbType1 = layerProperty.types [j];
1191
+ QGis::WkbType multiType1 = QGis::multiType ( wkbType1 );
1192
+ if ( multiType0 == multiType1 && wkbType0 != wkbType1 )
1193
+ {
1194
+ layerProperty.types [j] = multiType0;
1195
+ break ;
1196
+ }
1197
+ }
1198
+
1199
+ if ( j < layerProperty.size () )
1200
+ break ;
1201
+
1202
+ layerProperty.types << wkbType0;
1185
1203
layerProperty.srids << srid.toInt ();
1186
1204
}
1187
1205
}
@@ -1271,7 +1289,7 @@ QString QgsPostgresConn::postgisTypeFilter( QString geomCol, QGis::WkbType geomT
1271
1289
case QGis::WKBPolygon25D:
1272
1290
case QGis::WKBMultiPolygon:
1273
1291
case QGis::WKBMultiPolygon25D:
1274
- return QString ( " upper(geometrytype(%1)) IN ('POLYGON','MULTIPOLYGON','POLYGONM','MULTIPOLYGONM', 'POLYHEDRALSURFACE', 'TIN')" ).arg ( geomCol );
1292
+ return QString ( " upper(geometrytype(%1)) IN ('POLYGON','MULTIPOLYGON','POLYGONM','MULTIPOLYGONM','POLYHEDRALSURFACE','TIN')" ).arg ( geomCol );
1275
1293
case QGis::WKBNoGeometry:
1276
1294
return QString ( " geometrytype(%1) IS NULL" ).arg ( geomCol );
1277
1295
case QGis::WKBUnknown:
0 commit comments