xy720 commented on code in PR #16776: URL: https://github.com/apache/doris/pull/16776#discussion_r1106817125
########## be/src/vec/data_types/data_type_map.cpp: ########## @@ -91,57 +162,51 @@ Status DataTypeMap::from_string(ReadBuffer& rb, IColumn* column) const { *(rb.end() - 1)); } - std::stringstream keyCharset; - std::stringstream valCharset; - if (rb.count() == 2) { // empty map {} , need to make empty array to add offset - keyCharset << "[]"; - valCharset << "[]"; + map_column->insert_default(); } else { - // {"aaa": 1, "bbb": 20}, need to handle key and value to make key column arr and value arr + // {"aaa": 1, "bbb": 20}, need to handle key slot and value slot to make key column arr and value arr // skip "{" ++rb.position(); - keyCharset << "["; - valCharset << "["; + auto& keys_arr = reinterpret_cast<ColumnArray&>(map_column->get_keys()); + ColumnArray::Offsets64& key_off = keys_arr.get_offsets(); + auto& values_arr = reinterpret_cast<ColumnArray&>(map_column->get_values()); + ColumnArray::Offsets64& val_off = values_arr.get_offsets(); + + IColumn& nested_key_column = keys_arr.get_data(); + DCHECK(nested_key_column.is_nullable()); + IColumn& nested_val_column = values_arr.get_data(); + DCHECK(nested_val_column.is_nullable()); + + size_t element_num = 0; while (!rb.eof()) { - size_t kv_len = 0; - auto start = rb.position(); - while (!rb.eof() && *start != ',' && *start != '}') { - kv_len++; - start++; + StringRef key_element(rb.position(), rb.count()); + if (!next_slot_from_string(rb, key_element)) { + return Status::InvalidArgument("Cannot read map key from text '{}'", + key_element.to_string()); } - if (kv_len >= rb.count()) { - return Status::InvalidArgument("Invalid Length"); + StringRef value_element(rb.position(), rb.count()); + if (!next_slot_from_string(rb, value_element)) { + return Status::InvalidArgument("Cannot read map value from text '{}'", + value_element.to_string()); } - - size_t k_len = 0; - auto k_rb = rb.position(); - while (kv_len > 0 && *k_rb != ':') { - k_len++; - k_rb++; + ReadBuffer krb(const_cast<char*>(key_element.data), key_element.size); Review Comment: Add support for null value. -- 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