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