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

    
https://github.com/apache/incubator-trafodion/pull/1253#discussion_r142539459
  
    --- 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 --
    
    I used the same technique that the existing code used. I'm curious how 
source and target tables could differ... check constraints are always local to 
a table, correct? That said, I'm happy to consider alternatives. Can you point 
me to an example?


---

Reply via email to