diff --git a/cpp/src/gandiva/array_ops.cc b/cpp/src/gandiva/array_ops.cc index 0f3b469367ed4..8e9960e306807 100644 --- a/cpp/src/gandiva/array_ops.cc +++ b/cpp/src/gandiva/array_ops.cc @@ -119,7 +119,8 @@ bool array_contains_template(const Type* entry_buf, template char* array_to_string_template(const Type* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, - const char* delimiter) { + const char* delimiter, gdv_int32 delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, gdv_int32* out_len) { bool first_element = true; const int32_t* entry_validityAdjusted = entry_validity - entry_len; @@ -140,8 +141,8 @@ char* array_to_string_template(const Type* entry_buf, first_element = false; } - - char* result_char = new char[result.length() + 1]; + *valid_row = true; + char* result_char = reinterpret_cast(gdv_fn_context_arena_malloc(context, *out_len)); std::strcpy(result_char, result.c_str()); return result_char; } @@ -242,30 +243,34 @@ double* array_float64_remove(int64_t context_ptr, const double* entry_buf, char* array_int32_to_string(int64_t context_ptr, const int32_t* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, int32_t contains_data, bool contains_data_valid, - const char* delimiter) { + const char* delimiter, int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, int32_t* out_len) { return array_to_string_template(entry_buf, entry_len, entry_validity, - combined_row_validity, delimiter); + combined_row_validity, delimiter, delimiter_len, loop_var, validity_index_var, valid_row, out_len); } char* array_int64_to_string(int64_t context_ptr, const int64_t* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, - const char* delimiter) { + const char* delimiter, int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, id_t* out_len) { return array_to_string_template(entry_buf, entry_len, entry_validity, - combined_row_validity, delimiter); + combined_row_validity, delimiter, delimiter_len, loop_var, validity_index_var, valid_row, out_len); } char* array_float32_to_string(int64_t context_ptr, const float* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, - const char* delimiter) { + const char* delimiter,int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, int32_t** out_len) { return array_to_string_template(entry_buf, entry_len, entry_validity, - combined_row_validity, delimiter); + combined_row_validity, delimiter, delimiter_len, loop_var, validity_index_var, valid_row, out_len); } char* array_float64_to_string(int64_t context_ptr, const double* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, - const char* delimiter) { + const char* delimiter, int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, int32_t* out_len) { return array_to_string_template(entry_buf, entry_len, entry_validity, - combined_row_validity, delimiter); + combined_row_validity, delimiter, delimiter_len, loop_var, validity_index_var, valid_row, out_len); } } @@ -420,7 +425,13 @@ arrow::Status ExportedArrayFunctions::AddMappings(Engine* engine) const { types->i32_type(), // int32_t input length types->i32_ptr_type(), // input validity buffer types->i1_type(), // bool input row validity - types->i8_ptr_type() //value to for delimiter + types->i8_ptr_type(), + types->i32_ptr_type() //delimiter length + types->i1_type(), // bool validity --Needed? + types->i64_type(), //in loop var --Needed? + types->i64_type(), //in validity_index_var index into the valdity vector for the current row. + types->i1_ptr_type() //output validity for the row + types->i32_ptr_type(), // output length //value to for delimiter }; engine->AddGlobalMappingForFunc("array_int32_to_string", types->i32_ptr_type(), args, @@ -431,7 +442,13 @@ arrow::Status ExportedArrayFunctions::AddMappings(Engine* engine) const { types->i32_type(), // int32_t input length types->i32_ptr_type(), // input validity buffer types->i1_type(), // bool input row validity - types->i8_ptr_type() //value to for delimiter + types->i8_ptr_type(), //value to for delimiter + types->i32_ptr_type(), //delimiter length + types->i1_type(), // bool validity --Needed? + types->i64_type(), //in loop var --Needed? + types->i64_type(), //in validity_index_var index into the valdity vector for the current row. + types->i1_ptr_type() //output validity for the row + types->i32_ptr_type(), // output length }; engine->AddGlobalMappingForFunc("array_int64_to_string", @@ -443,7 +460,13 @@ arrow::Status ExportedArrayFunctions::AddMappings(Engine* engine) const { types->i32_type(), // int32_t input length types->i32_ptr_type(), // input validity buffer types->i1_type(), // bool input row validity - types->i8_ptr_type() //value to for delimiter + types->i8_ptr_type(), //value to for delimiter + types->i32_ptr_type(), //delimiter length + types->i1_type(), // bool validity --Needed? + types->i64_type(), //in loop var --Needed? + types->i64_type(), //in validity_index_var index into the valdity vector for the current row. + types->i1_ptr_type() //output validity for the row + types->i32_ptr_type(), // output length }; engine->AddGlobalMappingForFunc("array_float32_to_string", @@ -455,7 +478,13 @@ arrow::Status ExportedArrayFunctions::AddMappings(Engine* engine) const { types->i32_type(), // int32_t input length types->i32_ptr_type(), // input validity buffer types->i1_type(), // bool input row validity - types->i8_ptr_type() //value to for delimiter + types->i8_ptr_type(), //value to for delimiter + types->i32_ptr_type(), //delimiter length + types->i1_type(), // bool validity --Needed? + types->i64_type(), //in loop var --Needed? + types->i64_type(), //in validity_index_var index into the valdity vector for the current row. + types->i1_ptr_type() //output validity for the row + types->i32_ptr_type(), // output length }; engine->AddGlobalMappingForFunc("array_float64_to_string", diff --git a/cpp/src/gandiva/array_ops.h b/cpp/src/gandiva/array_ops.h index da006d84fe971..a68be6b481eee 100644 --- a/cpp/src/gandiva/array_ops.h +++ b/cpp/src/gandiva/array_ops.h @@ -86,17 +86,21 @@ GANDIVA_EXPORT char* array_int32_to_string(int64_t context_ptr, const int32_t* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, int32_t contains_data, bool contains_data_valid, - const char* delimiter); + const char* delimiter, int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, id_t* out_len); GANDIVA_EXPORT char* array_int64_to_string(int64_t context_ptr, const int64_t* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, - const char* delimiter); + const char* delimiter, int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, id_t* out_len); GANDIVA_EXPORT char* array_float32_to_string(int64_t context_ptr, const float* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, - const char* delimiter); + const char* delimiter, int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, id_t* out_len); GANDIVA_EXPORT char* array_float64_to_string(int64_t context_ptr, const double* entry_buf, int32_t entry_len, const int32_t* entry_validity, bool combined_row_validity, - const char* delimiter); + const char* delimiter, int32_t delimiter_len, int64_t loop_var, int64_t validity_index_var, + bool* valid_row, id_t* out_len); }