Skip to content

Commit a67194d

Browse files
committed
[OGR] Add orig_ogc_fid as last field to avoid changing field order
1 parent 4ce2cf1 commit a67194d

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

src/providers/ogr/qgsogrfeatureiterator.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -196,17 +196,22 @@ bool QgsOgrFeatureIterator::nextFeatureFilterExpression( QgsFeature &f )
196196
bool QgsOgrFeatureIterator::fetchFeatureWithId( QgsFeatureId id, QgsFeature &feature ) const
197197
{
198198
feature.setValid( false );
199-
OGRFeatureH fet;
199+
OGRFeatureH fet = 0;
200200
if ( mOrigFidAdded )
201201
{
202202
OGR_L_ResetReading( ogrLayer );
203-
while ( ( fet = OGR_L_GetNextFeature( ogrLayer ) ) )
203+
OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( ogrLayer );
204+
int lastField = OGR_FD_GetFieldCount( fdef ) - 1;
205+
if ( lastField >= 0 )
204206
{
205-
if ( OGR_F_GetFieldAsInteger64( fet, 0 ) == id )
207+
while ( ( fet = OGR_L_GetNextFeature( ogrLayer ) ) )
206208
{
207-
break;
209+
if ( OGR_F_GetFieldAsInteger64( fet, lastField ) == id )
210+
{
211+
break;
212+
}
213+
OGR_F_Destroy( fet );
208214
}
209-
OGR_F_Destroy( fet );
210215
}
211216
}
212217
else

src/providers/ogr/qgsogrprovider.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -3547,8 +3547,8 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds
35473547
}
35483548
else
35493549
{
3550-
QByteArray sqlPart1 = "SELECT ";
3551-
QByteArray sqlPart3 = "* FROM " + quotedIdentifier( layerName, mGDALDriverName )
3550+
QByteArray sqlPart1 = "SELECT *";
3551+
QByteArray sqlPart3 = " FROM " + quotedIdentifier( layerName, mGDALDriverName )
35523552
+ " WHERE " + encoding->fromUnicode( subsetString );
35533553

35543554
origFidAddAttempted = true;
@@ -3560,15 +3560,15 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds
35603560
fidColumn = "FID";
35613561
}
35623562

3563-
QByteArray sql = sqlPart1 + fidColumn + " as orig_ogc_fid, " + sqlPart3;
3563+
QByteArray sql = sqlPart1 + ", " + fidColumn + " as orig_ogc_fid" + sqlPart3;
35643564
QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
35653565
subsetLayer = GDALDatasetExecuteSQL( ds, sql.constData(), nullptr, nullptr );
35663566

35673567
// See https://lists.osgeo.org/pipermail/qgis-developer/2017-September/049802.html
35683568
// If execute SQL fails because it did not find the fidColumn, retry with hardcoded FID
35693569
if ( !subsetLayer )
35703570
{
3571-
QByteArray sql = sqlPart1 + "FID as orig_ogc_fid, " + sqlPart3;
3571+
QByteArray sql = sqlPart1 + ", " + "FID as orig_ogc_fid" + sqlPart3;
35723572
QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
35733573
subsetLayer = GDALDatasetExecuteSQL( ds, sql.constData(), nullptr, nullptr );
35743574
}
@@ -3582,13 +3582,14 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds
35823582
}
35833583
}
35843584

3585-
// Check if first column is orig_ogc_fid
3585+
// Check if last column is orig_ogc_fid
35863586
if ( origFidAddAttempted && subsetLayer )
35873587
{
35883588
OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( subsetLayer );
3589-
if ( OGR_FD_GetFieldCount( fdef ) > 0 )
3589+
int fieldCount = OGR_FD_GetFieldCount( fdef );
3590+
if ( fieldCount > 0 )
35903591
{
3591-
OGRFieldDefnH fldDef = OGR_FD_GetFieldDefn( fdef, 0 );
3592+
OGRFieldDefnH fldDef = OGR_FD_GetFieldDefn( fdef, fieldCount - 1 );
35923593
origFidAdded = qstrcmp( OGR_Fld_GetNameRef( fldDef ), "orig_ogc_fid" ) == 0;
35933594
}
35943595
}

tests/src/python/test_provider_ogr_sqlite.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def testSubsetStringFids(self):
245245

246246
vl = QgsVectorLayer(tmpfile + "|subset=type=2", 'test', 'ogr')
247247
self.assertTrue(vl.isValid())
248-
self.assertTrue(vl.fields().at(0).name() == "orig_ogc_fid")
248+
self.assertTrue(vl.fields().at(vl.fields().count() - 1).name() == "orig_ogc_fid")
249249

250250
req = QgsFeatureRequest()
251251
req.setFilterExpression("value=16")
@@ -256,7 +256,7 @@ def testSubsetStringFids(self):
256256

257257
# Check that subset string is correctly set on reload
258258
vl.reload()
259-
self.assertTrue(vl.fields().at(0).name() == "orig_ogc_fid")
259+
self.assertTrue(vl.fields().at(vl.fields().count() - 1).name() == "orig_ogc_fid")
260260

261261

262262
if __name__ == '__main__':

0 commit comments

Comments
 (0)