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