diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/MaskAndFilterInfo.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/MaskAndFilterInfo.java index 1678d2c..f5a12a3 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/MaskAndFilterInfo.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/MaskAndFilterInfo.java @@ -18,13 +18,18 @@ package org.apache.hadoop.hive.ql.parse; +import java.util.List; + public class MaskAndFilterInfo { + List colTypes; String additionalTabInfo; String alias; ASTNode astNode; - public MaskAndFilterInfo(String additionalTabInfo, String alias, ASTNode astNode) { + public MaskAndFilterInfo(List colTypes, String additionalTabInfo, String alias, + ASTNode astNode) { super(); + this.colTypes = colTypes; this.additionalTabInfo = additionalTabInfo; this.alias = alias; this.astNode = astNode; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 987f25d..b138615 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -10408,13 +10408,15 @@ private void walkASTMarkTABREF(ASTNode ast, Set cteAlias) throw new SemanticException("Table " + tabIdName + " is not found."); } - List columns = new ArrayList<>(); + List colNames = new ArrayList<>(); + List colTypes = new ArrayList<>(); for (FieldSchema col : table.getAllCols()) { - columns.add(col.getName()); + colNames.add(col.getName()); + colTypes.add(col.getType()); } - basicInfos.put(new HivePrivilegeObject(table.getDbName(), table.getTableName(), columns), - new MaskAndFilterInfo(additionalTabInfo.toString(), alias, astNode)); + basicInfos.put(new HivePrivilegeObject(table.getDbName(), table.getTableName(), colNames), + new MaskAndFilterInfo(colTypes, additionalTabInfo.toString(), alias, astNode)); } if (astNode.getChildCount() > 0 && !ignoredTokens.contains(astNode.getToken().getType())) { for (Node child : astNode.getChildren()) { diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/TableMask.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/TableMask.java index f030da2..f3c7262 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/TableMask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/TableMask.java @@ -89,6 +89,7 @@ public String create(HivePrivilegeObject privObject, MaskAndFilterInfo maskAndFi throw new SemanticException("Expect " + privObject.getColumns().size() + " columns in " + privObject.getObjectName() + ", but only find " + exprs.size()); } + List colTypes = maskAndFilterInfo.colTypes; for (int index = 0; index < exprs.size(); index++) { String expr = exprs.get(index); if (expr == null) { @@ -100,7 +101,13 @@ public String create(HivePrivilegeObject privObject, MaskAndFilterInfo maskAndFi } else { firstOne = false; } - sb.append(expr + " AS " + privObject.getColumns().get(index)); + String colName = privObject.getColumns().get(index); + if (!expr.equals(colName)) { + // CAST(expr AS COLTYPE) AS COLNAME + sb.append("CAST(" + expr + " AS " + colTypes.get(index) + ") AS " + colName); + } else { + sb.append(expr); + } } } else { for (int index = 0; index < privObject.getColumns().size(); index++) {