You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2024/02/03 12:27:39 UTC

(doris) 09/24: [Bug](java-udf) fix core dump when javaudf input 0 row block (#30720)

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

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 5687ca977dd6acd9fdeadb7b6f3090888ab15d42
Author: Pxl <px...@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 66e6ffcf2b2..f0372f4bcf7 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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org