Skip to content

Commit a1a8d1b

Browse files
committed
Fix 'nan'='nan' evaluates to false in expressions
Also fix 'nan' and 'inf' being treated as doubles rather than strings.
1 parent 8c53821 commit a1a8d1b

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/core/qgsexpression.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,13 @@ inline bool isDoubleSafe( const QVariant& v )
176176
if ( v.type() == QVariant::UInt ) return true;
177177
if ( v.type() == QVariant::LongLong ) return true;
178178
if ( v.type() == QVariant::ULongLong ) return true;
179-
if ( v.type() == QVariant::String ) { bool ok; v.toString().toDouble( &ok ); return ok; }
179+
if ( v.type() == QVariant::String )
180+
{
181+
bool ok;
182+
double val = v.toString().toDouble( &ok );
183+
ok = ok && qIsFinite( val ) && !qIsNaN( val );
184+
return ok;
185+
}
180186
return false;
181187
}
182188

@@ -239,7 +245,7 @@ static double getDoubleValue( const QVariant& value, QgsExpression* parent )
239245
{
240246
bool ok;
241247
double x = value.toDouble( &ok );
242-
if ( !ok )
248+
if ( !ok || qIsNaN( x ) || !qIsFinite( x ) )
243249
{
244250
parent->setEvalErrorString( QObject::tr( "Cannot convert '%1' to double" ).arg( value.toString() ) );
245251
return 0;

tests/src/core/testqgsexpression.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,10 @@ class TestQgsExpression: public QObject
202202
QTest::newRow( "plus double" ) << "1+1.3" << false << QVariant( 2.3 );
203203
QTest::newRow( "plus with null" ) << "null+3" << false << QVariant();
204204
QTest::newRow( "plus invalid" ) << "1+'foo'" << true << QVariant();
205+
205206
QTest::newRow( "minus int" ) << "1-3" << false << QVariant( -2 );
207+
QTest::newRow( "minus nan" ) << "1-'nan'" << true << QVariant();
208+
QTest::newRow( "minus inf" ) << "1-'inf'" << true << QVariant();
206209
QTest::newRow( "mul int" ) << "8*7" << false << QVariant( 56 );
207210
QTest::newRow( "div int" ) << "5/2" << false << QVariant( 2.5 );
208211
QTest::newRow( "mod int" ) << "20%6" << false << QVariant( 2 );
@@ -238,6 +241,10 @@ class TestQgsExpression: public QObject
238241
QTest::newRow( "ge int 2" ) << "3 >= 3" << false << QVariant( 1 );
239242
QTest::newRow( "lt text 1" ) << "'bar' < 'foo'" << false << QVariant( 1 );
240243
QTest::newRow( "lt text 2" ) << "'foo' < 'bar'" << false << QVariant( 0 );
244+
QTest::newRow( "'nan'='nan'" ) << "'nan'='nan'" << false << QVariant( 1 );
245+
QTest::newRow( "'nan'='x'" ) << "'nan'='x'" << false << QVariant( 0 );
246+
QTest::newRow( "'inf'='inf'" ) << "'inf'='inf'" << false << QVariant( 1 );
247+
QTest::newRow( "'inf'='x'" ) << "'inf'='x'" << false << QVariant( 0 );
241248

242249
// is, is not
243250
QTest::newRow( "is null,null" ) << "null is null" << false << QVariant( 1 );

0 commit comments

Comments
 (0)