diff --git a/src/providers/ogr/qgsogrfeatureiterator.cpp b/src/providers/ogr/qgsogrfeatureiterator.cpp index 314792b2534f..04fef288c1bd 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(); } @@ -346,7 +347,12 @@ bool QgsOgrFeatureIterator::readFeature( OGRFeatureH fet, QgsFeature &feature ) { if ( mOrigFidAdded ) { - feature.setId( OGR_F_GetFieldAsInteger64( fet, 0 ) ); + OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( ogrLayer ); + int lastField = OGR_FD_GetFieldCount( fdef ) - 1; + if ( lastField >= 0 ) + feature.setId( OGR_F_GetFieldAsInteger64( fet, lastField ) ); + else + feature.setId( OGR_F_GetFID( fet ) ); } else { diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index 4a4fdb0550b6..1f9bc22e2147 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -88,6 +88,8 @@ static const QString TEXT_PROVIDER_DESCRIPTION = static OGRwkbGeometryType ogrWkbGeometryTypeFromName( const QString &typeName ); +static const QByteArray ORIG_OGC_FID = "orig_ogc_fid"; + bool QgsOgrProvider::convertField( QgsField &field, const QTextCodec &encoding ) { @@ -1023,7 +1025,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 ); + } } } @@ -3567,7 +3573,7 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds fidColumn = "FID"; } - QByteArray sql = sqlPart1 + ", " + fidColumn + " as orig_ogc_fid" + sqlPart3; + QByteArray sql = sqlPart1 + ", " + fidColumn + " as " + ORIG_OGC_FID + sqlPart3; QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) ); subsetLayer = GDALDatasetExecuteSQL( ds, sql.constData(), nullptr, nullptr ); @@ -3575,7 +3581,7 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds // If execute SQL fails because it did not find the fidColumn, retry with hardcoded FID if ( !subsetLayer ) { - QByteArray sql = sqlPart1 + ", " + "FID as orig_ogc_fid" + sqlPart3; + QByteArray sql = sqlPart1 + ", " + "FID as " + ORIG_OGC_FID + sqlPart3; QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) ); subsetLayer = GDALDatasetExecuteSQL( ds, sql.constData(), nullptr, nullptr ); } @@ -3597,7 +3603,7 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds if ( fieldCount > 0 ) { OGRFieldDefnH fldDef = OGR_FD_GetFieldDefn( fdef, fieldCount - 1 ); - origFidAdded = qstrcmp( OGR_Fld_GetNameRef( fldDef ), "orig_ogc_fid" ) == 0; + origFidAdded = qstrcmp( OGR_Fld_GetNameRef( fldDef ), ORIG_OGC_FID ) == 0; } } diff --git a/tests/src/python/test_provider_ogr_sqlite.py b/tests/src/python/test_provider_ogr_sqlite.py index f4d5e07ef4f0..5e573161d2ff 100644 --- a/tests/src/python/test_provider_ogr_sqlite.py +++ b/tests/src/python/test_provider_ogr_sqlite.py @@ -254,6 +254,18 @@ def testSubsetStringFids(self): 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")