diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java index 6952ffb7cc..dfadcd447e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java @@ -1199,11 +1199,17 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx ctx, Object.. if (HiveConf.getPositionFromInternalName(colName) == -1) { // if its not an internal name, this is what we want. ((ExprNodeConstantDesc)newCol).setFoldedFromCol(colName); + // See if we can set the tabAlias this was folded from as well. + ExprNodeDesc colExpr = colList.get(i); + if (colExpr instanceof ExprNodeColumnDesc) { + ((ExprNodeConstantDesc)newCol).setFoldedFromTab(((ExprNodeColumnDesc) colExpr).getTabAlias()); + } } else { // If it was internal column, lets try to get name from columnExprMap ExprNodeDesc desc = columnExprMap.get(colName); if (desc instanceof ExprNodeConstantDesc) { ((ExprNodeConstantDesc)newCol).setFoldedFromCol(((ExprNodeConstantDesc)desc).getFoldedFromCol()); + ((ExprNodeConstantDesc)newCol).setFoldedFromTab(((ExprNodeConstantDesc)desc).getFoldedFromTab()); } } } @@ -1364,7 +1370,7 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx ctx, Object.. for (ExprNodeDesc desc : rsDesc.getKeyCols()) { ExprNodeDesc newDesc = foldExpr(desc, constants, cppCtx, op, 0, false); if (newDesc != desc && desc instanceof ExprNodeColumnDesc && newDesc instanceof ExprNodeConstantDesc) { - ((ExprNodeConstantDesc)newDesc).setFoldedFromCol(((ExprNodeColumnDesc)desc).getColumn()); + ((ExprNodeConstantDesc)newDesc).setFoldedTabCol((ExprNodeColumnDesc)desc); } newKeyEpxrs.add(newDesc); } @@ -1376,7 +1382,7 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx ctx, Object.. ExprNodeDesc expr = foldExpr(desc, constants, cppCtx, op, 0, false); if (expr != desc && desc instanceof ExprNodeColumnDesc && expr instanceof ExprNodeConstantDesc) { - ((ExprNodeConstantDesc) expr).setFoldedFromCol(((ExprNodeColumnDesc) desc).getColumn()); + ((ExprNodeConstantDesc) expr).setFoldedTabCol((ExprNodeColumnDesc) desc); } newPartExprs.add(expr); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java index 1a3ae2b1ee..3dc2a0a4a5 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -682,6 +682,7 @@ private static ExprNodeDesc toExprNodeDesc(ColumnInfo colInfo) { Object constant = ((ConstantObjectInspector) inspector).getWritableConstantValue(); ExprNodeConstantDesc constantExpr = new ExprNodeConstantDesc(colInfo.getType(), poi.getPrimitiveJavaObject(constant)); constantExpr.setFoldedFromCol(colInfo.getInternalName()); + constantExpr.setFoldedFromTab(colInfo.getTabAlias()); return constantExpr; } // non-constant or non-primitive constants diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java index a5221a2baf..f8cd566b3d 100755 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java @@ -42,9 +42,17 @@ // If this constant was created while doing constant folding, foldedFromCol holds the name of // original column from which it was folded. private transient String foldedFromCol; + // If this constant was created while doing constant folding, foldedFromTab holds the name of + // the original tabAlias from which it was folded. + private transient String foldedFromTab; // string representation of folding constant. private transient String foldedFromVal; + public void setFoldedTabCol(ExprNodeColumnDesc colDesc) { + setFoldedFromTab(colDesc.getTabAlias()); + setFoldedFromCol(colDesc.getColumn()); + } + public ExprNodeConstantDesc setFoldedFromVal(String foldedFromVal) { this.foldedFromVal = foldedFromVal; return this; @@ -62,6 +70,14 @@ public void setFoldedFromCol(String foldedFromCol) { this.foldedFromCol = foldedFromCol; } + public String getFoldedFromTab() { + return foldedFromTab; + } + + public void setFoldedFromTab(String foldedFromTab) { + this.foldedFromTab = foldedFromTab; + } + public ExprNodeConstantDesc() { } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java index 969cc4b305..ca1acfe394 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java @@ -22,6 +22,8 @@ import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.apache.hadoop.hive.ql.exec.ColumnInfo; import org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator; import org.apache.hadoop.hive.ql.exec.ExprNodeEvaluatorFactory; @@ -45,6 +47,8 @@ public class ExprNodeDescUtils { + protected static final Logger LOG = LoggerFactory.getLogger(ExprNodeDescUtils.class); + public static int indexOf(ExprNodeDesc origin, List sources) { for (int i = 0; i < sources.size(); i++) { if (origin.isSame(sources.get(i))) { @@ -354,8 +358,13 @@ public static ExprNodeDesc resolveJoinKeysAsRSColumns(ExprNodeDesc source, Opera // Join key expression is likely some expression involving functions/operators, so there // is no actual table column for this. But the ReduceSink operator should still have an // output column corresponding to this expression, using the columnInternalName. - // TODO: does tableAlias matter for this kind of expression? - return new ExprNodeColumnDesc(source.getTypeInfo(), columnInternalName, "", false); + String tabAlias = ""; + // HIVE-21746: Set tabAlias when possible, such as for constant folded column + // that has foldedFromTab info. + if (source instanceof ExprNodeConstantDesc) { + tabAlias = ((ExprNodeConstantDesc) source).getFoldedFromTab(); + } + return new ExprNodeColumnDesc(source.getTypeInfo(), columnInternalName, tabAlias, false); } } }