From 39f4eda1f4d6dfcd9b15a1e12a04ce6ce324c5b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Feb 2021 12:28:32 +1000 Subject: [PATCH] Fix incorrect feature request filter expression generated when (#41368) rule based renderer uses a NOT IN rule Followup 40939 Co-authored-by: Nyall Dawson --- src/core/expression/qgsexpression.cpp | 3 +++ tests/src/core/testqgsexpression.cpp | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/core/expression/qgsexpression.cpp b/src/core/expression/qgsexpression.cpp index f0da8ffed75f..2f6abc229183 100644 --- a/src/core/expression/qgsexpression.cpp +++ b/src/core/expression/qgsexpression.cpp @@ -1147,6 +1147,9 @@ bool QgsExpression::attemptReduceToInClause( const QStringList &expressions, QSt if ( const QgsExpressionNodeInOperator *inOp = dynamic_cast( e.rootNode() ) ) { + if ( inOp->isNotIn() ) + return false; + const QgsExpressionNodeColumnRef *columnRef = dynamic_cast( inOp->node() ); if ( !columnRef ) return false; diff --git a/tests/src/core/testqgsexpression.cpp b/tests/src/core/testqgsexpression.cpp index 00dd65cfd4f7..12a4edc41ecd 100644 --- a/tests/src/core/testqgsexpression.cpp +++ b/tests/src/core/testqgsexpression.cpp @@ -4047,9 +4047,11 @@ class TestQgsExpression: public QObject QTest::newRow( "not equality" ) << ( QStringList() << QStringLiteral( "field <> 'value'" ) ) << false << "field"; QTest::newRow( "one expression" ) << ( QStringList() << QStringLiteral( "field = 'value'" ) ) << true << "field IN ('value')"; QTest::newRow( "one IN expression" ) << ( QStringList() << QStringLiteral( "field IN ('value', 'value2')" ) ) << true << "field IN ('value','value2')"; + QTest::newRow( "one NOT IN expression" ) << ( QStringList() << QStringLiteral( "field NOT IN ('value', 'value2')" ) ) << false << "field NOT IN ('value','value2')"; QTest::newRow( "one IN expression non-literal" ) << ( QStringList() << QStringLiteral( "field IN ('value', 'value2', \"a field\")" ) ) << false << QString(); QTest::newRow( "two expressions" ) << ( QStringList() << QStringLiteral( "field = 'value'" ) << QStringLiteral( "field = 'value2'" ) ) << true << "field IN ('value','value2')"; QTest::newRow( "two expressions with IN" ) << ( QStringList() << QStringLiteral( "field = 'value'" ) << QStringLiteral( "field IN ('value2', 'value3')" ) ) << true << "field IN ('value','value2','value3')"; + QTest::newRow( "two expressions with a not IN" ) << ( QStringList() << QStringLiteral( "field = 'value'" ) << QStringLiteral( "field NOT IN ('value2', 'value3')" ) ) << false << QString(); QTest::newRow( "two expressions with IN not literal" ) << ( QStringList() << QStringLiteral( "field = 'value'" ) << QStringLiteral( "field IN ('value2', 'value3', \"a field\")" ) ) << false << QString(); QTest::newRow( "two expressions with IN different field" ) << ( QStringList() << QStringLiteral( "field = 'value'" ) << QStringLiteral( "field2 IN ('value2', 'value3')" ) ) << false << QString(); QTest::newRow( "two expressions first not equality" ) << ( QStringList() << QStringLiteral( "field <>'value'" ) << QStringLiteral( "field == 'value2'" ) ) << false << "field";