diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java index 0015986..6f81188 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -164,6 +165,27 @@ public class RowResolver implements Serializable{ return ret; } + public ColumnInfo getExpression(String tab_alias, String col_alias) throws SemanticException { + if (tab_alias != null) { + tab_alias = tab_alias.toLowerCase(); + return rslvMap.get("").get("(. (tok_table_or_col " + tab_alias + ") " + col_alias +")"); + } + ColumnInfo ret = null; + boolean found = false; + Pattern pattern = Pattern.compile("\\(\\. \\(tok_table_or_col .+\\) " + col_alias +"\\)"); + for (Map.Entry entry : rslvMap.get("").entrySet()) { + if (pattern.matcher(entry.getKey()).matches()) { + if (found) { + throw new SemanticException("Column " + col_alias + + " Found in more than One Tables/Subqueries"); + } + found = true; + ret = entry.getValue(); + } + } + return ret; + } + public ArrayList getColumnInfos() { return rowSchema.getSignature(); } diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java index 0369f6e..330ef9a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -407,7 +407,12 @@ public final class TypeCheckProcFactory { .getChild(0).getText()); boolean isTableAlias = input.hasTableAlias(tableOrCol); - ColumnInfo colInfo = input.get(null, tableOrCol); + ColumnInfo colInfo; + if (!input.getIsExprResolver()) { + colInfo = input.get(null, tableOrCol); + } else { + colInfo = input.getExpression(null, tableOrCol); + } if (isTableAlias) { if (colInfo != null) {