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

panxiaolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new cec94beb81f [Bug](java-udf) fix core dump when javaudf input 0 row 
block (#30720)
cec94beb81f is described below

commit cec94beb81f06807568bc13ae16cfa1644c9f000
Author: Pxl <pxl...@qq.com>
AuthorDate: Fri Feb 2 20:03:38 2024 +0800

    [Bug](java-udf) fix core dump when javaudf input 0 row block (#30720)
    
    fix core dump when javaudf input 0 row block
---
 be/src/olap/schema_change.cpp                                 |  5 +++++
 be/src/vec/exec/jni_connector.cpp                             | 11 +++++------
 .../src/main/java/org/apache/doris/analysis/Analyzer.java     | 10 ++++++++++
 .../org/apache/doris/analysis/CreateMaterializedViewStmt.java |  6 ++++++
 .../main/java/org/apache/doris/analysis/FunctionCallExpr.java |  4 ++--
 .../java/org/apache/doris/catalog/MaterializedIndexMeta.java  |  2 +-
 regression-test/data/javaudf_p0/test_javaudf_float.out        |  5 +++++
 regression-test/suites/javaudf_p0/test_javaudf_float.groovy   |  7 +++++++
 8 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index 1543a6dfd5d..6e432b24096 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -293,6 +293,11 @@ Status BlockChanger::change_block(vectorized::Block* 
ref_block,
 
             int result_column_id = -1;
             RETURN_IF_ERROR(ctx->execute(ref_block, &result_column_id));
+            if (ref_block->get_by_position(result_column_id).column == 
nullptr) {
+                return Status::Error<ErrorCode::INTERNAL_ERROR>(
+                        "{} result column is nullptr",
+                        ref_block->get_by_position(result_column_id).name);
+            }
             ref_block->replace_by_position_if_const(result_column_id);
 
             if (ref_block->get_by_position(result_column_id).column->size() != 
row_size) {
diff --git a/be/src/vec/exec/jni_connector.cpp 
b/be/src/vec/exec/jni_connector.cpp
index 26b66f48aca..fe3bcd50d41 100644
--- a/be/src/vec/exec/jni_connector.cpp
+++ b/be/src/vec/exec/jni_connector.cpp
@@ -215,8 +215,10 @@ Status JniConnector::close() {
 Status JniConnector::_init_jni_scanner(JNIEnv* env, int batch_size) {
     RETURN_IF_ERROR(
             JniUtil::get_jni_scanner_class(env, _connector_class.c_str(), 
&_jni_scanner_cls));
-    if (_jni_scanner_cls == NULL) {
-        if (env->ExceptionOccurred()) env->ExceptionDescribe();
+    if (_jni_scanner_cls == nullptr) {
+        if (env->ExceptionOccurred()) {
+            env->ExceptionDescribe();
+        }
         return Status::InternalError("Fail to get JniScanner class.");
     }
     RETURN_ERROR_IF_EXC(env);
@@ -249,13 +251,10 @@ Status JniConnector::_init_jni_scanner(JNIEnv* env, int 
batch_size) {
 
 Status JniConnector::fill_block(Block* block, const ColumnNumbers& arguments, 
long table_address) {
     if (table_address == 0) {
-        return Status::OK();
+        return Status::InternalError("table_address is 0");
     }
     TableMetaAddress table_meta(table_address);
     long num_rows = table_meta.next_meta_as_long();
-    if (num_rows == 0) {
-        return Status::OK();
-    }
     for (size_t i : arguments) {
         if (block->get_by_position(i).column == nullptr) {
             auto return_type = block->get_data_type(i);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index 115ca193622..38b7403960c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -192,6 +192,8 @@ public class Analyzer {
 
     private boolean isReAnalyze = false;
 
+    private boolean isReplay = false;
+
     public void setIsSubquery() {
         isSubquery = true;
         isFirstScopeInSubquery = true;
@@ -266,6 +268,14 @@ public class Analyzer {
         return globalState.autoBroadcastJoinThreshold;
     }
 
+    public void setReplay() {
+        isReplay = true;
+    }
+
+    public boolean isReplay() {
+        return isReplay;
+    }
+
     private static class InferPredicateState {
         // map from two table tuple ids to JoinOperator between two tables.
         // NOTE: first tupleId's position in front of the second tupleId.
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
index c6a3db45b96..9c120d70048 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
@@ -200,6 +200,9 @@ public class CreateMaterializedViewStmt extends DdlStmt {
         rewriteToBitmapWithCheck();
         // TODO(ml): The mv name in from clause should pass the analyze 
without error.
         selectStmt.forbiddenMVRewrite();
+        if (isReplay) {
+            analyzer.setReplay();
+        }
         selectStmt.analyze(analyzer);
 
         ExprRewriter rewriter = analyzer.getExprRewriter();
@@ -207,6 +210,9 @@ public class CreateMaterializedViewStmt extends DdlStmt {
         selectStmt.rewriteExprs(rewriter);
         selectStmt.reset();
         analyzer = new Analyzer(analyzer.getEnv(), analyzer.getContext());
+        if (isReplay) {
+            analyzer.setReplay();
+        }
         selectStmt.analyze(analyzer);
 
         analyzeSelectClause(analyzer);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 4273b4b56e9..9907b497bb9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -2471,8 +2471,8 @@ public class FunctionCallExpr extends Expr {
         String dbName = fnName.analyzeDb(analyzer);
         if (!Strings.isNullOrEmpty(dbName)) {
             // check operation privilege
-            if (!Env.getCurrentEnv().getAccessManager()
-                    .checkDbPriv(ConnectContext.get(), dbName, 
PrivPredicate.SELECT)) {
+            if (!analyzer.isReplay() && 
!Env.getCurrentEnv().getAccessManager().checkDbPriv(ConnectContext.get(),
+                    dbName, PrivPredicate.SELECT)) {
                 
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, 
"SELECT");
             }
             // TODO(gaoxin): ExternalDatabase not implement udf yet.
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
index 57d428d481f..82a49b14907 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
@@ -303,6 +303,7 @@ public class MaterializedIndexMeta implements Writable, 
GsonPostProcessable {
         CreateMaterializedViewStmt stmt;
         try {
             stmt = (CreateMaterializedViewStmt) SqlParserUtils.getStmt(parser, 
defineStmt.idx);
+            stmt.setIsReplay(true);
             if (analyzer != null) {
                 try {
                     stmt.analyze(analyzer);
@@ -312,7 +313,6 @@ public class MaterializedIndexMeta implements Writable, 
GsonPostProcessable {
                 }
             }
 
-            stmt.setIsReplay(true);
             setWhereClause(stmt.getWhereClause());
             stmt.rewriteToBitmapWithCheck();
             try {
diff --git a/regression-test/data/javaudf_p0/test_javaudf_float.out 
b/regression-test/data/javaudf_p0/test_javaudf_float.out
index d806cbd5461..91977ee43e7 100644
--- a/regression-test/data/javaudf_p0/test_javaudf_float.out
+++ b/regression-test/data/javaudf_p0/test_javaudf_float.out
@@ -21,6 +21,11 @@
 112    1012333.8
 113    \N
 
+-- !select --
+111    -211111.22
+112    1012333.8
+113    \N
+
 -- !select --
 113.9475611
 
diff --git a/regression-test/suites/javaudf_p0/test_javaudf_float.groovy 
b/regression-test/suites/javaudf_p0/test_javaudf_float.groovy
index 06a7f6a4730..0672e1545d7 100644
--- a/regression-test/suites/javaudf_p0/test_javaudf_float.groovy
+++ b/regression-test/suites/javaudf_p0/test_javaudf_float.groovy
@@ -63,6 +63,13 @@ suite("test_javaudf_float") {
         qt_select """ SELECT java_udf_float_test(2.83645,null) as result ; """
         qt_select """ SELECT java_udf_float_test(cast(2.83645 as float),null) 
as result ; """
         qt_select """ SELECT user_id,java_udf_float_test(float_1, float_2) as 
sum FROM ${tableName} order by user_id; """
+        createMV("create materialized view udf_mv as SELECT 
user_id,java_udf_float_test(float_1, float_2) as sum FROM test_javaudf_float 
order by user_id;")
+        qt_select """ SELECT user_id,java_udf_float_test(float_1, float_2) as 
sum FROM ${tableName} order by user_id; """
+
+        explain {
+            sql("SELECT user_id,java_udf_float_test(float_1, float_2) as sum 
FROM ${tableName} order by user_id; ")
+            contains "(udf_mv)"
+        }
         
 
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to