[javaudf](string) Fix string format in java udf (#13854)

This commit is contained in:
Gabriel
2022-11-01 21:25:12 +08:00
committed by GitHub
parent 7f34698eef
commit 287a739510
9 changed files with 163 additions and 46 deletions

View File

@ -93,6 +93,10 @@ Status JavaFunctionCall::prepare(FunctionContext* context,
RETURN_IF_ERROR(SerializeThriftMsg(env, &ctor_params, &ctor_params_bytes));
jni_ctx->executor = env->NewObject(executor_cl_, executor_ctor_id_, ctor_params_bytes);
jbyte* pBytes = env->GetByteArrayElements(ctor_params_bytes, nullptr);
env->ReleaseByteArrayElements(ctor_params_bytes, pBytes, JNI_ABORT);
env->DeleteLocalRef(ctor_params_bytes);
}
RETURN_ERROR_IF_EXC(env);
RETURN_IF_ERROR(JniUtil::LocalToGlobalRef(env, jni_ctx->executor, &jni_ctx->executor));
@ -108,17 +112,17 @@ Status JavaFunctionCall::execute(FunctionContext* context, Block& block,
JniContext* jni_ctx = reinterpret_cast<JniContext*>(
context->get_function_state(FunctionContext::THREAD_LOCAL));
int arg_idx = 0;
ColumnPtr args[arguments.size()];
for (size_t col_idx : arguments) {
ColumnWithTypeAndName& column = block.get_by_position(col_idx);
auto col = column.column->convert_to_full_column_if_const();
args[arg_idx] = column.column->convert_to_full_column_if_const();
if (!_argument_types[arg_idx]->equals(*column.type)) {
return Status::InvalidArgument(strings::Substitute(
"$0-th input column's type $1 does not equal to required type $2", arg_idx,
column.type->get_name(), _argument_types[arg_idx]->get_name()));
}
auto data_col = col;
if (auto* nullable = check_and_get_column<const ColumnNullable>(*col)) {
data_col = nullable->get_nested_column_ptr();
if (auto* nullable = check_and_get_column<const ColumnNullable>(*args[arg_idx])) {
args[arg_idx] = nullable->get_nested_column_ptr();
auto null_col =
check_and_get_column<ColumnVector<UInt8>>(nullable->get_null_map_column_ptr());
jni_ctx->input_nulls_buffer_ptr.get()[arg_idx] =
@ -127,15 +131,15 @@ Status JavaFunctionCall::execute(FunctionContext* context, Block& block,
jni_ctx->input_nulls_buffer_ptr.get()[arg_idx] = -1;
}
if (data_col->is_column_string()) {
const ColumnString* str_col = assert_cast<const ColumnString*>(data_col.get());
if (args[arg_idx]->is_column_string()) {
const ColumnString* str_col = assert_cast<const ColumnString*>(args[arg_idx].get());
jni_ctx->input_values_buffer_ptr.get()[arg_idx] =
reinterpret_cast<int64_t>(str_col->get_chars().data());
jni_ctx->input_offsets_ptrs.get()[arg_idx] =
reinterpret_cast<int64_t>(str_col->get_offsets().data());
} else if (data_col->is_numeric() || data_col->is_column_decimal()) {
} else if (args[arg_idx]->is_numeric() || args[arg_idx]->is_column_decimal()) {
jni_ctx->input_values_buffer_ptr.get()[arg_idx] =
reinterpret_cast<int64_t>(data_col->get_raw_data().data);
reinterpret_cast<int64_t>(args[arg_idx]->get_raw_data().data);
} else {
return Status::InvalidArgument(
strings::Substitute("Java UDF doesn't support type $0 now !",