Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 6acb414

Browse files
elpasogithub-actions[bot]
authored andcommittedMar 10, 2023
OGR: reset the data source subset string
Fix #51934 by resetting the data source subset string filter, in case it was changed by a previous request.
1 parent bc48595 commit 6acb414

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed
 

‎src/core/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,13 @@ bool QgsOgrFeatureIterator::rewind()
517517

518518
bool QgsOgrFeatureIterator::close()
519519
{
520+
// Finally reset the data source filter, in case it was changed by a previous request
521+
// this fixes https://github.com/qgis/QGIS/issues/51934
522+
if ( mOgrLayer && ! mSource->mSubsetString.isEmpty() )
523+
{
524+
OGR_L_SetAttributeFilter( mOgrLayer, mSource->mEncoding->fromUnicode( mSource->mSubsetString ).constData() );
525+
}
526+
520527
if ( mSharedDS )
521528
{
522529
iteratorClosed();

‎tests/src/python/test_provider_ogr_gpkg.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,6 +2638,59 @@ def testDateTimeTimeZoneMilliseconds(self):
26382638
got = [feat for feat in vl.getFeatures()]
26392639
self.assertEqual(got[0]["dt"], new_dt)
26402640

2641+
def testTransactionModeAutoWithFilter(self):
2642+
2643+
temp_dir = QTemporaryDir()
2644+
temp_path = temp_dir.path()
2645+
filename = os.path.join(temp_path, "test.gpkg")
2646+
ds = ogr.GetDriverByName("GPKG").CreateDataSource(filename)
2647+
lyr = ds.CreateLayer("points", geom_type=ogr.wkbPoint)
2648+
lyr.CreateField(ogr.FieldDefn('name', ogr.OFTString))
2649+
f = ogr.Feature(lyr.GetLayerDefn())
2650+
f['name'] = 'a'
2651+
f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)'))
2652+
lyr.CreateFeature(f)
2653+
f = None
2654+
ds = None
2655+
ds = None
2656+
2657+
vl = QgsVectorLayer(filename)
2658+
self.assertTrue(vl.isValid())
2659+
self.assertEqual(vl.featureCount(), 1)
2660+
self.assertEqual(next(vl.getFeatures())['name'], 'a')
2661+
2662+
p = QgsProject()
2663+
p.setAutoTransaction(True)
2664+
self.assertTrue(p.addMapLayers([vl]))
2665+
self.assertTrue(vl.setSubsetString('"name" IN (\'a\', \'b\')'))
2666+
self.assertEqual(vl.featureCount(), 1)
2667+
self.assertTrue(vl.startEditing())
2668+
2669+
# Add feature
2670+
f = QgsFeature(vl.fields())
2671+
f.setAttribute('name', 'b')
2672+
g = QgsGeometry.fromWkt('POINT(3 4)')
2673+
f.setGeometry(g)
2674+
2675+
# This triggers the issue because it sets the subset filter
2676+
req = QgsFeatureRequest()
2677+
req.setFilterExpression('"name" IS NULL')
2678+
self.assertEqual([f for f in vl.getFeatures(req)], [])
2679+
2680+
self.assertTrue(vl.addFeatures([f]))
2681+
self.assertTrue(vl.commitChanges())
2682+
self.assertEqual(vl.featureCount(), 2)
2683+
attrs = [f['name'] for f in vl.getFeatures()]
2684+
self.assertEqual(attrs, ['a', 'b'])
2685+
2686+
# verify
2687+
del p
2688+
vl2 = QgsVectorLayer(filename)
2689+
self.assertTrue(vl2.isValid())
2690+
self.assertEqual(vl2.featureCount(), 2)
2691+
attrs = [f['name'] for f in vl2.getFeatures()]
2692+
self.assertEqual(attrs, ['a', 'b'])
2693+
26412694

26422695
if __name__ == '__main__':
26432696
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.