@@ -66,7 +66,8 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
6666 if ( !mSource ->mSubsetString .isEmpty () )
6767 {
6868 mOgrOrigLayer = mOgrLayer ;
69- mOgrLayer = QgsOgrProviderUtils::setSubsetString ( mOgrOrigLayer , mConn ->ds , mSource ->mEncoding , mSource ->mSubsetString , mOrigFidAdded );
69+ mOgrLayerWithFid = QgsOgrProviderUtils::setSubsetString ( mOgrLayer , mConn ->ds , mSource ->mEncoding , QString (), mOrigFidAdded );
70+ mOgrLayer = QgsOgrProviderUtils::setSubsetString ( mOgrLayer , mConn ->ds , mSource ->mEncoding , mSource ->mSubsetString , mOrigFidAdded );
7071 if ( !mOgrLayer )
7172 {
7273 close ();
@@ -94,6 +95,8 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
9495 ( mSource ->mOgrGeometryTypeFilter != wkbUnknown );
9596
9697 QgsAttributeList attrs = ( mRequest .flags () & QgsFeatureRequest::SubsetOfAttributes ) ? mRequest .subsetOfAttributes () : mSource ->mFields .allAttributesList ();
98+ if ( mOrigFidAdded )
99+ attrs << mSource ->mFields .count ();
97100
98101 // ensure that all attributes required for expression filter are being fetched
99102 if ( mRequest .flags () & QgsFeatureRequest::SubsetOfAttributes && request.filterType () == QgsFeatureRequest::FilterExpression )
@@ -128,17 +131,23 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
128131 // filter if we choose to ignore them (fixes #11223)
129132 if ( ( mSource ->mDriverName != QLatin1String ( " VRT" ) && mSource ->mDriverName != QLatin1String ( " OGR_VRT" ) ) || mFilterRect .isNull () )
130133 {
131- QgsOgrProviderUtils::setRelevantFields ( mOgrLayer , mSource ->mFields .count (), mFetchGeometry , attrs, mSource ->mFirstFieldIsFid );
134+ QgsOgrProviderUtils::setRelevantFields ( mOgrLayer , mSource ->mFields .count () + ( mOrigFidAdded ? 1 : 0 ), mFetchGeometry , attrs, mSource ->mFirstFieldIsFid );
135+ if ( mOgrLayerWithFid )
136+ QgsOgrProviderUtils::setRelevantFields ( mOgrLayerWithFid , mSource ->mFields .count () + ( mOrigFidAdded ? 1 : 0 ), mFetchGeometry , attrs, mSource ->mFirstFieldIsFid );
132137 }
133138
134139 // spatial query to select features
135140 if ( !mFilterRect .isNull () )
136141 {
137142 OGR_L_SetSpatialFilterRect ( mOgrLayer , mFilterRect .xMinimum (), mFilterRect .yMinimum (), mFilterRect .xMaximum (), mFilterRect .yMaximum () );
143+ if ( mOgrLayerWithFid )
144+ OGR_L_SetSpatialFilterRect ( mOgrLayerWithFid , mFilterRect .xMinimum (), mFilterRect .yMinimum (), mFilterRect .xMaximum (), mFilterRect .yMaximum () );
138145 }
139146 else
140147 {
141148 OGR_L_SetSpatialFilter ( mOgrLayer , nullptr );
149+ if ( mOgrLayerWithFid )
150+ OGR_L_SetSpatialFilter ( mOgrLayerWithFid , nullptr );
142151 }
143152
144153 if ( request.filterType () == QgsFeatureRequest::FilterExpression
@@ -205,8 +214,8 @@ bool QgsOgrFeatureIterator::fetchFeatureWithId( QgsFeatureId id, QgsFeature &fea
205214 // string in place), then we need to request features from the original, unfiltered
206215 // OGR layer. Otherwise the feature IDs we request will correspond to features in the
207216 // filtered layer, not the original layer!
208- OGR_L_ResetReading ( mOgrOrigLayer );
209- fet.reset ( OGR_L_GetFeature ( mOgrOrigLayer , FID_TO_NUMBER ( id ) ) );
217+ OGR_L_ResetReading ( mOgrLayerWithFid );
218+ fet.reset ( OGR_L_GetFeature ( mOgrLayerWithFid , FID_TO_NUMBER ( id ) ) );
210219 }
211220 else
212221 {
@@ -303,8 +312,10 @@ bool QgsOgrFeatureIterator::close()
303312 if ( mOgrOrigLayer )
304313 {
305314 GDALDatasetReleaseResultSet ( mConn ->ds , mOgrLayer );
315+ GDALDatasetReleaseResultSet ( mConn ->ds , mOgrLayerWithFid );
306316 mOgrLayer = mOgrOrigLayer ;
307317 mOgrOrigLayer = nullptr ;
318+ mOgrLayerWithFid = nullptr ;
308319 }
309320
310321 if ( mConn )
0 commit comments