Skip to content

Commit ca1262d

Browse files
committed
Fix failing test
We need to ensure that the FID column is also fetched for the unfiltered layer which we use when requesting features by ID
1 parent f3bc283 commit ca1262d

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed

src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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 )

src/providers/ogr/qgsogrfeatureiterator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class QgsOgrFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsOgr
7474
QgsOgrConn *mConn = nullptr;
7575
OGRLayerH mOgrLayer = nullptr;
7676
OGRLayerH mOgrOrigLayer = nullptr;
77+
OGRLayerH mOgrLayerWithFid = nullptr;
7778

7879
bool mOrigFidAdded = false;
7980

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3919,8 +3919,9 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds
39193919
else
39203920
{
39213921
QByteArray sqlPart1 = "SELECT *";
3922-
QByteArray sqlPart3 = " FROM " + quotedIdentifier( layerName, mGDALDriverName )
3923-
+ " WHERE " + encoding->fromUnicode( subsetString );
3922+
QByteArray sqlPart3 = " FROM " + quotedIdentifier( layerName, mGDALDriverName );
3923+
if ( !subsetString.isEmpty() )
3924+
sqlPart3 += " WHERE " + encoding->fromUnicode( subsetString );
39243925

39253926
origFidAddAttempted = true;
39263927

0 commit comments

Comments
 (0)