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.


---

Reply via email to