@@ -37,6 +37,7 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
37
37
QString tableName = mSource ->provider ()->mTableName ;
38
38
39
39
QStringList wheres;
40
+ QString offset;
40
41
QString subset = mSource ->provider ()->mSubset ;
41
42
if ( !subset.isNull () )
42
43
{
@@ -76,6 +77,17 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
76
77
values += " )" ;
77
78
wheres << values;
78
79
}
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
+ }
79
91
80
92
mFields = mSource ->provider ()->fields ();
81
93
if ( request.flags () & QgsFeatureRequest::SubsetOfAttributes )
@@ -111,7 +123,15 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
111
123
}
112
124
else
113
125
{
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
+ }
115
135
}
116
136
Q_FOREACH ( int i, mAttributes )
117
137
{
@@ -134,6 +154,11 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
134
154
mSqlQuery += " WHERE " + wheres.join ( " AND " );
135
155
}
136
156
157
+ if ( !offset.isEmpty () )
158
+ {
159
+ mSqlQuery += offset;
160
+ }
161
+
137
162
mQuery .reset ( new Sqlite::Query ( mSqlite , mSqlQuery ) );
138
163
139
164
mFid = 0 ;
@@ -191,7 +216,8 @@ bool QgsVirtualLayerFeatureIterator::fetchFeature( QgsFeature& feature )
191
216
192
217
feature.setFields ( mFields , /* init */ true );
193
218
194
- if ( mDefinition .uid ().isNull () )
219
+ if ( mDefinition .uid ().isNull () &&
220
+ mRequest .filterType () != QgsFeatureRequest::FilterFid )
195
221
{
196
222
// no id column => autoincrement
197
223
feature.setFeatureId ( mFid ++ );
0 commit comments