diff --git a/src/providers/ogr/qgsogrfeatureiterator.cpp b/src/providers/ogr/qgsogrfeatureiterator.cpp index 4ce78d7bb0c..04fef288c1b 100644 --- a/src/providers/ogr/qgsogrfeatureiterator.cpp +++ b/src/providers/ogr/qgsogrfeatureiterator.cpp @@ -176,6 +176,7 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool OGR_L_SetAttributeFilter( ogrLayer, nullptr ); } + //start with first feature rewind(); } diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index ac7953f14d3..4da8a7b43f4 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -1022,7 +1022,11 @@ void QgsOgrProviderUtils::setRelevantFields( OGRLayerH ogrLayer, int fieldCount, if ( !fetchAttributes.contains( i ) ) { // add to ignored fields - ignoredFields.append( OGR_Fld_GetNameRef( OGR_FD_GetFieldDefn( featDefn, firstAttrIsFid ? i - 1 : i ) ) ); + const char *fieldName = OGR_Fld_GetNameRef( OGR_FD_GetFieldDefn( featDefn, firstAttrIsFid ? i - 1 : i ) ); + if ( qstrcmp( fieldName, "orig_ogc_fid" ) != 0 ) + { + ignoredFields.append( fieldName ); + } } } diff --git a/tests/src/python/test_provider_ogr_sqlite.py b/tests/src/python/test_provider_ogr_sqlite.py index f4d5e07ef4f..5e573161d2f 100644 --- a/tests/src/python/test_provider_ogr_sqlite.py +++ b/tests/src/python/test_provider_ogr_sqlite.py @@ -254,6 +254,18 @@ class TestPyQgsOGRProviderSqlite(unittest.TestCase): self.assertTrue(it.nextFeature(f)) self.assertTrue(f.id() == 5) + # Ensure that orig_ogc_fid is still retrieved even if attribute subset is passed + req = QgsFeatureRequest() + req.setSubsetOfAttributes([]) + it = vl.getFeatures(req) + ids = [] + while it.nextFeature(f): + ids.append(f.id()) + self.assertTrue(len(ids) == 3) + self.assertTrue(3 in ids) + self.assertTrue(4 in ids) + self.assertTrue(5 in ids) + # Check that subset string is correctly set on reload vl.reload() self.assertTrue(vl.fields().at(vl.fields().count() - 1).name() == "orig_ogc_fid")