[
https://issues.apache.org/jira/browse/TRAFODION-1610?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16190505#comment-16190505
]
ASF GitHub Bot commented on TRAFODION-1610:
-------------------------------------------
Github user zellerh commented on a diff in the pull request:
https://github.com/apache/incubator-trafodion/pull/1253#discussion_r142544778
--- 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 --
Thanks. Here is one example, but there are many others:
FileScan::preCodeGen() in file GenPreCode.cpp:
```C++
ValueIdMap divExprMap;
ValueId computedBeg;
// If hashJoinBeg is :sysHV1 and the computed column
// expression is A/100, then the begin value for
// the computed column is :sysHV1/100. Do this
// rewrite by using a ValueIdMap
divExprMap.addMapEntry(underlyingCol, hashJoinBeg);
divExprMap.rewriteValueIdDown(computedColExpr->getValueId(),
computedBeg);
newBeg = computedBeg.getItemExpr();
```
There are also examples in file OptPhysRelExpr where we rewrite expressions
on the select side of an insert/select into expressions on the insert side,
using the ValueIdMap that can be accessed with Join::updateToSelectMap().
> Generate constraint expression for update/merge commands
> --------------------------------------------------------
>
> Key: TRAFODION-1610
> URL: https://issues.apache.org/jira/browse/TRAFODION-1610
> Project: Apache Trafodion
> Issue Type: Sub-task
> Components: sql-cmp
> Reporter: Selvaganesan Govindarajan
> Assignee: David Wayne Birdsall
>
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)