This is an automated email from the ASF dual-hosted git repository.

zhangbutao 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 46fa50d8c3a HIVE-27960: Invalid function error when using custom udaf 
(#4981)(gaoxiong, reviewed by Butao Zhang)
46fa50d8c3a is described below

commit 46fa50d8c3a0ee0323f21a5a4cd4c116b4bed5af
Author: gaoxiong <[email protected]>
AuthorDate: Sat Jan 20 13:58:34 2024 +0800

    HIVE-27960: Invalid function error when using custom udaf (#4981)(gaoxiong, 
reviewed by Butao Zhang)
---
 data/files/datasets/temp_udaf/load.hive.sql        |  1 +
 .../org/apache/hadoop/hive/ql/exec/Registry.java   |  4 +-
 .../test/queries/clientpositive/ptf_register_use.q |  5 ++
 .../clientpositive/llap/ptf_register_use.q.out     | 84 ++++++++++++++++++++++
 4 files changed, 92 insertions(+), 2 deletions(-)

diff --git a/data/files/datasets/temp_udaf/load.hive.sql 
b/data/files/datasets/temp_udaf/load.hive.sql
new file mode 100644
index 00000000000..f0e59b3feae
--- /dev/null
+++ b/data/files/datasets/temp_udaf/load.hive.sql
@@ -0,0 +1 @@
+create function ptf_register_use_func as 
'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFRowNumber';
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java
index d01da9f8f37..8c8d90f2537 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java
@@ -384,8 +384,8 @@ public class Registry {
   public WindowFunctionInfo getWindowFunctionInfo(String functionName) throws 
SemanticException {
     // First try without qualifiers - would resolve builtin/temp functions
     FunctionInfo info = getFunctionInfo(WINDOW_FUNC_PREFIX + functionName);
-    // Try qualifying with current db name for permanent functions
-    if (info == null) {
+    // Try qualifying with current db name for permanent functions and try 
register function to session
+    if (info == null && FunctionRegistry.getFunctionInfo(functionName) != 
null) {
       String qualifiedName = FunctionUtils.qualifyFunctionName(
               functionName, 
SessionState.get().getCurrentDatabase().toLowerCase());
       info = getFunctionInfo(WINDOW_FUNC_PREFIX + qualifiedName);
diff --git a/ql/src/test/queries/clientpositive/ptf_register_use.q 
b/ql/src/test/queries/clientpositive/ptf_register_use.q
new file mode 100644
index 00000000000..ff899a283dc
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/ptf_register_use.q
@@ -0,0 +1,5 @@
+--! qt:dataset:temp_udaf
+
+explain select ptf_register_use_func() over();
+
+select ptf_register_use_func() over();
diff --git a/ql/src/test/results/clientpositive/llap/ptf_register_use.q.out 
b/ql/src/test/results/clientpositive/llap/ptf_register_use.q.out
new file mode 100644
index 00000000000..3a788430661
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/ptf_register_use.q.out
@@ -0,0 +1,84 @@
+PREHOOK: query: explain select ptf_register_use_func() over()
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: explain select ptf_register_use_func() over()
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Tez
+#### A masked pattern was here ####
+      Edges:
+        Reducer 2 <- Map 1 (SIMPLE_EDGE)
+#### A masked pattern was here ####
+      Vertices:
+        Map 1 
+            Map Operator Tree:
+                TableScan
+                  alias: _dummy_table
+                  Row Limit Per Split: 1
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: COMPLETE
+                  Reduce Output Operator
+                    key expressions: 0 (type: int)
+                    null sort order: a
+                    sort order: +
+                    Map-reduce partition columns: 0 (type: int)
+                    Statistics: Num rows: 1 Data size: 10 Basic stats: 
COMPLETE Column stats: COMPLETE
+            Execution mode: llap
+            LLAP IO: no inputs
+        Reducer 2 
+            Execution mode: llap
+            Reduce Operator Tree:
+              PTF Operator
+                Function definitions:
+                    Input definition
+                      input alias: ptf_0
+                      output shape: 
+                      type: WINDOWING
+                    Windowing table definition
+                      input alias: ptf_1
+                      name: windowingtablefunction
+                      order by: 0 ASC NULLS FIRST
+                      partition by: 0
+                      raw input shape:
+                      window functions:
+                          window function definition
+                            alias: ptf_register_use_func_window_0
+                            name: ptf_register_use_func
+                            window function: GenericUDAFRowNumberEvaluator
+                            window frame: ROWS PRECEDING(MAX)~FOLLOWING(MAX)
+                            isPivotResult: true
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: COMPLETE
+                Select Operator
+                  expressions: ptf_register_use_func_window_0 (type: int)
+                  outputColumnNames: _col0
+                  Statistics: Num rows: 1 Data size: 4 Basic stats: COMPLETE 
Column stats: COMPLETE
+                  File Output Operator
+                    compressed: false
+                    Statistics: Num rows: 1 Data size: 4 Basic stats: COMPLETE 
Column stats: COMPLETE
+                    table:
+                        input format: 
org.apache.hadoop.mapred.SequenceFileInputFormat
+                        output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                        serde: 
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select ptf_register_use_func() over()
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select ptf_register_use_func() over()
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1

Reply via email to