This is an automated email from the ASF dual-hosted git repository.
krisztiankasa pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 2d528556b69 HIVE-28815: Primitive common category for String and
Boolean returns null causing NPE (Soumyakanti Das, reviewed by Krisztian Kasa)
2d528556b69 is described below
commit 2d528556b69c1ec011e83f69d2a2fdcfb78b356e
Author: Soumyakanti Das <[email protected]>
AuthorDate: Mon Mar 17 22:47:12 2025 -0700
HIVE-28815: Primitive common category for String and Boolean returns null
causing NPE (Soumyakanti Das, reviewed by Krisztian Kasa)
---
.../hadoop/hive/ql/exec/FunctionRegistry.java | 12 ++--
.../udf_boolean_string_common_category.q | 14 ++++
.../llap/udf_boolean_string_common_category.q.out | 74 ++++++++++++++++++++++
3 files changed, 95 insertions(+), 5 deletions(-)
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
index f644bd81c9d..33c8153e860 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
@@ -273,6 +273,10 @@ public final class FunctionRegistry {
"=", "==", "<=>", "!=", "<>", "<", "<=", ">", ">=",
"index"));
}
+
+ private static final Set<PrimitiveGrouping> STRING_FRIENDLY_GROUPS = new
HashSet<>(
+ Arrays.asList(PrimitiveGrouping.DATE_GROUP,
PrimitiveGrouping.NUMERIC_GROUP, PrimitiveGrouping.BOOLEAN_GROUP)
+ );
// registry for system functions
private static final Registry system = new Registry(true);
@@ -1165,13 +1169,11 @@ public static PrimitiveCategory
getPrimitiveCommonCategory(TypeInfo a, TypeInfo
}
}
- // Handle date-string common category and numeric-string common category
- if (pgA == PrimitiveGrouping.STRING_GROUP
- && (pgB == PrimitiveGrouping.DATE_GROUP || pgB ==
PrimitiveGrouping.NUMERIC_GROUP)) {
+ // Handle common category for date-string, numeric-string, and
boolean-string types
+ if (pgA == PrimitiveGrouping.STRING_GROUP &&
STRING_FRIENDLY_GROUPS.contains(pgB)) {
return pcA;
}
- if (pgB == PrimitiveGrouping.STRING_GROUP
- && (pgA == PrimitiveGrouping.DATE_GROUP || pgA ==
PrimitiveGrouping.NUMERIC_GROUP)) {
+ if (pgB == PrimitiveGrouping.STRING_GROUP &&
STRING_FRIENDLY_GROUPS.contains(pgA)) {
return pcB;
}
diff --git
a/ql/src/test/queries/clientpositive/udf_boolean_string_common_category.q
b/ql/src/test/queries/clientpositive/udf_boolean_string_common_category.q
new file mode 100644
index 00000000000..46cf428073b
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/udf_boolean_string_common_category.q
@@ -0,0 +1,14 @@
+create table boolarray1(id int, txt string, num int, flag string);
+create table boolarray2(id int, txt string, num int, flag boolean);
+
+insert into boolarray1 values
+ (1, 'one', 5, 'FALSE'),
+ (2, 'two', 14, 'TRUE'),
+ (3, NULL, 3, 'FALSE');
+insert into boolarray2 values
+ (1, 'one', 5, 'FALSE'),
+ (2, 'two', 14, 'TRUE'),
+ (3, NULL, 3, 'FALSE');
+
+select array(*) from boolarray1;
+select array(*) from boolarray2;
diff --git
a/ql/src/test/results/clientpositive/llap/udf_boolean_string_common_category.q.out
b/ql/src/test/results/clientpositive/llap/udf_boolean_string_common_category.q.out
new file mode 100644
index 00000000000..d0d500ae71b
--- /dev/null
+++
b/ql/src/test/results/clientpositive/llap/udf_boolean_string_common_category.q.out
@@ -0,0 +1,74 @@
+PREHOOK: query: create table boolarray1(id int, txt string, num int, flag
string)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@boolarray1
+POSTHOOK: query: create table boolarray1(id int, txt string, num int, flag
string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@boolarray1
+PREHOOK: query: create table boolarray2(id int, txt string, num int, flag
boolean)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@boolarray2
+POSTHOOK: query: create table boolarray2(id int, txt string, num int, flag
boolean)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@boolarray2
+PREHOOK: query: insert into boolarray1 values
+ (1, 'one', 5, 'FALSE'),
+ (2, 'two', 14, 'TRUE'),
+ (3, NULL, 3, 'FALSE')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@boolarray1
+POSTHOOK: query: insert into boolarray1 values
+ (1, 'one', 5, 'FALSE'),
+ (2, 'two', 14, 'TRUE'),
+ (3, NULL, 3, 'FALSE')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@boolarray1
+POSTHOOK: Lineage: boolarray1.flag SCRIPT []
+POSTHOOK: Lineage: boolarray1.id SCRIPT []
+POSTHOOK: Lineage: boolarray1.num SCRIPT []
+POSTHOOK: Lineage: boolarray1.txt SCRIPT []
+PREHOOK: query: insert into boolarray2 values
+ (1, 'one', 5, 'FALSE'),
+ (2, 'two', 14, 'TRUE'),
+ (3, NULL, 3, 'FALSE')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@boolarray2
+POSTHOOK: query: insert into boolarray2 values
+ (1, 'one', 5, 'FALSE'),
+ (2, 'two', 14, 'TRUE'),
+ (3, NULL, 3, 'FALSE')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@boolarray2
+POSTHOOK: Lineage: boolarray2.flag SCRIPT []
+POSTHOOK: Lineage: boolarray2.id SCRIPT []
+POSTHOOK: Lineage: boolarray2.num SCRIPT []
+POSTHOOK: Lineage: boolarray2.txt SCRIPT []
+PREHOOK: query: select array(*) from boolarray1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@boolarray1
+#### A masked pattern was here ####
+POSTHOOK: query: select array(*) from boolarray1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@boolarray1
+#### A masked pattern was here ####
+["1","one","5","FALSE"]
+["2","two","14","TRUE"]
+["3",null,"3","FALSE"]
+PREHOOK: query: select array(*) from boolarray2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@boolarray2
+#### A masked pattern was here ####
+POSTHOOK: query: select array(*) from boolarray2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@boolarray2
+#### A masked pattern was here ####
+["1","one","5","FALSE"]
+["2","two","14","TRUE"]
+["3",null,"3","FALSE"]