diff --git a/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp b/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp index 23c8f874d22..1946d13473a 100644 --- a/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp +++ b/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp @@ -63,6 +63,7 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF QString tableName = mSource->mTableName; QStringList wheres; + QString offset; QString subset = mSource->mSubset; if ( !subset.isNull() ) { @@ -105,6 +106,13 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF wheres << values; } } + else + { + if ( request.filterType() == QgsFeatureRequest::FilterFid ) + { + offset = QStringLiteral( " LIMIT 1 OFFSET %1" ).arg( request.filterFid() ); + } + } if ( request.flags() & QgsFeatureRequest::SubsetOfAttributes ) { @@ -150,7 +158,14 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF } else { - columns = QStringLiteral( "0" ); + if ( request.filterType() == QgsFeatureRequest::FilterFid ) + { + columns = QStringLiteral( "%1" ).arg( request.filterFid() ); + } + else + { + columns = QStringLiteral( "0" ); + } } Q_FOREACH ( int i, mAttributes ) { @@ -173,6 +188,11 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF mSqlQuery += " WHERE " + wheres.join( QStringLiteral( " AND " ) ); } + if ( !offset.isEmpty() ) + { + mSqlQuery += offset; + } + mQuery.reset( new Sqlite::Query( mSource->mSqlite, mSqlQuery ) ); mFid = 0; @@ -232,8 +252,15 @@ bool QgsVirtualLayerFeatureIterator::fetchFeature( QgsFeature &feature ) if ( mSource->mDefinition.uid().isNull() ) { - // no id column => autoincrement - feature.setId( mFid++ ); + if ( mRequest.filterType() == QgsFeatureRequest::FilterFid ) + { + feature.setId( mQuery->columnInt64( 0 ) ); + } + else + { + // no id column => autoincrement + feature.setId( mFid++ ); + } } else {