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"]

Reply via email to