diff --git a/src/providers/ogr/qgsogrfeatureiterator.cpp b/src/providers/ogr/qgsogrfeatureiterator.cpp
index 2dfd500b47a7..f49acb65ef30 100644
--- a/src/providers/ogr/qgsogrfeatureiterator.cpp
+++ b/src/providers/ogr/qgsogrfeatureiterator.cpp
@@ -152,6 +152,7 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource* source, bool
OGR_L_SetAttributeFilter( ogrLayer, nullptr );
}
+
//start with first feature
rewind();
}
@@ -327,11 +328,16 @@ bool QgsOgrFeatureIterator::readFeature( OGRFeatureH fet, QgsFeature& feature )
{
if ( mOrigFidAdded )
{
+ OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( ogrLayer );
+ int lastField = OGR_FD_GetFieldCount( fdef ) - 1;
+ if ( lastField >= 0 )
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM >= 2000000
- feature.setFeatureId( OGR_F_GetFieldAsInteger64( fet, 0 ) );
+ feature.setFeatureId( OGR_F_GetFieldAsInteger64( fet, lastField ) );
#else
- feature.setFeatureId( OGR_F_GetFieldAsInteger( fet, 0 ) );
+ feature.setFeatureId( OGR_F_GetFieldAsInteger( fet, lastField ) );
#endif
+ else
+ feature.setFeatureId( OGR_F_GetFID( fet ) );
}
else
{
diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp
index 9e0142bbe2fa..068004a3df25 100644
--- a/src/providers/ogr/qgsogrprovider.cpp
+++ b/src/providers/ogr/qgsogrprovider.cpp
@@ -95,6 +95,8 @@ class QgsCPLErrorHandler
}
};
+static const QByteArray ORIG_OGC_FID = "orig_ogc_fid";
+
bool QgsOgrProvider::convertField( QgsField &field, const QTextCodec &encoding )
{
@@ -1030,7 +1032,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 );
+ }
}
}
@@ -3466,7 +3472,7 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, OGRDataSourceH
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 = OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );
@@ -3474,7 +3480,7 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, OGRDataSourceH
// 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 = OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );
}
@@ -3496,7 +3502,7 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, OGRDataSourceH
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 beddd200a513..4267face4012 100644
--- a/tests/src/python/test_provider_ogr_sqlite.py
+++ b/tests/src/python/test_provider_ogr_sqlite.py
@@ -184,6 +184,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")
diff --git a/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt b/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt
index 9fa1cb1b1111..49cabb4e71ee 100644
--- a/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt
+++ b/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt
@@ -8,6 +8,7 @@ Content-Type: text/xml; charset=utf-8
+
diff --git a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt
index 9fba9719b63d..d1afc764b769 100644
--- a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt
+++ b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt
@@ -8,6 +8,7 @@ Content-Type: text/xml; charset=utf-8
+
@@ -15,6 +16,7 @@ Content-Type: text/xml; charset=utf-8
+
diff --git a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt
index 9fba9719b63d..d1afc764b769 100644
--- a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt
+++ b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt
@@ -8,6 +8,7 @@ Content-Type: text/xml; charset=utf-8
+
@@ -15,6 +16,7 @@ Content-Type: text/xml; charset=utf-8
+