Skip to content

Commit

Permalink
HPCC-28338 Avoid re-evaluating the inputs to row PROJECT
Browse files Browse the repository at this point in the history
Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
  • Loading branch information
ghalliday committed Oct 4, 2022
1 parent 3a586cc commit 36225f5
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions ecl/hqlcpp/hqlcppds.cpp
Expand Up @@ -4601,15 +4601,27 @@ void HqlCppTranslator::doBuildRowAssignProjectRow(BuildCtx & ctx, IReferenceSele
IHqlExpression * srcRow = expr->queryChild(0);
IHqlExpression * transform = expr->queryChild(1);

//Evaluate the row expression here - otherwise it could be re-evaluated lots of times depending on the context it is used
Owned<IReferenceSelector> source = buildNewRow(ctx, srcRow);
BuildCtx subctx(ctx);

OwnedHqlExpr leftSelect = createSelector(no_left, srcRow, querySelSeq(expr));
OwnedHqlExpr newRow = srcRow->getOperator() == no_select ? LINK(srcRow) : createRow(no_newrow, LINK(srcRow));
OwnedHqlExpr newTransform = replaceSelector(transform, leftSelect, newRow);
if (!source->isRoot())
{
OwnedHqlExpr leftSelect = createSelector(no_left, srcRow, querySelSeq(expr));
OwnedHqlExpr newRow = srcRow->getOperator() == no_select ? LINK(srcRow) : createRow(no_newrow, LINK(srcRow));
OwnedHqlExpr newTransform = replaceSelector(transform, leftSelect, newRow);

Owned<BoundRow> selfCursor = target->getRow(subctx);
doTransform(subctx, newTransform, selfCursor);
Owned<BoundRow> selfCursor = target->getRow(subctx);
doTransform(subctx, newTransform, selfCursor);
}
else
{
//Alternative implementation that rebinds the selector and uses that directly
BoundRow * bound = source->getRow(subctx);
bindTableCursor(subctx, srcRow, bound->queryBound(), no_left, querySelSeq(expr));
Owned<BoundRow> selfCursor = target->getRow(subctx);
doTransform(subctx, transform, selfCursor);
}
}

void HqlCppTranslator::doBuildRowAssignSerializeRow(BuildCtx & ctx, IReferenceSelector * target, IHqlExpression * expr)
Expand Down

0 comments on commit 36225f5

Please sign in to comment.