Skip to content

Commit efa7f99

Browse files
authoredMay 31, 2018
Merge pull request #7132 from rouault/fix_19077_bis
[OGR provider] Avoid attribute table to be empty on OGR layer with mixed geom types (fixes #19077)
2 parents 0cffd19 + 2969ba1 commit efa7f99

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed
 

‎src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
9292
return;
9393
}
9494

95-
mFetchGeometry = ( !mFilterRect.isNull() ) || !( mRequest.flags() & QgsFeatureRequest::NoGeometry );
95+
mFetchGeometry = ( !mFilterRect.isNull() ) ||
96+
!( mRequest.flags() & QgsFeatureRequest::NoGeometry ) ||
97+
( mSource->mOgrGeometryTypeFilter != wkbUnknown );
98+
9699
QgsAttributeList attrs = ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes ) ? mRequest.subsetOfAttributes() : mSource->mFields.allAttributesList();
97100

98101
// ensure that all attributes required for expression filter are being fetched

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,7 @@ static OGRwkbGeometryType ogrWkbGeometryTypeFromName( const QString &typeName )
661661
else if ( typeName == QLatin1String( "MultiLineString25D" ) ) return wkbMultiLineString25D;
662662
else if ( typeName == QLatin1String( "MultiPolygon25D" ) ) return wkbMultiPolygon25D;
663663
else if ( typeName == QLatin1String( "GeometryCollection25D" ) ) return wkbGeometryCollection25D;
664+
QgsDebugMsg( QStringLiteral( "unknown geometry type: %1" ).arg( typeName ) );
664665
return wkbUnknown;
665666
}
666667

‎tests/src/python/test_provider_ogr_gpkg.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -841,8 +841,11 @@ def testCreateSpatialIndex(self):
841841
def testSubSetStringEditable_bug17795(self):
842842
"""Test that a layer is not editable after setting a subset and it's reverted to editable after the filter is removed"""
843843

844+
tmpfile = os.path.join(self.basetestpath, 'testSubSetStringEditable_bug17795.gpkg')
845+
shutil.copy(TEST_DATA_DIR + '/' + 'provider/bug_17795.gpkg', tmpfile)
846+
844847
isEditable = QgsVectorDataProvider.ChangeAttributeValues
845-
testPath = TEST_DATA_DIR + '/' + 'provider/bug_17795.gpkg|layername=bug_17795'
848+
testPath = tmpfile + '|layername=bug_17795'
846849

847850
vl = QgsVectorLayer(testPath, 'subset_test', 'ogr')
848851
self.assertTrue(vl.isValid())
@@ -868,7 +871,10 @@ def testSubsetStringExtent_bug17863(self):
868871
def _lessdigits(s):
869872
return re.sub(r'(\d+\.\d{3})\d+', r'\1', s)
870873

871-
testPath = TEST_DATA_DIR + '/' + 'provider/bug_17795.gpkg|layername=bug_17795'
874+
tmpfile = os.path.join(self.basetestpath, 'testSubsetStringExtent_bug17863.gpkg')
875+
shutil.copy(TEST_DATA_DIR + '/' + 'provider/bug_17795.gpkg', tmpfile)
876+
877+
testPath = tmpfile + '|layername=bug_17795'
872878
subSetString = '"name" = \'int\''
873879
subSet = '|layername=bug_17795|subset=%s' % subSetString
874880

@@ -897,6 +903,32 @@ def _lessdigits(s):
897903
self.assertEqual(_lessdigits(subSet_vl.extent().toString()), filtered_extent)
898904
self.assertNotEqual(_lessdigits(subSet_vl.extent().toString()), unfiltered_extent)
899905

906+
def testRequestWithoutGeometryOnLayerMixedGeometry(self):
907+
""" Test bugfix for https://issues.qgis.org/issues/19077 """
908+
909+
# Issue is more a generic one of the OGR provider, but easy to trigger with GPKG
910+
911+
tmpfile = os.path.join(self.basetestpath, 'testRequestWithoutGeometryOnLayerMixedGeometry.gpkg')
912+
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
913+
lyr = ds.CreateLayer('test', geom_type=ogr.wkbUnknown, options=['SPATIAL_INDEX=NO'])
914+
f = ogr.Feature(lyr.GetLayerDefn())
915+
f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)'))
916+
lyr.CreateFeature(f)
917+
f = ogr.Feature(lyr.GetLayerDefn())
918+
f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 0)'))
919+
lyr.CreateFeature(f)
920+
f = ogr.Feature(lyr.GetLayerDefn())
921+
f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 0)'))
922+
lyr.CreateFeature(f)
923+
f = None
924+
ds = None
925+
926+
vl = QgsVectorLayer(u'{}'.format(tmpfile) + "|geometrytype=Point|layername=" + "test", 'test', u'ogr')
927+
self.assertTrue(vl.isValid())
928+
request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
929+
features = [f for f in vl.getFeatures(request)]
930+
self.assertEqual(len(features), 1)
931+
900932

901933
if __name__ == '__main__':
902934
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.