Github user DaveBirdsall commented on a diff in the pull request:

    
https://github.com/apache/incubator-trafodion/pull/1253#discussion_r142539579
  
    --- 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) &&
    +              (targetCol->getColName() == sourceCol->getColName()) &&
    +              (targetCol->getHbaseColFam() == sourceCol->getHbaseColFam()) 
&&
    +              (targetCol->getHbaseColQual() == 
sourceCol->getHbaseColQual()) &&
    +              
(targetCol->getNATable()->getTableName().getQualifiedNameAsAnsiString() ==
    +               
sourceCol->getNATable()->getTableName().getQualifiedNameAsAnsiString()))
    +            {
    +              found = TRUE;
    +              break;
    +            }
    +        }
    +
    +      if (found)
    +   {
    +          Attributes * sourceValAttr = (generator->addMapInfo(sourceValId, 
0))->getAttr();
    +          Attributes * targetValAttr = (generator->getMapInfo(targetValId, 
0))->getAttr();
    +
    +          // Save original location attributes so we can change them back 
after
    +          // generating the update constraint expression
    +
    +          Attributes * savedValAttr = new(generator->wHeap()) Attributes();
    --- End diff --
    
    Happy to consider. Can you point me to an instructive example?


---

Reply via email to