Showing with 23 additions and 3 deletions.
  1. +16 −3 src/providers/ogr/qgsogrprovider.cpp
  2. +7 −0 src/providers/ogr/qgsogrprovider.h
19 changes: 16 additions & 3 deletions src/providers/ogr/qgsogrprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,10 @@ void QgsOgrProvider::setRelevantFields( bool fetchGeometry, const QgsAttributeLi

OGR_L_SetIgnoredFields( ogrLayer, ignoredFields.data() );
}

// mark that relevant fields may not be set appropriately for nextFeature() calls
mRelevantFieldsForNextFeature = false;

#else
Q_UNUSED( fetchGeometry );
Q_UNUSED( fetchAttributes );
Expand Down Expand Up @@ -623,12 +627,17 @@ bool QgsOgrProvider::nextFeature( QgsFeature& feature )
return false;
}

if ( !mRelevantFieldsForNextFeature )
{
// setting relevant fields has some overhead so set it only when necessary
setRelevantFields( mFetchGeom || mUseIntersect || !mFetchRect.isEmpty(),
mAttributesToFetch );
mRelevantFieldsForNextFeature = true;
}

OGRFeatureH fet;
QgsRectangle selectionRect;

setRelevantFields( mFetchGeom || mUseIntersect || !mFetchRect.isEmpty(),
mAttributesToFetch );

while (( fet = OGR_L_GetNextFeature( ogrLayer ) ) )
{
// skip features without geometry
Expand Down Expand Up @@ -727,6 +736,10 @@ void QgsOgrProvider::select( QgsAttributeList fetchAttributes, QgsRectangle rect
mFetchGeom = fetchGeometry;
mFetchRect = rect;

setRelevantFields( mFetchGeom || mUseIntersect || !mFetchRect.isEmpty(),
mAttributesToFetch );
mRelevantFieldsForNextFeature = true;

// spatial query to select features
if ( rect.isEmpty() )
{
Expand Down
7 changes: 7 additions & 0 deletions src/providers/ogr/qgsogrprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,13 @@ class QgsOgrProvider : public QgsVectorDataProvider
int geomType;
long featuresCounted;

/** Flag whether OGR will return fields required by nextFeature() calls.
The relevant fields are first set in select(), however the setting may be
interferred by some other calls. This flag ensures they are set again
to correct values.
*/
bool mRelevantFieldsForNextFeature;

//! Selection rectangle
OGRGeometryH mSelectionRectangle;
/**Adds one feature*/
Expand Down