Github user zellerh commented on a diff in the pull request: https://github.com/apache/incubator-trafodion/pull/1253#discussion_r142527381 --- Diff: core/sql/generator/GenRelUpdate.cpp --- @@ -292,8 +292,85 @@ static short genUpdExpr( return 0; } -static short genUpdConstraintExpr(Generator *generator) +// Used to generate update or insert constraint expressions for update operators +static short genUpdConstraintExpr(Generator * generator, + ItemExpr * constrTree, + const ValueIdSet & constraintColumns, + ValueIdArray & targetRecExprArray, + ex_expr ** targetExpr /* out */) { + ExpGenerator * expGen = generator->getExpGenerator(); + + // The Attributes for the table columns refer to the old values of the column. + // The constraints must operate on the new values, though. So we must do a + // switcheroo on the Attributes for the update expression. The target value IDs + // come from targetRecExprArray. + + ValueIdList savedSourceVIDlist; + NAList<Attributes*> savedSourceAttrsList(generator->wHeap()); + + for (ValueId sourceValId = constraintColumns.init(); + constraintColumns.next(sourceValId); + constraintColumns.advance(sourceValId)) + { + NAColumn * sourceCol = ((IndexColumn*)sourceValId.getItemExpr())->getNAColumn(); + ValueId targetValId; + NABoolean found = FALSE; + for (CollIndex ni = 0; (!found) && (ni < targetRecExprArray.entries()); ni++) + { + const ItemExpr *assignExpr = targetRecExprArray[ni].getItemExpr(); + targetValId = assignExpr->child(0)->castToItemExpr()->getValueId(); + NAColumn *targetCol = NULL; + if (targetValId.getItemExpr()->getOperatorType() == ITM_BASECOLUMN) + targetCol = ((BaseColumn*)targetValId.getItemExpr())->getNAColumn(); + else if (targetValId.getItemExpr()->getOperatorType() == ITM_INDEXCOLUMN) + targetCol = ((IndexColumn*)targetValId.getItemExpr())->getNAColumn(); + + if ((targetCol) && --- End diff -- This code to find the corresponding column seems risky to me. Isn't there a way to find the column by position? If the NATables for source and target are the same, that should be possible. If they are not, then matching by name is probably not the right thing anyway.
---