Repository: hive Updated Branches: refs/heads/master 7049f49d9 -> 529580f88
HIVE-13486: Cast the column type for column masking (Pengcheng Xiong, reviewed by Ashutosh Chauhan) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/529580f8 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/529580f8 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/529580f8 Branch: refs/heads/master Commit: 529580f88e6e9c694a705028e08fd3ee59fd260a Parents: 7049f49 Author: Pengcheng Xiong <[email protected]> Authored: Wed Apr 13 13:12:50 2016 -0700 Committer: Pengcheng Xiong <[email protected]> Committed: Wed Apr 13 13:12:50 2016 -0700 ---------------------------------------------------------------------- .../apache/hadoop/hive/ql/parse/MaskAndFilterInfo.java | 7 ++++++- .../org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java | 10 ++++++---- .../java/org/apache/hadoop/hive/ql/parse/TableMask.java | 9 ++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/529580f8/ql/src/java/org/apache/hadoop/hive/ql/parse/MaskAndFilterInfo.java ---------------------------------------------------------------------- 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<String> colTypes; String additionalTabInfo; String alias; ASTNode astNode; - public MaskAndFilterInfo(String additionalTabInfo, String alias, ASTNode astNode) { + public MaskAndFilterInfo(List<String> colTypes, String additionalTabInfo, String alias, + ASTNode astNode) { super(); + this.colTypes = colTypes; this.additionalTabInfo = additionalTabInfo; this.alias = alias; this.astNode = astNode; http://git-wip-us.apache.org/repos/asf/hive/blob/529580f8/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ---------------------------------------------------------------------- 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 9b565c5..d3e7040 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 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { throw new SemanticException("Table " + tabIdName + " is not found."); } - List<String> columns = new ArrayList<>(); + List<String> colNames = new ArrayList<>(); + List<String> 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()) { http://git-wip-us.apache.org/repos/asf/hive/blob/529580f8/ql/src/java/org/apache/hadoop/hive/ql/parse/TableMask.java ---------------------------------------------------------------------- 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 class TableMask { throw new SemanticException("Expect " + privObject.getColumns().size() + " columns in " + privObject.getObjectName() + ", but only find " + exprs.size()); } + List<String> colTypes = maskAndFilterInfo.colTypes; for (int index = 0; index < exprs.size(); index++) { String expr = exprs.get(index); if (expr == null) { @@ -100,7 +101,13 @@ public class TableMask { } 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++) {
