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 ab9271f..9069d69 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 @@ -10569,11 +10569,15 @@ public int compare(Entry o1, Entry 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()); + // Note that exprNodeDesc may be other types, e.g., + // ExprNodeGenericFuncDesc. In this case, we bail out. + if (nodeToText.get(exprNodeDesc) != null) { + replacementText.append(nodeToText.get(exprNodeDesc)); + replacementText.append("."); + replacementText.append(HiveUtils.unparseIdentifier(fieldName, conf)); + nodeToText.put(fieldDesc, replacementText.toString()); + unparseTranslator.addTranslation(node, replacementText.toString()); + } } } diff --git a/ql/src/test/queries/clientpositive/struct_in_view.q b/ql/src/test/queries/clientpositive/struct_in_view.q index d420030..b02d35b 100644 --- a/ql/src/test/queries/clientpositive/struct_in_view.q +++ b/ql/src/test/queries/clientpositive/struct_in_view.q @@ -26,3 +26,11 @@ 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; + 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..e71b21c 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,41 @@ 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