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