Skip to content

Commit 3a76708

Browse files
committedOct 8, 2016
Fix renaming a virtual field leads to crash (fix #15669)
1 parent 3b9316d commit 3a76708

File tree

5 files changed

+68
-2
lines changed

5 files changed

+68
-2
lines changed
 

‎python/core/qgsexpressionfieldbuffer.sip

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ class QgsExpressionFieldBuffer
2727
*/
2828
void removeExpression( int index );
2929

30+
/**
31+
* Renames an expression field at a given index
32+
*
33+
* @param index The index of the expression to change
34+
* @param name New name for field
35+
*
36+
* @note added in 3.0
37+
*/
38+
void renameExpression( int index, const QString& name );
39+
3040
/**
3141
* Changes the expression at a given index
3242
*

‎src/core/qgsexpressionfieldbuffer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ void QgsExpressionFieldBuffer::removeExpression( int index )
3333
mExpressions.removeAt( index );
3434
}
3535

36+
void QgsExpressionFieldBuffer::renameExpression( int index, const QString& name )
37+
{
38+
mExpressions[index].field.setName( name );
39+
}
40+
3641
void QgsExpressionFieldBuffer::updateExpression( int index, const QString& exp )
3742
{
3843
mExpressions[index].cachedExpression = QgsExpression( exp );

‎src/core/qgsexpressionfieldbuffer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ class CORE_EXPORT QgsExpressionFieldBuffer
6161
*/
6262
void removeExpression( int index );
6363

64+
/**
65+
* Renames an expression field at a given index
66+
*
67+
* @param index The index of the expression to change
68+
* @param name New name for field
69+
*
70+
* @note added in 3.0
71+
*/
72+
void renameExpression( int index, const QString& name );
73+
6474
/**
6575
* Changes the expression at a given index
6676
*

‎src/core/qgsvectorlayer.cpp

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2125,10 +2125,41 @@ void QgsVectorLayer::removeFieldAlias( int attIndex )
21252125

21262126
bool QgsVectorLayer::renameAttribute( int index, const QString& newName )
21272127
{
2128-
if ( !mEditBuffer || !mDataProvider )
2128+
if ( index < 0 || index >= fields().count() )
21292129
return false;
21302130

2131-
return mEditBuffer->renameAttribute( index, newName );
2131+
switch ( mFields.fieldOrigin( index ) )
2132+
{
2133+
case QgsFields::OriginExpression:
2134+
{
2135+
if ( mExpressionFieldBuffer )
2136+
{
2137+
int oi = mFields.fieldOriginIndex( index );
2138+
mExpressionFieldBuffer->renameExpression( oi, newName );
2139+
updateFields();
2140+
return true;
2141+
}
2142+
else
2143+
{
2144+
return false;
2145+
}
2146+
}
2147+
2148+
case QgsFields::OriginProvider:
2149+
case QgsFields::OriginEdit:
2150+
2151+
if ( !mEditBuffer || !mDataProvider )
2152+
return false;
2153+
2154+
return mEditBuffer->renameAttribute( index, newName );
2155+
2156+
case QgsFields::OriginJoin:
2157+
case QgsFields::OriginUnknown:
2158+
return false;
2159+
2160+
}
2161+
2162+
return false; // avoid warning
21322163
}
21332164

21342165
void QgsVectorLayer::setFieldAlias( int attIndex, const QString& aliasString )

‎tests/src/python/test_qgsvectorlayer.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,16 @@ def checkFieldNames(names):
10581058
#layer.undoStack().redo()
10591059
#checkFieldNames(['fldint'])
10601060

1061+
def test_RenameExpressionField(self):
1062+
layer = createLayerWithOnePoint()
1063+
exp_field_idx = layer.addExpressionField('1+1', QgsField('math_is_hard', QVariant.Int))
1064+
1065+
#rename and check
1066+
self.assertTrue(layer.renameAttribute(exp_field_idx, 'renamed'))
1067+
self.assertEqual(layer.fields()[exp_field_idx].name(), 'renamed')
1068+
f = next(layer.getFeatures())
1069+
self.assertEqual(f.fields()[exp_field_idx].name(), 'renamed')
1070+
10611071
def test_fields(self):
10621072
layer = createLayerWithOnePoint()
10631073

0 commit comments

Comments
 (0)
Please sign in to comment.