Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Actually also don't evaluate right-hand side
(cherry picked from commit b5dd082)
  • Loading branch information
wonder-sk authored and nirvn committed Dec 6, 2019
1 parent b366a20 commit c9d9b40
Showing 1 changed file with 13 additions and 10 deletions.
23 changes: 13 additions & 10 deletions src/core/expression/qgsexpressionnodeimpl.cpp
Expand Up @@ -178,6 +178,17 @@ QVariant QgsExpressionNodeBinaryOperator::evalNode( QgsExpression *parent, const
{
QVariant vL = mOpLeft->eval( parent, context );
ENSURE_NO_EVAL_ERROR;

if ( mOp == boAnd || mOp == boOr )
{
QgsExpressionUtils::TVL tvlL = QgsExpressionUtils::getTVLValue( vL, parent );
ENSURE_NO_EVAL_ERROR;
if ( mOp == boAnd && tvlL == QgsExpressionUtils::False )
return TVL_False; // shortcut -- no need to evaluate right-hand side
if ( mOp == boOr && tvlL == QgsExpressionUtils::True )
return TVL_True; // shortcut -- no need to evaluate right-hand side
}

QVariant vR = mOpRight->eval( parent, context );
ENSURE_NO_EVAL_ERROR;

Expand Down Expand Up @@ -298,22 +309,14 @@ QVariant QgsExpressionNodeBinaryOperator::evalNode( QgsExpression *parent, const

case boAnd:
{
QgsExpressionUtils::TVL tvlL = QgsExpressionUtils::getTVLValue( vL, parent );
ENSURE_NO_EVAL_ERROR;
if ( tvlL == QgsExpressionUtils::False )
return TVL_False; // shortcut -- no need to evaluate right-hand side
QgsExpressionUtils::TVL tvlR = QgsExpressionUtils::getTVLValue( vR, parent );
QgsExpressionUtils::TVL tvlL = QgsExpressionUtils::getTVLValue( vL, parent ), tvlR = QgsExpressionUtils::getTVLValue( vR, parent );
ENSURE_NO_EVAL_ERROR;
return QgsExpressionUtils::tvl2variant( QgsExpressionUtils::AND[tvlL][tvlR] );
}

case boOr:
{
QgsExpressionUtils::TVL tvlL = QgsExpressionUtils::getTVLValue( vL, parent );
ENSURE_NO_EVAL_ERROR;
if ( tvlL == QgsExpressionUtils::True )
return TVL_True; // shortcut -- no need to evaluate right-hand side
QgsExpressionUtils::TVL tvlR = QgsExpressionUtils::getTVLValue( vR, parent );
QgsExpressionUtils::TVL tvlL = QgsExpressionUtils::getTVLValue( vL, parent ), tvlR = QgsExpressionUtils::getTVLValue( vR, parent );
ENSURE_NO_EVAL_ERROR;
return QgsExpressionUtils::tvl2variant( QgsExpressionUtils::OR[tvlL][tvlR] );
}
Expand Down

0 comments on commit c9d9b40

Please sign in to comment.