From 8711473b7f83d436eda5e7f4627a6090f2a227bc Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 13 Jul 2017 11:01:55 +1000 Subject: [PATCH] Add a very basic guard against virtual fields which reference themself --- src/core/qgsvectorlayerfeatureiterator.cpp | 9 +++++++++ tests/src/python/test_qgsvectorlayer.py | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp index 9168704b1dd..08f33e105f2 100644 --- a/src/core/qgsvectorlayerfeatureiterator.cpp +++ b/src/core/qgsvectorlayerfeatureiterator.cpp @@ -617,6 +617,15 @@ void QgsVectorLayerFeatureIterator::prepareExpression( int fieldIdx ) exp->setAreaUnits( QgsProject::instance()->areaUnits() ); exp->prepare( mExpressionContext.get() ); + Q_FOREACH ( const QString &col, exp->referencedColumns() ) + { + if ( mSource->fields().lookupField( col ) == fieldIdx ) + { + // circular reference - expression depends on column itself + delete exp; + return; + } + } mExpressionFieldInfo.insert( fieldIdx, exp ); Q_FOREACH ( const QString &col, exp->referencedColumns() ) diff --git a/tests/src/python/test_qgsvectorlayer.py b/tests/src/python/test_qgsvectorlayer.py index 5fdcabb1300..30fe77f7e80 100644 --- a/tests/src/python/test_qgsvectorlayer.py +++ b/tests/src/python/test_qgsvectorlayer.py @@ -1609,6 +1609,11 @@ class TestQgsVectorLayer(unittest.TestCase, FeatureSourceTestCase): self.assertEqual(layer.pendingFields().count(), cnt) + # expression field which references itself + idx = layer.addExpressionField('sum(test2)', QgsField('test2', QVariant.LongLong)) + fet = next(layer.getFeatures()) + self.assertEqual(fet['test2'], NULL) + def test_ExpressionFieldEllipsoidLengthCalculation(self): #create a temporary layer temp_layer = QgsVectorLayer("LineString?crs=epsg:3111&field=pk:int", "vl", "memory")