You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by px...@apache.org on 2016/01/12 19:15:54 UTC
hive git commit: HIVE-12785: View with union type and UDF to the
struct is broken (Pengcheng Xiong, reviewed by Laljo John Pullokkaran)
Repository: hive
Updated Branches:
refs/heads/master 29620dad9 -> 632b4e230
HIVE-12785: View with union type and UDF to the struct is broken (Pengcheng Xiong, reviewed by Laljo John Pullokkaran)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/632b4e23
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/632b4e23
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/632b4e23
Branch: refs/heads/master
Commit: 632b4e2306e527ff59e170bcea06c5823013f975
Parents: 29620da
Author: Pengcheng Xiong <px...@apache.org>
Authored: Tue Jan 12 10:08:40 2016 -0800
Committer: Pengcheng Xiong <px...@apache.org>
Committed: Tue Jan 12 10:08:40 2016 -0800
----------------------------------------------------------------------
.../hadoop/hive/ql/parse/SemanticAnalyzer.java | 43 +++++------
.../queries/clientpositive/struct_in_view.q | 16 +++++
.../results/clientpositive/struct_in_view.q.out | 76 ++++++++++++++++++++
3 files changed, 110 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/632b4e23/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 8efd467..c38699d 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
@@ -10523,14 +10523,14 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
}
Map<ExprNodeDesc,String> nodeToText = new HashMap<>();
- List<Entry<ASTNode, ExprNodeDesc>> fieldDescList = new ArrayList<>();
+ List<ASTNode> fieldDescList = new ArrayList<>();
for (Map.Entry<ASTNode, ExprNodeDesc> entry : nodeOutputs.entrySet()) {
if (!(entry.getValue() instanceof ExprNodeColumnDesc)) {
// we need to translate the ExprNodeFieldDesc too, e.g., identifiers in
// struct<>.
if (entry.getValue() instanceof ExprNodeFieldDesc) {
- fieldDescList.add(entry);
+ fieldDescList.add(entry.getKey());
}
continue;
}
@@ -10551,35 +10551,28 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
unparseTranslator.addTranslation(node, replacementText.toString());
}
- if (fieldDescList.size() != 0) {
- // Sorting the list based on the length of fieldName
- // For example, in Column[a].b.c and Column[a].b, Column[a].b should be
- // unparsed before Column[a].b.c
- Collections.sort(fieldDescList, new Comparator<Map.Entry<ASTNode, ExprNodeDesc>>() {
- @Override
- public int compare(Entry<ASTNode, ExprNodeDesc> o1, Entry<ASTNode, ExprNodeDesc> o2) {
- ExprNodeFieldDesc fieldDescO1 = (ExprNodeFieldDesc) o1.getValue();
- ExprNodeFieldDesc fieldDescO2 = (ExprNodeFieldDesc) o2.getValue();
- return fieldDescO1.toString().length() < fieldDescO2.toString().length() ? -1 : 1;
- }
- });
- for (Map.Entry<ASTNode, ExprNodeDesc> entry : fieldDescList) {
- ASTNode node = entry.getKey();
- ExprNodeFieldDesc fieldDesc = (ExprNodeFieldDesc) entry.getValue();
- ExprNodeDesc exprNodeDesc = fieldDesc.getDesc();
- String fieldName = fieldDesc.getFieldName();
- StringBuilder replacementText = new StringBuilder();
- replacementText.append(nodeToText.get(exprNodeDesc));
- replacementText.append(".");
- replacementText.append(HiveUtils.unparseIdentifier(fieldName, conf));
- nodeToText.put(fieldDesc, replacementText.toString());
- unparseTranslator.addTranslation(node, replacementText.toString());
+ for (ASTNode node : fieldDescList) {
+ Map<ASTNode, String> map = translateFieldDesc(node);
+ for (Entry<ASTNode, String> entry : map.entrySet()) {
+ unparseTranslator.addTranslation(entry.getKey(), entry.getValue());
}
}
return nodeOutputs;
}
+ private Map<ASTNode, String> translateFieldDesc(ASTNode node) {
+ Map<ASTNode, String> map = new HashMap<>();
+ if (node.getType() == HiveParser.DOT) {
+ for (Node child : node.getChildren()) {
+ map.putAll(translateFieldDesc((ASTNode) child));
+ }
+ } else if (node.getType() == HiveParser.Identifier) {
+ map.put(node, HiveUtils.unparseIdentifier(node.getText(), conf));
+ }
+ return map;
+ }
+
@Override
public void validate() throws SemanticException {
LOG.debug("validation start");
http://git-wip-us.apache.org/repos/asf/hive/blob/632b4e23/ql/src/test/queries/clientpositive/struct_in_view.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/struct_in_view.q b/ql/src/test/queries/clientpositive/struct_in_view.q
index d420030..fa1ae9c 100644
--- a/ql/src/test/queries/clientpositive/struct_in_view.q
+++ b/ql/src/test/queries/clientpositive/struct_in_view.q
@@ -26,3 +26,19 @@ drop view vs1;
drop view vs2;
+create view v as select named_struct('key', 1).key from src limit 1;
+
+desc extended v;
+
+select * from v;
+
+drop view v;
+
+create view v as select named_struct('end', 1).`end` from src limit 1;
+
+desc extended v;
+
+select * from v;
+
+drop view v;
+
http://git-wip-us.apache.org/repos/asf/hive/blob/632b4e23/ql/src/test/results/clientpositive/struct_in_view.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/struct_in_view.q.out b/ql/src/test/results/clientpositive/struct_in_view.q.out
index 10b2f2e..e57d17e 100644
--- a/ql/src/test/results/clientpositive/struct_in_view.q.out
+++ b/ql/src/test/results/clientpositive/struct_in_view.q.out
@@ -116,3 +116,79 @@ POSTHOOK: query: drop view vs2
POSTHOOK: type: DROPVIEW
POSTHOOK: Input: default@vs2
POSTHOOK: Output: default@vs2
+PREHOOK: query: create view v as select named_struct('key', 1).key from src limit 1
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@v
+POSTHOOK: query: create view v as select named_struct('key', 1).key from src limit 1
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@v
+PREHOOK: query: desc extended v
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@v
+POSTHOOK: query: desc extended v
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@v
+key int
+
+#### A masked pattern was here ####
+PREHOOK: query: select * from v
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@v
+#### A masked pattern was here ####
+POSTHOOK: query: select * from v
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@v
+#### A masked pattern was here ####
+1
+PREHOOK: query: drop view v
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@v
+PREHOOK: Output: default@v
+POSTHOOK: query: drop view v
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@v
+POSTHOOK: Output: default@v
+PREHOOK: query: create view v as select named_struct('end', 1).`end` from src limit 1
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@v
+POSTHOOK: query: create view v as select named_struct('end', 1).`end` from src limit 1
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@v
+PREHOOK: query: desc extended v
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@v
+POSTHOOK: query: desc extended v
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@v
+end int
+
+#### A masked pattern was here ####
+PREHOOK: query: select * from v
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@v
+#### A masked pattern was here ####
+POSTHOOK: query: select * from v
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@v
+#### A masked pattern was here ####
+1
+PREHOOK: query: drop view v
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@v
+PREHOOK: Output: default@v
+POSTHOOK: query: drop view v
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@v
+POSTHOOK: Output: default@v