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 +