diff --git a/src/core/qgsexpressionfieldbuffer.cpp b/src/core/qgsexpressionfieldbuffer.cpp index c6f2b38b5b9..bb54cb48fb2 100644 --- a/src/core/qgsexpressionfieldbuffer.cpp +++ b/src/core/qgsexpressionfieldbuffer.cpp @@ -36,6 +36,7 @@ void QgsExpressionFieldBuffer::removeExpression( int index ) void QgsExpressionFieldBuffer::updateExpression( int index, const QString& exp ) { mExpressions[index].expression = exp; + mExpressions[index].cachedExpression = QgsExpression( exp ); } void QgsExpressionFieldBuffer::writeXml( QDomNode& layerNode, QDomDocument& document ) const diff --git a/src/core/qgsexpressionfieldbuffer.h b/src/core/qgsexpressionfieldbuffer.h index f94fb5a14d5..69feb960709 100644 --- a/src/core/qgsexpressionfieldbuffer.h +++ b/src/core/qgsexpressionfieldbuffer.h @@ -23,6 +23,7 @@ #include #include "qgsfield.h" +#include "qgsexpression.h" /** * Buffers information about expression fields for a vector layer. @@ -34,10 +35,14 @@ class CORE_EXPORT QgsExpressionFieldBuffer public: typedef struct ExpressionField { - ExpressionField() {} - ExpressionField( const QString& exp, const QgsField& fld ) : expression( exp ), field( fld ) {} + ExpressionField() : cachedExpression( expression ) {} + ExpressionField( const QString& exp, const QgsField& fld ) : expression( exp ), cachedExpression( exp ), field( fld ) {} + /** + * @deprecated use cachedExpression instead + */ QString expression; + QgsExpression cachedExpression; QgsField field; } ExpressionField; diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp index 550443586a8..80bb5aecab0 100644 --- a/src/core/qgsvectorlayerfeatureiterator.cpp +++ b/src/core/qgsvectorlayerfeatureiterator.cpp @@ -530,7 +530,7 @@ void QgsVectorLayerFeatureIterator::prepareExpressions() || mRequest.subsetOfAttributes().contains( i ) ) { int oi = mSource->mFields.fieldOriginIndex( i ); - QgsExpression* exp = new QgsExpression( exps[oi].expression ); + QgsExpression* exp = new QgsExpression( exps[oi].cachedExpression ); exp->prepare( mExpressionContext.data() ); mExpressionFieldInfo.insert( i, exp ); diff --git a/tests/src/python/test_qgsvectorlayer.py b/tests/src/python/test_qgsvectorlayer.py index c6ebd6c7edb..86c3153a0d8 100644 --- a/tests/src/python/test_qgsvectorlayer.py +++ b/tests/src/python/test_qgsvectorlayer.py @@ -965,16 +965,16 @@ class TestQgsVectorLayer(TestCase): idx = layer.addExpressionField('5', QgsField('test', QVariant.LongLong)) - assert(layer.getFeatures().next()[idx] == 5) - assert(layer.pendingFields().count() == cnt + 1) + self.assertEquals(layer.getFeatures().next()[idx], 5) + self.assertEquals(layer.pendingFields().count(), cnt + 1) layer.updateExpressionField(idx, '9') - assert(layer.getFeatures().next()[idx] == 9) + self.assertEquals(layer.getFeatures().next()[idx], 9) layer.removeExpressionField(idx) - assert(layer.pendingFields().count() == cnt) + self.assertEquals(layer.pendingFields().count(), cnt) def test_ExpressionFilter(self): layer = createLayerWithOnePoint()