diff --git a/ql/src/test/queries/clientpositive/cbo_udf_max.q b/ql/src/test/queries/clientpositive/cbo_udf_max.q new file mode 100644 index 0000000..c22e89b --- /dev/null +++ b/ql/src/test/queries/clientpositive/cbo_udf_max.q @@ -0,0 +1,36 @@ +set hive.cbo.returnpath.hiveop=true; + +DESCRIBE FUNCTION max; +DESCRIBE FUNCTION EXTENDED max; + + +set hive.map.aggr = false; +set hive.groupby.skewindata = false; + +SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src; + + +set hive.map.aggr = true; +set hive.groupby.skewindata = false; + +SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src; + + +set hive.map.aggr = false; +set hive.groupby.skewindata = true; + +SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src; + + +set hive.map.aggr = true; +set hive.groupby.skewindata = true; + +SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src; diff --git a/ql/src/test/results/clientpositive/cbo_udf_max.q.out b/ql/src/test/results/clientpositive/cbo_udf_max.q.out new file mode 100644 index 0000000..410cf31 --- /dev/null +++ b/ql/src/test/results/clientpositive/cbo_udf_max.q.out @@ -0,0 +1,62 @@ +PREHOOK: query: DESCRIBE FUNCTION max +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION max +POSTHOOK: type: DESCFUNCTION +max(expr) - Returns the maximum value of expr +PREHOOK: query: DESCRIBE FUNCTION EXTENDED max +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED max +POSTHOOK: type: DESCFUNCTION +max(expr) - Returns the maximum value of expr +PREHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +{"expr$0":498,"expr$1":"val_498"} {"expr$0":498,"expr$1":"val_498"} +PREHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +{"expr$0":498,"expr$1":"val_498"} {"expr$0":"98","expr$1":"val_98"} +PREHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +{"expr$0":498,"expr$1":"val_498"} {"expr$0":498,"expr$1":"val_498"} +PREHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT max(struct(CAST(key as INT), value)), + max(struct(key, value)) +FROM src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +{"expr$0":498,"expr$1":"val_498"} {"expr$0":"98","expr$1":"val_98"} diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java index a4323d1..24361c7 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java @@ -256,7 +256,7 @@ public String toString() { }; private static boolean isTypeChar(char c) { - return Character.isLetterOrDigit(c) || c == '_' || c == '.' || c == ' '; + return Character.isLetterOrDigit(c) || c == '_' || c == '.' || c == ' ' || c == '$'; } /** @@ -266,6 +266,9 @@ private static boolean isTypeChar(char c) { * * tokenize("map") should return * ["map","<","int",",","string",">"] + * + * Note that we add '$' in new Calcite return path. As '$' will not appear + * in any type in Hive, it is safe to do so. */ private static ArrayList tokenize(String typeInfoString) { ArrayList tokens = new ArrayList(0);