@@ -2101,6 +2101,47 @@ class TestQgsExpression: public QObject
2101
2101
QgsExpression nodeExpression ( " 1 IN (1, 2, 3, 4)" );
2102
2102
QgsExpression nodeExpression2 ( nodeExpression );
2103
2103
}
2104
+
2105
+ void test_columnRefUnprepared ()
2106
+ {
2107
+ // test retrieving fields from feature when expression is unprepared - explicitly specified fields collection
2108
+ // should take precedence over feature's field collection
2109
+
2110
+ QgsFields fields;
2111
+ fields.append ( QgsField ( " f1" , QVariant::String ) );
2112
+
2113
+ QgsFeature f ( 1 );
2114
+ f.setFields ( fields );
2115
+
2116
+ // also add a joined field - this will not be available in feature's field collection
2117
+ fields.append ( QgsField ( " j1" , QVariant::String ), QgsFields::OriginJoin, 1 );
2118
+
2119
+ f.setAttributes ( QgsAttributes () << QVariant ( " f1" ) << QVariant ( " j1" ) );
2120
+ f.setValid ( true );
2121
+
2122
+ QgsExpression e ( " \" f1\" " );
2123
+ QgsExpressionContext context;
2124
+ context.setFeature ( f );
2125
+ context.setFields ( fields );
2126
+ QVariant result = e.evaluate ( &context );
2127
+ QCOMPARE ( result.toString (), QString ( " f1" ) );
2128
+
2129
+ // test joined field
2130
+ QgsExpression e2 ( " \" j1\" " );
2131
+ result = e2 .evaluate ( &context );
2132
+ QCOMPARE ( result.toString (), QString ( " j1" ) );
2133
+
2134
+ // final test - check that feature's field collection is also used when corresponding field NOT found
2135
+ // in explicitly passed field collection
2136
+ fields.append ( QgsField ( " f2" , QVariant::String ) );
2137
+ f.setFields ( fields );
2138
+ f.setAttributes ( QgsAttributes () << QVariant ( " f1" ) << QVariant ( " j1" ) << QVariant ( " f2" ) );
2139
+ context.setFeature ( f );
2140
+ QgsExpression e3 ( " \" f2\" " );
2141
+ result = e3 .evaluate ( &context );
2142
+ QCOMPARE ( result.toString (), QString ( " f2" ) );
2143
+ }
2144
+
2104
2145
};
2105
2146
2106
2147
QTEST_MAIN ( TestQgsExpression )
0 commit comments