Skip to content

Commit 577c1f2

Browse files
committed
Fixes #16798 FilterFid feature requests with virtual layers
1 parent 10b34b9 commit 577c1f2

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp

+28-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
3737
QString tableName = mSource->provider()->mTableName;
3838

3939
QStringList wheres;
40+
QString offset;
4041
QString subset = mSource->provider()->mSubset;
4142
if ( !subset.isNull() )
4243
{
@@ -76,6 +77,17 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
7677
values += ")";
7778
wheres << values;
7879
}
80+
else if ( mDefinition.uid().isNull() && request.filterType() == QgsFeatureRequest::FilterFid )
81+
{
82+
if ( request.filterFid() >= 0 )
83+
{
84+
offset = QString( " LIMIT 1 OFFSET %1" ).arg( request.filterFid() );
85+
}
86+
else // never return a feature if the id is negative
87+
{
88+
offset = QString( " LIMIT 0" );
89+
}
90+
}
7991

8092
mFields = mSource->provider()->fields();
8193
if ( request.flags() & QgsFeatureRequest::SubsetOfAttributes )
@@ -111,7 +123,15 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
111123
}
112124
else
113125
{
114-
columns = "0";
126+
columns = QString( "0" );
127+
if ( request.filterType() == QgsFeatureRequest::FilterFid )
128+
{
129+
columns = QString::number( request.filterFid() );
130+
}
131+
else
132+
{
133+
columns = QString( "0" );
134+
}
115135
}
116136
Q_FOREACH ( int i, mAttributes )
117137
{
@@ -134,6 +154,11 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
134154
mSqlQuery += " WHERE " + wheres.join( " AND " );
135155
}
136156

157+
if ( !offset.isEmpty() )
158+
{
159+
mSqlQuery += offset;
160+
}
161+
137162
mQuery.reset( new Sqlite::Query( mSqlite, mSqlQuery ) );
138163

139164
mFid = 0;
@@ -191,7 +216,8 @@ bool QgsVirtualLayerFeatureIterator::fetchFeature( QgsFeature& feature )
191216

192217
feature.setFields( mFields, /* init */ true );
193218

194-
if ( mDefinition.uid().isNull() )
219+
if ( mDefinition.uid().isNull() &&
220+
mRequest.filterType() != QgsFeatureRequest::FilterFid )
195221
{
196222
// no id column => autoincrement
197223
feature.setFeatureId( mFid++ );

0 commit comments

Comments
 (0)