Skip to content

Commit 8711473

Browse files
committed
Add a very basic guard against virtual fields which reference themself
1 parent 3f4d6de commit 8711473

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

src/core/qgsvectorlayerfeatureiterator.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,15 @@ void QgsVectorLayerFeatureIterator::prepareExpression( int fieldIdx )
617617
exp->setAreaUnits( QgsProject::instance()->areaUnits() );
618618

619619
exp->prepare( mExpressionContext.get() );
620+
Q_FOREACH ( const QString &col, exp->referencedColumns() )
621+
{
622+
if ( mSource->fields().lookupField( col ) == fieldIdx )
623+
{
624+
// circular reference - expression depends on column itself
625+
delete exp;
626+
return;
627+
}
628+
}
620629
mExpressionFieldInfo.insert( fieldIdx, exp );
621630

622631
Q_FOREACH ( const QString &col, exp->referencedColumns() )

tests/src/python/test_qgsvectorlayer.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,6 +1609,11 @@ def test_ExpressionField(self):
16091609

16101610
self.assertEqual(layer.pendingFields().count(), cnt)
16111611

1612+
# expression field which references itself
1613+
idx = layer.addExpressionField('sum(test2)', QgsField('test2', QVariant.LongLong))
1614+
fet = next(layer.getFeatures())
1615+
self.assertEqual(fet['test2'], NULL)
1616+
16121617
def test_ExpressionFieldEllipsoidLengthCalculation(self):
16131618
#create a temporary layer
16141619
temp_layer = QgsVectorLayer("LineString?crs=epsg:3111&field=pk:int", "vl", "memory")

0 commit comments

Comments
 (0)