You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by xu...@apache.org on 2015/11/12 04:59:41 UTC
[17/55] [abbrv] hive git commit: HIVE-12156: expanding view doesn't
quote reserved keyword (Pengcheng Xiong, reviewed by Laljo John Pullokkaran)
HIVE-12156: expanding view doesn't quote reserved keyword (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/a46729b3
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/a46729b3
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/a46729b3
Branch: refs/heads/spark
Commit: a46729b3e3d2e902c46e6b0a553b6f22f529f5df
Parents: 0918ff9
Author: Pengcheng Xiong <px...@apache.org>
Authored: Thu Nov 5 11:26:05 2015 -0800
Committer: Pengcheng Xiong <px...@apache.org>
Committed: Thu Nov 5 11:26:05 2015 -0800
----------------------------------------------------------------------
.../hadoop/hive/ql/parse/SemanticAnalyzer.java | 37 ++++++
.../queries/clientpositive/struct_in_view.q | 28 +++++
.../results/clientpositive/struct_in_view.q.out | 118 +++++++++++++++++++
3 files changed, 183 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/a46729b3/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 d2c3a7c..f3d7057 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
@@ -26,6 +26,8 @@ import java.io.Serializable;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -155,6 +157,7 @@ import org.apache.hadoop.hive.ql.plan.ExprNodeColumnListDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeDescUtils;
+import org.apache.hadoop.hive.ql.plan.ExprNodeFieldDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc;
import org.apache.hadoop.hive.ql.plan.FileSinkDesc;
import org.apache.hadoop.hive.ql.plan.FilterDesc;
@@ -10496,8 +10499,16 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
return nodeOutputs;
}
+ Map<ExprNodeDesc,String> nodeToText = new HashMap<>();
+ List<Entry<ASTNode, ExprNodeDesc>> 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);
+ }
continue;
}
ASTNode node = entry.getKey();
@@ -10513,9 +10524,35 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
replacementText.append(HiveUtils.unparseIdentifier(tmp[0], conf));
replacementText.append(".");
replacementText.append(HiveUtils.unparseIdentifier(tmp[1], conf));
+ nodeToText.put(columnDesc, replacementText.toString());
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>>() {
+ 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());
+ }
+ }
+
return nodeOutputs;
}
http://git-wip-us.apache.org/repos/asf/hive/blob/a46729b3/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
new file mode 100644
index 0000000..d420030
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/struct_in_view.q
@@ -0,0 +1,28 @@
+drop table testreserved;
+
+create table testreserved (data struct<`end`:string, id: string>);
+
+create view testreservedview as select data.`end` as data_end, data.id as data_id from testreserved;
+
+describe extended testreservedview;
+
+select data.`end` from testreserved;
+
+drop view testreservedview;
+
+drop table testreserved;
+
+create table s (default struct<src:struct<`end`:struct<key:string>, id: string>, id: string>);
+
+create view vs1 as select default.src.`end`.key from s;
+
+describe extended vs1;
+
+create view vs2 as select default.src.`end` from s;
+
+describe extended vs2;
+
+drop view vs1;
+
+drop view vs2;
+
http://git-wip-us.apache.org/repos/asf/hive/blob/a46729b3/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
new file mode 100644
index 0000000..10b2f2e
--- /dev/null
+++ b/ql/src/test/results/clientpositive/struct_in_view.q.out
@@ -0,0 +1,118 @@
+PREHOOK: query: drop table testreserved
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table testreserved
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table testreserved (data struct<`end`:string, id: string>)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testreserved
+POSTHOOK: query: create table testreserved (data struct<`end`:string, id: string>)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testreserved
+PREHOOK: query: create view testreservedview as select data.`end` as data_end, data.id as data_id from testreserved
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@testreserved
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testreservedview
+POSTHOOK: query: create view testreservedview as select data.`end` as data_end, data.id as data_id from testreserved
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@testreserved
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testreservedview
+PREHOOK: query: describe extended testreservedview
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@testreservedview
+POSTHOOK: query: describe extended testreservedview
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@testreservedview
+data_end string
+data_id string
+
+#### A masked pattern was here ####
+PREHOOK: query: select data.`end` from testreserved
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testreserved
+#### A masked pattern was here ####
+POSTHOOK: query: select data.`end` from testreserved
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testreserved
+#### A masked pattern was here ####
+PREHOOK: query: drop view testreservedview
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@testreservedview
+PREHOOK: Output: default@testreservedview
+POSTHOOK: query: drop view testreservedview
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@testreservedview
+POSTHOOK: Output: default@testreservedview
+PREHOOK: query: drop table testreserved
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@testreserved
+PREHOOK: Output: default@testreserved
+POSTHOOK: query: drop table testreserved
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@testreserved
+POSTHOOK: Output: default@testreserved
+PREHOOK: query: create table s (default struct<src:struct<`end`:struct<key:string>, id: string>, id: string>)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@s
+POSTHOOK: query: create table s (default struct<src:struct<`end`:struct<key:string>, id: string>, id: string>)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@s
+PREHOOK: query: create view vs1 as select default.src.`end`.key from s
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@s
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vs1
+POSTHOOK: query: create view vs1 as select default.src.`end`.key from s
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@s
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vs1
+PREHOOK: query: describe extended vs1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@vs1
+POSTHOOK: query: describe extended vs1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@vs1
+key string
+
+#### A masked pattern was here ####
+PREHOOK: query: create view vs2 as select default.src.`end` from s
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@s
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vs2
+POSTHOOK: query: create view vs2 as select default.src.`end` from s
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@s
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vs2
+PREHOOK: query: describe extended vs2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@vs2
+POSTHOOK: query: describe extended vs2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@vs2
+end struct<key:string>
+
+#### A masked pattern was here ####
+PREHOOK: query: drop view vs1
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@vs1
+PREHOOK: Output: default@vs1
+POSTHOOK: query: drop view vs1
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@vs1
+POSTHOOK: Output: default@vs1
+PREHOOK: query: drop view vs2
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@vs2
+PREHOOK: Output: default@vs2
+POSTHOOK: query: drop view vs2
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@vs2
+POSTHOOK: Output: default@vs2