HappenLee commented on code in PR #15303: URL: https://github.com/apache/doris/pull/15303#discussion_r1057054824
########## be/src/exec/table_connector.cpp: ########## @@ -319,4 +202,148 @@ Status TableConnector::append(const std::string& table_name, vectorized::Block* return Status::OK(); } +Status TableConnector::convert_column_data(const vectorized::ColumnPtr& column_ptr, + const vectorized::DataTypePtr& type_ptr, + const TypeDescriptor& type, int row, + bool need_extra_convert) { + auto extra_convert_func = [&](const std::string_view& str, const bool& is_date) -> void { + if (!need_extra_convert) { + fmt::format_to(_insert_stmt_buffer, "'{}'", str); + } else { + if (is_date) { + fmt::format_to(_insert_stmt_buffer, "to_date('{}','yyyy-mm-dd')", str); + } else { + fmt::format_to(_insert_stmt_buffer, "to_date('{}','yyyy-mm-dd hh24:mi:ss')", str); + } + } + }; + const vectorized::IColumn* column = column_ptr; + if (type_ptr->is_nullable()) { + if (column_ptr->is_null_at(row)) { Review Comment: `assert_cast` to reduce virtual function call ########## be/src/exec/table_connector.cpp: ########## @@ -319,4 +202,148 @@ Status TableConnector::append(const std::string& table_name, vectorized::Block* return Status::OK(); } +Status TableConnector::convert_column_data(const vectorized::ColumnPtr& column_ptr, + const vectorized::DataTypePtr& type_ptr, + const TypeDescriptor& type, int row, + bool need_extra_convert) { + auto extra_convert_func = [&](const std::string_view& str, const bool& is_date) -> void { + if (!need_extra_convert) { + fmt::format_to(_insert_stmt_buffer, "'{}'", str); + } else { + if (is_date) { + fmt::format_to(_insert_stmt_buffer, "to_date('{}','yyyy-mm-dd')", str); + } else { + fmt::format_to(_insert_stmt_buffer, "to_date('{}','yyyy-mm-dd hh24:mi:ss')", str); + } + } + }; + const vectorized::IColumn* column = column_ptr; + if (type_ptr->is_nullable()) { + if (column_ptr->is_null_at(row)) { + fmt::format_to(_insert_stmt_buffer, "{}", "NULL"); + return Status::OK(); + } + column = assert_cast<const vectorized::ColumnNullable*>(column_ptr.get()) + ->get_nested_column_ptr() + .get(); + } else { + column = column_ptr; + } + auto [item, size] = column->get_data_at(row); + switch (type.type) { + case TYPE_BOOLEAN: + case TYPE_TINYINT: + fmt::format_to(_insert_stmt_buffer, "{}", *reinterpret_cast<const int8_t*>(item)); + break; + case TYPE_SMALLINT: + fmt::format_to(_insert_stmt_buffer, "{}", *reinterpret_cast<const int16_t*>(item)); + break; + case TYPE_INT: + fmt::format_to(_insert_stmt_buffer, "{}", *reinterpret_cast<const int32_t*>(item)); + break; + case TYPE_BIGINT: + fmt::format_to(_insert_stmt_buffer, "{}", *reinterpret_cast<const int64_t*>(item)); + break; + case TYPE_FLOAT: + fmt::format_to(_insert_stmt_buffer, "{}", *reinterpret_cast<const float*>(item)); + break; + case TYPE_DOUBLE: + fmt::format_to(_insert_stmt_buffer, "{}", *reinterpret_cast<const double*>(item)); + break; + case TYPE_DATE: { + vectorized::VecDateTimeValue value = + binary_cast<int64_t, doris::vectorized::VecDateTimeValue>(*(int64_t*)item); + + char buf[64]; + char* pos = value.to_string(buf); + std::string_view str(buf, pos - buf - 1); + extra_convert_func(str, true); + break; + } + case TYPE_DATETIME: { + vectorized::VecDateTimeValue value = + binary_cast<int64_t, doris::vectorized::VecDateTimeValue>(*(int64_t*)item); + + char buf[64]; + char* pos = value.to_string(buf); + std::string_view str(buf, pos - buf - 1); + extra_convert_func(str, false); + break; + } + case TYPE_DATEV2: { + vectorized::DateV2Value<vectorized::DateV2ValueType> value = + binary_cast<uint32_t, doris::vectorized::DateV2Value<vectorized::DateV2ValueType>>( + *(int32_t*)item); + + char buf[64]; + char* pos = value.to_string(buf); + std::string str(buf, pos - buf - 1); + extra_convert_func(str, true); + break; + } + case TYPE_DATETIMEV2: { + vectorized::DateV2Value<vectorized::DateTimeV2ValueType> value = + binary_cast<uint64_t, + doris::vectorized::DateV2Value<vectorized::DateTimeV2ValueType>>( + *(int64_t*)item); + + char buf[64]; + char* pos = value.to_string(buf, type.scale); + std::string str(buf, pos - buf - 1); + extra_convert_func(str, false); + break; + } + case TYPE_VARCHAR: + case TYPE_CHAR: + case TYPE_STRING: { + // here need check the ' is used, now for pg array string must be " + fmt::format_to(_insert_stmt_buffer, "\"{}\"", fmt::basic_string_view(item, size)); + break; + } + case TYPE_ARRAY: { + auto& arr_nested = reinterpret_cast<const vectorized::ColumnArray*>(column)->get_data_ptr(); + auto& arr_offset = reinterpret_cast<const vectorized::ColumnArray*>(column)->get_offsets(); + auto array_type = remove_nullable(type_ptr); + auto nested_type = + reinterpret_cast<const vectorized::DataTypeArray&>(*array_type).get_nested_type(); + //insert into doris_test.test_int values(2,'{22,33}'); Review Comment: why the `{}` not `[]` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org