Skip to content

Commit 81db005

Browse files
committed
[mssql] Fix single geometry types are added to multi geometry type layers
Fixes #10793
1 parent a86c683 commit 81db005

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

src/providers/mssql/qgsmssqlprovider.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,6 +1073,10 @@ bool QgsMssqlProvider::addFeatures( QgsFeatureList &flist, Flags flags )
10731073
if ( !mGeometryColName.isEmpty() )
10741074
{
10751075
QgsGeometry geom = it->geometry();
1076+
if ( QgsWkbTypes::isMultiType( mWkbType ) && !geom.isMultipart() )
1077+
{
1078+
geom.convertToMultiType();
1079+
}
10761080
if ( mUseWkb )
10771081
{
10781082
QByteArray bytea = geom.asWkb();

tests/src/python/test_provider_mssql.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
QgsVectorLayer,
2121
QgsFeatureRequest,
2222
QgsFeature,
23-
QgsFields,
23+
QgsWkbTypes,
2424
QgsField,
2525
QgsGeometry,
2626
QgsPointXY,
@@ -197,6 +197,7 @@ def testCreateLayer(self):
197197

198198
new_layer = QgsVectorLayer(uri, 'new', 'mssql')
199199
self.assertTrue(new_layer.isValid())
200+
self.assertEqual(new_layer.wkbType(), QgsWkbTypes.Point)
200201
self.assertEqual([f.name() for f in new_layer.fields()], ['qgs_fid', 'id', 'fldtxt', 'fldint'])
201202

202203
features = [f.attributes() for f in new_layer.getFeatures()]
@@ -208,7 +209,7 @@ def testCreateLayer(self):
208209
self.assertEqual(geom, ['Point (1 2)', '', 'Point (3 2)', 'Point (4 3)'])
209210

210211
def testCreateLayerMultiPoint(self):
211-
layer = QgsVectorLayer("MultiPoint?field=id:integer&field=fldtxt:string&field=fldint:integer",
212+
layer = QgsVectorLayer("MultiPoint?crs=epsg:3111&field=id:integer&field=fldtxt:string&field=fldint:integer",
212213
"addfeat", "memory")
213214
pr = layer.dataProvider()
214215
f = QgsFeature()
@@ -222,11 +223,13 @@ def testCreateLayerMultiPoint(self):
222223
pr.addFeatures([f, f2, f3])
223224

224225
uri = '{} table="qgis_test"."new_table_multipoint" sql='.format(self.dbconn)
225-
error, message = QgsVectorLayerExporter.exportLayer(layer, uri, 'mssql', QgsCoordinateReferenceSystem('EPSG:4326'))
226+
error, message = QgsVectorLayerExporter.exportLayer(layer, uri, 'mssql', QgsCoordinateReferenceSystem('EPSG:3111'))
226227
self.assertEqual(error, QgsVectorLayerExporter.NoError)
227228

228229
new_layer = QgsVectorLayer(uri, 'new', 'mssql')
229230
self.assertTrue(new_layer.isValid())
231+
self.assertEqual(new_layer.wkbType(), QgsWkbTypes.MultiPoint)
232+
self.assertEqual(new_layer.crs().authid(), 'EPSG:3111')
230233
self.assertEqual([f.name() for f in new_layer.fields()], ['qgs_fid', 'id', 'fldtxt', 'fldint'])
231234

232235
features = [f.attributes() for f in new_layer.getFeatures()]
@@ -236,6 +239,34 @@ def testCreateLayerMultiPoint(self):
236239
geom = [f.geometry().asWkt() for f in new_layer.getFeatures()]
237240
self.assertEqual(geom, ['MultiPoint ((1 2),(3 4))', '', 'MultiPoint ((7 8))'])
238241

242+
def testInsertPolygonInMultiPolygon(self):
243+
layer = QgsVectorLayer("MultiPolygon?crs=epsg:4326&field=id:integer", "addfeat", "memory")
244+
pr = layer.dataProvider()
245+
f = QgsFeature()
246+
f.setAttributes([1])
247+
f.setGeometry(QgsGeometry.fromWkt('MultiPolygon(((0 0, 1 0, 1 1, 0 1, 0 0)),((10 0, 11 0, 11 1, 10 1, 10 0)))'))
248+
pr.addFeatures([f])
249+
250+
uri = '{} table="qgis_test"."new_table_multipolygon" sql='.format(self.dbconn)
251+
error, message = QgsVectorLayerExporter.exportLayer(layer, uri, 'mssql', QgsCoordinateReferenceSystem('EPSG:4326'))
252+
self.assertEqual(error, QgsVectorLayerExporter.NoError)
253+
254+
new_layer = QgsVectorLayer(uri, 'new', 'mssql')
255+
self.assertTrue(new_layer.isValid())
256+
self.assertEqual(new_layer.wkbType(), QgsWkbTypes.MultiPolygon)
257+
geom = [f.geometry().asWkt() for f in new_layer.getFeatures()]
258+
self.assertEqual(geom, ['MultiPolygon (((0 0, 1 0, 1 1, 0 1, 0 0)),((10 0, 11 0, 11 1, 10 1, 10 0)))'])
259+
260+
# add single part
261+
f2 = QgsFeature()
262+
f2.setAttributes([2])
263+
f2.setGeometry(QgsGeometry.fromWkt('Polygon((30 0, 31 0, 31 1, 30 1, 30 0))'))
264+
self.assertTrue(new_layer.dataProvider().addFeatures([f2]))
265+
266+
# should become multipart
267+
geom = [f.geometry().asWkt() for f in new_layer.getFeatures()]
268+
self.assertEqual(geom, ['MultiPolygon (((0 0, 1 0, 1 1, 0 1, 0 0)),((10 0, 11 0, 11 1, 10 1, 10 0)))', 'MultiPolygon (((30 0, 31 0, 31 1, 30 1, 30 0)))'])
269+
239270

240271
if __name__ == '__main__':
241272
unittest.main()

0 commit comments

Comments
 (0)